Skip to content

Validar antes de enviar (verificacion offline) ​

Validar el comprobante en tu servidor, antes de firmar y enviar, evita la mayoria de rechazos del SRI sin gastar llamadas de red. El toolkit incluye tres verificaciones offline.

1. Esquema XSD ​

Valida el XML generado contra el XSD oficial incluido en el paquete. Atrapa los errores 35 (documento invalido), 36 y 48.

php
use MTZ\Toolkit\XMLMaker\Enums\XmlDocumentType;
use MTZ\Toolkit\XMLMaker\Validation\XsdValidator;

$validator = new XsdValidator();
$errors = $validator->validate($xml, XmlDocumentType::Invoice);

if ($errors !== []) {
    throw new RuntimeException("XML no conforme:\n" . implode("\n", $errors));
}

2. Identificacion del comprador ​

Valida cedula (modulo 10) y RUC (modulo 11) para evitar las advertencias 59 y 62.

php
use MTZ\Toolkit\XMLMaker\Validation\IdentificationValidator;

$id = new IdentificationValidator();

if (! $id->isValid($number, $identificationType)) {
    throw new RuntimeException('Identificacion del comprador invalida.');
}

3. Cuadre de totales ​

XMLMaker calcula los totales desde las lineas por defecto, por lo que el XML siempre cuadra (evita el error 52). Si envias los totales manualmente, puedes verificarlos con TotalsCalculator:

php
use MTZ\Toolkit\XMLMaker\Calculation\TotalsCalculator;

$totals = (new TotalsCalculator())->calculate($details, tip: 0.0);

// Compara $totals->importeTotal con el total que vas a declarar

Flujo recomendado ​

php
$generated = (new XMLMaker())->generate($data);
$xml = $generated->toString();

$errors = (new XsdValidator())->validate($xml, $data->documentType);

if ($errors !== []) {
    // corrige antes de firmar y enviar
    return;
}

$signedXml = (new Signer($certPath, $certPassword))->loadXml($xml)->sign();
$result = $sender->send($generated->accessKey, $signedXml);

El Pipeline ya ejecuta la validacion XSD como paso previo obligatorio: si el XML no es conforme, corta antes de firmar y devuelve schemaErrors.

Errores del SRI ​

Cuando el SRI si responde con un rechazo, interpreta el codigo con SriMessageCode. Ver Codigos de error.

Publicado bajo licencia MIT.