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