diff --git a/src/Sii/Dte/Documento/Builder/AbstractDocumentoBuilder.php b/src/Sii/Dte/Documento/Builder/AbstractDocumentoBuilder.php index 483bdab6..d292258c 100644 --- a/src/Sii/Dte/Documento/Builder/AbstractDocumentoBuilder.php +++ b/src/Sii/Dte/Documento/Builder/AbstractDocumentoBuilder.php @@ -31,6 +31,7 @@ use libredte\lib\Core\Sii\Dte\Documento\DocumentoTipo; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoNormalizer; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoSanitizer; +use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoValidator; use libredte\lib\Core\Sii\Dte\Documento\Normalization\UtilsTrait; /** @@ -78,6 +79,13 @@ abstract class AbstractDocumentoBuilder */ private DocumentoSanitizer $sanitizer; + /** + * Validador de datos del documento a construir. + * + * @var DocumentoValidator + */ + private DocumentoValidator $validator; + /** * Repositorio de impuestos adicionales. * @@ -110,12 +118,14 @@ public function __construct(?DataProviderInterface $dataProvider = null) // Obtener el tipo de documento tributario. $this->tipoDocumento = $this->documentoBaseForNewBuilds->getTipo(); - // Crear instancias del normalizador y sanitizador. + // Crear instancias del normalizador, sanitizador y validador de los + // datos de los documentos tributarios electrónicos. $this->normalizer = new DocumentoNormalizer( $this->tipoDocumento, [$this, 'applyDocumentoNormalization'] ); $this->sanitizer = new DocumentoSanitizer(); + $this->validator = new DocumentoValidator(); } /** @@ -140,6 +150,7 @@ public function build(array $data, bool $normalize = true): AbstractDocumento if ($normalize) { $data = $this->normalizer->normalize($data); $data = $this->sanitizer->sanitize($data); + $this->validator->validate($data); } // Crear el documento tributario y asignar sus datos. diff --git a/src/Sii/Dte/Documento/Normalization/DocumentoNormalizer.php b/src/Sii/Dte/Documento/Normalization/DocumentoNormalizer.php index f81db8aa..34f07e99 100644 --- a/src/Sii/Dte/Documento/Normalization/DocumentoNormalizer.php +++ b/src/Sii/Dte/Documento/Normalization/DocumentoNormalizer.php @@ -51,7 +51,11 @@ class DocumentoNormalizer private DocumentoTipo $tipoDocumento; /** - * Undocumented variable + * Callback con el método principal (de entrada) para la normalización de un + * cierto tipo de documento. + * + * Este callback, por defecto, se define en cada "DocumentoBuilder" en el + * método applyDocumentoNormalization(). * * @var ?callable */ diff --git a/src/Sii/Dte/Documento/Normalization/DocumentoValidator.php b/src/Sii/Dte/Documento/Normalization/DocumentoValidator.php new file mode 100644 index 00000000..fbbd2cf8 --- /dev/null +++ b/src/Sii/Dte/Documento/Normalization/DocumentoValidator.php @@ -0,0 +1,57 @@ + + * + * Este programa es software libre: usted puede redistribuirlo y/o modificarlo + * bajo los términos de la Licencia Pública General Affero de GNU publicada + * por la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, + * o (a su elección) cualquier versión posterior de la misma. + * + * Este programa se distribuye con la esperanza de que sea útil, pero SIN + * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD + * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública + * General Affero de GNU para obtener una información más detallada. + * + * Debería haber recibido una copia de la Licencia Pública General Affero de + * GNU junto a este programa. + * + * En caso contrario, consulte . + */ + +namespace libredte\lib\Core\Sii\Dte\Documento\Normalization; + +/** + * Clase que maneja la validación de los datos de un documento. + */ +class DocumentoValidator +{ + /** + * Ejecuta la validación de los datos. + * + * @param array $data Arreglo con los datos del documento a validar. + */ + public function validate(array $data): void + { + $this->applyProValidation($data); + } + + /** + * Valida los datos del documento utilizando funcionalidades Pro. + * + * @param array $data Arreglo con los datos del documento a validar. + * @throws DocumentoValidatorException + */ + private function applyProValidation(array $data): void + { + // Validar los datos con las funcionalidades Pro de la biblioteca. + $class = '\libredte\lib\Pro\Sii\Dte\Documento\Normalization\DocumentoValidator'; + if (class_exists($class)) { + $validator = $class::create($this); + $validator->validate($data); + } + } +} diff --git a/tests/src/Functional/Sii/Dte/Documento/CrearSobreEnvioAmbienteCertificacionTest.php b/tests/src/Functional/Sii/Dte/Documento/CrearSobreEnvioAmbienteCertificacionTest.php index 8419f7a3..4a6b8193 100644 --- a/tests/src/Functional/Sii/Dte/Documento/CrearSobreEnvioAmbienteCertificacionTest.php +++ b/tests/src/Functional/Sii/Dte/Documento/CrearSobreEnvioAmbienteCertificacionTest.php @@ -45,6 +45,7 @@ use libredte\lib\Core\Sii\Dte\Documento\DocumentoTipo; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoNormalizer; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoSanitizer; +use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoValidator; use libredte\lib\Core\Sii\Dte\Documento\SobreEnvio; use libredte\lib\Core\Xml\XmlConverter; use libredte\lib\Core\Xml\XmlDocument; @@ -75,6 +76,7 @@ #[CoversClass(DocumentoTipo::class)] #[CoversClass(DocumentoNormalizer::class)] #[CoversClass(DocumentoSanitizer::class)] +#[CoversClass(DocumentoValidator::class)] #[CoversClass(XmlConverter::class)] #[CoversClass(XmlDocument::class)] #[CoversClass(XmlUtils::class)] diff --git a/tests/src/Functional/Sii/Dte/Documento/CrearSobreEnvioDocumentosOkTest.php b/tests/src/Functional/Sii/Dte/Documento/CrearSobreEnvioDocumentosOkTest.php index e53fa559..a934f55d 100644 --- a/tests/src/Functional/Sii/Dte/Documento/CrearSobreEnvioDocumentosOkTest.php +++ b/tests/src/Functional/Sii/Dte/Documento/CrearSobreEnvioDocumentosOkTest.php @@ -57,6 +57,7 @@ use libredte\lib\Core\Sii\Dte\Documento\DocumentoTipo; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoNormalizer; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoSanitizer; +use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoValidator; use libredte\lib\Core\Sii\Dte\Documento\SobreEnvio; use libredte\lib\Core\Xml\XmlConverter; use libredte\lib\Core\Xml\XmlDecoder; @@ -101,6 +102,7 @@ #[CoversClass(DocumentoTipo::class)] #[CoversClass(DocumentoNormalizer::class)] #[CoversClass(DocumentoSanitizer::class)] +#[CoversClass(DocumentoValidator::class)] #[CoversClass(SobreEnvio::class)] #[CoversClass(XmlConverter::class)] #[CoversClass(XmlDecoder::class)] diff --git a/tests/src/Functional/Sii/Dte/Documento/DocumentoFactoryTest.php b/tests/src/Functional/Sii/Dte/Documento/DocumentoFactoryTest.php index 727fd50a..7c1011ca 100644 --- a/tests/src/Functional/Sii/Dte/Documento/DocumentoFactoryTest.php +++ b/tests/src/Functional/Sii/Dte/Documento/DocumentoFactoryTest.php @@ -37,6 +37,7 @@ use libredte\lib\Core\Sii\Dte\Documento\DocumentoTipo; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoNormalizer; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoSanitizer; +use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoValidator; use libredte\lib\Core\Sii\Dte\Documento\Parser\DocumentoParser; use libredte\lib\Core\Sii\Dte\Documento\Parser\Sii\JsonParser; use libredte\lib\Core\Sii\Dte\Documento\Parser\Sii\XmlParser; @@ -59,6 +60,7 @@ #[CoversClass(DocumentoTipo::class)] #[CoversClass(DocumentoNormalizer::class)] #[CoversClass(DocumentoSanitizer::class)] +#[CoversClass(DocumentoValidator::class)] #[CoversClass(DocumentoParser::class)] #[CoversClass(JsonParser::class)] #[CoversClass(XmlParser::class)] diff --git a/tests/src/Functional/Sii/Dte/Documento/DocumentoParserTest.php b/tests/src/Functional/Sii/Dte/Documento/DocumentoParserTest.php index 8712365d..fd6ebc2e 100644 --- a/tests/src/Functional/Sii/Dte/Documento/DocumentoParserTest.php +++ b/tests/src/Functional/Sii/Dte/Documento/DocumentoParserTest.php @@ -46,6 +46,7 @@ use libredte\lib\Core\Sii\Dte\Documento\DocumentoTipo; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoNormalizer; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoSanitizer; +use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoValidator; use libredte\lib\Core\Sii\Dte\Documento\Parser\DocumentoParser; use libredte\lib\Core\Sii\Dte\Documento\Parser\Sii\JsonParser; use libredte\lib\Core\Sii\Dte\Documento\Parser\Sii\XmlParser; @@ -85,6 +86,7 @@ #[CoversClass(DocumentoTipo::class)] #[CoversClass(DocumentoNormalizer::class)] #[CoversClass(DocumentoSanitizer::class)] +#[CoversClass(DocumentoValidator::class)] #[CoversClass(DocumentoParser::class)] #[CoversClass(JsonParser::class)] #[CoversClass(XmlParser::class)] diff --git a/tests/src/Functional/Sii/Dte/Documento/EmitirIndividualmenteDocumentosOkTest.php b/tests/src/Functional/Sii/Dte/Documento/EmitirIndividualmenteDocumentosOkTest.php index 712cb054..6a70812c 100644 --- a/tests/src/Functional/Sii/Dte/Documento/EmitirIndividualmenteDocumentosOkTest.php +++ b/tests/src/Functional/Sii/Dte/Documento/EmitirIndividualmenteDocumentosOkTest.php @@ -57,6 +57,7 @@ use libredte\lib\Core\Sii\Dte\Documento\DocumentoTipo; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoNormalizer; use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoSanitizer; +use libredte\lib\Core\Sii\Dte\Documento\Normalization\DocumentoValidator; use libredte\lib\Core\Sii\Dte\Documento\Renderer\AbstractRenderer; use libredte\lib\Core\Sii\Dte\Documento\Renderer\DocumentoRenderer; use libredte\lib\Core\Xml\XmlConverter; @@ -103,6 +104,7 @@ #[CoversClass(DocumentoTipo::class)] #[CoversClass(DocumentoNormalizer::class)] #[CoversClass(DocumentoSanitizer::class)] +#[CoversClass(DocumentoValidator::class)] #[CoversClass(DocumentoRenderer::class)] #[CoversClass(AbstractRenderer::class)] #[CoversClass(XmlConverter::class)]