Pipeline
DocumentPipeline orquesta el flujo completo de un comprobante en una sola llamada: generar XML, validar contra el XSD, firmar, enviar (recepcion y autorizacion), generar el RIDE y guardar todos los artefactos. Cada etapa es opcional.
Uso
php
use MTZ\Toolkit\Pipeline\Data\DocumentEmission;
use MTZ\Toolkit\Pipeline\DocumentPipeline;
use MTZ\Toolkit\Pipeline\Signers\CertificateDocumentSigner;
use MTZ\Toolkit\Documents\DocumentStore;
use MTZ\Toolkit\RideGenerator\Data\RideData;
use MTZ\Toolkit\RideGenerator\Enums\RideDocumentType;
use MTZ\Toolkit\RideGenerator\RideGenerator;
use MTZ\Toolkit\Sender\Sender;
$pipeline = new DocumentPipeline(
signer: new CertificateDocumentSigner('/secure/certificate.p12', getenv('SRI_CERTIFICATE_PASSWORD') ?: ''),
sender: new Sender(),
rideGenerator: new RideGenerator(),
documentStore: new DocumentStore($storage),
// validator XsdValidator y XMLMaker por defecto
);
$result = $pipeline->emit(new DocumentEmission(
xml: $xmlGenerationData,
ride: RideData::make(RideDocumentType::Invoice, $accessKey, $ridePayload),
ownerKey: '1790012345001', // activa el guardado
));Etapas
En orden, cada etapa se ejecuta solo si su dependencia esta presente:
- Generar XML con
XMLMaker. - Validar contra el XSD (si hay
validator). Si falla, corta antes de firmar. - Firmar (si hay
signer). - Enviar recepcion y autorizacion (si hay
sendery XML firmado). - Generar el RIDE (si hay
rideGeneratoryride, y el envio fue exitoso). - Guardar cada artefacto (si hay
documentStoreyownerKey).
Pasa null en cualquier dependencia para saltar esa etapa (por ejemplo, generar y validar sin enviar).
Resultado
php
$result->success; // autorizado, o true si no hay sender configurado
$result->accessKey;
$result->generatedXml;
$result->signedXml; // null si no se firmo
$result->send; // SendResult
$result->ride; // GeneratedRidePdf
$result->storedPaths; // ['generated.xml' => '...', 'signed.xml' => '...', 'ride.pdf' => '...']
$result->schemaErrors; // errores XSD si la validacion corto el flujo
$result->error; // motivo de falloSolo se guarda authorized.xml cuando el SRI autoriza el comprobante.
Firma
CertificateDocumentSigner adapta el Signer a la costura DocumentSignerInterface del pipeline. Implementa esa interfaz para usar otra estrategia de firma (por ejemplo, un HSM).
php
use MTZ\Toolkit\Pipeline\Contracts\DocumentSignerInterface;
final class MiFirmador implements DocumentSignerInterface
{
public function sign(string $xml): string { /* ... */ }
}