Repository navigation
Release v1.1.0
Release v1.1.0: AEAT compliance fixes (see CHANGELOG/UPGRADING).
Changelog
Security
nowo:verifactu:submit-sandboxwithout--submit(or with--dry-run) no longer stores the generated record as the new hash chain head, so smoke tests cannot rewrite the real persistent chain.BillingRecordProcessor::process()gains apersistChainStateargument (defaulttrue).- AEAT SOAP responses are only reported as successful when the HTTP status is 2xx and
EstadoRegistroisCorrecto. A missingEstadoRegistro(e.g. HTML error pages) or a non-2xx status is now a failure; namespace-prefixed AEAT responses (<tikR:EstadoRegistro>) are parsed andDescripcionErrorRegistrois reported. - The chain head read-then-write is now serialized per issuer NIF: new
LockableHashChainRepositoryInterface; the Doctrine repository runs it in a transaction withSELECT … FOR UPDATE, preventing forked chains under concurrent requests.
Fixed
- Apps without
doctrine/doctrine-bundleno longer fail at container build: the extension checkshash_chain.storagefirst and probesServiceEntityRepositoryinstead of autoloading the Doctrine repository.storage: doctrinewithout Doctrine now throws a clearLogicException. - Anulación fingerprints now use
IDEmisorFacturaAnulada/NumSerieFacturaAnulada/FechaExpedicionFacturaAnulada, as required by the AEAT hash specification (verified with the official test vector). - Hash amounts are normalized as strings (insignificant zeros only) instead of through
float, so large amounts such as999999999999.99are no longer altered. Desgloseemits oneDetalleDesgloseperTaxBreakdownentry instead of a single line with the first rate and the invoice totals.- QR URLs use
ValidarQRNoVerifactuinno_verifactumode (QrUrlBuildertakes the configured mode;buildUrl()accepts an optional per-call$mode).
Changed
- Documented that
XadesBillingRecordSignerproduces plain enveloped XML-DSig, not full XAdES, and thathash_chain.table_prefixandaeat_spec_versionare reserved options with no effect.