From fc8cb7af360cdcd60bb8f6b0a5f86f7200e04c1d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 25 Apr 2025 17:07:49 +1000 Subject: [PATCH] Clean up for verifactu tests --- .../Verifactu/Models/DetalleDesglose.php | 57 + .../Standards/Verifactu/xsd/ConsultaLR.xsd | 38 + .../Standards/Verifactu/xsd/EventosSIF.xsd | 823 ++++++++++ .../Verifactu/xsd/RespuestaConsultaLR.xsd | 195 +++ .../Verifactu/xsd/RespuestaSuministro.xsd | 139 ++ .../Verifactu/xsd/SistemaFacturacion.wsdl | 110 ++ .../Verifactu/xsd/SuministroInformacion.xsd | 1399 +++++++++++++++++ .../Standards/Verifactu/xsd/SuministroLR.xsd | 25 + .../Standards/Verifactu/xsd/example-alta.xml | 77 + .../Verifactu/xsd/example-anulacion.xml | 50 + .../Verifactu/xsd/example-subsanacion.xml | 78 + .../Verifactu/Models/BaseModelTest.php | 60 - .../EInvoice/Verifactu/Models/InvoiceTest.php | 55 +- 13 files changed, 3044 insertions(+), 62 deletions(-) create mode 100644 app/Services/EDocument/Standards/Verifactu/Models/DetalleDesglose.php create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/ConsultaLR.xsd create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/EventosSIF.xsd create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/RespuestaConsultaLR.xsd create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/RespuestaSuministro.xsd create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/SistemaFacturacion.wsdl create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/SuministroInformacion.xsd create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/SuministroLR.xsd create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/example-alta.xml create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/example-anulacion.xml create mode 100644 app/Services/EDocument/Standards/Verifactu/xsd/example-subsanacion.xml delete mode 100644 tests/Feature/EInvoice/Verifactu/Models/BaseModelTest.php diff --git a/app/Services/EDocument/Standards/Verifactu/Models/DetalleDesglose.php b/app/Services/EDocument/Standards/Verifactu/Models/DetalleDesglose.php new file mode 100644 index 0000000000..9709f6afd5 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/Models/DetalleDesglose.php @@ -0,0 +1,57 @@ +desgloseIVA = $desglose; + return $this; + } + + public function getDesgloseIVA(): array + { + return $this->desgloseIVA; + } + + public function toXml(\DOMDocument $doc): \DOMElement + { + $root = $this->createElement($doc, 'DetalleDesglose'); + + // Add IVA details directly under DetalleDesglose + $root->appendChild($this->createElement($doc, 'Impuesto', $this->desgloseIVA['Impuesto'])); + $root->appendChild($this->createElement($doc, 'ClaveRegimen', $this->desgloseIVA['ClaveRegimen'])); + $root->appendChild($this->createElement($doc, 'CalificacionOperacion', $this->desgloseIVA['CalificacionOperacion'] ?? 'S1')); + $root->appendChild($this->createElement($doc, 'TipoImpositivo', (string)$this->desgloseIVA['TipoImpositivo'])); + $root->appendChild($this->createElement($doc, 'BaseImponibleOimporteNoSujeto', (string)$this->desgloseIVA['BaseImponible'])); + $root->appendChild($this->createElement($doc, 'CuotaRepercutida', (string)$this->desgloseIVA['Cuota'])); + + return $root; + } + + public static function fromDOMElement(\DOMElement $element): self + { + $detalleDesglose = new self(); + + $desglose = [ + 'Impuesto' => self::getElementText($element, 'Impuesto'), + 'ClaveRegimen' => self::getElementText($element, 'ClaveRegimen'), + 'CalificacionOperacion' => self::getElementText($element, 'CalificacionOperacion'), + 'BaseImponible' => (float)self::getElementText($element, 'BaseImponibleOimporteNoSujeto'), + 'TipoImpositivo' => (float)self::getElementText($element, 'TipoImpositivo'), + 'Cuota' => (float)self::getElementText($element, 'CuotaRepercutida') + ]; + $detalleDesglose->setDesgloseIVA($desglose); + + return $detalleDesglose; + } + + protected static function getElementText(\DOMElement $element, string $tagName): ?string + { + $node = $element->getElementsByTagNameNS(self::XML_NAMESPACE, $tagName)->item(0); + return $node ? $node->nodeValue : null; + } +} \ No newline at end of file diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/ConsultaLR.xsd b/app/Services/EDocument/Standards/Verifactu/xsd/ConsultaLR.xsd new file mode 100644 index 0000000000..0e6327fb98 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/ConsultaLR.xsd @@ -0,0 +1,38 @@ + + + + + + + + + Servicio de consulta Registros Facturacion + + + + + + + + + + + + + + Nº Serie+Nº Factura de la Factura del Emisor. + + + + + Contraparte del NIF de la cabecera que realiza la consulta. + Obligado si la cosulta la realiza el Destinatario de los registros de facturacion. + Destinatario si la cosulta la realiza el Obligado dde los registros de facturacion. + + + + + + + + diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/EventosSIF.xsd b/app/Services/EDocument/Standards/Verifactu/xsd/EventosSIF.xsd new file mode 100644 index 0000000000..21cb370535 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/EventosSIF.xsd @@ -0,0 +1,823 @@ + + + + + + + + + + + + + + + + + + + Obligado a expedir la factura. + + + + + + + Formato: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Formato: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601) + + + + + Formato: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601) + + + + + + + + + + + + + + + + Formato: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601) + + + + + Formato: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601) + + + + + + + + + + + + + + + + + + + + + + + + + Formato: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601) + + + + + + + + + + + Formato: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601) + + + + + + + + + + + + + + + Datos de una persona física o jurídica Española con un NIF asociado + + + + + + + + + NIF + + + + + + + + + Datos de una persona física o jurídica Española o Extranjera + + + + + + + + + + + + + Identificador de persona Física o jurídica distinto del NIF + (Código pais, Tipo de Identificador, y hasta 15 caractéres) + No se permite CodigoPais=ES e IDType=01-NIFContraparte + para ese caso, debe utilizarse NIF en lugar de IDOtro. + + + + + + + + + + + + + + Destinatario + + + + + Tercero + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NIF-IVA + + + + + Pasaporte + + + + + IDEnPaisResidencia + + + + + Certificado Residencia + + + + + Otro documento Probatorio + + + + + No Censado + + + + + + + + + + SHA-256 + + + + + + + + + Inicio del funcionamiento del sistema informático como «NO VERI*FACTU». + + + + + Fin del funcionamiento del sistema informático como «NO VERI*FACTU». + + + + + Lanzamiento del proceso de detección de anomalías en los registros de facturación. + + + + + Detección de anomalías en la integridad, inalterabilidad y trazabilidad de registros de facturación. + + + + + Lanzamiento del proceso de detección de anomalías en los registros de evento. + + + + + Detección de anomalías en la integridad, inalterabilidad y trazabilidad de registros de evento. + + + + + Restauración de copia de seguridad, cuando ésta se gestione desde el propio sistema informático de facturación. + + + + + Exportación de registros de facturación generados en un periodo. + + + + + Exportación de registros de evento generados en un periodo. + + + + + Registro resumen de eventos + + + + + Otros tipos de eventos a registrar voluntariamente por la persona o entidad productora del sistema informático. + + + + + + + + + + Integridad-huella + + + + + Integridad-firma + + + + + Integridad - Otros + + + + + Trazabilidad-cadena-registro - Reg. no primero pero con reg. anterior no anotado o inexistente + + + + + Trazabilidad-cadena-registro - Reg. no último pero con reg. posterior no anotado o inexistente + + + + + Trazabilidad-cadena-registro - Otros + + + + + Trazabilidad-cadena-huella - Huella del reg. no se corresponde con la 'huella del reg. anterior' almacenada en el registro posterior + + + + + Trazabilidad-cadena-huella - Campo 'huella del reg. anterior' no se corresponde con la huella del reg. anterior + + + + + Trazabilidad-cadena-huella - Otros + + + + + Trazabilidad-cadena - Otros + + + + + Trazabilidad-fechas - Fecha-hora anterior a la fecha del reg. anterior + + + + + Trazabilidad-fechas - Fecha-hora posterior a la fecha del reg. posterior + + + + + Trazabilidad-fechas - Reg. con fecha-hora de generación posterior a la fecha-hora actual del sistema + + + + + Trazabilidad-fechas - Otros + + + + + Trazabilidad - Otros + + + + + Otros + + + + + + + Datos de identificación de factura expedida para operaciones de consulta + + + + + + + + + + Datos de encadenamiento + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/RespuestaConsultaLR.xsd b/app/Services/EDocument/Standards/Verifactu/xsd/RespuestaConsultaLR.xsd new file mode 100644 index 0000000000..fd3ab14fd2 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/RespuestaConsultaLR.xsd @@ -0,0 +1,195 @@ + + + + + + + + + Servicio de consulta de regIstros de facturacion + + + + + + + + + + + + + + + + + + + Estado del registro almacenado en el sistema. Los estados posibles son: Correcta, AceptadaConErrores y Anulada + + + + + + + Código del error de registro, en su caso. + + + + + + + Descripción detallada del error de registro, en su caso. + + + + + + + + + + + + + + + + + + + + Período al que corresponden los apuntes. todos los apuntes deben corresponder al mismo período impositivo + + + + + + + + + + + + + + + Apunte correspondiente al libro de facturas expedidas. + + + + + + + + + + + Clave del tipo de factura + + + + + Identifica si el tipo de factura rectificativa es por sustitución o por diferencia + + + + + + El ID de las facturas rectificadas, únicamente se rellena en el caso de rectificación de facturas + + + + + + + + + + El ID de las facturas sustituidas, únicamente se rellena en el caso de facturas sustituidas + + + + + + + + + + + + + + + + Tercero que expida la factura y/o genera el registro de alta. + + + + + + Contraparte de la operación. Cliente + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + El registro se almacenado sin errores + + + + + El registro se almacenado tiene algunos errores. Ver detalle del error + + + + + El registro almacenado ha sido anulado + + + + + diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/RespuestaSuministro.xsd b/app/Services/EDocument/Standards/Verifactu/xsd/RespuestaSuministro.xsd new file mode 100644 index 0000000000..d4902b9334 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/RespuestaSuministro.xsd @@ -0,0 +1,139 @@ + + + + + + + + + + + + CSV asociado al envío generado por AEAT. Solo se genera si no hay rechazo del envio + + + + + Se devuelven datos de la presentacion realizada. Solo se genera si no hay rechazo del envio + + + + + Se devuelve la cabecera que se incluyó en el envío. + + + + + + + Estado del envío en conjunto. + Si los datos de cabecera y todos los registros son correctos,el estado es correcto. + En caso de estructura y cabecera correctos donde todos los registros son incorrectos, el estado es incorrecto + En caso de estructura y cabecera correctos con al menos un registro incorrecto, el estado global es parcialmente correcto. + + + + + + + + Respuesta a un envío de registro de facturacion + + + + + + + + Estado detallado de cada línea del suministro. + + + + + + + + + + Respuesta a un envío + + + + + ID Factura Expedida + + + + + + + + Estado del registro. Correcto o Incorrecto + + + + + + + Código del error de registro, en su caso. + + + + + + + Descripción detallada del error de registro, en su caso. + + + + + + + Solo en el caso de que se rechace el registro por duplicado se devuelve este nodo con la informacion registrada en el sistema para este registro + + + + + + + + + + Correcto + + + + + Parcialmente correcto. Ver detalle de errores + + + + + Incorrecto + + + + + + + + + Correcto + + + + + Aceptado con Errores. Ver detalle del error + + + + + Incorrecto + + + + + + + + diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/SistemaFacturacion.wsdl b/app/Services/EDocument/Standards/Verifactu/xsd/SistemaFacturacion.wsdl new file mode 100644 index 0000000000..3d40d898b9 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/SistemaFacturacion.wsdl @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/SuministroInformacion.xsd b/app/Services/EDocument/Standards/Verifactu/xsd/SuministroInformacion.xsd new file mode 100644 index 0000000000..b6d14b5820 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/SuministroInformacion.xsd @@ -0,0 +1,1399 @@ + + + + + + Datos de cabecera + + + + + Obligado a expedir la factura. + + + + + Representante del obligado tributario. A rellenar solo en caso de que los registros de facturación remitdos hayan sido generados por un representante/asesor del obligado tributario. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Información básica que contienen los registros del sistema de facturacion + + + + + + Período de la fecha de la operación + + + + + + + + + + + + Datos de identificación de factura expedida para operaciones de consulta + + + + + + Nº Serie+Nº Factura de la Factura del Emisor. + + + + + Fecha de emisión de la factura + + + + + + + Datos de identificación de factura que se anula para operaciones de baja + + + + + NIF del obligado + + + + + Nº Serie+Nº Factura de la Factura que se anula. + + + + + Fecha de emisión de la factura que se anula + + + + + + + Datos correspondientes al registro de facturacion de alta + + + + + + + + + + + Clave del tipo de factura + + + + + Identifica si el tipo de factura rectificativa es por sustitución o por diferencia + + + + + + El ID de las facturas rectificadas, únicamente se rellena en el caso de rectificación de facturas + + + + + + + + + + El ID de las facturas sustituidas, únicamente se rellena en el caso de facturas sustituidas + + + + + + + + + + + + + + + + Tercero que expida la factura y/o genera el registro de alta. + + + + + + Contraparte de la operación. Cliente + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Datos correspondientes al registro de facturacion de anulacion + + + + + + + + + + + + + + + + + + + + + + + + + + + Datos de encadenamiento + + + + + NIF del obligado a expedir la factura a que se refiere el registro de facturación anterior + + + + + + + + + + + + + + + + + + + + + + + + + + + + Datos de identificación de factura + + + + + NIF del obligado + + + + + Nº Serie+Nº Factura de la Factura del Emisor + + + + + Fecha de emisión de la factura + + + + + + + + Datos de identificación de factura sustituida o rectificada. El NIF se cogerá del NIF indicado en el bloque IDFactura + + + + + NIF del obligado + + + + + Nº Serie+Nº Factura de la factura + + + + + Fecha de emisión de la factura sustituida o rectificada + + + + + + + + + + + + + + + + + + + + + + + Desglose de Base y Cuota sustituida en las Facturas Rectificativas sustitutivas + + + + + + + + + + + Datos de una persona física o jurídica Española con un NIF asociado + + + + + + + + + + Datos de una persona física o jurídica Española o Extranjera + + + + + + + + + + + + + Identificador de persona Física o jurídica distinto del NIF + (Código pais, Tipo de Identificador, y hasta 15 caractéres) + No se permite CodigoPais=ES e IDType=01-NIFContraparte + para ese caso, debe utilizarse NIF en lugar de IDOtro. + + + + + + + + + + + Rango de fechas de expedicion + + + + + + + + + + + + + + + + + + IdPeticion asociado a la factura registrada previamente en el sistema. Solo se suministra si la factura enviada es rechazada por estar duplicada + + + + + + + Estado del registro duplicado almacenado en el sistema. Los estados posibles son: Correcta, AceptadaConErrores y Anulada. Solo se suministra si la factura enviada es rechazada por estar duplicada + + + + + + + Código del error de registro duplicado almacenado en el sistema, en su caso. + + + + + + + Descripción detallada del error de registro duplicado almacenado en el sistema, en su caso. + + + + + + + + + + + + + + + Año en formato YYYY + + + + + + + + + Período de la factura + + + + + Enero + + + + + Febrero + + + + + Marzo + + + + + Abril + + + + + Mayo + + + + + Junio + + + + + Julio + + + + + Agosto + + + + + Septiembre + + + + + Octubre + + + + + Noviembre + + + + + Diciembre + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NIF + + + + + + + + + + + + + + + + + + + + + + EXENTA por Art. 20 + + + + + EXENTA por Art. 21 + + + + + EXENTA por Art. 22 + + + + + EXENTA por Art. 24 + + + + + EXENTA por Art. 25 + + + + + EXENTA otros + + + + + + + + + + FACTURA (ART. 6, 7.2 Y 7.3 DEL RD 1619/2012) + + + + + FACTURA SIMPLIFICADA Y FACTURAS SIN IDENTIFICACIÓN DEL DESTINATARIO ART. 6.1.D) RD 1619/2012 + + + + + FACTURA RECTIFICATIVA (Art 80.1 y 80.2 y error fundado en derecho) + + + + + FACTURA RECTIFICATIVA (Art. 80.3) + + + + + FACTURA RECTIFICATIVA (Art. 80.4) + + + + + FACTURA RECTIFICATIVA (Resto) + + + + + FACTURA RECTIFICATIVA EN FACTURAS SIMPLIFICADAS + + + + + FACTURA EMITIDA EN SUSTITUCIÓN DE FACTURAS SIMPLIFICADAS FACTURADAS Y DECLARADAS + + + + + + + + + No ha habido rechazo previo por la AEAT. + + + + + Ha habido rechazo previo por la AEAT. + + + + + Independientemente de si ha habido o no algún rechazo previo por la AEAT, el registro de facturación no existe en la AEAT (registro existente en ese SIF o en algún SIF del obligado tributario y que no se remitió a la AEAT, por ejemplo, al acogerse a Veri*factu desde no Veri*factu). No deberían existir operaciones de alta (N,X), por lo que no se admiten. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SUSTITUTIVA + + + + + INCREMENTAL + + + + + + + + + + Destinatario + + + + + Tercero + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Expedidor (obligado a Expedir la factura anulada). + + + + + Destinatario + + + + + Tercero + + + + + + + + + + NIF-IVA + + + + + Pasaporte + + + + + IDEnPaisResidencia + + + + + Certificado Residencia + + + + + Otro documento Probatorio + + + + + No Censado + + + + + + + + + + SHA-256 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + El registro se ha almacenado sin errores + + + + + El registro que se ha almacenado tiene algunos errores. Ver detalle del error + + + + + El registro almacenado ha sido anulado + + + + + + + + + + + + OPERACIÓN SUJETA Y NO EXENTA - SIN INVERSIÓN DEL SUJETO PASIVO. + + + + + OPERACIÓN SUJETA Y NO EXENTA - CON INVERSIÓN DEL SUJETO PASIVO + + + + + OPERACIÓN NO SUJETA ARTÍCULO 7, 14, OTROS. + + + + + OPERACIÓN NO SUJETA POR REGLAS DE LOCALIZACIÓN + + + + + + + + + + + + + + + + + + + Datos de una persona física o jurídica Española o Extranjera + + + + + + + + + + + + Compuesto por datos + de contexto y una secuencia de 1 o más registros. + + + + + + + + Cabecera de la Cobnsulta + + + + + + + Obligado a la emision de los registros de facturacion + + + + + Destinatario (a veces también denominado contraparte, es decir, el cliente) de la operación + + + + + + Flag opcional que tendrá valor S si la consulta la está realizando el representante/asesor del obligado tributario. A rellenar solo en caso de que los registros de facturación remitidos hayan sido generados por un representante/asesor del obligado tributario. Este flag solo se puede cumplimentar cuando esté informado el obligado tributario en la consulta + + + + + + + + Datos de una persona física o jurídica Española con un NIF asociado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Impuesto sobre el Valor Añadido (IVA) + + + + + Impuesto sobre la Producción, los Servicios y la Importación (IPSI) de Ceuta y Melilla + + + + + Impuesto General Indirecto Canario (IGIC) + + + + + Otros + + + + + + + + + + + + + + + + + + La operación realizada ha sido un alta + + + + + La operación realizada ha sido una anulación + + + + + diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/SuministroLR.xsd b/app/Services/EDocument/Standards/Verifactu/xsd/SuministroLR.xsd new file mode 100644 index 0000000000..bde17b7728 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/SuministroLR.xsd @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + Datos correspondientes a los registros de facturacion + + + + + + + + + \ No newline at end of file diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/example-alta.xml b/app/Services/EDocument/Standards/Verifactu/xsd/example-alta.xml new file mode 100644 index 0000000000..3fefd0c039 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/example-alta.xml @@ -0,0 +1,77 @@ + + + + + + + XXXXX + AAAA + + + + + 1.0 + + AAAA + 12345 + 13-09-2024 + + XXXXX + F1 + Descripc + + + YYYY + BBBB + + + + + 01 + S1 + 4 + 10 + 0.4 + + + 01 + S1 + 21 + 100 + 21 + + + 21.4 + 131.4 + + + AAAA + 44 + 13-09-2024 + HuellaRegistroAnterior + + + + SSSS + NNNN + NombreSistemaInformatico + 77 + 1.0.03 + 383 + N + S + S + + 2024-09-13T19:20:30+01:00 + 01 + Huella + + + + + \ No newline at end of file diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/example-anulacion.xml b/app/Services/EDocument/Standards/Verifactu/xsd/example-anulacion.xml new file mode 100644 index 0000000000..d0509800e8 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/example-anulacion.xml @@ -0,0 +1,50 @@ + + + + + + + XXXXX + AAAA + + + + + 1.0 + + AAAA + 12345 + 13-09-2024 + + + + AAAA + 44 + 13-09-2024 + HuellaRegistroAnterior + + + + SSSS + NNNN + NombreSistemaInformatico + 77 + 1.0.03 + 383 + N + S + S + + 2024-09-13T19:20:30+01:00 + 01 + Huella + + + + + \ No newline at end of file diff --git a/app/Services/EDocument/Standards/Verifactu/xsd/example-subsanacion.xml b/app/Services/EDocument/Standards/Verifactu/xsd/example-subsanacion.xml new file mode 100644 index 0000000000..2ef1de97c1 --- /dev/null +++ b/app/Services/EDocument/Standards/Verifactu/xsd/example-subsanacion.xml @@ -0,0 +1,78 @@ + + + + + + + XXXXX + AAAA + + + + + 1.0 + + AAAA + 12345 + 13-09-2024 + + XXXXX + S + F1 + Descripc + + + YYYY + BBBB + + + + + 01 + S1 + 4 + 10 + 0.4 + + + 01 + S1 + 21 + 100 + 21 + + + 21.4 + 131.4 + + + AAAA + 44 + 13-09-2024 + HuellaRegistroAnterior + + + + SSSS + NNNN + NombreSistemaInformatico + 77 + 1.0.03 + 383 + N + S + S + + 2024-09-13T19:20:30+01:00 + 01 + Huella + + + + + \ No newline at end of file diff --git a/tests/Feature/EInvoice/Verifactu/Models/BaseModelTest.php b/tests/Feature/EInvoice/Verifactu/Models/BaseModelTest.php deleted file mode 100644 index 452c5a3672..0000000000 --- a/tests/Feature/EInvoice/Verifactu/Models/BaseModelTest.php +++ /dev/null @@ -1,60 +0,0 @@ -assertEquals( - $this->normalizeXml($expectedXml), - $this->normalizeXml($actualXml) - ); - } - - protected function normalizeXml(string $xml): string - { - $doc = new \DOMDocument('1.0'); - $doc->preserveWhiteSpace = false; - $doc->formatOutput = true; - if (!$doc->loadXML($xml)) { - throw new \DOMException('Failed to load XML in normalizeXml'); - } - return $doc->saveXML(); - } - - protected function assertValidatesAgainstXsd(string $xml, string $xsdPath): void - { - try { - $doc = new \DOMDocument(); - $doc->preserveWhiteSpace = false; - $doc->formatOutput = true; - if (!$doc->loadXML($xml, LIBXML_NOBLANKS)) { - throw new \DOMException('Failed to load XML in assertValidatesAgainstXsd'); - } - - libxml_use_internal_errors(true); - $result = $doc->schemaValidate($xsdPath); - if (!$result) { - foreach (libxml_get_errors() as $error) { - } - libxml_clear_errors(); - } - - $this->assertTrue( - $result, - 'XML does not validate against XSD schema' - ); - } catch (\Exception $e) { - throw $e; - } - } - - protected function getTestXsdPath(): string - { - return __DIR__ . '/../schema/SuministroInformacion.xsd'; - } -} \ No newline at end of file diff --git a/tests/Feature/EInvoice/Verifactu/Models/InvoiceTest.php b/tests/Feature/EInvoice/Verifactu/Models/InvoiceTest.php index 407dccac89..09199d309d 100644 --- a/tests/Feature/EInvoice/Verifactu/Models/InvoiceTest.php +++ b/tests/Feature/EInvoice/Verifactu/Models/InvoiceTest.php @@ -2,7 +2,6 @@ namespace Tests\Feature\EInvoice\Verifactu\Models; -use Tests\Feature\EInvoice\Verifactu\Models\BaseModelTest; use App\Services\EDocument\Standards\Verifactu\Models\Cupon; use App\Services\EDocument\Standards\Verifactu\Models\Invoice; use App\Services\EDocument\Standards\Verifactu\Models\Desglose; @@ -12,8 +11,9 @@ use App\Services\EDocument\Standards\Verifactu\Models\SistemaInformatico; use App\Services\EDocument\Standards\Verifactu\Models\PrimerRegistroCadena; use App\Services\EDocument\Standards\Verifactu\Models\PersonaFisicaJuridica; use App\Services\EDocument\Standards\Verifactu\Models\FacturaRectificativa; +use Tests\TestCase; -class InvoiceTest extends BaseModelTest +class InvoiceTest extends TestCase { public function testCreateAndSerializeCompleteInvoice(): void { @@ -1343,4 +1343,55 @@ class InvoiceTest extends BaseModelTest // // Clean up test keys // } + + protected function assertXmlEquals(string $expectedXml, string $actualXml): void + { + $this->assertEquals( + $this->normalizeXml($expectedXml), + $this->normalizeXml($actualXml) + ); + } + + protected function normalizeXml(string $xml): string + { + $doc = new \DOMDocument('1.0'); + $doc->preserveWhiteSpace = false; + $doc->formatOutput = true; + if (!$doc->loadXML($xml)) { + throw new \DOMException('Failed to load XML in normalizeXml'); + } + return $doc->saveXML(); + } + + protected function assertValidatesAgainstXsd(string $xml, string $xsdPath): void + { + try { + $doc = new \DOMDocument(); + $doc->preserveWhiteSpace = false; + $doc->formatOutput = true; + if (!$doc->loadXML($xml, LIBXML_NOBLANKS)) { + throw new \DOMException('Failed to load XML in assertValidatesAgainstXsd'); + } + + libxml_use_internal_errors(true); + $result = $doc->schemaValidate($xsdPath); + if (!$result) { + foreach (libxml_get_errors() as $error) { + } + libxml_clear_errors(); + } + + $this->assertTrue( + $result, + 'XML does not validate against XSD schema' + ); + } catch (\Exception $e) { + throw $e; + } + } + + protected function getTestXsdPath(): string + { + return __DIR__ . '/../schema/SuministroInformacion.xsd'; + } } \ No newline at end of file