validators) { $this->validators = $this->createValidators(); } return $this->validators; } public function validateRecepcionPagos(NodeInterface $comprobante, Asserts $asserts) { $this->asserts = $asserts; // create pago validators array $validators = $this->createValidators(); // register pago validators array into asserts foreach ($validators as $validator) { $validator->registerInAssets($asserts); } // obtain the pago nodes $pagoNodes = $comprobante->searchNodes('cfdi:Complemento', 'pago10:Pagos', 'pago10:Pago'); foreach ($pagoNodes as $index => $pagoNode) { // pass each pago node thru validators foreach ($validators as $validator) { try { if (! $validator->validatePago($pagoNode)) { throw new \Exception( sprintf('The validation of pago %s %s return false', $index, get_class($validator)) ); } } catch (Pagos\DoctoRelacionado\ValidateDoctoException $exception) { $this->setDoctoRelacionadoStatus( $exception->getValidatorCode(), $index, $exception->getIndex(), $exception->getStatus(), $exception->getMessage() ); } catch (Pagos\ValidatePagoException $exception) { $this->setPagoStatus( $validator->getCode(), $index, $exception->getStatus(), $exception->getMessage() ); } } } } private function setPagoStatus(string $code, int $index, Status $errorStatus, string $explanation = '') { $assert = $this->asserts->get($code); $assert->setStatus($errorStatus); $this->asserts->put( sprintf('%s-%02d', $assert->getCode(), $index), $assert->getTitle(), $errorStatus, $explanation ); } private function setDoctoRelacionadoStatus( string $code, int $pagoIndex, int $doctoIndex, Status $errorStatus, string $explanation = '' ) { $assert = $this->asserts->get($code); $doctoCode = sprintf('%s-%02d-%02d', $assert->getCode(), $pagoIndex, $doctoIndex); $this->setPagoStatus($code, $pagoIndex, $errorStatus); $this->asserts->put( $doctoCode, $assert->getTitle(), $errorStatus, $explanation ); } }