Me quedaban las anulaciones, aunque a Hacienda no le gusta recibir muchas anulaciones, mejor evitarlas cuando se pueda y generar rectificativas en su lugar.
Yo solo anulo F1, F2 y F3, nunca anulo rectificativas, genero otra rectificativa de esa rectificativa.
Código PHP:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sum="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:sum1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
<soapenv:Header/>
<soapenv:Body>
<sum:RegFactuSistemaFacturacion>
<sum:Cabecera>
<sum1:ObligadoEmision>
<sum1:NombreRazon>Nombre de la persona o empresa que envía la factura</sum1:NombreRazon>
<sum1:NIF>NIF de la persona o empresa que envía la factura</sum1:NIF>
</sum1:ObligadoEmision>
</sum:Cabecera>
<sum:RegistroFactura>
<sum1:RegistroAnulacion>
<sum1:IDVersion>1.0</sum1:IDVersion>
<sum1:IDFactura>
<sum1:IDEmisorFacturaAnulada>NIF de la persona o empresa que envía la factura</sum1:IDEmisorFacturaAnulada>
<sum1:NumSerieFacturaAnulada>FS 77567</sum1:NumSerieFacturaAnulada>
<sum1:FechaExpedicionFacturaAnulada>10-10-2026</sum1:FechaExpedicionFacturaAnulada>
</sum1:IDFactura>
<sum1:Encadenamiento>
<sum1:RegistroAnterior>
<sum1:IDEmisorFactura>NIF de la persona o empresa que envía la factura</sum1:IDEmisorFactura>
<sum1:NumSerieFactura>FS 77567</sum1:NumSerieFactura>
<sum1:FechaExpedicionFactura>10-10-2026</sum1:FechaExpedicionFactura>
<sum1:Huella>026B7E86DD284D57C9D97D681A599B452455A1963CD7FAC08303A0234BD6C257</sum1:Huella>
</sum1:RegistroAnterior>
</sum1:Encadenamiento>
<sum1:SistemaInformatico>
<sum1:NombreRazon>Nombre de la empresa propietaria del software</sum1:NombreRazon>
<sum1:NIF>NIF de la empresa propietaria del software</sum1:NIF>
<sum1:NombreSistemaInformatico>Mobile TPV</sum1:NombreSistemaInformatico>
<sum1:IdSistemaInformatico>01</sum1:IdSistemaInformatico>
<sum1:Version>57</sum1:Version>
<sum1:NumeroInstalacion>11</sum1:NumeroInstalacion>
<sum1:TipoUsoPosibleSoloVerifactu>S</sum1:TipoUsoPosibleSoloVerifactu>
<sum1:TipoUsoPosibleMultiOT>S</sum1:TipoUsoPosibleMultiOT>
<sum1:IndicadorMultiplesOT>S</sum1:IndicadorMultiplesOT>
</sum1:SistemaInformatico>
<sum1:FechaHoraHusoGenRegistro>2026-10-10T11:29:16+02:00</sum1:FechaHoraHusoGenRegistro>
<sum1:TipoHuella>01</sum1:TipoHuella>
<sum1:Huella>FF6169A1AC69FD7CF2F1697A48E4B0315A9AAB9E8CA6481DD4D5E3BF92311E7F</sum1:Huella>
</sum1:RegistroAnulacion>
</sum:RegistroFactura>
</sum:RegFactuSistemaFacturacion>
</soapenv:Body>
</soapenv:Envelope>
Y luego las respuestas de la AEAT pueden venir en 3 modos diferentes según lo que he visto hasta ahora:
- Si viene un archivo HTML es que hubo un error y no se llegó a procesar el alta de esta factura, por ejemplo si el certificado está caducado te envía un HTML con código de error 401 (No autorizado). Yo aquí lo que hago es no guardar el encadenamiento, corregir el error y volver a enviar la factura como si fuera la primera vez.
- Si viene un archivo XML con una etiqueta <faultcode> es que hubo un error generalmente por mala configuración del archivo XML, que le falta alguna etiqueta o algún cierre o a que alguna etiqueta no está en el orden correcto. Aquí en el encadenamiento hago lo mismo que en el caso anterior.
- Si viene un archivo XML con una etiqueta <tikR:CodigoErrorRegistro> es que hubo un error de IVA incorrecto o algo así, lo que hago es guardar el encadenamiento, corregir el problema de la factura y enviar una subsanación. El XML de la subsanación es exactamente igual (corrigiendo el dato incorrecto) que el original pero en la etiqueta <sum1:Subsanacion> le ponemos una S.
Si hay alguna anulación de una factura con fecha anterior a la puesta en marcha de Verifactu en la tienda no se envía a Verifactu. Si se envía te da un error de que la factura no existe en Verifactu.
Si hay que rectificar alguna factura con fecha anterior a la puesta en marcha de Verifactu en la tienda se envía a Verifactu y no da error de que no existe, da resultado correcto.
Todo esto está chequeado contra la AEAT.