{"version":3,"file":"cfdi-validator.cjs","sources":["../../src/traits/xml-string-property-trait.ts","../../src/status.ts","../../src/common/sello-digital-certificado-validator-trait.ts","../../src/common/timbre-fiscal-digital-sello-validator-trait.ts","../../src/common/timbre-fiscal-digital-version-validator-trait.ts","../../src/xml/xml-follow-schema.ts","../../src/cfdi33/abstracts/abstract-version33.ts","../../src/cfdi33/abstracts/abstract-recepcion-pagos10.ts","../../src/cfdi33/abstracts/abstract-discoverable-version33.ts","../../src/cfdi40/abstracts/abstract-version40.ts","../../src/cfdi40/abstracts/abstract-discoverable-version40.ts","../../src/cfdi33/standard/comprobante-decimales-moneda.ts","../../src/cfdi33/standard/comprobante-descuento.ts","../../src/cfdi33/standard/comprobante-forma-pago.ts","../../src/cfdi33/standard/comprobante-impuestos.ts","../../src/cfdi33/standard/comprobante-tipo-cambio.ts","../../src/cfdi33/standard/comprobante-tipo-de-comprobante.ts","../../src/cfdi33/standard/comprobante-total.ts","../../src/cfdi33/standard/concepto-descuento.ts","../../src/cfdi33/standard/concepto-impuestos.ts","../../src/cfdi33/standard/emisor-regimen-fiscal.ts","../../src/cfdi33/standard/emisor-rfc.ts","../../src/cfdi33/utils/assert-fecha-format.ts","../../src/cfdi33/standard/fecha-comprobante.ts","../../src/cfdi33/standard/receptor-residencia-fiscal.ts","../../src/cfdi33/standard/receptor-rfc.ts","../../src/cfdi33/standard/sello-digital-certificado.ts","../../src/cfdi33/standard/timbre-fiscal-digital-sello.ts","../../src/cfdi33/standard/timbre-fiscal-digital-version.ts","../../src/cfdi33/recepcion-pagos/cfdi-relacionados.ts","../../src/cfdi33/recepcion-pagos/complemento-pagos.ts","../../src/cfdi33/recepcion-pagos/comprobante-pagos.ts","../../src/cfdi33/recepcion-pagos/conceptos.ts","../../src/assert.ts","../../src/asserts.ts","../../src/cfdi33/recepcion-pagos/helpers/forma-pago-entry.ts","../../src/cfdi33/recepcion-pagos/helpers/forma-pago-catalog.ts","../../src/cfdi33/recepcion-pagos/pagos/validate-pago-exception.ts","../../src/cfdi33/recepcion-pagos/pagos/abstract-pago-validator.ts","../../src/cfdi33/recepcion-pagos/pagos/fecha.ts","../../src/cfdi33/recepcion-pagos/pagos/forma-de-pago.ts","../../src/cfdi33/recepcion-pagos/pagos/moneda-pago.ts","../../src/cfdi33/recepcion-pagos/pagos/tipo-cambio-exists.ts","../../src/cfdi33/recepcion-pagos/pagos/tipo-cambio-value.ts","../../src/cfdi33/recepcion-pagos/pagos/monto-greater-than-zero.ts","../../src/cfdi33/recepcion-pagos/pagos/monto-decimals.ts","../../src/cfdi33/recepcion-pagos/helpers/calculate-document-amount-trait.ts","../../src/cfdi33/recepcion-pagos/pagos/monto-between-interval-sum-of-documents.ts","../../src/cfdi33/recepcion-pagos/pagos/banco-ordenante-rfc-correcto.ts","../../src/cfdi33/recepcion-pagos/pagos/banco-ordenante-nombre-requerido.ts","../../src/cfdi33/recepcion-pagos/pagos/banco-ordenante-rfc-prohibido.ts","../../src/cfdi33/recepcion-pagos/pagos/cuenta-ordenante-prohibida.ts","../../src/cfdi33/recepcion-pagos/pagos/cuenta-ordenante-patron.ts","../../src/cfdi33/recepcion-pagos/pagos/banco-beneficiario-rfc-correcto.ts","../../src/cfdi33/recepcion-pagos/pagos/banco-beneficiario-rfc-prohibido.ts","../../src/cfdi33/recepcion-pagos/pagos/cuenta-beneficiaria-prohibida.ts","../../src/cfdi33/recepcion-pagos/pagos/cuenta-beneficiaria-patron.ts","../../src/cfdi33/recepcion-pagos/pagos/tipo-cadena-pago-prohibido.ts","../../src/cfdi33/recepcion-pagos/pagos/tipo-cadena-pago-certificado.ts","../../src/cfdi33/recepcion-pagos/pagos/tipo-cadena-pago-cadena.ts","../../src/cfdi33/recepcion-pagos/pagos/tipo-cadena-pago-sello.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/validate-docto-exception.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/abstract-docto-relacionado-validator.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/moneda.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/tipo-cambio-requerido.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/tipo-cambio-valor.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/importe-saldo-anterior-valor.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/importe-pagado-valor.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/importe-saldo-insoluto-valor.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/importes-decimales.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/importe-pagado-requerido.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/numero-parcialidad-requerido.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/importe-saldo-anterior-requerido.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado/importe-saldo-insoluto-requerido.ts","../../src/cfdi33/recepcion-pagos/pagos/docto-relacionado.ts","../../src/cfdi33/recepcion-pagos/pagos/monto-greater-or-equal-than-sum-of-documents.ts","../../src/cfdi33/recepcion-pagos/pago.ts","../../src/cfdi33/recepcion-pagos/pagos.ts","../../src/cfdi33/recepcion-pagos/uso-cfdi.ts","../../src/cfdi40/standard/sello-digital-certificado.ts","../../src/cfdi40/standard/timbre-fiscal-digital-sello.ts","../../src/cfdi40/standard/timbre-fiscal-digital-version.ts","../../src/hydrater.ts","../../src/cfdi-validator-trait.ts","../../src/multi-validator.ts","../../src/cfdi40/xml/xml-definition.ts","../../src/cfdi33/standard/sumas-conceptos-comprobante-impuestos.ts","../../src/multi-validator-factory.ts","../../src/cfdi-validator33.ts","../../src/cfdi-validator40.ts"],"sourcesContent":["export abstract class XmlStringPropertyTrait {\n    private _xmlString = '';\n\n    public setXmlString(xmlString: string): void {\n        this._xmlString = xmlString;\n    }\n\n    public getXmlString(): string {\n        return this._xmlString || '';\n    }\n}\n","export enum StatusLvl {\n    ERROR = 'ERROR',\n    WARNING = 'WARN',\n    NONE = 'NONE',\n    OK = 'OK'\n}\n\nexport class Status {\n    private readonly _status: StatusLvl;\n\n    constructor(value: string) {\n        if (\n            value !== StatusLvl.ERROR &&\n            value !== StatusLvl.WARNING &&\n            value !== StatusLvl.OK &&\n            value !== StatusLvl.NONE\n        ) {\n            throw new SyntaxError('The status is not one of the defined valid constants enum');\n        }\n        this._status = value;\n    }\n\n    public static ok(): Status {\n        return new Status(StatusLvl.OK);\n    }\n\n    public static error(): Status {\n        return new Status(StatusLvl.ERROR);\n    }\n\n    public static warn(): Status {\n        return new Status(StatusLvl.WARNING);\n    }\n\n    public static none(): Status {\n        return new Status(StatusLvl.NONE);\n    }\n\n    public isError(): boolean {\n        return StatusLvl.ERROR === this._status;\n    }\n\n    public isWarning(): boolean {\n        return StatusLvl.WARNING === this._status;\n    }\n\n    public isOk(): boolean {\n        return StatusLvl.OK === this._status;\n    }\n\n    public isNone(): boolean {\n        return StatusLvl.NONE === this._status;\n    }\n\n    public static when(condition: boolean, errorStatus: Status | null = null): Status {\n        return condition ? Status.ok() : errorStatus || Status.error();\n    }\n\n    public equalsTo(status: Status): boolean {\n        return status._status === this._status;\n    }\n\n    public compareTo(status: Status): number {\n        return Math.sign(Status.comparableValue(this) - Status.comparableValue(status));\n    }\n\n    public static comparableValue(status: Status): number {\n        return Object.values(StatusLvl).indexOf(status._status) + 1;\n    }\n\n    public toString = (): string => {\n        return this._status;\n    };\n}\n","import { NodeCertificado, XmlResolverPropertyTrait, XsltBuilderPropertyTrait } from '@nodecfdi/cfdiutils-core';\nimport { Certificate } from '@nodecfdi/credentials';\nimport { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { DateTime } from 'luxon';\nimport { Mixin } from 'ts-mixer';\nimport { XmlStringPropertyTrait } from '../traits/xml-string-property-trait';\nimport { Asserts } from '../asserts';\nimport { Status } from '../status';\n\nabstract class SelloDigitalCertificadoValidatorTrait extends Mixin(\n    XmlResolverPropertyTrait,\n    XmlStringPropertyTrait,\n    XsltBuilderPropertyTrait\n) {\n    private _asserts!: Asserts;\n\n    private _certificado!: Certificate;\n\n    private registerAsserts(): void {\n        const asserts: Record<string, string> = {\n            SELLO01: 'Se puede obtener el certificado del comprobante',\n            SELLO02: 'El número de certificado del comprobante igual al encontrado en el certificado',\n            SELLO03: 'El RFC del comprobante igual al encontrado en el certificado',\n            SELLO04: 'El nombre del emisor del comprobante es igual al encontrado en el certificado',\n            SELLO05: 'La fecha del documento es mayor o igual a la fecha de inicio de vigencia del certificado',\n            SELLO06: 'La fecha del documento menor o igual a la fecha de fin de vigencia del certificado',\n            SELLO07: 'El sello del comprobante está en base 64',\n            SELLO08: 'El sello del comprobante coincide con el certificado y la cadena de origen generada'\n        };\n        Object.entries(asserts).forEach(([code, title]) => {\n            this._asserts.put(code, title);\n        });\n    }\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        this._asserts = asserts;\n        this.registerAsserts();\n\n        // create the certificate\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        const extractor = new NodeCertificado(comprobante);\n        let certificado: Certificate;\n        let version: string;\n        try {\n            certificado = extractor.obtain();\n            version = extractor.getVersion();\n        } catch (e) {\n            this._asserts.putStatus('SELLO01', Status.error(), (e as Error).message);\n\n            return Promise.resolve();\n        }\n        this._certificado = certificado;\n        this._asserts.putStatus('SELLO01', Status.ok());\n\n        // start validations\n        this.validateNoCertificado(comprobante.get('NoCertificado'));\n        const hasRegistroFiscal =\n            comprobante.searchNodes('cfdi:Complemento', 'registrofiscal:CFDIRegistroFiscal').length > 0;\n        const noCertificadoSAT = comprobante.searchAttribute(\n            'cfdi:Complemento',\n            'tfd:TimbreFiscalDigital',\n            'NoCertificadoSAT'\n        );\n        if (!hasRegistroFiscal || comprobante.get('NoCertificado') !== noCertificadoSAT) {\n            // validate emisor rfc\n            this.validateRfc(comprobante.searchAttribute('cfdi:Emisor', 'Rfc'));\n            // validate emisor nombre\n            this.validateNombre(comprobante.searchAttribute('cfdi:Emisor', 'Nombre'));\n        }\n        this.validateFecha(comprobante.get('Fecha'));\n\n        return this.validateSello(comprobante.get('Sello'), version);\n    }\n\n    private async buildCadenaOrigen(version: string): Promise<string> {\n        const xsltLocation = await this.getXmlResolver().resolveCadenaOrigenLocation(version);\n\n        return this.getXsltBuilder().build(this.getXmlString(), xsltLocation);\n    }\n\n    private validateNoCertificado(noCertificado: string): void {\n        const expectedNumber = this._certificado.serialNumber().bytes();\n        this._asserts.putStatus(\n            'SELLO02',\n            Status.when(expectedNumber === noCertificado),\n            `Certificado: ${expectedNumber}, Comprobante: ${noCertificado}`\n        );\n    }\n\n    private validateRfc(emisorRfc: string): void {\n        const expectedRfc = this._certificado.rfc();\n        this._asserts.put(\n            'SELLO03',\n            'El RFC del comprobante igual al encontrado en el certificado',\n            Status.when(expectedRfc === emisorRfc),\n            `Rfc certificado: ${expectedRfc}, Rfc comprobante: ${emisorRfc}`\n        );\n    }\n\n    private validateNombre(emisorNombre: string): void {\n        if ('' === emisorNombre) {\n            return;\n        }\n\n        this._asserts.putStatus(\n            'SELLO04',\n            Status.when(this.compareNames(this._certificado.legalName(), emisorNombre)),\n            `Nombre certificado: ${this._certificado.legalName()}, Nombre comprobante: ${emisorNombre}`\n        );\n    }\n\n    private validateFecha(fechaSource: string): void {\n        const fecha = '' === fechaSource ? 0 : DateTime.fromISO(fechaSource).toMillis();\n        if (0 === fecha) {\n            return;\n        }\n        const validFrom = this._certificado.validFromDateTime();\n        const validTo = this._certificado.validToDateTime();\n        const explanation = `Validez del certificado: ${validFrom.toFormat(\n            'yyyy-LL-dd HH:mm:ss'\n        )} hasta ${validTo.toFormat('yyyy-LL-dd HH:mm:ss')}, Fecha comprobante ${DateTime.fromMillis(fecha).toFormat(\n            'yyyy-LL-dd HH:mm:ss'\n        )}`;\n        this._asserts.putStatus('SELLO05', Status.when(fecha >= validFrom.toMillis()), explanation);\n        this._asserts.putStatus('SELLO06', Status.when(fecha <= validTo.toMillis()), explanation);\n    }\n\n    private async validateSello(selloBase64: string, version: string): Promise<void> {\n        const sello = this.obtainSello(selloBase64);\n        if ('' === sello) {\n            return;\n        }\n        const cadena = await this.buildCadenaOrigen(version);\n        const selloIsValid = this._certificado.publicKey().verify(cadena, Buffer.from(sello, 'binary').toString('hex'));\n        this._asserts.putStatus(\n            'SELLO08',\n            Status.when(selloIsValid),\n            'La verificación del sello del CFDI no coincide, probablemente el CFDI fue alterado o mal generado'\n        );\n    }\n\n    private obtainSello(selloBase64: string): string {\n        let sello: string | boolean;\n        try {\n            sello = Buffer.from(selloBase64, 'base64').toString('binary');\n        } catch (e) {\n            sello = false;\n        }\n        this._asserts.putStatus('SELLO07', Status.when(false !== sello));\n\n        return sello || '';\n    }\n\n    protected compareNames(first: string, second: string): boolean {\n        return this.castNombre(first) === this.castNombre(second);\n    }\n\n    protected castNombre(nombre: string): string {\n        [' ', '-', ',', '.', '#', '&', \"'\", '\"', '~', '¨', '^'].forEach((searchString) => {\n            nombre = nombre.replace(searchString, '');\n        });\n\n        return nombre.toUpperCase();\n    }\n}\n\nexport { SelloDigitalCertificadoValidatorTrait };\n","import {\n    SatCertificateNumber,\n    TfdCadenaDeOrigen,\n    XmlResolver,\n    XmlResolverPropertyTrait,\n    XsltBuilderPropertyTrait\n} from '@nodecfdi/cfdiutils-core';\nimport { CNodeInterface, XmlNodeUtils } from '@nodecfdi/cfdiutils-common';\nimport { Certificate } from '@nodecfdi/credentials';\nimport { cleanupSync, openSync } from 'temp';\nimport { Mixin } from 'ts-mixer';\nimport { Asserts } from '../asserts';\nimport { Status } from '../status';\n\nabstract class TimbreFiscalDigitalSelloValidatorTrait extends Mixin(\n    XmlResolverPropertyTrait,\n    XsltBuilderPropertyTrait\n) {\n    public async validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const assert = asserts.put(\n            'TFDSELLO01',\n            'El sello SAT del Timbre Fiscal Digital corresponde al certificado SAT'\n        );\n\n        if (!this.hasXmlResolver()) {\n            assert.setExplanation('No se puede hacer la validación porque carece de un objeto resolvedor');\n\n            return Promise.resolve();\n        }\n\n        const tfd = comprobante.searchNode('cfdi:Complemento', 'tfd:TimbreFiscalDigital');\n        if (!tfd) {\n            assert.setExplanation('El CFDI no contiene un Timbre Fiscal Digital');\n\n            return Promise.resolve();\n        }\n\n        if ('1.1' !== tfd.get('Version')) {\n            assert.setExplanation('La versión del timbre fiscal digital no es 1.1');\n\n            return Promise.resolve();\n        }\n\n        const validationSellosMatch = comprobante.get('Sello') !== tfd.get('SelloCFD');\n        if (validationSellosMatch) {\n            assert.setStatus(\n                Status.error(),\n                'El atributo SelloCFD del Timbre Fiscal Digital no coincide con el atributo Sello del Comprobante'\n            );\n\n            return Promise.resolve();\n        }\n\n        const certificadoSAT = tfd.get('NoCertificadoSAT');\n        if (!SatCertificateNumber.isValidCertificateNumber(certificadoSAT)) {\n            assert.setStatus(\n                Status.error(),\n                `El atributo NoCertificadoSAT con el valor \"${certificadoSAT}\" no es valido`\n            );\n\n            return Promise.resolve();\n        }\n\n        let certificado: Certificate;\n        const resolver = this.getXmlResolver();\n        try {\n            const certificadoUrl = new SatCertificateNumber(certificadoSAT).remoteUrl();\n            if (!resolver.hasLocalPath()) {\n                const temporaryFile = openSync({ prefix: '.cer' });\n                const certificadoFile = temporaryFile.path;\n                await resolver.getDownloader().downloadTo(certificadoUrl, certificadoFile);\n                certificado = Certificate.openFile(certificadoFile);\n                cleanupSync();\n            } else {\n                const certificadoFile = await resolver.resolve(certificadoUrl, XmlResolver.TYPE_CER);\n                certificado = Certificate.openFile(certificadoFile);\n            }\n        } catch (e) {\n            assert.setStatus(\n                Status.error(),\n                `No se ha podido obtener el certificado ${certificadoSAT}: ${(e as Error).message}`\n            );\n\n            return Promise.resolve();\n        }\n\n        const tfdCadenaOrigen = new TfdCadenaDeOrigen(resolver, this.getXsltBuilder());\n        // fix al parecer no me regresa el namespace xmlns:xsi\n        tfd.set('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');\n        const source = await tfdCadenaOrigen.build(XmlNodeUtils.nodeToXmlString(tfd), tfd.get('Version'));\n        const signature = Buffer.from(tfd.get('SelloSAT'), 'base64').toString('hex');\n\n        const verification = certificado.publicKey().verify(source, signature);\n        if (!verification) {\n            assert.setStatus(\n                Status.error(),\n                [\n                    'La verificación del timbrado fue negativa,',\n                    ' posiblemente el CFDI fue modificado después de general el sello'\n                ].join('')\n            );\n\n            return Promise.resolve();\n        }\n        assert.setStatus(Status.ok());\n\n        return Promise.resolve();\n    }\n}\n\nexport { TimbreFiscalDigitalSelloValidatorTrait };\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { Asserts } from '../asserts';\nimport { Status } from '../status';\n\nexport abstract class TimbreFiscalDigitalVersionValidatorTrait {\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        asserts.put('TFDVERSION01', 'Si existe el complemento timbre fiscal digital, entonces su versión debe ser 1.1');\n\n        const tfdVersion = comprobante.searchNode('cfdi:Complemento', 'tfd:TimbreFiscalDigital');\n        if (tfdVersion) {\n            asserts.putStatus('TFDVERSION01', Status.when('1.1' === tfdVersion.get('Version')));\n        }\n\n        return Promise.resolve();\n    }\n}\n","import { XmlResolverPropertyInterface, XmlResolverPropertyTrait } from '@nodecfdi/cfdiutils-core';\nimport { Schema, Schemas, SchemaValidator } from '@nodecfdi/xml-schema-validator';\nimport { CNodeInterface, XmlNodeUtils } from '@nodecfdi/cfdiutils-common';\nimport { Mixin } from 'ts-mixer';\nimport { existsSync } from 'fs';\nimport { ValidatorInterface } from '../contracts/validator-interface';\nimport { RequireXmlStringInterface } from '../contracts/require-xml-string-interface';\nimport { RequireXmlResolverInterface } from '../contracts/require-xml-resolver-interface';\nimport { XmlStringPropertyTrait } from '../traits/xml-string-property-trait';\nimport { Asserts } from '../asserts';\nimport { Status } from '../status';\n\nclass XmlFollowSchema\n    extends Mixin(XmlStringPropertyTrait, XmlResolverPropertyTrait)\n    implements ValidatorInterface, XmlResolverPropertyInterface, RequireXmlStringInterface, RequireXmlResolverInterface\n{\n    public canValidateCfdiVersion(_version: string): boolean {\n        return true;\n    }\n\n    public async validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const assert = asserts.put('XSD01', 'El contenido XML sigue los esquemas XSD');\n\n        // obtain content\n        let content = this.getXmlString();\n        if ('' === content) {\n            content = XmlNodeUtils.nodeToXmlString(comprobante);\n        }\n\n        // create the schema validator object\n        const schemaValidator = SchemaValidator.createFromString(content);\n\n        // validate using resolver->retriever or using the simple method\n        try {\n            let schemas = schemaValidator.buildSchemas();\n            if (this.hasXmlResolver() && this.getXmlResolver().hasLocalPath()) {\n                schemas = await this.changeSchemasUsingRetriever(schemas);\n            }\n            schemaValidator.validateWithSchemas(schemas);\n        } catch (e) {\n            assert.setStatus(Status.error(), (e as Error).message);\n            asserts.mustStop(true);\n\n            return Promise.resolve();\n        }\n\n        // set final status\n        assert.setStatus(Status.ok());\n\n        return Promise.resolve();\n    }\n\n    private async changeSchemasUsingRetriever(schemas: Schemas): Promise<Schemas> {\n        // obtain the retriever, throw its own exception if non set\n        const retriever = this.getXmlResolver().newXsdRetriever();\n\n        // replace the schemas locations with the retrieved local path\n        for (const schema of schemas.values()) {\n            const location = schema.getLocation();\n            const localPath = retriever.buildPath(location);\n            if (!existsSync(localPath)) {\n                await retriever.retrieve(location);\n            }\n            // this call will change the value, not insert a new entry\n            schemas.insert(new Schema(schema.getNamespace(), localPath));\n        }\n\n        return Promise.resolve(schemas);\n    }\n}\n\nexport { XmlFollowSchema };\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { ValidatorInterface } from '../../contracts/validator-interface';\nimport { Asserts } from '../../asserts';\n\nexport abstract class AbstractVersion33 implements ValidatorInterface {\n    public abstract validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void>;\n\n    public canValidateCfdiVersion(version: string): boolean {\n        return '3.3' === version;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractVersion33 } from './abstract-version33';\nimport { Asserts } from '../../asserts';\n\nexport abstract class AbstractRecepcionPagos10 extends AbstractVersion33 {\n    public abstract validateRecepcionPagos(comprobante: CNodeInterface, asserts: Asserts): Promise<void>;\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        // do not run anything if not found\n        const pagos10 = comprobante.searchNode('cfdi:Complemento', 'pago10:Pagos');\n        if (\n            '3.3' !== comprobante.get('Version') ||\n            'P' !== comprobante.get('TipoDeComprobante') ||\n            !pagos10 ||\n            '1.0' !== pagos10.get('Version')\n        ) {\n            return Promise.resolve();\n        }\n\n        return this.validateRecepcionPagos(comprobante, asserts);\n    }\n}\n","import { AbstractVersion33 } from './abstract-version33';\n\nexport abstract class AbstractDiscoverableVersion33 extends AbstractVersion33 {}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { ValidatorInterface } from '../../contracts/validator-interface';\nimport { Asserts } from '../../asserts';\n\nexport abstract class AbstractVersion40 implements ValidatorInterface {\n    public abstract validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void>;\n\n    public canValidateCfdiVersion(version: string): boolean {\n        return '4.0' === version;\n    }\n}\n","import { AbstractVersion40 } from './abstract-version40';\n\nexport abstract class AbstractDiscoverableVersion40 extends AbstractVersion40 {}\n","import { CNodeInterface, CurrencyDecimals } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Assert } from '../../assert';\nimport { Status } from '../../status';\n\n/**\n * ComprobanteDecimalesMoneda\n *\n * Válida que:\n * - MONDEC01: El subtotal del comprobante no contiene más de los decimales de la moneda (CFDI33106)\n * - MONDEC02: El descuento del comprobante no contiene más de los decimales de la moneda (CFDI33111)\n * - MONDEC03: El total del comprobante no contiene más de los decimales de la moneda\n * - MONDEC04: El total de impuestos trasladados no contiene más de los decimales de la moneda (CFDI33182)\n * - MONDEC05: El total de impuestos retenidos no contiene más de los decimales de la moneda (CFDI33180)\n */\nexport class ComprobanteDecimalesMoneda extends AbstractDiscoverableVersion33 {\n    private _asserts!: Asserts;\n\n    private _currency!: CurrencyDecimals;\n\n    private registerAsserts(): void {\n        const asserts: Record<string, string> = {\n            MONDEC01: 'El subtotal del comprobante no contiene más de los decimales de la moneda (CFDI33106)',\n            MONDEC02: 'El descuento del comprobante no contiene más de los decimales de la moneda (CFDI33111)',\n            MONDEC03: 'El total del comprobante no contiene más de los decimales de la moneda',\n            MONDEC04: 'El total de impuestos trasladados no contiene más de los decimales de la moneda (CFDI33182)',\n            MONDEC05: 'El total de impuestos retenidos no contiene más de los decimales de la moneda (CFDI33180)'\n        };\n        Object.entries(asserts).forEach(([code, title]) => {\n            this._asserts.put(code, title);\n        });\n    }\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        this._asserts = asserts;\n        this.registerAsserts();\n\n        try {\n            this._currency = CurrencyDecimals.newFromKnownCurrencies(comprobante.get('Moneda'));\n        } catch (e) {\n            this._asserts.get('MONDEC01').setExplanation((e as Error).message);\n\n            return Promise.resolve();\n        }\n\n        // SubTotal, Descuento, Total\n        this.validateValue('MONDEC01', comprobante, 'SubTotal', true);\n        this.validateValue('MONDEC02', comprobante, 'Descuento');\n        this.validateValue('MONDEC03', comprobante, 'Total', true);\n\n        const impuestos = comprobante.searchNode('cfdi:Impuestos');\n        if (impuestos) {\n            this.validateValue('MONDEC04', impuestos, 'TotalImpuestosTrasladados');\n            this.validateValue('MONDEC05', impuestos, 'TotalImpuestosRetenidos');\n        }\n\n        return Promise.resolve();\n    }\n\n    private validateValue(code: string, node: CNodeInterface, attribute: string, required = false): Assert {\n        return this._asserts.putStatus(\n            code,\n            Status.when(this.checkValue(node, attribute, required)),\n            `Valor: \"${node.get(\n                attribute\n            )}\", Moneda: \"${this._currency.currency()}\" - ${this._currency.decimals()} decimales`\n        );\n    }\n\n    private checkValue(node: CNodeInterface, attribute: string, required: boolean): boolean {\n        if (required && !node.offsetExists(attribute)) {\n            return false;\n        }\n\n        return this._currency.doesNotExceedDecimals(node.get(attribute));\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ComprobanteDescuento\n *\n * Válida que:\n * - DESCUENTO01: Si existe el atributo descuento, entonces debe ser menor o igual que el subtotal\n *                 y mayor o igual que cero (CFDI33109)\n */\nexport class ComprobanteDescuento extends AbstractDiscoverableVersion33 {\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        asserts.put(\n            'DESCUENTO01',\n            [\n                'Si existe el atributo descuento,',\n                ' entonces debe ser menor o igual que el subtotal y mayor o igual que cero (CFDI33109)'\n            ].join('')\n        );\n        if (comprobante.offsetExists('Descuento')) {\n            const descuento = parseFloat(comprobante.get('Descuento') || '0');\n            const subtotal = parseFloat(comprobante.get('SubTotal') || '0');\n            asserts.putStatus(\n                'DESCUENTO01',\n                Status.when('' !== comprobante.get('Descuento') && descuento >= 0 && descuento <= subtotal),\n                `Descuento: \"${comprobante.get('Descuento')}\", SubTotal: \"${comprobante.get('SubTotal')}\"`\n            );\n        }\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ComprobanteFormaPago\n *\n * Válida que:\n * - FORMAPAGO01: El campo forma de pago no debe existir cuando existe el complemento para recepción de pagos\n *                (CFDI33103)\n */\nexport class ComprobanteFormaPago extends AbstractDiscoverableVersion33 {\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const assert = asserts.put(\n            'FORMAPAGO01',\n            'El campo forma de pago no debe existir cuando existe el complemento para recepción de pagos (CFDI33103)',\n            Status.none()\n        );\n\n        const existsComplementoPagos = undefined !== comprobante.searchNode('cfdi:Complemento', 'pago10:Pagos');\n        if (existsComplementoPagos) {\n            const existsFormaPago = comprobante.offsetExists('FormaPago');\n            assert.setStatus(Status.when(!existsFormaPago));\n        }\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ConceptoImpuestos\n *\n * Válida que:\n * - COMPIMPUESTOSC01: Si existe el nodo impuestos entonces debe incluir el total de traslados\n *                     y/o el total de retenciones\n * - COMPIMPUESTOSC02: Si existe al menos un traslado entonces debe existir el total de traslados\n * - COMPIMPUESTOSC03: Si existe al menos una retención entonces debe existir el total de retenciones\n */\nexport class ComprobanteImpuestos extends AbstractDiscoverableVersion33 {\n    private registerAsserts(asserts: Asserts): void {\n        const assertDescriptions: Record<string, string> = {\n            COMPIMPUESTOSC01: [\n                'Si existe el nodo impuestos entonces debe incluir el total de traslados y/o',\n                ' el total de retenciones'\n            ].join(''),\n            COMPIMPUESTOSC02: 'Si existe al menos un traslado entonces debe existir el total de traslados',\n            COMPIMPUESTOSC03: 'Si existe al menos una retención entonces debe existir el total de retenciones'\n        };\n        Object.entries(assertDescriptions).forEach(([code, title]) => {\n            asserts.put(code, title);\n        });\n    }\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        this.registerAsserts(asserts);\n\n        const nodeImpuestos = comprobante.searchNode('cfdi:Impuestos');\n        if (!nodeImpuestos) {\n            return Promise.resolve();\n        }\n\n        const existsTotalTrasladados = nodeImpuestos.offsetExists('TotalImpuestosTrasladados');\n        const existsTotalRetenidos = nodeImpuestos.offsetExists('TotalImpuestosRetenidos');\n\n        asserts.putStatus('COMPIMPUESTOSC01', Status.when(existsTotalTrasladados || existsTotalRetenidos));\n\n        const hasTraslados = !!nodeImpuestos.searchNode('cfdi:Traslados', 'cfdi:Traslado');\n        asserts.putStatus('COMPIMPUESTOSC02', Status.when(!(hasTraslados && !existsTotalTrasladados)));\n\n        const hasRetenciones = !!nodeImpuestos.searchNode('cfdi:Retenciones', 'cfdi:Retencion');\n        asserts.putStatus('COMPIMPUESTOSC03', Status.when(!(hasRetenciones && !existsTotalRetenidos)));\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ComprobanteTipoCambio\n *\n * Válida que:\n * - TIPOCAMBIO01: La moneda exista y no tenga un valor vacío\n * - TIPOCAMBIO02: Si la moneda es \"MXN\", entonces el tipo de cambio debe tener el valor \"1\"\n *                 o no debe existir (CFDI33113)\n * - TIPOCAMBIO03: Si la moneda es \"XXX\", entonces el tipo de cambio no debe existir (CFDI33115)\n * - TIPOCAMBIO04: Si la moneda no es \"MXN\" ni \"XXX\", entonces el tipo de cambio entonces\n *                 el tipo de cambio debe seguir el patrón [0-9]\\{1,18\\}(.[0-9]\\{1,6\\})? (CFDI33114, CFDI33117)\n */\nexport class ComprobanteTipoCambio extends AbstractDiscoverableVersion33 {\n    private registerAssets(asserts: Asserts): void {\n        const assertDescriptions: Record<string, string> = {\n            TIPOCAMBIO01: 'La moneda exista y no tenga un valor vacío',\n            TIPOCAMBIO02: [\n                'Si la moneda es \"MXN\", entonces el tipo de cambio debe tener el valor \"1\"',\n                ' o no debe existir (CFDI33113)'\n            ].join(''),\n            TIPOCAMBIO03: 'Si la moneda es \"XXX\", entonces el tipo de cambio no debe existir (CFDI33115)',\n            TIPOCAMBIO04: [\n                'Si la moneda no es \"MXN\" ni \"XXX\", entonces el tipo de cambio',\n                ' debe seguir el patrón [0-9]{1,18}(.[0-9]{1,6}?) (CFDI33114, CFDI33117)'\n            ].join('')\n        };\n        Object.entries(assertDescriptions).forEach(([code, title]) => {\n            asserts.put(code, title);\n        });\n    }\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        this.registerAssets(asserts);\n\n        const existsTipoCambio = comprobante.offsetExists('TipoCambio');\n        const tipoCambio = comprobante.get('TipoCambio');\n        const moneda = comprobante.get('Moneda');\n\n        asserts.putStatus('TIPOCAMBIO01', Status.when('' !== moneda));\n        if ('' === moneda) {\n            return Promise.resolve();\n        }\n\n        if ('MXN' === moneda) {\n            asserts.putStatus(\n                'TIPOCAMBIO02',\n                Status.when(!existsTipoCambio || Math.abs(parseFloat(tipoCambio || '0') - 1) < 0.0000001)\n            );\n        }\n\n        if ('XXX' === moneda) {\n            asserts.putStatus('TIPOCAMBIO03', Status.when(!existsTipoCambio));\n        }\n\n        if ('MXN' !== moneda && 'XXX' !== moneda) {\n            const pattern = /^\\d{1,18}(\\.\\d{1,6})?$/;\n            asserts.putStatus('TIPOCAMBIO04', Status.when(!!tipoCambio.match(pattern)));\n        }\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ComprobanteTipoDeComprobante\n *\n * Válida que:\n * - TIPOCOMP01: Si el tipo de comprobante es T, P ó N, entonces no debe existir las condiciones de pago\n * - TIPOCOMP02: Si el tipo de comprobante es T, P ó N, entonces no debe existir la definición de impuestos (CFDI33179)\n * - TIPOCOMP03: Si el tipo de comprobante es T ó P, entonces no debe existir la forma de pago\n * - TIPOCOMP04: Si el tipo de comprobante es T ó P, entonces no debe existir el método de pago (CFDI33123)\n * - TIPOCOMP05: Si el tipo de comprobante es T ó P, entonces no debe existir el descuento del comprobante (CFDI33110)\n * - TIPOCOMP06: Si el tipo de comprobante es T ó P, entonces no debe existir el descuento de los conceptos (CFDI33179)\n * - TIPOCOMP07: Si el tipo de comprobante es T ó P, entonces el subtotal debe ser cero (CFDI33108)\n * - TIPOCOMP08: Si el tipo de comprobante es T ó P, entonces el total debe ser cero\n * - TIPOCOMP09: Si el tipo de comprobante es I, E ó N, entonces el valor unitario de todos los conceptos\n *               debe ser mayor que cero\n * - TIPOCOMP010: Si el tipo de comprobante es N, entonces la moneda debe ser MXN\n */\nexport class ComprobanteTipoDeComprobante extends AbstractDiscoverableVersion33 {\n    private registerAsserts(asserts: Asserts): void {\n        const assertsDescriptions: Record<string, string> = {\n            TIPOCOMP01: [\n                'Si el tipo de comprobante es T, P ó N,',\n                ' entonces no debe existir las condiciones de pago'\n            ].join(''),\n            TIPOCOMP02: [\n                'Si el tipo de comprobante es T, P ó N,',\n                ' entonces no debe existir la definición de impuestos (CFDI33179)'\n            ].join(''),\n            TIPOCOMP03: 'Si el tipo de comprobante es T ó P, entonces no debe existir la forma de pago',\n\n            TIPOCOMP04: [\n                'Si el tipo de comprobante es T ó P,',\n                ' entonces no debe existir el método de pago (CFDI33123)'\n            ].join(''),\n            TIPOCOMP05: [\n                'Si el tipo de comprobante es T ó P,',\n                ' entonces no debe existir el descuento del comprobante (CFDI33110)'\n            ].join(''),\n            TIPOCOMP06: [\n                'Si el tipo de comprobante es T ó P,',\n                ' entonces no debe existir el descuento de los conceptos (CFDI33179)'\n            ].join(''),\n            TIPOCOMP07: 'Si el tipo de comprobante es T ó P, entonces el subtotal debe ser cero (CFDI33108)',\n            TIPOCOMP08: 'Si el tipo de comprobante es T ó P entonces el total debe ser cero',\n\n            TIPOCOMP09: [\n                'Si el tipo de comprobante es I, E ó N,',\n                ' entonces el valor unitario de todos los conceptos debe ser mayor que cero'\n            ].join(''),\n\n            TIPOCOMP10: 'Si el tipo de comprobante es N entonces, la moneda debe ser MXN'\n        };\n        Object.entries(assertsDescriptions).forEach(([code, title]) => {\n            asserts.put(code, title);\n        });\n    }\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        this.registerAsserts(asserts);\n\n        const tipoComprobante = comprobante.get('TipoDeComprobante');\n\n        if ('T' === tipoComprobante || 'P' === tipoComprobante || 'N' === tipoComprobante) {\n            asserts.putStatus('TIPOCOMP01', Status.when(!comprobante.offsetExists('CondicionesDePago')));\n            asserts.putStatus('TIPOCOMP02', Status.when(!comprobante.searchNode('cfdi:Impuestos')));\n        }\n\n        if ('T' === tipoComprobante || 'P' === tipoComprobante) {\n            asserts.putStatus('TIPOCOMP03', Status.when(!comprobante.offsetExists('FormaPago')));\n            asserts.putStatus('TIPOCOMP04', Status.when(!comprobante.offsetExists('MetodoPago')));\n            asserts.putStatus('TIPOCOMP05', Status.when(!comprobante.offsetExists('Descuento')));\n            asserts.putStatus('TIPOCOMP06', Status.when(this.checkConceptosDoesNotHaveDescuento(comprobante)));\n            asserts.putStatus('TIPOCOMP07', Status.when(this.isZero(comprobante.get('SubTotal'))));\n            asserts.putStatus('TIPOCOMP08', Status.when(this.isZero(comprobante.get('Total'))));\n        }\n\n        if ('I' === tipoComprobante || 'E' === tipoComprobante || 'N' === tipoComprobante) {\n            asserts.putStatus(\n                'TIPOCOMP09',\n                Status.when(this.checkConceptosValorUnitarioIsGreaterThanZero(comprobante))\n            );\n        }\n\n        if ('N' === tipoComprobante) {\n            asserts.putStatus('TIPOCOMP10', Status.when('MXN' === comprobante.get('Moneda')));\n        }\n\n        return Promise.resolve();\n    }\n\n    protected checkConceptosDoesNotHaveDescuento(comprobante: CNodeInterface): boolean {\n        for (const concepto of comprobante.searchNodes('cfdi:Conceptos', 'cfdi:Concepto')) {\n            if (concepto.offsetExists('Descuento')) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    protected checkConceptosValorUnitarioIsGreaterThanZero(comprobante: CNodeInterface): boolean {\n        for (const concepto of comprobante.searchNodes('cfdi:Conceptos', 'cfdi:Concepto')) {\n            if (!this.isGreaterThanZero(concepto.get('ValorUnitario'))) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    protected isZero(value = ''): boolean {\n        if ('' === value || isNaN(Number(value))) {\n            return false;\n        }\n\n        return Math.abs(parseFloat(value)) < 0.0000001;\n    }\n\n    protected isGreaterThanZero(value = ''): boolean {\n        if ('' === value || isNaN(Number(value))) {\n            return false;\n        }\n\n        return Math.abs(parseFloat(value)) > 0.0000001;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ComprobanteTotal\n *\n * Válida que:\n * - TOTAL01: El atributo Total existe, no está vacío y cumple con el patrón [0-9]+(.[0-9]+)?\n */\nexport class ComprobanteTotal extends AbstractDiscoverableVersion33 {\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const pattern = /^\\d+(\\.\\d+)?$/;\n        asserts.put(\n            'TOTAL01',\n            'El atributo Total existe, no está vacío y cumple con el patrón [0-9]+(.[0-9]+)?',\n            Status.when('' !== comprobante.get('Total') && !!comprobante.get('Total').match(pattern))\n        );\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ConceptoDescuento\n *\n * Válida que:\n * - CONCEPDESC01: Si existe el atributo descuento en el concepto,\n *                 entonces debe ser menor o igual que el importe y mayor o igual que cero (CFDI33151)\n */\nexport class ConceptoDescuento extends AbstractDiscoverableVersion33 {\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        asserts.put(\n            'CONCEPDESC01',\n            [\n                'Si existe el atributo descuento en el concepto,',\n                ' entonces debe ser menor o igual que el importe y mayor o igual que cero (CFDI33151)'\n            ].join('')\n        );\n        let checked = 0;\n        comprobante.searchNodes('cfdi:Conceptos', 'cfdi:Concepto').forEach((concepto, i) => {\n            checked = checked + 1;\n            if (this.conceptoHasInvalidDiscount(concepto)) {\n                const explanation = `Concepto #${i}, Descuento: \"${concepto.get(\n                    'Descuento'\n                )}\", Importe: \"${concepto.get('Importe')}\"`;\n                asserts.putStatus('CONCEPDESC01', Status.error(), explanation);\n            }\n        });\n        if (checked > 0 && asserts.get('CONCEPDESC01').getStatus().isNone()) {\n            asserts.putStatus('CONCEPDESC01', Status.ok(), `Revisados ${checked} conceptos`);\n        }\n\n        return Promise.resolve();\n    }\n\n    public conceptoHasInvalidDiscount(concepto: CNodeInterface): boolean {\n        if (!concepto.offsetExists('Descuento')) {\n            return false;\n        }\n        const descuento = parseFloat(concepto.get('Descuento') || '0');\n        const importe = parseFloat(concepto.get('Importe') || '0');\n\n        return !(descuento >= 0 && descuento <= importe);\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ConceptoImpuestos\n *\n * Válida que:\n * - CONCEPIMPC01: El nodo impuestos de un concepto debe incluir traslados y/o retenciones (CFDI33152)\n * - CONCEPIMPC02: Los traslados de los impuestos de un concepto deben tener una base y ser mayor a cero (CFDI33154)\n * - CONCEPIMPC03: No se debe registrar la tasa o cuota ni el importe cuando\n *                 el tipo de factor de traslado es exento (CFDI33157)\n * - CONCEPIMPC04: Se debe registrar la tasa o cuota y el importe cuando\n *                 el tipo de factor de traslado es tasa o cuota (CFDI33158)\n * - CONCEPIMPC05: Las retenciones de los impuestos de un concepto deben tener una base y ser mayor a cero (CFDI33154)\n * - CONCEPIMPC06: Las retenciones de los impuestos de un concepto deben tener\n *                 un tipo de factor diferente de exento (CFDI33166)\n */\nexport class ConceptoImpuestos extends AbstractDiscoverableVersion33 {\n    private registerAsserts(asserts: Asserts): void {\n        const assertsDescriptions: Record<string, string> = {\n            CONCEPIMPC01: 'El nodo impuestos de un concepto debe incluir traslados y/o retenciones (CFDI33152)',\n            CONCEPIMPC02: [\n                'Los traslados de los impuestos de un concepto deben tener una base y ser mayor a cero',\n                ' (CFDI33154)'\n            ].join(''),\n            CONCEPIMPC03: [\n                'No se debe registrar la tasa o cuota ni el importe cuando el tipo de factor de traslado',\n                ' es exento (CFDI33157)'\n            ].join(''),\n            CONCEPIMPC04: [\n                'Se debe registrar la tasa o cuota y el importe cuando el tipo de factor de traslado',\n                ' es tasa o cuota (CFDI33158)'\n            ].join(''),\n            CONCEPIMPC05: [\n                'Las retenciones de los impuestos de un concepto deben tener una base y ser mayor a cero',\n                '(CFDI33154)'\n            ].join(''),\n            CONCEPIMPC06: [\n                'Las retenciones de los impuestos de un concepto deben tener un tipo de factor diferente',\n                ' de exento (CFDI33166)'\n            ].join('')\n        };\n        Object.entries(assertsDescriptions).forEach(([code, title]) => {\n            asserts.put(code, title);\n        });\n    }\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        this.registerAsserts(asserts);\n\n        let status01 = Status.ok();\n        let status02 = Status.ok();\n        let status03 = Status.ok();\n        let status04 = Status.ok();\n        let status05 = Status.ok();\n        let status06 = Status.ok();\n\n        comprobante.searchNodes('cfdi:Conceptos', 'cfdi:Concepto').forEach((concepto, i) => {\n            if (status01.isOk() && !this.conceptoImpuestosHasTrasladosOrRetenciones(concepto)) {\n                status01 = Status.error();\n                asserts.get('CONCEPIMPC01').setExplanation(`Concepto #${i}`);\n            }\n\n            const traslados = concepto.searchNodes('cfdi:Impuestos', 'cfdi:Traslados', 'cfdi:Traslado');\n            traslados.forEach((traslado, k) => {\n                if (status02.isOk() && !this.impuestoHasBaseGreaterThanZero(traslado)) {\n                    status02 = Status.error();\n                    asserts.get('CONCEPIMPC02').setExplanation(`Concepto #${i}, Traslado #${k}`);\n                }\n                if (status03.isOk() && !this.trasladoHasTipoFactorExento(traslado)) {\n                    status03 = Status.error();\n                    asserts.get('CONCEPIMPC03').setExplanation(`Concepto #${i}, Traslado #${k}`);\n                }\n                if (status04.isOk() && !this.trasladoHasTipoFactorTasaOCuota(traslado)) {\n                    status04 = Status.error();\n                    asserts.get('CONCEPIMPC04').setExplanation(`Concepto #${i}, Traslado #${k}`);\n                }\n            });\n\n            const retenciones = concepto.searchNodes('cfdi:Impuestos', 'cfdi:Retenciones', 'cfdi:Retencion');\n            retenciones.forEach((retencion, j) => {\n                if (status05.isOk() && !this.impuestoHasBaseGreaterThanZero(retencion)) {\n                    status05 = Status.error();\n                    asserts.get('CONCEPIMPC05').setExplanation(`Concepto #${i}, Retención #${j}`);\n                }\n                if (status06.isOk() && 'Exento' === retencion.attributes().get('TipoFactor')) {\n                    status06 = Status.error();\n                    asserts.get('CONCEPIMPC06').setExplanation(`Concepto #${i}, Retención #${j}`);\n                }\n            });\n        });\n\n        asserts.putStatus('CONCEPIMPC01', status01);\n        asserts.putStatus('CONCEPIMPC02', status02);\n        asserts.putStatus('CONCEPIMPC03', status03);\n        asserts.putStatus('CONCEPIMPC04', status04);\n        asserts.putStatus('CONCEPIMPC05', status05);\n        asserts.putStatus('CONCEPIMPC06', status06);\n\n        return Promise.resolve();\n    }\n\n    protected conceptoImpuestosHasTrasladosOrRetenciones(concepto: CNodeInterface): boolean {\n        const impuestos = concepto.searchNode('cfdi:Impuestos');\n        if (!impuestos) {\n            return true;\n        }\n\n        return (\n            impuestos.searchNodes('cfdi:Traslados', 'cfdi:Traslado').length !== 0 ||\n            impuestos.searchNodes('cfdi:Retenciones', 'cfdi:Retencion').length !== 0\n        );\n    }\n\n    protected impuestoHasBaseGreaterThanZero(impuesto: CNodeInterface): boolean {\n        if (!impuesto.offsetExists('Base')) {\n            return false;\n        }\n        if (isNaN(Number(impuesto.get('Base')))) {\n            return false;\n        }\n\n        return parseFloat(impuesto.get('Base')) >= 0.000001;\n    }\n\n    protected trasladoHasTipoFactorExento(traslado: CNodeInterface): boolean {\n        if ('Exento' === traslado.get('TipoFactor')) {\n            if (traslado.offsetExists('TasaOCuota')) {\n                return false;\n            }\n            if (traslado.offsetExists('Importe')) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    protected trasladoHasTipoFactorTasaOCuota(traslado: CNodeInterface): boolean {\n        if ('Tasa' === traslado.get('TipoFactor') || 'Cuota' === traslado.get('TipoFactor')) {\n            if ('' === traslado.get('TasaOCuota')) {\n                return false;\n            }\n            if ('' === traslado.get('Importe')) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * EmisorRegimenFiscal\n *\n * Válida que:\n *  - REGFIS01: El régimen fiscal contenga un valor apropiado según el tipo de RFC emisor (CFDI33130 y CFDI33131)\n *\n * Nota: No válida que el RFC sea válido, esa responsabilidad no es de este validador.\n */\nexport class EmisorRegimenFiscal extends AbstractDiscoverableVersion33 {\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const regimenFiscal = comprobante.searchAttribute('cfdi:Emisor', 'RegimenFiscal');\n        const emisorRfc = comprobante.searchAttribute('cfdi:Emisor', 'Rfc');\n\n        const length = emisorRfc.length;\n        let validCodes: string[];\n\n        if (12 === length) {\n            validCodes = ['601', '603', '609', '610', '620', '622', '623', '624', '626', '628'];\n        } else if (13 === length) {\n            validCodes = [\n                '605',\n                '606',\n                '607',\n                '608',\n                '610',\n                '611',\n                '612',\n                '614',\n                '615',\n                '616',\n                '621',\n                '625',\n                '626',\n                '629',\n                '630'\n            ];\n        } else {\n            validCodes = [];\n        }\n\n        asserts.put(\n            'REGFIS01',\n            'El régimen fiscal contenga un valor apropiado según el tipo de RFC emisor (CFDI33130 y CFDI33131)',\n            Status.when(validCodes.includes(regimenFiscal.trim())),\n            `Rfc: \"${emisorRfc}\", Regimen Fiscal: \"${regimenFiscal}\"`\n        );\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Rfc } from '@nodecfdi/rfc';\nimport { Status } from '../../status';\n\n/**\n * EmisorRfc\n *\n * Válida que:\n *  - EMISORRFC01: El RFC del emisor del comprobante debe ser válido y diferente de XAXX010101000 y XEXX010101000\n */\nexport class EmisorRfc extends AbstractDiscoverableVersion33 {\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const assert = asserts.put(\n            'EMISORRFC01',\n            'El RFC del emisor del comprobante debe ser válido y diferente de XAXX010101000 y XEXX010101000'\n        );\n\n        const emisorRfc = comprobante.searchAttribute('cfdi:Emisor', 'Rfc');\n        try {\n            Rfc.checkIsValid(emisorRfc, Rfc.DISALLOW_FOREIGN | Rfc.DISALLOW_GENERIC);\n        } catch (e) {\n            assert.setStatus(Status.error(), `Rfc: \"${emisorRfc}\". ${(e as Error).message}`);\n\n            return Promise.resolve();\n        }\n        assert.setStatus(Status.ok());\n\n        return Promise.resolve();\n    }\n}\n","import { DateTime } from 'luxon';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\nexport class AssertFechaFormat {\n    public static assertFormat(asserts: Asserts, code: string, label: string, text: string): boolean {\n        const hasFormat = AssertFechaFormat.hasFormat(text);\n        asserts.put(\n            code,\n            `La fecha ${label} cumple con el formato`,\n            Status.when(hasFormat),\n            `Contenido del campo: \"${text}\"`\n        );\n\n        return hasFormat;\n    }\n\n    public static hasFormat(format: string): boolean {\n        if ('' === format) {\n            return false;\n        }\n        try {\n            const rawDate = DateTime.fromISO(format);\n            const value = rawDate.toMillis();\n            const expectedFormat = DateTime.fromMillis(value).toFormat(\"yyyy-LL-dd'T'HH:mm:ss\");\n\n            return expectedFormat === format;\n        } catch (e) {\n            return false;\n        }\n    }\n}\n","import { DateTime } from 'luxon';\nimport { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { AssertFechaFormat } from '../utils/assert-fecha-format';\nimport { Status } from '../../status';\n\n/**\n * FechaComprobante\n *\n * Válida que:\n * - FECHA01: La fecha del comprobante cumple con el formato\n * - FECHA02: La fecha existe en el comprobante y es mayor que 2017-07-01 y menor que el futuro\n *      - La fecha en el futuro se puede configurar a un valor determinado\n *      - La fecha en el futuro es por defecto el momento de validación más una tolerancia\n *      - La tolerancia puede ser configurada y es por defecto 300 segundos\n */\nexport class FechaComprobante extends AbstractDiscoverableVersion33 {\n    private _maximumDate?: number;\n\n    /** Tolerancia en segundos */\n    private _tolerance = 300;\n\n    public getMinimumDate(): number {\n        return DateTime.fromObject({\n            hour: 0,\n            minute: 0,\n            second: 0,\n            month: 7,\n            day: 1,\n            year: 2017\n        }).toMillis();\n    }\n\n    public getMaximumDate(): number {\n        if (this._maximumDate === undefined || isNaN(Number(this._maximumDate))) {\n            return Date.now() + this.getTolerance();\n        }\n\n        return this._maximumDate;\n    }\n\n    public setMaximumDate(maximumDate: number | null = null): void {\n        this._maximumDate = maximumDate !== null ? maximumDate : undefined;\n    }\n\n    public getTolerance(): number {\n        return this._tolerance;\n    }\n\n    public setTolerance(tolerance: number): void {\n        this._tolerance = tolerance;\n    }\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const fechaSource = comprobante.get('Fecha');\n        const hasFormat = AssertFechaFormat.assertFormat(asserts, 'FECHA01', 'del comprobante', fechaSource);\n        const assertBetween = asserts.put(\n            'FECHA02',\n            'La fecha existe en el comprobante y es mayor que 2017-07-01 y menor que el futuro'\n        );\n        if (!hasFormat) {\n            return Promise.resolve();\n        }\n\n        const exists = comprobante.offsetExists('Fecha');\n        const testDate = '' !== fechaSource ? DateTime.fromISO(fechaSource).toMillis() : 0;\n\n        const minimumDate = this.getMinimumDate();\n        const maximumDate = this.getMaximumDate();\n\n        assertBetween.setStatus(\n            Status.when(testDate >= minimumDate && testDate <= maximumDate),\n            `Fecha: \"${fechaSource}\" (${exists ? 'Existe' : 'No existe'}), Máxima: ${DateTime.fromMillis(\n                maximumDate\n            ).toFormat('yyyy-LL-dd HH:mm:ss')}`\n        );\n\n        return Promise.resolve();\n    }\n}\n","import { CNode, CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ReceptorResidenciaFiscal\n *\n * Válida que:\n * - RESFISC01: Si el RFC no es XEXX010101000, entonces la residencia fiscal no debe existir (CFDI33134)\n * - RESFISC02: Si el RFC sí es XEXX010101000 y existe el complemento de comercio exterior,\n *              entonces la residencia fiscal debe establecerse y no puede ser \"MEX\" (CFDI33135 y CFDI33136)\n * - RESFISC03: Si el RFC sí es XEXX010101000 y se registró el número de registro de identificación fiscal,\n *              entonces la residencia fiscal debe establecerse y no puede ser \"MEX\" (CFDI33135 y CFDI33136)\n */\nexport class ReceptorResidenciaFiscal extends AbstractDiscoverableVersion33 {\n    private registerAsserts(asserts: Asserts): void {\n        const assertsDescriptions: Record<string, string> = {\n            RESFISC01: 'Si el RFC no es XEXX010101000, entonces la residencia fiscal no debe existir (CFDI33134)',\n            RESFISC02: [\n                'Si el RFC sí es XEXX010101000 y existe el complemento de comercio exterior,',\n                ' entonces la residencia fiscal debe establecerse y no puede ser \"MEX\" (CFDI33135 y CFDI33136)'\n            ].join(''),\n            RESFISC03: [\n                'Si el RFC sí es XEXX010101000 y se registró el número de registro de identificación fiscal,',\n                ' entonces la residencia fiscal debe establecerse y no puede ser \"MEX\" (CFDI33135 y CFDI33136)'\n            ].join('')\n        };\n        Object.entries(assertsDescriptions).forEach(([code, title]) => {\n            asserts.put(code, title);\n        });\n    }\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        this.registerAsserts(asserts);\n\n        let receptor = comprobante.searchNode('cfdi:Receptor');\n        if (!receptor) {\n            receptor = new CNode('cfdi:Receptor');\n        }\n\n        if ('XEXX010101000' !== receptor.get('Rfc')) {\n            asserts.putStatus('RESFISC01', Status.when(!receptor.offsetExists('ResidenciaFiscal')));\n        }\n\n        const existsComercioExterior =\n            comprobante.searchNode('cfdi:Complemento', 'cce11:ComercioExterior') !== undefined;\n        const isValidResidenciaFiscal =\n            '' !== receptor.get('ResidenciaFiscal') && 'MEX' !== receptor.get('ResidenciaFiscal');\n        if (existsComercioExterior) {\n            asserts.putStatus('RESFISC02', Status.when(isValidResidenciaFiscal));\n        }\n        if (receptor.offsetExists('NumRegIdTrib')) {\n            asserts.putStatus('RESFISC03', Status.when(isValidResidenciaFiscal));\n        }\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { Rfc } from '@nodecfdi/rfc';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ReceptorRfc\n *\n * Válida que:\n *  - RECRFC01: El RFC del receptor del comprobante debe ser válido\n */\nexport class ReceptorRfc extends AbstractDiscoverableVersion33 {\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const assert = asserts.put('RECRFC01', 'El RFC del receptor del comprobante debe ser válido');\n\n        const receptorRfc = comprobante.searchAttribute('cfdi:Receptor', 'Rfc');\n\n        try {\n            Rfc.checkIsValid(receptorRfc);\n        } catch (e) {\n            assert.setStatus(Status.error(), `Rfc: \"${receptorRfc}\". ${(e as Error).message}`);\n\n            return Promise.resolve();\n        }\n\n        assert.setStatus(Status.ok());\n\n        return Promise.resolve();\n    }\n}\n","import { Mixin } from 'ts-mixer';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { RequireXmlResolverInterface } from '../../contracts/require-xml-resolver-interface';\nimport { RequireXsltBuilderInterface } from '../../contracts/require-xslt-builder-interface';\nimport { RequireXmlStringInterface } from '../../contracts/require-xml-string-interface';\nimport { SelloDigitalCertificadoValidatorTrait } from '../../common/sello-digital-certificado-validator-trait';\n\n/**\n * SelloDigitalCertificado\n *\n * Válida que:\n * - SELLO01: Se puede obtener el certificado del comprobante\n * - SELLO02: El número de certificado del comprobante igual al encontrado en el certificado\n * - SELLO03: El RFC del comprobante igual al encontrado en el certificado\n * - SELLO04: El nombre del emisor del comprobante es igual al encontrado en el certificado\n * - SELLO05: La fecha del documento es mayor o igual a la fecha de inicio de vigencia del certificado\n * - SELLO06: La fecha del documento menor o igual a la fecha de fin de vigencia del certificado\n * - SELLO07: El sello del comprobante está en base 64\n * - SELLO08: El sello del comprobante coincide con el certificado y la cadena de origen generada\n */\nclass SelloDigitalCertificado\n    extends Mixin(AbstractDiscoverableVersion33, SelloDigitalCertificadoValidatorTrait)\n    implements RequireXmlStringInterface, RequireXmlResolverInterface, RequireXsltBuilderInterface {}\n\nexport { SelloDigitalCertificado };\n","import { Mixin } from 'ts-mixer';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { RequireXmlResolverInterface } from '../../contracts/require-xml-resolver-interface';\nimport { RequireXsltBuilderInterface } from '../../contracts/require-xslt-builder-interface';\nimport { TimbreFiscalDigitalSelloValidatorTrait } from '../../common/timbre-fiscal-digital-sello-validator-trait';\n\n/**\n * TimbreFiscalDigitalSello\n *\n * Válida que:\n * - TFDSELLO01: El Sello SAT del Timbre Fiscal Digital corresponde al certificado SAT\n */\nclass TimbreFiscalDigitalSello\n    extends Mixin(AbstractDiscoverableVersion33, TimbreFiscalDigitalSelloValidatorTrait)\n    implements RequireXmlResolverInterface, RequireXsltBuilderInterface {}\n\nexport { TimbreFiscalDigitalSello };\n","import { Mixin } from 'ts-mixer';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { TimbreFiscalDigitalVersionValidatorTrait } from '../../common/timbre-fiscal-digital-version-validator-trait';\n\n/**\n * TimbreFiscalDigitalVersion\n *\n * Válida que:\n * - TFDVERSION01: Si existe el complemento timbre fiscal digital, entonces su versión debe ser 1.1\n */\nclass TimbreFiscalDigitalVersion extends Mixin(\n    AbstractDiscoverableVersion33,\n    TimbreFiscalDigitalVersionValidatorTrait\n) {}\n\nexport { TimbreFiscalDigitalVersion };\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractRecepcionPagos10 } from '../abstracts/abstract-recepcion-pagos10';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * CfdiRelacionados\n *\n * - PAGREL01: El tipo de relación en los CFDI relacionados debe ser \"04\"\n */\nexport class CfdiRelacionados extends AbstractRecepcionPagos10 {\n    public validateRecepcionPagos(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const assert = asserts.put('PAGREL01', 'El tipo de relación en los CFDI relacionados debe ser \"04\"');\n        const cfdiRelacionados = comprobante.searchNode('cfdi:CfdiRelacionados');\n        if (!cfdiRelacionados) {\n            return Promise.resolve();\n        }\n        assert.setStatus(\n            Status.when('04' === cfdiRelacionados.get('TipoRelacion')),\n            `Tipo de relación: \"${cfdiRelacionados.get('TipoRelacion')}\"`\n        );\n\n        return Promise.resolve();\n    }\n}\n","import { CNode, CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ComplementoPagos\n *\n * Este complemento se ejecuta siempre\n *\n * - COMPPAG01: El complemento de pagos debe existir si el tipo de comprobante es P y viceversa\n * - COMPPAG02: Si el complemento de pagos existe su version debe ser 1.0\n * - COMPPAG03: Si el tipo de comprobante es P su versión debe ser 3.3\n * - COMPPAG04: No debe existir el nodo impuestos del complemento de pagos (CRP237)\n */\nexport class ComplementoPagos extends AbstractDiscoverableVersion33 {\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        asserts.put('COMPPAG01', 'El complemento de pagos debe existir si el tipo de comprobante es P y viceversa');\n        asserts.put('COMPPAG02', 'Si el complemento de pagos existe su version debe ser 1.0');\n        asserts.put('COMPPAG03', 'Si el tipo de comprobante es P su versión debe ser 3.3');\n        asserts.put('COMPPAG04', 'No debe existir el nodo impuestos del complemento de pagos (CRP237)');\n\n        let pagosExists = true;\n        let pagos10 = comprobante.searchNode('cfdi:Complemento', 'pago10:Pagos');\n        if (!pagos10) {\n            pagosExists = false;\n            pagos10 = new CNode('pago10:Pagos'); // avoid accessing a null object\n        }\n\n        const isTipoPago = 'P' === comprobante.get('TipoDeComprobante');\n\n        asserts.putStatus(\n            'COMPPAG01',\n            Status.when(!(isTipoPago ? !pagosExists : pagosExists)),\n            `Tipo de comprobante: \"${comprobante.get('TipoDeComprobante')}\", Complemento: \"${\n                pagosExists ? 'existe' : 'no existe'\n            }\"`\n        );\n\n        if (pagosExists) {\n            asserts.putStatus('COMPPAG02', Status.when('1.0' === pagos10.get('Version')));\n        }\n        if (isTipoPago) {\n            asserts.putStatus('COMPPAG03', Status.when('3.3' === comprobante.get('Version')));\n        }\n\n        asserts.putStatus('COMPPAG04', Status.when(!pagos10.searchNode('pago10:Impuestos')));\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractRecepcionPagos10 } from '../abstracts/abstract-recepcion-pagos10';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * ComprobantePagos - Válida los datos relacionados con el nodo Comprobante cuando es un CFDI de recepción de pagos\n *\n * - PAGCOMP01: Debe existir un solo nodo que represente el complemento de pagos\n * - PAGCOMP02: La forma de pago no debe existir (CRP104)\n * - PAGCOMP03: Las condiciones de pago no deben existir (CRP106)\n * - PAGCOMP04: El método de pago no deben existir (CRP105)\n * - PAGCOMP05: La moneda debe ser \"XXX\" (CRP103)\n * - PAGCOMP06: El tipo de cambio no debe existir (CRP108)\n * - PAGCOMP07: El descuento no debe existir (CRP107)\n * - PAGCOMP08: El subtotal del documento debe ser cero \"0\" (CRP102)\n * - PAGCOMP09: El total del documento debe ser cero \"0\" (CRP109)\n * - PAGCOMP10: No se debe registrar el apartado de Impuestos en el CFDI (CRP122)\n */\nexport class ComprobantePagos extends AbstractRecepcionPagos10 {\n    public validateRecepcionPagos(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const pagos = comprobante.searchNodes('cfdi:Complemento', 'pago10:Pagos');\n        asserts.put(\n            'PAGCOMP01',\n            'Debe existir un solo nodo que represente el complemento de pagos',\n            Status.when(1 === pagos.length),\n            `Encontrados: ${pagos.length}`\n        );\n        asserts.put(\n            'PAGCOMP02',\n            'La forma de pago no debe existir (CRP104)',\n            Status.when(!comprobante.offsetExists('FormaPago'))\n        );\n        asserts.put(\n            'PAGCOMP03',\n            'Las condiciones de pago no deben existir (CRP106)',\n            Status.when(!comprobante.offsetExists('CondicionesDePago'))\n        );\n        asserts.put(\n            'PAGCOMP04',\n            'El método de pago no debe existir (CRP105)',\n            Status.when(!comprobante.offsetExists('MetodoPago'))\n        );\n        asserts.put(\n            'PAGCOMP05',\n            'La moneda debe ser \"XXX\" (CRP103)',\n            Status.when('XXX' === comprobante.get('Moneda')),\n            `Moneda: \"${comprobante.get('Moneda')}\"`\n        );\n        asserts.put(\n            'PAGCOMP06',\n            'El tipo de cambio no debe existir (CRP108)',\n            Status.when(!comprobante.offsetExists('TipoCambio'))\n        );\n        asserts.put(\n            'PAGCOMP07',\n            'El descuento no debe existir (CRP107)',\n            Status.when(!comprobante.offsetExists('Descuento'))\n        );\n        asserts.put(\n            'PAGCOMP08',\n            'El subtotal del documento debe ser cero \"0\" (CRP102)',\n            Status.when('0' === comprobante.get('SubTotal')),\n            `SubTotal: \"${comprobante.get('SubTotal')}\"`\n        );\n        asserts.put(\n            'PAGCOMP09',\n            'El total del documento debe ser cero \"0\" (CRP109)',\n            Status.when('0' === comprobante.get('Total')),\n            `Total: \"${comprobante.get('Total')}\"`\n        );\n        asserts.put(\n            'PAGCOMP10',\n            'No se debe registrar el apartado de Impuesto en el CFDI (CRP122)',\n            Status.when(0 === comprobante.searchNodes('cfdi:Impuestos').length)\n        );\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractRecepcionPagos10 } from '../abstracts/abstract-recepcion-pagos10';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * Conceptos\n * En un CFDI de recepción de pagos el Concepto del CFDI debe tener datos fijos,\n * puede ver el problema específico en la explicación del issue\n *\n * - PAGCON01: Se debe usar el concepto predefinido (CRP107 - CRP121)\n */\nexport class Conceptos extends AbstractRecepcionPagos10 {\n    public static REQUIRED_CLAVEPRODSERV = '84111506';\n\n    public static REQUIRED_CANTIDAD = /^1(\\.0{1,6})?$/;\n\n    public static REQUIRED_CLAVEUNIDAD = 'ACT';\n\n    public static REQUIRED_DESCRIPCION = 'Pago';\n\n    public static REQUIRED_VALORUNITARIO = /^0(\\.0{1,6})?$/;\n\n    public static REQUIRED_IMPORTE = /^0(\\.0{1,6})?$/;\n\n    public validateRecepcionPagos(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const assert = asserts.put('PAGCON01', 'Se debe usar el concepto predefinido (CRP107 - CRP121)');\n        // get conceptos\n        try {\n            this.checkConceptos(comprobante);\n        } catch (e) {\n            assert.setStatus(Status.error(), (e as Error).message);\n\n            return Promise.resolve();\n        }\n        assert.setStatus(Status.ok());\n\n        return Promise.resolve();\n    }\n\n    protected checkConceptos(comprobante: CNodeInterface): void {\n        const conceptos = comprobante.searchNode('cfdi:Conceptos');\n        if (!conceptos) {\n            throw new Error('No se encontró el nodo Conceptos');\n        }\n        // check conceptos count\n        const conceptosCount = conceptos.children().length;\n        if (1 !== conceptosCount) {\n            throw new Error(`Se esperaba encontrar un solo hijo de conceptos, se encontraron  ${conceptosCount}`);\n        }\n        // check it contains a Concepto\n        const concepto = conceptos.searchNode('cfdi:Concepto');\n        if (!concepto) {\n            throw new Error('No se encontró el nodo Concepto');\n        }\n        // check concepto does not have any children\n        const conceptoCount = concepto.children().length;\n        if (0 !== conceptoCount) {\n            throw new Error(`Se esperaba encontrar ningún hijo de concepto, se encontraron ${conceptoCount}`);\n        }\n        if (Conceptos.REQUIRED_CLAVEPRODSERV !== concepto.get('ClaveProdServ')) {\n            throw new Error(\n                `La clave del producto o servicio debe ser \"${\n                    Conceptos.REQUIRED_CLAVEPRODSERV\n                }\" y se registró \"${concepto.get('ClaveProdServ')}\"`\n            );\n        }\n        if (concepto.offsetExists('NoIdentificacion')) {\n            throw new Error('No debe existir el número de identificación');\n        }\n        if (!Conceptos.REQUIRED_CANTIDAD.test(concepto.get('Cantidad'))) {\n            throw new Error(\n                `La cantidad debe ser \"${Conceptos.REQUIRED_CANTIDAD}\" y se registró ${concepto.get('Cantidad')}`\n            );\n        }\n        if (Conceptos.REQUIRED_CLAVEUNIDAD !== concepto.get('ClaveUnidad')) {\n            throw new Error(\n                `La clave de unidad debe ser \"${Conceptos.REQUIRED_CLAVEUNIDAD}\" y se registró ${concepto.get(\n                    'ClaveUnidad'\n                )}`\n            );\n        }\n        if (concepto.offsetExists('Unidad')) {\n            throw new Error('No debe existir la unidad');\n        }\n        if (Conceptos.REQUIRED_DESCRIPCION !== concepto.get('Descripcion')) {\n            throw new Error(\n                `La descripción debe ser \"${Conceptos.REQUIRED_DESCRIPCION}\" y se registró \"${concepto.get(\n                    'Descripcion'\n                )}\"`\n            );\n        }\n        if (!Conceptos.REQUIRED_VALORUNITARIO.test(concepto.get('ValorUnitario'))) {\n            throw new Error(\n                `El valor unitario debe ser \"${Conceptos.REQUIRED_VALORUNITARIO}\" y se registró \"${concepto.get(\n                    'ValorUnitario'\n                )}\"`\n            );\n        }\n        if (!Conceptos.REQUIRED_IMPORTE.test(concepto.get('Importe'))) {\n            throw new Error(\n                `El importe debe ser \"${Conceptos.REQUIRED_IMPORTE}\" y se registró \"${concepto.get('Importe')}\"`\n            );\n        }\n        if (concepto.offsetExists('Descuento')) {\n            throw new Error('No debe existir descuento');\n        }\n    }\n}\n","import { Status } from './status';\n\nexport class Assert {\n    private _title: string;\n\n    private _status!: Status;\n\n    private _explanation: string;\n\n    private readonly _code: string;\n\n    /**\n     * Assert constructor\n     *\n     * @param code -\n     * @param title -\n     * @param status - If null the status will be NONE\n     * @param explanation -\n     */\n    constructor(code: string, title = '', status: Status | null = null, explanation = '') {\n        if ('' == code) {\n            throw new SyntaxError('Code cannot be an empty string');\n        }\n        this._code = code;\n        this._title = title;\n        this.setStatus(status || Status.none());\n        this._explanation = explanation;\n    }\n\n    public getTitle(): string {\n        return this._title;\n    }\n\n    public getStatus(): Status {\n        return this._status;\n    }\n\n    public getExplanation(): string {\n        return this._explanation;\n    }\n\n    public getCode(): string {\n        return this._code;\n    }\n\n    public setTitle(title: string): void {\n        this._title = title;\n    }\n\n    public setStatus(status: Status, explanation?: string): void {\n        this._status = status;\n        if (explanation) {\n            this.setExplanation(explanation);\n        }\n    }\n\n    public setExplanation(explanation: string): void {\n        this._explanation = explanation;\n    }\n\n    public toString = (): string => {\n        return `${this._status}: ${this._code} - ${this._title}`;\n    };\n}\n","import { Assert } from './assert';\nimport { Status } from './status';\n\nexport class Asserts {\n    private _assets: Map<string, Assert> = new Map();\n\n    public get length(): number {\n        return this._assets.size;\n    }\n\n    private _mustStop = false;\n\n    /**\n     * This will try to create a new assert or get and change assert with the same code\n     * The new values are preserved, except if they are null\n     *\n     * @param code -\n     * @param title -\n     * @param status -\n     * @param explanation -\n     */\n    public put(\n        code: string,\n        title: string | null = null,\n        status: Status | null = null,\n        explanation: string | null = null\n    ): Assert {\n        let assert: Assert;\n        if (!this.exists(code)) {\n            assert = new Assert(code, title || '', status, explanation || '');\n            this.add(assert);\n\n            return assert;\n        }\n        assert = this.get(code);\n        if (title) {\n            assert.setTitle(title);\n        }\n        if (status) {\n            assert.setStatus(status);\n        }\n        if (explanation) {\n            assert.setExplanation(explanation);\n        }\n\n        return assert;\n    }\n\n    /**\n     * This will try to create a new assert or get and change assert with the same code\n     * The new values are preserved, except if they are null\n     *\n     * @param code -\n     * @param status -\n     * @param explanation -\n     */\n    public putStatus(code: string, status: Status | null = null, explanation: string | null = null): Assert {\n        return this.put(code, null, status, explanation);\n    }\n\n    /**\n     * Get and or set the flag that alerts about stop flow\n     * Consider this flag as: \"Something was found, you should not continue\"\n     *\n     * @param newValue - Value of the flag, if null then will not change the flag\n     * @returns the previous value of the flag\n     */\n    public mustStop(newValue: boolean | null = null): boolean {\n        if (null == newValue) {\n            return this._mustStop;\n        }\n        const previous = this._mustStop;\n        this._mustStop = newValue;\n\n        return previous;\n    }\n\n    public hasStatus(status: Status): boolean {\n        return undefined !== this.getFirstStatus(status);\n    }\n\n    public hasErrors(): boolean {\n        return this.hasStatus(Status.error());\n    }\n\n    public hasWarnings(): boolean {\n        return this.hasStatus(Status.warn());\n    }\n\n    public getFirstStatus(status: Status): Assert | undefined {\n        for (const [, assert] of this) {\n            if (status.equalsTo(assert.getStatus())) {\n                return assert;\n            }\n        }\n\n        return undefined;\n    }\n\n    public byStatus(status: Status): Map<string, Assert> {\n        return new Map([...this].filter(([, item]) => status.equalsTo(item.getStatus())));\n    }\n\n    public get(code: string): Assert {\n        for (const [, assert] of this) {\n            if (assert.getCode() === code) {\n                return assert;\n            }\n        }\n        throw new Error(`There is no assert with code ${code}`);\n    }\n\n    public exists(code: string): boolean {\n        return this._assets.has(code);\n    }\n\n    public oks(): Map<string, Assert> {\n        return this.byStatus(Status.ok());\n    }\n\n    public errors(): Map<string, Assert> {\n        return this.byStatus(Status.error());\n    }\n\n    public warnings(): Map<string, Assert> {\n        return this.byStatus(Status.warn());\n    }\n\n    public nones(): Map<string, Assert> {\n        return this.byStatus(Status.none());\n    }\n\n    public add(assert: Assert): void {\n        this._assets.set(assert.getCode(), assert);\n    }\n\n    private indexOf(assert: Assert): string {\n        const index = [...this.values()].indexOf(assert);\n        let indexKey = '';\n        if (index !== -1) {\n            indexKey = [...this.keys()][index];\n        }\n\n        return indexKey;\n    }\n\n    public remove(assert: Assert): void {\n        const index = this.indexOf(assert);\n        if (index !== '') {\n            this._assets.delete(index);\n        }\n    }\n\n    public removeByCode(code: string): void {\n        this._assets.delete(code);\n    }\n\n    public removeAll(): void {\n        this._assets.clear();\n    }\n\n    public import(asserts: Asserts): void {\n        for (const [, assert] of asserts) {\n            this.add(Object.assign(Object.create(Object.getPrototypeOf(assert)), assert));\n        }\n        this.mustStop(asserts.mustStop());\n    }\n\n    // Iterators of asserts\n    public [Symbol.iterator](): IterableIterator<[string, Assert]> {\n        return this._assets[Symbol.iterator]();\n    }\n\n    public entries(): IterableIterator<[string, Assert]> {\n        return this._assets.entries();\n    }\n\n    public keys(): IterableIterator<string> {\n        return this._assets.keys();\n    }\n\n    public values(): IterableIterator<Assert> {\n        return this._assets.values();\n    }\n}\n","export interface FormaPagoEntryInterface {\n    key: string;\n    description: string;\n    useSenderRfc: boolean;\n    useSenderAccount: boolean;\n    useSenderAccountRegExp?: RegExp;\n    useReceiverRfc: boolean;\n    useReceiverAccount: boolean;\n    useReceiverAccountRegExp?: RegExp;\n    allowPaymentSignature: boolean;\n}\n\nexport class FormaPagoEntry {\n    private readonly _key: string;\n\n    private readonly _description: string;\n\n    private readonly _allowSenderRfc: boolean;\n\n    private readonly _allowSenderAccount: boolean;\n\n    private readonly _senderAccountPattern: RegExp;\n\n    private readonly _allowReceiverRfc: boolean;\n\n    private readonly _allowReceiverAccount: boolean;\n\n    private readonly _receiverAccountPattern: RegExp;\n\n    private readonly _allowPaymentSignature: boolean;\n\n    constructor(entry: FormaPagoEntryInterface) {\n        if ('' === entry.key) {\n            throw new Error('The FormaPago key cannot be empty');\n        }\n        if ('' === entry.description) {\n            throw new Error('The FormaPago description cannot be empty');\n        }\n        this._key = entry.key;\n        this._description = entry.description;\n        this._allowSenderRfc = entry.useSenderRfc;\n        this._allowSenderAccount = entry.useSenderAccount;\n        this._senderAccountPattern = this.pattern(entry.useSenderAccount, entry.useSenderAccountRegExp);\n        this._allowReceiverRfc = entry.useReceiverRfc;\n        this._allowReceiverAccount = entry.useReceiverAccount;\n        this._receiverAccountPattern = this.pattern(entry.useReceiverAccount, entry.useReceiverAccountRegExp);\n        this._allowPaymentSignature = entry.allowPaymentSignature;\n    }\n\n    protected pattern(allowed: boolean, pattern?: RegExp): RegExp {\n        if (!allowed || !pattern) {\n            return /^$/;\n        }\n\n        return pattern;\n    }\n\n    public key(): string {\n        return this._key;\n    }\n\n    public description(): string {\n        return this._description;\n    }\n\n    public allowSenderRfc(): boolean {\n        return this._allowSenderRfc;\n    }\n\n    public allowSenderAccount(): boolean {\n        return this._allowSenderAccount;\n    }\n\n    public senderAccountPattern(): RegExp {\n        return this._senderAccountPattern;\n    }\n\n    public allowReceiverRfc(): boolean {\n        return this._allowReceiverRfc;\n    }\n\n    public allowReceiverAccount(): boolean {\n        return this._allowReceiverAccount;\n    }\n\n    public receiverAccountPattern(): RegExp {\n        return this._receiverAccountPattern;\n    }\n\n    public allowPaymentSignature(): boolean {\n        return this._allowPaymentSignature;\n    }\n}\n","import { FormaPagoEntry, FormaPagoEntryInterface } from './forma-pago-entry';\n\nexport class FormaPagoCatalog {\n    public obtain(key: string): FormaPagoEntry {\n        const map: FormaPagoEntryInterface[] = [\n            {\n                key: '01',\n                description: 'Efectivo',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '02',\n                description: 'Cheque nominativo',\n                useSenderRfc: true,\n                useSenderAccount: true,\n                useSenderAccountRegExp: /^(\\d{11}|\\d{18})$/,\n                useReceiverRfc: true,\n                useReceiverAccount: true,\n                useReceiverAccountRegExp: /^(\\d{10,11}|\\d{15,16}|\\d{18}|[A-Z0-9_]{10,50})$/,\n                allowPaymentSignature: false\n            },\n            {\n                key: '03',\n                description: 'Transferencia electrónica de fondos',\n                useSenderRfc: true,\n                useSenderAccount: true,\n                useSenderAccountRegExp: /^(\\d{10}|\\d{16}|\\d{18})$/,\n                useReceiverRfc: true,\n                useReceiverAccount: true,\n                useReceiverAccountRegExp: /^(\\d{10}|\\d{18})$/,\n                allowPaymentSignature: true\n            },\n            {\n                key: '04',\n                description: 'Tarjeta de crédito',\n                useSenderRfc: true,\n                useSenderAccount: true,\n                useSenderAccountRegExp: /^(\\d{16})$/,\n                useReceiverRfc: true,\n                useReceiverAccount: true,\n                useReceiverAccountRegExp: /^(\\d{10,11}|\\d{15,16}|\\d{18}|[A-Z0-9_]{10,50})$/,\n                allowPaymentSignature: false\n            },\n            {\n                key: '05',\n                description: 'Monedero electrónico',\n                useSenderRfc: true,\n                useSenderAccount: true,\n                useSenderAccountRegExp: /^(\\d{10,11}|\\d{15,16}|\\d{18}|[A-Z0-9_]{10,50})$/,\n                useReceiverRfc: true,\n                useReceiverAccount: true,\n                useReceiverAccountRegExp: /^(\\d{10,11}|\\d{15,16}|\\d{18}|[A-Z0-9_]{10,50})$/,\n                allowPaymentSignature: false\n            },\n            {\n                key: '06',\n                description: 'Dinero electrónico',\n                useSenderRfc: true,\n                useSenderAccount: true,\n                useSenderAccountRegExp: /^(\\d{10})$/,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '08',\n                description: 'Vales de despensa',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '12',\n                description: 'Dación en pago',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '13',\n                description: 'Pago por subrogación',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '14',\n                description: 'Pago por consignación',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '15',\n                description: 'Condonación',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '17',\n                description: 'Compensación',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '23',\n                description: 'Novación',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '24',\n                description: 'Confusión',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '25',\n                description: 'Remisión de deuda',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '26',\n                description: 'Prescripción o caducidad',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '27',\n                description: 'A satisfacción del acreedor',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '28',\n                description: 'Tarjeta de débito',\n                useSenderRfc: true,\n                useSenderAccount: true,\n                useSenderAccountRegExp: /^(\\d{16})$/,\n                useReceiverRfc: true,\n                useReceiverAccount: true,\n                useReceiverAccountRegExp: /^(\\d{10,11}|\\d{15,16}|\\d{18}|[A-Z0-9_]{10,50})$/,\n                allowPaymentSignature: false\n            },\n            {\n                key: '29',\n                description: 'Tarjeta de servicios',\n                useSenderRfc: true,\n                useSenderAccount: true,\n                useSenderAccountRegExp: /^(\\d{15,16})$/,\n                useReceiverRfc: true,\n                useReceiverAccount: true,\n                useReceiverAccountRegExp: /^(\\d{10,11}|\\d{15,16}|\\d{18}|[A-Z0-9_]{10,50})$/,\n                allowPaymentSignature: false\n            },\n            {\n                key: '30',\n                description: 'Aplicación de anticipos',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '31',\n                description: 'Intermediario pagos',\n                useSenderRfc: false,\n                useSenderAccount: false,\n                useSenderAccountRegExp: undefined,\n                useReceiverRfc: false,\n                useReceiverAccount: false,\n                useReceiverAccountRegExp: undefined,\n                allowPaymentSignature: false\n            },\n            {\n                key: '99',\n                description: 'Por definir',\n                useSenderRfc: true,\n                useSenderAccount: true,\n                useSenderAccountRegExp: /^S*$/,\n                useReceiverRfc: true,\n                useReceiverAccount: true,\n                useReceiverAccountRegExp: /^S*$/,\n                allowPaymentSignature: true\n            }\n        ];\n\n        const keys = map.map((entry) => entry.key);\n        const index = keys.findIndex((keyEntry) => keyEntry === key);\n        if (index === -1) {\n            throw new RangeError(`Key '${key}' was not found in the catalog`);\n        }\n\n        return new FormaPagoEntry(map[index]);\n    }\n}\n","import { Status } from '../../../status';\n\nexport class ValidatePagoException extends Error {\n    private _status?: Status;\n\n    public getStatus(): Status {\n        return this._status || Status.error();\n    }\n\n    public setStatus(status: Status): ValidatePagoException {\n        this._status = status;\n\n        return this;\n    }\n}\n","import { CNodeInterface, CurrencyDecimals } from '@nodecfdi/cfdiutils-common';\nimport { Asserts } from '../../../asserts';\nimport { Status } from '../../../status';\nimport { FormaPagoEntry } from '../helpers/forma-pago-entry';\nimport { FormaPagoCatalog } from '../helpers/forma-pago-catalog';\nimport { ValidatePagoException } from './validate-pago-exception';\n\nexport abstract class AbstractPagoValidator {\n    protected code = '';\n\n    protected title = '';\n\n    public getCode(): string {\n        return this.code;\n    }\n\n    public getTitle(): string {\n        return this.title;\n    }\n\n    public registerInAssets(asserts: Asserts): void {\n        asserts.put(this.getCode(), this.getTitle(), Status.ok());\n    }\n\n    /**\n     * In this method is where all validations must occur\n     *\n     * @param pago -\n     * @throws ValidatePagoException Then validation fails\n     * @throws Error In the implementer if it does not return TRUE\n     */\n    public abstract validatePago(pago: CNodeInterface): boolean;\n\n    protected isGreaterThan(value: number, compare: number): boolean {\n        return value - compare > 0.0000001;\n    }\n\n    protected isEqual(expected: number, value: number): boolean {\n        return Math.abs(expected - value) < 0.0000001;\n    }\n\n    protected createCurrencyDecimals(currency: string): CurrencyDecimals {\n        try {\n            return CurrencyDecimals.newFromKnownCurrencies(currency);\n        } catch (e) {\n            return new CurrencyDecimals(currency || 'XXX', 0);\n        }\n    }\n\n    protected createPaymentType(paymentType: string): FormaPagoEntry {\n        try {\n            return new FormaPagoCatalog().obtain(paymentType);\n        } catch (e) {\n            throw new ValidatePagoException(`La forma de pago \"${paymentType}\" no esta definida`);\n        }\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\nimport { AssertFechaFormat } from '../../utils/assert-fecha-format';\n\n/**\n * PAGO02: En un pago, la fecha debe cumplir con el formato específico\n */\nexport class Fecha extends AbstractPagoValidator {\n    protected override code = 'PAGO02';\n\n    protected override title = 'En un pago la fecha debe cumplir con el formato específico';\n\n    public validatePago(pago: CNodeInterface): boolean {\n        if (!AssertFechaFormat.hasFormat(pago.get('FechaPago'))) {\n            throw new ValidatePagoException(`FechaPago: \"${pago.get('FechaPago')}\"`);\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO03: En un pago, la forma de pago debe existir y no puede ser \"99\" (CRP201)\n */\nexport class FormaDePago extends AbstractPagoValidator {\n    protected override code = 'PAGO03';\n\n    protected override title = 'En un pago, la forma de pago debe existir y no puede ser \"99\" (CRP201)';\n\n    public validatePago(pago: CNodeInterface): boolean {\n        try {\n            const paymentType = this.createPaymentType(pago.get('FormaDePagoP'));\n            if ('99' === paymentType.key()) {\n                throw new ValidatePagoException('Cannot be 99');\n            }\n        } catch (e) {\n            throw new ValidatePagoException(\n                `FormaDePagoP: \"${pago.get('FormaDePagoP')}\" ${(e as ValidatePagoException).message}`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO04: En un pago, la moneda debe existir y no puede ser \"XXX\" (CRP202)\n */\nexport class MonedaPago extends AbstractPagoValidator {\n    protected override code = 'PAGO04';\n\n    protected override title = 'En un pago, la moneda debe existir y no puede ser \"XXX\" (CRP202)';\n\n    public validatePago(pago: CNodeInterface): boolean {\n        if ('' === pago.get('MonedaP') || 'XXX' === pago.get('MonedaP')) {\n            throw new ValidatePagoException(`Moneda: \"${pago.get('MonedaP')}\"`);\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO05: En un pago, cuando la moneda no es \"MXN\" no debe existir tipo de cambio,\n *         de lo contrario el tipo de cambio debe existir (CRP203, CRP204)\n */\nexport class TipoCambioExists extends AbstractPagoValidator {\n    protected override code = 'PAGO05';\n\n    protected override title = [\n        'En un pago, cuando la moneda no es \"MXN\" no debe existir tipo de cambio,',\n        ' de lo contrario el tipo de cambio debe existir (CRP203, CRP204)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        if (!('MXN' === pago.get('MonedaP') ? '' === pago.get('TipoCambioP') : '' !== pago.get('TipoCambioP'))) {\n            throw new ValidatePagoException(\n                `Moneda \"${pago.get('MonedaP')}\", Tipo de cambio: \"${pago.get('TipoCambioP')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface, CurrencyDecimals } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO06: En un pago, el tipo de cambio debe ser numérico, no debe exceder 6 decimales y debe ser mayor a \"0.000001\"\n */\nexport class TipoCambioValue extends AbstractPagoValidator {\n    protected override code = 'PAGO06';\n\n    protected override title = [\n        'En un pago, el tipo de cambio debe ser numérico,',\n        ' no debe exceder 6 decimales y debe ser mayor a \"0.000001\"'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        if (!pago.offsetExists('TipoCambioP')) {\n            return true;\n        }\n        let reason = '';\n        if (isNaN(Number(pago.get('TipoCambioP')))) {\n            reason = 'No es numérico';\n        } else if (CurrencyDecimals.decimalsCount(pago.get('TipoCambioP')) > 6) {\n            reason = 'Tiene más de 6 decimales';\n        } else if (!this.isGreaterThan(parseFloat(pago.get('TipoCambioP') || '0'), 0.000001)) {\n            reason = 'No es mayor a \"0.000001\"';\n        }\n        if ('' !== reason) {\n            throw new ValidatePagoException(`TipoCambioP: ${pago.get('TipoCambioP')}, ${reason}`);\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO07: En un pago, el monto debe ser mayor a cero (CRP207)\n */\nexport class MontoGreaterThanZero extends AbstractPagoValidator {\n    protected override code = 'PAGO07';\n\n    protected override title = 'En un pago, el monto debe ser mayor a cero (CRP207)';\n\n    public validatePago(pago: CNodeInterface): boolean {\n        if (!this.isGreaterThan(parseFloat(pago.get('Monto') || '0'), 0)) {\n            throw new ValidatePagoException(`Monto: \"${pago.get('Monto')}\"`);\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO08: En un pago, el monto debe tener hasta la cantidad de decimales que soporte la moneda (CRP208)\n */\nexport class MontoDecimals extends AbstractPagoValidator {\n    protected override code = 'PAGO08';\n\n    protected override title =\n        'En un pago, el monto debe tener hasta la cantidad de decimales que soporte la moneda (CRP208)';\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const currency = this.createCurrencyDecimals(pago.get('MonedaP'));\n        if (!currency.doesNotExceedDecimals(pago.get('Monto'))) {\n            throw new ValidatePagoException(`Monto: \"${pago.get('Monto')}\", MaxDecimals: \"${currency.decimals()}\"`);\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\n\nexport abstract class CalculateDocumentAmountTrait {\n    public calculateDocumentAmount(doctoRelacionado: CNodeInterface, pago: CNodeInterface): number {\n        // el importe pagado es el que está en el documento\n        if (doctoRelacionado.offsetExists('ImpPagado')) {\n            return Number.parseFloat(doctoRelacionado.get('ImpPagado'));\n        }\n\n        // el importe pagado es el que está en el pago\n        const doctosCount = pago.searchNodes('pago10:DoctoRelacionado').length;\n        if (1 === doctosCount && !doctoRelacionado.offsetExists('TipoCambioDR')) {\n            return Number.parseFloat(pago.get('Monto'));\n        }\n\n        // no hay importe pagado\n        return 0.0;\n    }\n}\n","import { CNodeInterface, CurrencyDecimals } from '@nodecfdi/cfdiutils-common';\nimport { Mixin } from 'ts-mixer';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { CalculateDocumentAmountTrait } from '../helpers/calculate-document-amount-trait';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO09: En un pago, el monto del pago debe encontrarse entre límites mínimo y máximo de la suma\n *         de los valores registrados en el importe pagado de los documentos relacionados (Guía llenado)\n */\nclass MontoBetweenIntervalSumOfDocuments extends Mixin(AbstractPagoValidator, CalculateDocumentAmountTrait) {\n    protected override code = 'PAGO09';\n\n    protected override title = [\n        'En un pago, el monto del pago debe encontrarse entre límites mínimo y máximo de la suma',\n        ' de los valores registrados en el importe pagado de los documentos relacionados (Guía llenado)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const pagoAmount = parseFloat(pago.get('Monto') || '0');\n        const bounds = this.calculateDocumentsAmountBounds(pago);\n        const currencyDecimals = CurrencyDecimals.newFromKnownCurrencies(pago.get('MonedaP'), 2);\n        const lower = currencyDecimals.round(bounds['lower']);\n        const upper = currencyDecimals.round(bounds['upper']);\n        if (pagoAmount < lower || pagoAmount > upper) {\n            throw new ValidatePagoException(\n                `Monto del pago: \"${pagoAmount}\", Suma mínima: \"${lower}\", Suma máxima: \"${upper}\"`\n            );\n        }\n\n        return true;\n    }\n\n    public calculateDocumentsAmountBounds(pago: CNodeInterface): Record<string, number> {\n        const documents = pago.searchNodes('pago10:DoctoRelacionado');\n        const values = documents.map((document) => this.calculateDocumentAmountBounds(document, pago));\n\n        return {\n            lower: values.reduce((a, b) => a + b['lower'], 0),\n            upper: values.reduce((a, b) => a + b['upper'], 0)\n        };\n    }\n\n    public calculateDocumentAmountBounds(\n        doctoRelacionado: CNodeInterface,\n        pago: CNodeInterface\n    ): Record<string, number> {\n        const amount = this.calculateDocumentAmount(doctoRelacionado, pago);\n        const impPagado = doctoRelacionado.get('ImpPagado') || amount;\n        const tipoCambioDR = doctoRelacionado.get('TipoCambioDR');\n        let exchangeRate = 1;\n        if ('' !== tipoCambioDR && pago.get('MonedaP') !== pago.get('MonedaDR')) {\n            exchangeRate = parseFloat(tipoCambioDR);\n        }\n        const numDecimalsAmount = this.getNumDecimals(`${impPagado}`);\n        const numDecimalsExchangeRate = this.getNumDecimals(`${tipoCambioDR}`);\n\n        if (0 === numDecimalsExchangeRate) {\n            return {\n                lower: amount / exchangeRate,\n                upper: amount / exchangeRate\n            };\n        }\n\n        const almostTwo = 2 - 10 ** -10;\n\n        const lowerAmount = amount - 10 ** -numDecimalsAmount / 2;\n        const lowerExchangeRate = exchangeRate + 10 ** -numDecimalsExchangeRate / almostTwo;\n\n        const upperAmount = amount + 10 ** -numDecimalsAmount / almostTwo;\n        const upperExchangeRate = exchangeRate - 10 ** -numDecimalsExchangeRate / 2;\n\n        return {\n            lower: lowerAmount / lowerExchangeRate,\n            upper: upperAmount / upperExchangeRate\n        };\n    }\n\n    public getNumDecimals(numeric: string): number {\n        if (isNaN(Number(numeric)) || isNaN(parseFloat(numeric))) {\n            return 0;\n        }\n        const pointPosition = numeric.indexOf('.');\n        if (pointPosition === -1) {\n            return 0;\n        }\n\n        return numeric.length - 1 - pointPosition;\n    }\n}\n\nexport { MontoBetweenIntervalSumOfDocuments };\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { Rfc } from '@nodecfdi/rfc';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO10: En un pago, cuando el RFC del banco emisor de la cuenta ordenante existe\n *         debe ser válido y diferente de \"XAXX010101000\"\n */\nexport class BancoOrdenanteRfcCorrecto extends AbstractPagoValidator {\n    protected override code = 'PAGO10';\n\n    protected override title = [\n        'En en pago, cuando el RFC del banco emisor de la cuenta ordenante existe',\n        ' debe ser válido y diferente de \"XAXX010101000\"'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        if (pago.offsetExists('RfcEmisorCtaOrd')) {\n            try {\n                Rfc.checkIsValid(pago.get('RfcEmisorCtaOrd'), Rfc.DISALLOW_GENERIC);\n            } catch (e) {\n                throw new ValidatePagoException((e as Error).message);\n            }\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { Rfc } from '@nodecfdi/rfc';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO11: En un pago, cuando el RFC del banco emisor sea \"XEXX010101000\" el nombre del banco es requerido (CRP211)\n */\nexport class BancoOrdenanteNombreRequerido extends AbstractPagoValidator {\n    protected override code = 'PAGO11';\n\n    protected override title = [\n        'En un pago, cuando el RFC del banco emisor sea \"XEXX010101000\"',\n        ' el nombre del banco es requerido (CRP211)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        if (Rfc.RFC_FOREIGN === pago.get('RfcEmisorCtaOrd') && '' === pago.get('NomBancoOrdExt')) {\n            throw new ValidatePagoException(\n                `Rfc: \"${pago.get('RfcEmisorCtaOrd')}\", Nombre \"${pago.get('NomBancoOrdExt')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO12: En un pago, cuando la forma de pago no sea bancarizada el RFC del banco emisor no debe existir (CRP238)\n */\nexport class BancoOrdenanteRfcProhibido extends AbstractPagoValidator {\n    protected override code = 'PAGO12';\n\n    protected override title = [\n        'En un pago, cuando la forma de pago no sea bancarizada',\n        ' el RFC del banco emisor no debe existir (CRP238)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        if ('' === pago.get('FormaDePagoP')) {\n            throw new ValidatePagoException('No está establecida la forma de pago');\n        }\n        const payment = this.createPaymentType(pago.get('FormaDePagoP'));\n\n        // si NO es bancarizado y está establecido el RFC del Emisor de la cuenta ordenante\n        if (!payment.allowSenderRfc() && pago.offsetExists('RfcEmisorCtaOrd')) {\n            throw new ValidatePagoException(`Bancarizado: Si, Rfc: \"${pago.get('RfcEmisorCtaOrd')}\"`);\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO13: En un pago, cuando la forma de pago no sea bancarizada la cuenta ordenante no debe existir (CRP212)\n */\nexport class CuentaOrdenanteProhibida extends AbstractPagoValidator {\n    protected override code = 'PAGO13';\n\n    protected override title = [\n        'En un pago, cuando la forma de pago no sea bancarizada',\n        ' la cuenta ordenante no debe existir (CRP212)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const payment = this.createPaymentType(pago.get('FormaDePagoP'));\n\n        // si NO es bancarizado y está establecida la cuenta ordenante existe\n        if (!payment.allowSenderAccount() && pago.offsetExists('CtaOrdenante')) {\n            throw new ValidatePagoException(`Bancarizado: Si, Cuenta: \"${pago.get('CtaOrdenante')}\"`);\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO14: En un pago, cuando la cuenta ordenante existe debe cumplir con su patrón específico (CRP213)\n */\nexport class CuentaOrdenantePatron extends AbstractPagoValidator {\n    protected override code = 'PAGO14';\n\n    protected override title =\n        'En un pago, cuando la cuenta ordenante existe debe cumplir con su patrón específico (CRP213)';\n\n    public validatePago(pago: CNodeInterface): boolean {\n        // Solo validar si está establecida la cuenta ordenante\n        if (pago.offsetExists('CtaOrdenante')) {\n            const payment = this.createPaymentType(pago.get('FormaDePagoP'));\n            const pattern = payment.senderAccountPattern();\n            if (!pago.get('CtaOrdenante').match(pattern)) {\n                throw new ValidatePagoException(`Cuenta: \"${pago.get('CtaOrdenante')}\". Patrón \"${pattern}\"`);\n            }\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { Rfc } from '@nodecfdi/rfc';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO15: En un pago, cuando el RFC del banco emisor de la cuenta beneficiaria existe\n *         debe ser válido y diferente de \"XAXX010101000\"\n */\nexport class BancoBeneficiarioRfcCorrecto extends AbstractPagoValidator {\n    protected override code = 'PAGO15';\n\n    protected override title = [\n        'En un pago, cuando el RFC del banco emisor de la cuenta beneficiaria existe',\n        ' debe ser válido y diferente de \"XAXX010101000\"'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        if (pago.offsetExists('RfcEmisorCtaBen')) {\n            try {\n                Rfc.checkIsValid(pago.get('RfcEmisorCtaBen'), Rfc.DISALLOW_GENERIC);\n            } catch (e) {\n                throw new ValidatePagoException((e as Error).message);\n            }\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO16: En un pago, cuando la forma de pago no sea 02, 03, 04, 05, 28, 29 o 99\n *         el RFC del banco de la cuenta beneficiaria no debe existir (CRP214)\n */\nexport class BancoBeneficiarioRfcProhibido extends AbstractPagoValidator {\n    protected override code = 'PAGO16';\n\n    protected override title = [\n        'En un pago, cuando la forma de pago no sea 02, 03, 04, 05, 28, 29 o 99',\n        ' el RFC del banco de la cuenta beneficiaria no debe existir (CRP214)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const payment = this.createPaymentType(pago.get('FormaDePagoP'));\n\n        if (!payment.allowReceiverRfc() && pago.offsetExists('RfcEmisorCtaBen')) {\n            throw new ValidatePagoException(\n                `FormaDePago: \"${pago.get('FormaDePagoP')}\", Rfc: \"${pago.get('RfcEmisorCtaBen')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO17: En un pago, cuando la forma de pago no sea 02, 03, 04, 05, 28, 29 o 99\n *         la cuenta beneficiaria no debe existir (CRP215)\n */\nexport class CuentaBeneficiariaProhibida extends AbstractPagoValidator {\n    protected override code = 'PAGO17';\n\n    protected override title = [\n        'En un pago, cuando la forma de pago no sea 02, 03, 04, 05, 28, 29 o 99',\n        ' la cuenta beneficiaria no debe existir (CRP215)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const payment = this.createPaymentType(pago.get('FormaDePagoP'));\n\n        // si No es bancarizado y está establecida la cuenta beneficiaria\n        if (!payment.allowReceiverAccount() && pago.offsetExists('CtaBeneficiario')) {\n            throw new ValidatePagoException(\n                `Forma de pago: \"${pago.get('FormaDePagoP')}\", Cuenta: \"${pago.get('CtaBeneficiario')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO18: En un pago, cuando la cuenta beneficiaria existe debe cumplir con su patrón específico (CRP239)\n */\nexport class CuentaBeneficiariaPatron extends AbstractPagoValidator {\n    protected override code = 'PAGO18';\n\n    protected override title = [\n        'En un pago, cuando la cuenta beneficiaria existe',\n        ' debe cumplir con su patrón específico (CRP213)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        // solo validar si está establecida la cuenta ordenante\n        if (pago.offsetExists('CtaBeneficiario')) {\n            const payment = this.createPaymentType(pago.get('FormaDePagoP'));\n            const pattern = payment.receiverAccountPattern();\n            if (!pago.get('CtaBeneficiario').match(pattern)) {\n                throw new ValidatePagoException(`Cuenta: \"${pago.get('CtaOrdenante')}\". Patrón: \"${pattern}\"`);\n            }\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO19: En un pago, cuando la forma de pago no sea 03 o 99 el tipo de cadena de pago no debe existir (CRP216)\n */\nexport class TipoCadenaPagoProhibido extends AbstractPagoValidator {\n    protected override code = 'PAGO19';\n\n    protected override title = [\n        'En un pago, cuando la forma de pago no sea 03 o 99',\n        ' el tipo de cadena de pago no debe existir (CRP216)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const payment = this.createPaymentType(pago.get('FormaDePagoP'));\n\n        // si NO es bancarizado y está establecida la cuenta ordenante existe\n        if (!payment.allowPaymentSignature() && pago.offsetExists('TipoCadPago')) {\n            throw new ValidatePagoException(\n                `Forma de pago: \"${pago.get('FormaDePagoP')}\", Tipo cadena pago: \"${pago.get('TipoCadPago')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO20: En un pago, si existe el tipo de cadena de pago debe existir\n *         el certificado del pago y viceversa (CRP227 y CRP228)\n */\nexport class TipoCadenaPagoCertificado extends AbstractPagoValidator {\n    protected override code = 'PAGO20';\n\n    protected override title = [\n        'En un pago, si existe el tipo de cadena de pago debe existir',\n        ' el certificado del pago y viceversa (CRP227 y CRP228)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const notEmpty = '' !== pago.get('TipoCadPago') ? '' === pago.get('CertPago') : '' !== pago.get('CertPago');\n        if (\n            notEmpty ||\n            (pago.offsetExists('TipoCadPago') ? !pago.offsetExists('CertPago') : pago.offsetExists('CertPago'))\n        ) {\n            throw new ValidatePagoException(\n                `Tipo cadena pago: \"${pago.get('TipoCadPago')}\", Certificado: \"${pago.get('CertPago')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO21: En un pago, si existe el tipo de cadena de pago debe existir\n *         la cadena del pago y viceversa (CRP229 y CRP230)\n */\nexport class TipoCadenaPagoCadena extends AbstractPagoValidator {\n    protected override code = 'PAGO21';\n\n    protected override title = [\n        'En un pago, si existe el tipo de cadena de pago debe existir',\n        ' la cadena del pago y viceversa (CRP229 y CRP230)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const notEmpty = '' !== pago.get('TipoCadPago') ? '' === pago.get('CadPago') : '' !== pago.get('CadPago');\n        if (\n            notEmpty ||\n            (pago.offsetExists('TipoCadPago') ? !pago.offsetExists('CadPago') : pago.offsetExists('CadPago'))\n        ) {\n            throw new ValidatePagoException(\n                `Tipo cadena pago: \"${pago.get('TipoCadPago')}\", Cadena: \"${pago.get('CadPago')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO22: En un pago, si existe el tipo de cadena de pago debe existir\n *         el sello del pago  y viceversa (CRP231 y CRP232)\n */\nexport class TipoCadenaPagoSello extends AbstractPagoValidator {\n    protected override code = 'PAGO22';\n\n    protected override title = [\n        'En un pago, si existe el tipo de cadena de pago debe existir',\n        ' el sello del pago  y viceversa (CRP231 y CRP232)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const notEmpty = '' !== pago.get('TipoCadPago') ? '' === pago.get('SelloPago') : '' !== pago.get('SelloPago');\n        if (\n            notEmpty ||\n            (pago.offsetExists('TipoCadPago') ? !pago.offsetExists('SelloPago') : pago.offsetExists('SelloPago'))\n        ) {\n            throw new ValidatePagoException(\n                `Tipo cadena pago: \"${pago.get('TipoCadPago')}\", Sello: \"${pago.get('SelloPago')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { ValidatePagoException } from '../validate-pago-exception';\n\nexport class ValidateDoctoException extends ValidatePagoException {\n    private _index!: number;\n\n    private _validatorCode!: string;\n\n    public setIndex(index: number): ValidateDoctoException {\n        this._index = index;\n\n        return this;\n    }\n\n    public setValidatorCode(validatorCode: string): ValidateDoctoException {\n        this._validatorCode = validatorCode;\n\n        return this;\n    }\n\n    public getIndex(): number {\n        return this._index;\n    }\n\n    public getValidatorCode(): string {\n        return this._validatorCode;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from '../abstract-pago-validator';\nimport { ValidateDoctoException } from './validate-docto-exception';\n\nexport abstract class AbstractDoctoRelacionadoValidator extends AbstractPagoValidator {\n    private _pago!: CNodeInterface;\n\n    private _index!: number;\n\n    public abstract validateDoctoRelacionado(docto: CNodeInterface): boolean;\n\n    public exception(message: string): ValidateDoctoException {\n        const exception = new ValidateDoctoException(message);\n        exception.setIndex(this.getIndex());\n        exception.setValidatorCode(this.getCode());\n\n        return exception;\n    }\n\n    public validatePago(_pago: CNodeInterface): boolean {\n        throw new Error('This method must not be called');\n    }\n\n    public getPago(): CNodeInterface {\n        return this._pago;\n    }\n\n    public setPago(pago: CNodeInterface): void {\n        this._pago = pago;\n    }\n\n    public getIndex(): number {\n        return this._index;\n    }\n\n    public setIndex(index: number): void {\n        this._index = index;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\n\n/**\n * PAGO23: En un documento relacionado, la moneda no puede ser \"XXX\" (CRP217)\n */\nexport class Moneda extends AbstractDoctoRelacionadoValidator {\n    protected override code = 'PAGO23';\n\n    protected override title = 'En un documento relacionado, la moneda no puede ser \"XXX\" (CRP217)';\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        if ('XXX' === docto.get('MonedaDR')) {\n            throw this.exception(`MonedaDR: \"${docto.get('MonedaDR')}\"`);\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\n\n/**\n * PAGO24: En un documento relacionado, el tipo de cambio debe existir cuando la moneda del pago\n *         es diferente a la moneda del documento y viceversa (CRP218, CRP219)\n */\nexport class TipoCambioRequerido extends AbstractDoctoRelacionadoValidator {\n    protected override code = 'PAGO24';\n\n    protected override title = [\n        'En un documento relacionado, el tipo de cambio debe existir cuando la moneda del pago',\n        ' es diferente a la moneda del documento y viceversa (CRP218, CRP219)'\n    ].join('');\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        const pago = this.getPago();\n        const currencyIsEqual = pago.get('MonedaP') === docto.get('MonedaDR');\n        if (!(currencyIsEqual ? !docto.offsetExists('TipoCambioDR') : docto.offsetExists('TipoCambioDR'))) {\n            throw this.exception(\n                `Moneda pago: \"${pago.get('MonedaP')}\", Moneda documento: \"${docto.get(\n                    'MonedaDR'\n                )}\", Tipo cambio docto: \"${docto.get('TipoCambioDR')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\n\n/**\n * PAGO25: En un documento relacionado, el tipo de cambio debe tener el valor \"1\"\n *         cuando la moneda del documento es MXN y diferente de la moneda del pago (CRP220)\n */\nexport class TipoCambioValor extends AbstractDoctoRelacionadoValidator {\n    protected override code = 'PAGO25';\n\n    protected override title = [\n        'En un documento relacionado, el tipo de cambio debe tener el valor \"1\"',\n        ' cuando la moneda del documento es MXN y diferente de la moneda del pago (CRP220)'\n    ].join('');\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        const pago = this.getPago();\n\n        if (\n            'MXN' === docto.get('MonedaDR') &&\n            pago.get('MonedaP') !== docto.get('MonedaDR') &&\n            '1' !== docto.get('TipoCambioDR')\n        ) {\n            throw this.exception(\n                `Moneda pago: \"${pago.get('MonedaP')}\", Moneda documento: \"${docto.get(\n                    'MonedaDR'\n                )}\", Tipo cambio docto: \"${docto.get('TipoCambioDR')}\"`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\n\n/**\n * PAGO26: En un documento relacionado, el importe del saldo anterior debe ser mayor a cero (CRP221)\n */\nexport class ImporteSaldoAnteriorValor extends AbstractDoctoRelacionadoValidator {\n    protected override code = 'PAGO26';\n\n    protected override title =\n        'En un documento relacionado, el importe del saldo anterior debe ser mayor a cero (CRP221)';\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        const value = parseFloat(docto.get('ImpSaldoAnt') || '0');\n        if (!this.isGreaterThan(value, 0)) {\n            throw this.exception(`ImpSaldoAnt: ${docto.get('ImpSaldoAnt')}`);\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { Mixin } from 'ts-mixer';\n\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\nimport { CalculateDocumentAmountTrait } from '../../helpers/calculate-document-amount-trait';\n\n/**\n * PAGO27: En un documento relacionado, el importe pagado debes ser mayor a cero (CRP223)\n */\nclass ImportePagadoValor extends Mixin(AbstractDoctoRelacionadoValidator, CalculateDocumentAmountTrait) {\n    protected override code = 'PAGO27';\n\n    protected override title = 'En un documento relacionado, el importe pagado debe ser mayor a cero (CRP223)';\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        let value: number;\n        if (docto.offsetExists('ImpPagado')) {\n            value = parseFloat(docto.attributes().get('ImpPagado') || '0');\n        } else {\n            value = this.calculateDocumentAmount(docto, this.getPago());\n        }\n        if (!this.isGreaterThan(value, 0)) {\n            throw this.exception(`ImpPagado: ${docto.get('ImpPagado')}, valor: ${value}`);\n        }\n\n        return true;\n    }\n}\n\nexport { ImportePagadoValor };\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { Mixin } from 'ts-mixer';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\nimport { CalculateDocumentAmountTrait } from '../../helpers/calculate-document-amount-trait';\n\n/**\n * PAGO28: En un documento relacionado, el importe del saldo insoluto debe ser mayor o igual a cero\n *         e igual a la resta del importe del saldo anterior menos el importe pagado (CRP226)\n */\nclass ImporteSaldoInsolutoValor extends Mixin(AbstractDoctoRelacionadoValidator, CalculateDocumentAmountTrait) {\n    protected override code = 'PAGO28';\n\n    protected override title = [\n        'En un documento relacionado, el importe del saldo insoluto debe ser mayor o igual a cero',\n        ' e igual a la resta del importe del saldo anterior menos el importe pagado (CRP226)'\n    ].join('');\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        const value = parseFloat(docto.get('ImpSaldoInsoluto') || '0');\n        if (!this.isEqual(0, value) && !this.isGreaterThan(value, 0)) {\n            throw this.exception(`ImpSaldoInsoluto: ${docto.get('ImpSaldoInsoluto')}`);\n        }\n\n        const expected =\n            parseFloat(docto.get('ImpSaldoAnt') || '0') - this.calculateDocumentAmount(docto, this.getPago());\n        if (!this.isEqual(expected, value)) {\n            throw this.exception(`ImpSaldoInsoluto: ${docto.get('ImpSaldoInsoluto')}, Esperado: ${expected}`);\n        }\n\n        return true;\n    }\n}\n\nexport { ImporteSaldoInsolutoValor };\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\n\n/**\n * PAGO29: En un documento relacionado, los importes de importe pagado, saldo anterior y saldo insoluto\n *         deben tener hasta la cantidad de decimales que soporte la moneda (CRP222, CRP224, CRP225)\n */\nexport class ImportesDecimales extends AbstractDoctoRelacionadoValidator {\n    protected override code = 'PAGO29';\n\n    protected override title = [\n        'En un documento relacionado, los importes de importe pagado, saldo anterior y saldo insoluto',\n        ' deben tener hasta la cantidad de decimales que soporte la moneda (CRP222, CRP224, CRP225)'\n    ].join('');\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        const currency = this.createCurrencyDecimals(docto.get('MonedaDR'));\n        if (!currency.doesNotExceedDecimals(docto.get('ImpSaldoAnt') || '0')) {\n            throw this.exception(`ImpSaldoAnt \"${docto.get('ImpSaldoAnt')}\", Decimales: ${currency.decimals()}`);\n        }\n\n        if (docto.offsetExists('ImpPagado') && !currency.doesNotExceedDecimals(docto.get('ImpPagado') || '0')) {\n            throw this.exception(`ImpPagado: \"${docto.get('ImpPagado')}\", Decimales: ${currency.decimals()}`);\n        }\n\n        if (!currency.doesNotExceedDecimals(docto.get('ImpSaldoInsoluto') || '0')) {\n            throw this.exception(\n                `ImpSaldoInsoluto: \"${docto.get('ImpSaldoInsoluto')}\", Decimales: ${currency.decimals()}`\n            );\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\n\n/**\n * PAGO30: En un documento relacionado, el importe pagado es requerido cuando\n *         el tipo de cambio existe o existe más de un documento relacionado (CRP235)\n */\nexport class ImportePagadoRequerido extends AbstractDoctoRelacionadoValidator {\n    protected override code = 'PAGO30';\n\n    protected override title = [\n        'En un documento relacionado, el importe pagado es requerido cuando',\n        ' el tipo de cambio existe o existe más de un documento relacionado (CRP235)'\n    ].join('');\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        if (!docto.offsetExists('ImpPagado')) {\n            const documentsCount = this.getPago().searchNodes('pago10:DoctoRelacionado').length;\n            if (documentsCount > 1) {\n                throw this.exception('No hay importe pagado y hay más de 1 documento en el pago');\n            }\n            if (docto.offsetExists('TipoCambioDR')) {\n                throw this.exception('No hay importe pagado y existe el tipo de cambio del documento');\n            }\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\n\n/**\n * PAGO31: En un documento relacionado, el número de parcialidad es requerido cuando\n *         el tipo de cambio existe o existe más de un documento relacionado (CRP234)\n */\nexport class NumeroParcialidadRequerido extends AbstractDoctoRelacionadoValidator {\n    protected override code = 'PAGO31';\n\n    protected override title = [\n        'En un documento relacionado, el número de parcialidad es requerido cuando',\n        ' el tipo de cambio existe o existe más de un documento relacionado (CRP233)'\n    ].join('');\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        if (!docto.offsetExists('NumParcialidad') && 'PPD' === docto.get('MetodoDePagoDR')) {\n            throw this.exception('No hay número de parcialidad y el método de pago es PPD');\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\n\n/**\n * PAGO32: En un documento relacionado, el saldo anterior es requerido cuando\n *         el tipo de cambio existe o existe más de un documento relacionado (CRP234)\n */\nexport class ImporteSaldoAnteriorRequerido extends AbstractDoctoRelacionadoValidator {\n    protected override code = 'PAGO32';\n\n    protected override title = [\n        'En un documento relacionado, el saldo anterior es requerido cuando',\n        ' el tipo de cambio existe o existe más de un documento relacionado (CRP234)'\n    ].join('');\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        if (!docto.offsetExists('ImpSaldoAnt') && 'PPD' === docto.get('MetodoDePagoDR')) {\n            throw this.exception('No hay saldo anterior y el método de pago es PPD');\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDoctoRelacionadoValidator } from './abstract-docto-relacionado-validator';\n\n/**\n * PAGO33: En un documento relacionado, el saldo insoluto es requerido cuando\n *         el tipo de cambio existe o existe más de un documento relacionado (CRP234)\n */\nexport class ImporteSaldoInsolutoRequerido extends AbstractDoctoRelacionadoValidator {\n    protected override code = 'PAGO33';\n\n    protected override title = [\n        'En un documento relacionado, el saldo insoluto es requerido cuando',\n        ' el tipo de cambio existe o existe más de un documento relacionado (CRP233)'\n    ].join('');\n\n    public validateDoctoRelacionado(docto: CNodeInterface): boolean {\n        if (!docto.offsetExists('ImpSaldoInsoluto') && 'PPD' === docto.get('MetodoDePagoDR')) {\n            throw this.exception('No hay saldo insoluto y el método de pago es PPD');\n        }\n\n        return true;\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { AbstractDoctoRelacionadoValidator } from './docto-relacionado/abstract-docto-relacionado-validator';\nimport { Moneda } from './docto-relacionado/moneda';\nimport { TipoCambioRequerido } from './docto-relacionado/tipo-cambio-requerido';\nimport { TipoCambioValor } from './docto-relacionado/tipo-cambio-valor';\nimport { ImporteSaldoAnteriorValor } from './docto-relacionado/importe-saldo-anterior-valor';\nimport { ImportePagadoValor } from './docto-relacionado/importe-pagado-valor';\nimport { ImporteSaldoInsolutoValor } from './docto-relacionado/importe-saldo-insoluto-valor';\nimport { ImportesDecimales } from './docto-relacionado/importes-decimales';\nimport { ImportePagadoRequerido } from './docto-relacionado/importe-pagado-requerido';\nimport { NumeroParcialidadRequerido } from './docto-relacionado/numero-parcialidad-requerido';\nimport { ImporteSaldoAnteriorRequerido } from './docto-relacionado/importe-saldo-anterior-requerido';\nimport { ImporteSaldoInsolutoRequerido } from './docto-relacionado/importe-saldo-insoluto-requerido';\nimport { Asserts } from '../../../asserts';\n\nexport class DoctoRelacionado extends AbstractPagoValidator {\n    protected validators: AbstractDoctoRelacionadoValidator[];\n\n    constructor() {\n        super();\n        this.validators = this.createValidators();\n    }\n\n    public getValidators(): AbstractDoctoRelacionadoValidator[] {\n        return this.validators;\n    }\n\n    public createValidators(): AbstractDoctoRelacionadoValidator[] {\n        return [\n            new Moneda(), // PAGO23\n            new TipoCambioRequerido(), // PAGO24\n            new TipoCambioValor(), // PAGO25\n            new ImporteSaldoAnteriorValor(), // PAGO26\n            new ImportePagadoValor(), // PAGO27\n            new ImporteSaldoInsolutoValor(), // PAGO28\n            new ImportesDecimales(), // PAGO29\n            new ImportePagadoRequerido(), // PAGO30\n            new NumeroParcialidadRequerido(), // PAGO31\n            new ImporteSaldoAnteriorRequerido(), // PAGO32\n            new ImporteSaldoInsolutoRequerido() // PAGO33\n        ];\n    }\n\n    // override registerInAssets to add validators instead of itself\n    public override registerInAssets(asserts: Asserts): void {\n        this.validators.forEach((validator) => {\n            validator.registerInAssets(asserts);\n        });\n    }\n\n    public validatePago(pago: CNodeInterface): boolean {\n        // when validate pago perform validators on all documents\n        const validators = this.getValidators();\n        pago.searchNodes('pago10:DoctoRelacionado').forEach((doctoRelacionado, index) => {\n            validators.forEach((validator) => {\n                validator.setPago(pago);\n                validator.setIndex(index);\n                validator.validateDoctoRelacionado(doctoRelacionado);\n            });\n        });\n\n        return true;\n    }\n}\n","import { CNodeInterface, CurrencyDecimals } from '@nodecfdi/cfdiutils-common';\nimport { Mixin } from 'ts-mixer';\nimport { AbstractPagoValidator } from './abstract-pago-validator';\nimport { CalculateDocumentAmountTrait } from '../helpers/calculate-document-amount-trait';\nimport { ValidatePagoException } from './validate-pago-exception';\n\n/**\n * PAGO30: En un pago, la suma de los valores registrados o predeterminados en el importe pagado\n *         de los documentos relacionados debe ser menor o igual que el monto del pago (CRP206)\n */\nclass MontoGreaterOrEqualThanSumOfDocuments extends Mixin(AbstractPagoValidator, CalculateDocumentAmountTrait) {\n    protected override code = 'PAGO30';\n\n    protected override title = [\n        'En un pago, la suma de los valores registrados o predeterminados en el importe pagado',\n        ' de los documentos relacionados debe ser menor o igual que el monto del pago (CRP206)'\n    ].join('');\n\n    public validatePago(pago: CNodeInterface): boolean {\n        const currency = this.createCurrencyDecimals(pago.get('MonedaP'));\n        const sumOfDocuments = this.calculateSumOfDocuments(pago, currency);\n        const pagoAmount = parseFloat(pago.get('Monto') || '0');\n        if (this.isGreaterThan(sumOfDocuments, pagoAmount)) {\n            throw new ValidatePagoException(`Monto del pago: \"${pagoAmount}\", Suma de documentos: \"${sumOfDocuments}\"`);\n        }\n\n        return true;\n    }\n\n    public calculateSumOfDocuments(pago: CNodeInterface, currency: CurrencyDecimals): number {\n        let sumOfDocuments = 0;\n        const documents = pago.searchNodes('pago10:DoctoRelacionado');\n        documents.forEach((document) => {\n            let exchangeRate = parseFloat(document.get('TipoCambioDR') || '0');\n            if (this.isEqual(exchangeRate, 0)) {\n                exchangeRate = 1;\n            }\n            sumOfDocuments += currency.round(this.calculateDocumentAmount(document, pago) / exchangeRate);\n        });\n\n        return sumOfDocuments;\n    }\n}\n\nexport { MontoGreaterOrEqualThanSumOfDocuments };\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractRecepcionPagos10 } from '../abstracts/abstract-recepcion-pagos10';\nimport { Asserts } from '../../asserts';\nimport { AbstractPagoValidator } from './pagos/abstract-pago-validator';\nimport { Fecha } from './pagos/fecha';\nimport { FormaDePago } from './pagos/forma-de-pago';\nimport { MonedaPago } from './pagos/moneda-pago';\nimport { TipoCambioExists } from './pagos/tipo-cambio-exists';\nimport { TipoCambioValue } from './pagos/tipo-cambio-value';\nimport { MontoGreaterThanZero } from './pagos/monto-greater-than-zero';\nimport { MontoDecimals } from './pagos/monto-decimals';\nimport { MontoBetweenIntervalSumOfDocuments } from './pagos/monto-between-interval-sum-of-documents';\nimport { BancoOrdenanteRfcCorrecto } from './pagos/banco-ordenante-rfc-correcto';\nimport { BancoOrdenanteNombreRequerido } from './pagos/banco-ordenante-nombre-requerido';\nimport { BancoOrdenanteRfcProhibido } from './pagos/banco-ordenante-rfc-prohibido';\nimport { CuentaOrdenanteProhibida } from './pagos/cuenta-ordenante-prohibida';\nimport { CuentaOrdenantePatron } from './pagos/cuenta-ordenante-patron';\nimport { BancoBeneficiarioRfcCorrecto } from './pagos/banco-beneficiario-rfc-correcto';\nimport { BancoBeneficiarioRfcProhibido } from './pagos/banco-beneficiario-rfc-prohibido';\nimport { CuentaBeneficiariaProhibida } from './pagos/cuenta-beneficiaria-prohibida';\nimport { CuentaBeneficiariaPatron } from './pagos/cuenta-beneficiaria-patron';\nimport { TipoCadenaPagoProhibido } from './pagos/tipo-cadena-pago-prohibido';\nimport { TipoCadenaPagoCertificado } from './pagos/tipo-cadena-pago-certificado';\nimport { TipoCadenaPagoCadena } from './pagos/tipo-cadena-pago-cadena';\nimport { TipoCadenaPagoSello } from './pagos/tipo-cadena-pago-sello';\nimport { DoctoRelacionado } from './pagos/docto-relacionado';\nimport { MontoGreaterOrEqualThanSumOfDocuments } from './pagos/monto-greater-or-equal-than-sum-of-documents';\nimport { ValidateDoctoException } from './pagos/docto-relacionado/validate-docto-exception';\nimport { ValidatePagoException } from './pagos/validate-pago-exception';\nimport { Status } from '../../status';\n\n/**\n * Pago - Válida los nodos de pago dentro del complemento de pagos\n *\n * Se generan mensajes de error en los pagos con clave:\n * PAGO??-XX donde '??', es el número de validación general y XX es el número del nodo con problemas\n *\n * Se generan mensajes de error en los documentos relacionados con clave:\n * PAGO??-XX-YY donde YY es el número del nodo con problemas\n */\nexport class Pago extends AbstractRecepcionPagos10 {\n    /** This is the asserts object used in the validation process */\n    private _asserts: Asserts = new Asserts();\n\n    private _validators: AbstractPagoValidator[] | null = null;\n\n    public createValidators(): AbstractPagoValidator[] {\n        return [\n            new Fecha(), // PAGO02\n            new FormaDePago(), // PAGO03\n            new MonedaPago(), // PAGO04\n            new TipoCambioExists(), // PAGO05\n            new TipoCambioValue(), // PAGO06\n            new MontoGreaterThanZero(), // PAGO07\n            new MontoDecimals(), // PAGO08\n            new MontoBetweenIntervalSumOfDocuments(), // PAGO09\n            new BancoOrdenanteRfcCorrecto(), // PAGO10\n            new BancoOrdenanteNombreRequerido(), // PAGO11\n            new BancoOrdenanteRfcProhibido(), // PAGO12\n            new CuentaOrdenanteProhibida(), // PAGO13\n            new CuentaOrdenantePatron(), // PAGO14\n            new BancoBeneficiarioRfcCorrecto(), // PAGO15\n            new BancoBeneficiarioRfcProhibido(), // PAGO16\n            new CuentaBeneficiariaProhibida(), // PAGO017\n            new CuentaBeneficiariaPatron(), // PAGO18\n            new TipoCadenaPagoProhibido(), // PAGO19\n            new TipoCadenaPagoCertificado(), // PAGO20\n            new TipoCadenaPagoCadena(), // PAGO21\n            new TipoCadenaPagoSello(), // PAGO22\n            new DoctoRelacionado(), // PAGO23 ... PAGO29\n            new MontoGreaterOrEqualThanSumOfDocuments() // PAGO30\n        ];\n    }\n\n    public getValidators(): AbstractPagoValidator[] {\n        if (!this._validators) {\n            this._validators = this.createValidators();\n        }\n\n        return this._validators;\n    }\n\n    public validateRecepcionPagos(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        this._asserts = asserts;\n\n        // create pago validators array\n        const validators = this.createValidators();\n\n        // register pago validators array into asserts\n        validators.forEach((validator) => {\n            validator.registerInAssets(asserts);\n        });\n\n        // obtain the pago nodes\n        const pagoNodes = comprobante.searchNodes('cfdi:Complemento', 'pago10:Pagos', 'pago10:Pago');\n        pagoNodes.forEach((pagoNode, index) => {\n            // pass each pago node throw validators\n            validators.forEach((validator) => {\n                try {\n                    if (!validator.validatePago(pagoNode)) {\n                        throw new Error(`The validation of pago ${index} ${validator.constructor.name} return false`);\n                    }\n                } catch (e) {\n                    if (e instanceof ValidateDoctoException) {\n                        this.setDoctoRelacionadoStatus(\n                            e.getValidatorCode(),\n                            index,\n                            e.getIndex(),\n                            e.getStatus(),\n                            e.message\n                        );\n                    } else if (e instanceof ValidatePagoException) {\n                        this.setPagoStatus(validator.getCode(), index, e.getStatus(), e.message);\n                    }\n                }\n            });\n        });\n\n        return Promise.resolve();\n    }\n\n    private setPagoStatus(code: string, index: number, errorStatus: Status, explanation = ''): void {\n        const assert = this._asserts.get(code);\n        assert.setStatus(errorStatus);\n        this._asserts.put(\n            `${assert.getCode()}-${index.toString().padStart(2, '0')}`,\n            assert.getTitle(),\n            errorStatus,\n            explanation\n        );\n    }\n\n    private setDoctoRelacionadoStatus(\n        code: string,\n        pagoIndex: number,\n        doctoIndex: number,\n        errorStatus: Status,\n        explanation = ''\n    ): void {\n        const assert = this._asserts.get(code);\n        const doctoCode = `${assert.getCode()}-${pagoIndex.toString().padStart(2, '0')}-${doctoIndex\n            .toString()\n            .padStart(2, '0')}`;\n        this.setPagoStatus(code, pagoIndex, errorStatus);\n        this._asserts.put(doctoCode, assert.getTitle(), errorStatus, explanation);\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractRecepcionPagos10 } from '../abstracts/abstract-recepcion-pagos10';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * Pagos - Válida el contenido del nodo del complemento de pago\n *\n * - PAGOS01: Debe existir al menos un pago en el complemento de pagos\n */\nexport class Pagos extends AbstractRecepcionPagos10 {\n    public validateRecepcionPagos(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const assert = asserts.put('PAGOS01', 'Debe existir al menos un pago en el complemento de pagos');\n\n        const pagoCollection = comprobante.searchNodes('cfdi:Complemento', 'pago10:Pagos', 'pago10:Pago');\n        assert.setStatus(\n            Status.when(pagoCollection.length > 0),\n            'Debe existir al menos un pago en el complemento de pagos'\n        );\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractRecepcionPagos10 } from '../abstracts/abstract-recepcion-pagos10';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * UsoCfdi\n *\n * - PAGUSO01: El uso del CFDI debe ser \"P01\" (CRP110)\n */\nexport class UsoCfdi extends AbstractRecepcionPagos10 {\n    public validateRecepcionPagos(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        const assert = asserts.put('PAGUSO01', 'El uso del CFDI debe ser \"P01\" (CRP110)');\n\n        const receptor = comprobante.searchNode('cfdi:Receptor');\n        if (!receptor) {\n            assert.setStatus(Status.error(), 'No se encontró el nodo Receptor');\n\n            return Promise.resolve();\n        }\n        assert.setStatus(Status.when('P01' === receptor.get('UsoCFDI')), `Uso CFDI: \"${receptor.get('UsoCFDI')}\"`);\n\n        return Promise.resolve();\n    }\n}\n","import { Mixin } from 'ts-mixer';\nimport { AbstractDiscoverableVersion40 } from '../abstracts/abstract-discoverable-version40';\nimport { RequireXmlStringInterface } from '../../contracts/require-xml-string-interface';\nimport { RequireXmlResolverInterface } from '../../contracts/require-xml-resolver-interface';\nimport { RequireXsltBuilderInterface } from '../../contracts/require-xslt-builder-interface';\nimport { SelloDigitalCertificadoValidatorTrait } from '../../common/sello-digital-certificado-validator-trait';\n\n/**\n * SelloDigitalCertificado\n *\n * Válida que:\n * - SELLO01: Se puede obtener el certificado del comprobante\n * - SELLO02: El número de certificado del comprobante igual al encontrado en el certificado\n * - SELLO03: El RFC del comprobante igual al encontrado en el certificado\n * - SELLO04: El nombre del emisor del comprobante es igual al encontrado en el certificado\n * - SELLO05: La fecha del documento es mayor o igual a la fecha de inicio de vigencia del certificado\n * - SELLO06: La fecha del documento menor o igual a la fecha de fin de vigencia del certificado\n * - SELLO07: El sello del comprobante está en base 64\n * - SELLO08: El sello del comprobante coincide con el certificado y la cadena de origen generada\n */\nclass SelloDigitalCertificado\n    extends Mixin(AbstractDiscoverableVersion40, SelloDigitalCertificadoValidatorTrait)\n    implements RequireXmlStringInterface, RequireXmlResolverInterface, RequireXsltBuilderInterface {}\n\nexport { SelloDigitalCertificado };\n","import { Mixin } from 'ts-mixer';\nimport { RequireXmlResolverInterface } from '../../contracts/require-xml-resolver-interface';\nimport { RequireXsltBuilderInterface } from '../../contracts/require-xslt-builder-interface';\nimport { TimbreFiscalDigitalSelloValidatorTrait } from '../../common/timbre-fiscal-digital-sello-validator-trait';\nimport { AbstractDiscoverableVersion40 } from '../abstracts/abstract-discoverable-version40';\n\n/**\n * TimbreFiscalDigitalSello\n *\n * Válida que:\n * - TFDSELLO01: El Sello SAT del Timbre Fiscal Digital corresponde al certificado SAT\n */\nclass TimbreFiscalDigitalSello\n    extends Mixin(AbstractDiscoverableVersion40, TimbreFiscalDigitalSelloValidatorTrait)\n    implements RequireXmlResolverInterface, RequireXsltBuilderInterface {}\n\nexport { TimbreFiscalDigitalSello };\n","import { Mixin } from 'ts-mixer';\nimport { TimbreFiscalDigitalVersionValidatorTrait } from '../../common/timbre-fiscal-digital-version-validator-trait';\nimport { AbstractDiscoverableVersion40 } from '../abstracts/abstract-discoverable-version40';\n\n/**\n * TimbreFiscalDigitalVersion\n *\n * Válida que:\n * - TFDVERSION01: Si existe el complemento timbre fiscal digital, entonces su versión debe ser 1.1\n */\nclass TimbreFiscalDigitalVersion extends Mixin(\n    AbstractDiscoverableVersion40,\n    TimbreFiscalDigitalVersionValidatorTrait\n) {}\n\nexport { TimbreFiscalDigitalVersion };\n","import {\n    XmlResolverPropertyInterface,\n    XmlResolverPropertyTrait,\n    XsltBuilderPropertyInterface,\n    XsltBuilderPropertyTrait\n} from '@nodecfdi/cfdiutils-core';\nimport { Mixin } from 'ts-mixer';\nimport { XmlStringPropertyTrait } from './traits/xml-string-property-trait';\nimport { ValidatorInterface } from './contracts/validator-interface';\nimport { RequireXmlStringInterface } from './contracts/require-xml-string-interface';\nimport { RequireXmlResolverInterface } from './contracts/require-xml-resolver-interface';\nimport { RequireXsltBuilderInterface } from './contracts/require-xslt-builder-interface';\n\nclass Hydrater\n    extends Mixin(XmlResolverPropertyTrait, XmlStringPropertyTrait, XsltBuilderPropertyTrait)\n    implements XmlResolverPropertyInterface, XsltBuilderPropertyInterface\n{\n    public hydrate(validator: ValidatorInterface): void {\n        if (this.isRequireXmlStringInterface(validator)) {\n            validator.setXmlString(this.getXmlString());\n        }\n        if (this.hasXmlResolver() && this.isRequireXmlResolverInterface(validator)) {\n            validator.setXmlResolver(this.getXmlResolver());\n        }\n        if (this.isRequireXsltBuilderInterface(validator)) {\n            validator.setXsltBuilder(this.getXsltBuilder());\n        }\n    }\n\n    protected isRequireXmlStringInterface(object: unknown): object is RequireXmlStringInterface {\n        const instance = object as RequireXmlStringInterface;\n\n        return instance.setXmlString !== undefined && instance.getXmlString !== undefined;\n    }\n\n    protected isRequireXmlResolverInterface(object: unknown): object is RequireXmlResolverInterface {\n        const instance = object as RequireXmlResolverInterface;\n\n        return (\n            instance.hasXmlResolver !== undefined &&\n            instance.getXmlResolver !== undefined &&\n            instance.setXmlResolver !== undefined\n        );\n    }\n\n    protected isRequireXsltBuilderInterface(object: unknown): object is RequireXsltBuilderInterface {\n        const instance = object as RequireXsltBuilderInterface;\n\n        return (\n            instance.hasXsltBuilder !== undefined &&\n            instance.getXsltBuilder !== undefined &&\n            instance.setXsltBuilder !== undefined\n        );\n    }\n}\n\nexport { Hydrater };\n","import { XmlResolverPropertyTrait, XsltBuilderPropertyTrait } from '@nodecfdi/cfdiutils-core';\nimport { CNodeInterface, XmlNodeUtils } from '@nodecfdi/cfdiutils-common';\nimport { Mixin } from 'ts-mixer';\nimport { MultiValidator } from './multi-validator';\nimport { Asserts } from './asserts';\nimport { Hydrater } from './hydrater';\n\nabstract class CfdiValidatorTrait extends Mixin(XsltBuilderPropertyTrait, XmlResolverPropertyTrait) {\n    protected abstract createVersionedMultiValidator(): MultiValidator;\n\n    /**\n     * Validate and return the asserts from the validation process.\n     * This method can use a xml string and a CNodeInterface,\n     * is your responsability that the node is the representation of the content.\n     *\n     * @param xmlString -\n     * @param node -\n     */\n    public async validate(xmlString: string, node: CNodeInterface): Promise<Asserts> {\n        if ('' === xmlString) {\n            throw new Error('The xml string to validate cannot be empty');\n        }\n\n        const validator = this.createVersionedMultiValidator();\n\n        const hydrater = new Hydrater();\n        hydrater.setXmlString(xmlString);\n        hydrater.setXmlResolver(this.hasXmlResolver() ? this.getXmlResolver() : null);\n        hydrater.setXsltBuilder(this.getXsltBuilder());\n        validator.hydrate(hydrater);\n\n        const asserts = new Asserts();\n        await validator.validate(node, asserts);\n\n        return asserts;\n    }\n\n    /**\n     * Validate and return the asserts from the validation process based on a xml string\n     *\n     * @param xmlString -\n     */\n    public validateXml(xmlString: string): Promise<Asserts> {\n        return this.validate(xmlString, XmlNodeUtils.nodeFromXmlString(xmlString));\n    }\n\n    /**\n     * Validate and return the asserts from the validation process based on a node interface object\n     *\n     * @param node -\n     */\n    public validateNode(node: CNodeInterface): Promise<Asserts> {\n        return this.validate(XmlNodeUtils.nodeToXmlString(node), node);\n    }\n}\n\nexport { CfdiValidatorTrait };\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { ValidatorInterface } from './contracts/validator-interface';\nimport { Asserts } from './asserts';\nimport { Hydrater } from './hydrater';\n\nexport class MultiValidator implements ValidatorInterface {\n    private _validators: ValidatorInterface[] = [];\n\n    private readonly _version: string;\n\n    public get length(): number {\n        return this._validators.length;\n    }\n\n    constructor(version: string) {\n        this._version = version;\n    }\n\n    public getVersion(): string {\n        return this._version;\n    }\n\n    public async validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        for (const validator of this._validators) {\n            if (!validator.canValidateCfdiVersion(this.getVersion())) {\n                continue;\n            }\n            const localAsserts = new Asserts();\n            await validator.validate(comprobante, localAsserts);\n            asserts.import(localAsserts);\n            if (localAsserts.mustStop()) {\n                break;\n            }\n        }\n\n        return Promise.resolve();\n    }\n\n    public canValidateCfdiVersion(version: string): boolean {\n        return this._version === version;\n    }\n\n    public hydrate(hydrater: Hydrater): void {\n        this._validators.forEach((validator) => {\n            hydrater.hydrate(validator);\n        });\n    }\n\n    /**\n     * Collection methods\n     */\n\n    public add(validator: ValidatorInterface): void {\n        this._validators.push(validator);\n    }\n\n    public addMulti(...validators: ValidatorInterface[]): void {\n        validators.forEach((validator) => {\n            this.add(validator);\n        });\n    }\n\n    public exists(validator: ValidatorInterface): boolean {\n        return this.indexOf(validator) >= 0;\n    }\n\n    private indexOf(validator: ValidatorInterface): number {\n        return this._validators.indexOf(validator);\n    }\n\n    public remove(validator: ValidatorInterface): void {\n        const index = this.indexOf(validator);\n        if (index >= 0) {\n            this._validators.splice(index, 1);\n        }\n    }\n\n    public removeAll(): void {\n        this._validators = [];\n    }\n\n    // Iterators of MultiValidator\n    public [Symbol.iterator](): IterableIterator<ValidatorInterface> {\n        return this._validators[Symbol.iterator]();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { AbstractDiscoverableVersion40 } from '../abstracts/abstract-discoverable-version40';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * XmlDefinition\n *\n * Válida que:\n * - XML01: El XML implementa el namespace %s con el prefijo cfdi\n * - XML02: El nodo principal se llama cfdi:Comprobante\n * - XML03: La versión es 4.0\n */\nexport class XmlDefinition extends AbstractDiscoverableVersion40 {\n    private static CFDI40_NAMESPACE = 'http://www.sat.gob.mx/cfd/4';\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        asserts.put(\n            'XML01',\n            `El XML implementa el namespace ${XmlDefinition.CFDI40_NAMESPACE} con el prefijo cfdi.`,\n            Status.when(XmlDefinition.CFDI40_NAMESPACE === comprobante.get('xmlns:cfdi')),\n            `Valor de xmlns:cfdi: ${comprobante.get('xmlns:cfdi')}`\n        );\n        asserts.put(\n            'XML02',\n            'El nodo principal se llama cfdi:Comprobante',\n            Status.when('cfdi:Comprobante' === comprobante.name()),\n            `Nombre: ${comprobante.name()}`\n        );\n        asserts.put(\n            'XML03',\n            'La versión es 4.0',\n            Status.when('4.0' === comprobante.get('Version')),\n            `Version: ${comprobante.get('Version')}`\n        );\n\n        return Promise.resolve();\n    }\n}\n","import { CNodeInterface } from '@nodecfdi/cfdiutils-common';\nimport { SumasConceptos } from '@nodecfdi/cfdiutils-elements';\nimport { AbstractDiscoverableVersion33 } from '../abstracts/abstract-discoverable-version33';\nimport { Asserts } from '../../asserts';\nimport { Status } from '../../status';\n\n/**\n * SumasConceptosComprobanteImpuestos\n *\n * Esta clase genera la suma de subtotal, descuento, total e impuestos a partir de las sumas de los conceptos.\n * Con estas sumas válidas contra los valores del comprobante, los valores de impuestos\n * y la lista de impuestos trasladados y retenidos\n *\n * Válida que:\n * - SUMAS01: La suma de los importes de conceptos es igual al subtotal del comprobante\n * - SUMAS02: La suma de los descuentos es igual al descuento del comprobante\n * - SUMAS03: El cálculo del total es igual al total del comprobante\n *\n * - SUMAS04: El cálculo de impuestos trasladados es igual al total de impuestos trasladados\n * - SUMAS05: Todos los impuestos trasladados existen en el comprobante\n * - SUMAS06: Todos los valores de los impuestos trasladados conciden con el comprobante\n * - SUMAS07: No existen más nodos de impuestos trasladados en el comprobante de los que se han calculado\n *\n * - SUMAS08: El cálculo de impuestos retenidos es igual al total de impuestos retenidos\n * - SUMAS09: Todos los impuestos retenidos existen en el comprobante\n * - SUMAS10: Todos los valores de los impuestos retenidos conciden con el comprobante\n * - SUMAS11: No existen más nodos de impuestos trasladados en el comprobante de los que se han calculado\n *\n * - SUMAS12: El cálculo del descuento debe ser menor o igual al cálculo del subtotal\n *\n * - Adicionalmente, para SUMAS06 y SUMAS10 se generan: SUMASxx:yyy donde\n *      - xx puede ser 06 o 10\n *      - yyy es el consecutivo de la línea del impuesto\n *      - Se valida que El importe dek impuesto del Grupo X Impuesto X Tipo factor X Tasa o cuota X\n *                 es igual al importe del nodo\n */\nexport class SumasConceptosComprobanteImpuestos extends AbstractDiscoverableVersion33 {\n    private _comprobante!: CNodeInterface;\n\n    private _asserts!: Asserts;\n\n    private _sumasConceptos!: SumasConceptos;\n\n    private registerAsserts(): void {\n        const asserts: Record<string, string> = {\n            SUMAS01: 'La suma de los importes de conceptos es igual a el subtotal del comprobante',\n            SUMAS02: 'La suma de los descuentos es igual a el descuento del comprobante',\n            SUMAS03: 'El cálculo del total es igual a el total del comprobante',\n            SUMAS04: 'El cálculo de impuestos trasladados es igual a el total de impuestos trasladados',\n            SUMAS05: 'Todos los impuestos trasladados existen en el comprobante',\n            SUMAS06: 'Todos los valores de los impuestos trasladados conciden con el comprobante',\n            SUMAS07: 'No existen más nodos de impuestos trasladados en el comprobante de los que se han calculado',\n            SUMAS08: 'El cálculo de impuestos retenidos es igual a el total de impuestos retenidos',\n            SUMAS09: 'Todos los impuestos retenidos existen en el comprobante',\n            SUMAS10: 'Todos los valores de los impuestos retenidos conciden con el comprobante',\n            SUMAS11: 'No existen más nodos de impuestos trasladados en el comprobante de los que se han calculado',\n            SUMAS12: 'El cálculo del descuento debe ser menor o igual al cálculo del subtotal'\n        };\n        Object.entries(asserts).forEach(([code, title]) => {\n            this._asserts.put(code, title);\n        });\n    }\n\n    public validate(comprobante: CNodeInterface, asserts: Asserts): Promise<void> {\n        this._asserts = asserts;\n        this._comprobante = comprobante;\n        this.registerAsserts();\n\n        this._sumasConceptos = new SumasConceptos(comprobante);\n        this.validateSubTotal();\n        this.validateDescuento();\n        this.validateTotal();\n        this.validateImpuestosTrasladados();\n        this.validateTrasladosMatch();\n        this.validateImpuestosRetenidos();\n        this.validateRetencionesMatch();\n        this.validateDescuentoLessOrEqualThanSubTotal();\n\n        return Promise.resolve();\n    }\n\n    private validateSubTotal(): void {\n        this.validateValues(\n            'SUMAS01',\n            'Calculado',\n            this._sumasConceptos.getSubTotal(),\n            'Comprobante',\n            parseFloat(this._comprobante.get('SubTotal') || '0')\n        );\n    }\n\n    private validateDescuento(): void {\n        this.validateValues(\n            'SUMAS02',\n            'Calculado',\n            this._sumasConceptos.getDescuento(),\n            'Comprobante',\n            parseFloat(this._comprobante.get('Descuento') || '0')\n        );\n    }\n\n    private validateDescuentoLessOrEqualThanSubTotal(): void {\n        const subtotal = parseFloat(this._comprobante.get('SubTotal') || '0');\n        const descuento = parseFloat(this._comprobante.get('Descuento') || '0');\n        this._asserts.putStatus(\n            'SUMAS12',\n            Status.when(subtotal >= descuento),\n            `Subtotal: ${this._comprobante.get('SubTotal')}, Descuento: ${this._comprobante.get('Descuento')}`\n        );\n    }\n\n    private validateTotal(): void {\n        this.validateValues(\n            'SUMAS03',\n            'Calculado',\n            this._sumasConceptos.getTotal(),\n            'Comprobante',\n            parseFloat(this._comprobante.get('Total') || '0')\n        );\n    }\n\n    private validateImpuestosTrasladados(): void {\n        this.validateValues(\n            'SUMAS04',\n            'Calculado',\n            this._sumasConceptos.getImpuestosTrasladados(),\n            'Comprobante',\n            parseFloat(this._comprobante.searchAttribute('cfdi:Impuestos', 'TotalImpuestosTrasladados') || '0')\n        );\n    }\n\n    private validateImpuestosRetenidos(): void {\n        this.validateValues(\n            'SUMAS08',\n            'Calculado',\n            this._sumasConceptos.getImpuestosRetenidos(),\n            'Comprobante',\n            parseFloat(this._comprobante.searchAttribute('cfdi:Impuestos', 'TotalImpuestosRetenidos') || '0')\n        );\n    }\n\n    private validateTrasladosMatch(): void {\n        this.validateImpuestosMatch(\n            5,\n            'traslado',\n            this._sumasConceptos.getTraslados(),\n            ['cfdi:Impuestos', 'cfdi:Traslados', 'cfdi:Traslado'],\n            ['Impuesto', 'TipoFactor', 'TasaOCuota']\n        );\n    }\n\n    private validateRetencionesMatch(): void {\n        this.validateImpuestosMatch(\n            9,\n            'retención',\n            this._sumasConceptos.getRetenciones(),\n            ['cfdi:Impuestos', 'cfdi:Retenciones', 'cfdi:Retencion'],\n            ['Impuesto']\n        );\n    }\n\n    private validateImpuestosMatch(\n        assertOffset: number,\n        type: string,\n        expectedItems: Record<string, Record<string, string | number>>,\n        impuestosPath: string[],\n        impuestosKeys: string[]\n    ): void {\n        const extractedItems: Record<string, Record<string, unknown>> = {};\n        this._comprobante.searchNodes(...impuestosPath).forEach((extracted) => {\n            const newTemp: Record<string, unknown> = {};\n            impuestosKeys.forEach((impuestoKey) => {\n                newTemp[impuestoKey] = extracted.get(impuestoKey);\n            });\n            newTemp['Importe'] = extracted.get('Importe');\n            newTemp['Encontrado'] = false;\n            const newKey = SumasConceptos.impuestoKey(\n                extracted.get('Impuesto'),\n                extracted.get('TipoFactor'),\n                extracted.get('TasaOCuota')\n            );\n            extractedItems[newKey] = newTemp;\n        });\n\n        // check that all elements are found and mark extracted item as found\n        let allExpectedAreFound = true;\n        let allValuesMatch = true;\n        let expectedOffSet = 0;\n        Object.entries(expectedItems).forEach(([expectedKey, expectedItem]) => {\n            expectedOffSet = expectedOffSet + 1;\n            let extractedItem: Record<string, unknown>;\n            if (!extractedItems[expectedKey]) {\n                allExpectedAreFound = false;\n                extractedItem = { Importe: '' };\n            } else {\n                // set found flag\n                extractedItems[expectedKey]['Encontrado'] = true;\n                // check value match\n                extractedItem = extractedItems[expectedKey];\n            }\n            const code = `SUMAS${(assertOffset + 1).toString().padStart(2, '0')}:${expectedOffSet\n                .toString()\n                .padStart(3, '0')}`;\n            const thisValueMatch = this.validateImpuestoImporte(type, code, expectedItem, extractedItem);\n            allValuesMatch = allValuesMatch && thisValueMatch;\n        });\n        const extractedWithoutMatch = Object.values(extractedItems).reduce((a, b) => a + (b['Encontrado'] ? 0 : 1), 0);\n\n        this._asserts.putStatus(`SUMAS${assertOffset.toString().padStart(2, '0')}`, Status.when(allExpectedAreFound));\n        this._asserts.putStatus(`SUMAS${(assertOffset + 1).toString().padStart(2, '0')}`, Status.when(allValuesMatch));\n        this._asserts.putStatus(\n            `SUMAS${(assertOffset + 2).toString().padStart(2, '0')}`,\n            Status.when(0 === extractedWithoutMatch),\n            `No encontrados: ${extractedWithoutMatch}`\n        );\n    }\n\n    private validateImpuestoImporte(\n        type: string,\n        code: string,\n        expected: Record<string, unknown>,\n        extracted: Record<string, unknown>\n    ): boolean {\n        let label = `Grupo ${type} Impuesto ${extracted['Impuesto']}`;\n        if (expected['TipoFactor']) {\n            label = `${label} Tipo factor ${expected['TipoFactor']}`;\n        }\n        if (expected['TasaOCuota']) {\n            label = `${label} Tasa o cuota ${expected['TasaOCuota']}`;\n        }\n        this._asserts.put(code, `El importe del impuesto ${label} es igual a el importe del nodo`);\n\n        return this.validateValues(\n            code,\n            'Calculado',\n            parseFloat(`${expected['Importe']}`),\n            'Encontrado',\n            parseFloat(`${extracted['Importe']}`)\n        );\n    }\n\n    private validateValues(\n        code: string,\n        expectedLabel: string,\n        expectedValue: number,\n        compareLabel: string,\n        compareValue: number,\n        errorStatus: Status | null = null\n    ): boolean {\n        const condition = this.compareImportesAreEqual(expectedValue, compareValue);\n        this._asserts.putStatus(\n            code,\n            Status.when(condition, errorStatus),\n            `${expectedLabel}: ${expectedValue}, ${compareLabel}: ${compareValue}`\n        );\n\n        return condition;\n    }\n\n    protected compareImportesAreEqual(first: number, second: number, delta: number | null = null): boolean {\n        if (null === delta) {\n            delta = 0.000001;\n        }\n\n        return Math.abs(first - second) <= delta;\n    }\n}\n","import { MultiValidator } from './multi-validator';\nimport { XmlFollowSchema } from './xml/xml-follow-schema';\nimport { ValidatorInterface } from './contracts/validator-interface';\nimport { XmlDefinition } from './cfdi40/xml/xml-definition';\n\nimport { ComprobanteDecimalesMoneda } from './cfdi33/standard/comprobante-decimales-moneda';\nimport { ComprobanteDescuento } from './cfdi33/standard/comprobante-descuento';\nimport { ComprobanteFormaPago } from './cfdi33/standard/comprobante-forma-pago';\nimport { ComprobanteImpuestos } from './cfdi33/standard/comprobante-impuestos';\nimport { ComprobanteTipoCambio } from './cfdi33/standard/comprobante-tipo-cambio';\nimport { ComprobanteTipoDeComprobante } from './cfdi33/standard/comprobante-tipo-de-comprobante';\nimport { ComprobanteTotal } from './cfdi33/standard/comprobante-total';\nimport { ConceptoDescuento } from './cfdi33/standard/concepto-descuento';\nimport { ConceptoImpuestos } from './cfdi33/standard/concepto-impuestos';\nimport { EmisorRegimenFiscal } from './cfdi33/standard/emisor-regimen-fiscal';\nimport { EmisorRfc } from './cfdi33/standard/emisor-rfc';\nimport { FechaComprobante } from './cfdi33/standard/fecha-comprobante';\nimport { ReceptorResidenciaFiscal } from './cfdi33/standard/receptor-residencia-fiscal';\nimport { ReceptorRfc } from './cfdi33/standard/receptor-rfc';\nimport { SelloDigitalCertificado } from './cfdi33/standard/sello-digital-certificado';\nimport { SumasConceptosComprobanteImpuestos } from './cfdi33/standard/sumas-conceptos-comprobante-impuestos';\nimport { TimbreFiscalDigitalSello } from './cfdi33/standard/timbre-fiscal-digital-sello';\nimport { TimbreFiscalDigitalVersion } from './cfdi33/standard/timbre-fiscal-digital-version';\nimport { CfdiRelacionados } from './cfdi33/recepcion-pagos/cfdi-relacionados';\nimport { ComplementoPagos } from './cfdi33/recepcion-pagos/complemento-pagos';\nimport { ComprobantePagos } from './cfdi33/recepcion-pagos/comprobante-pagos';\nimport { Conceptos } from './cfdi33/recepcion-pagos/conceptos';\nimport { Pago } from './cfdi33/recepcion-pagos/pago';\nimport { Pagos } from './cfdi33/recepcion-pagos/pagos';\nimport { UsoCfdi } from './cfdi33/recepcion-pagos/uso-cfdi';\nimport { SelloDigitalCertificado as SelloDigitalCertificado40 } from './cfdi40/standard/sello-digital-certificado';\nimport { TimbreFiscalDigitalSello as TimbreFiscalDigitalSello40 } from './cfdi40/standard/timbre-fiscal-digital-sello';\nimport { TimbreFiscalDigitalVersion as TimbreFiscalDigitalVersion40 } from './cfdi40/standard/timbre-fiscal-digital-version';\n\nexport class MultiValidatorFactory {\n    public newCreated33(): MultiValidator {\n        const multiValidator = new MultiValidator('3.3');\n        multiValidator.add(new XmlFollowSchema());\n        const standardFiles: ValidatorInterface[] = [\n            new ComprobanteDecimalesMoneda(),\n            new ComprobanteDescuento(),\n            new ComprobanteFormaPago(),\n            new ComprobanteImpuestos(),\n            new ComprobanteTipoCambio(),\n            new ComprobanteTipoDeComprobante(),\n            new ComprobanteTotal(),\n            new ConceptoDescuento(),\n            new ConceptoImpuestos(),\n            new EmisorRegimenFiscal(),\n            new EmisorRfc(),\n            new FechaComprobante(),\n            new ReceptorResidenciaFiscal(),\n            new ReceptorRfc(),\n            new SelloDigitalCertificado(),\n            new SumasConceptosComprobanteImpuestos(),\n            new TimbreFiscalDigitalSello(),\n            new TimbreFiscalDigitalVersion()\n        ];\n        const recepcionFiles: ValidatorInterface[] = [\n            new CfdiRelacionados(),\n            new ComplementoPagos(),\n            new ComprobantePagos(),\n            new Conceptos(),\n            new Pago(),\n            new Pagos(),\n            new UsoCfdi()\n        ];\n        multiValidator.addMulti(...standardFiles);\n        multiValidator.addMulti(...recepcionFiles);\n\n        return multiValidator;\n    }\n\n    public newReceived33(): MultiValidator {\n        return this.newCreated33();\n    }\n\n    public newCreated40(): MultiValidator {\n        const multiValidator = new MultiValidator('4.0');\n        multiValidator.add(new XmlFollowSchema());\n        multiValidator.add(new XmlDefinition());\n        const standardFiles = [\n            new SelloDigitalCertificado40(),\n            new TimbreFiscalDigitalSello40(),\n            new TimbreFiscalDigitalVersion40()\n        ];\n        multiValidator.addMulti(...standardFiles);\n\n        return multiValidator;\n    }\n\n    public newReceived40(): MultiValidator {\n        return this.newCreated40();\n    }\n}\n","import {\n    SaxonbCliBuilder,\n    XmlResolver,\n    XmlResolverPropertyInterface,\n    XsltBuilderInterface,\n    XsltBuilderPropertyInterface\n} from '@nodecfdi/cfdiutils-core';\nimport { CfdiValidatorTrait } from './cfdi-validator-trait';\nimport { MultiValidator } from './multi-validator';\nimport { MultiValidatorFactory } from './multi-validator-factory';\n\nclass CfdiValidator33 extends CfdiValidatorTrait implements XmlResolverPropertyInterface, XsltBuilderPropertyInterface {\n    /**\n     * This class uses a default XmlResolver if not provided or null.\n     * If you really want to remove the XmlResolver then use the method setXmlResolver after construction.\n     *\n     * @param xmlResolver -\n     * @param xsltBuilder -\n     */\n    constructor(xmlResolver: XmlResolver | null = null, xsltBuilder: XsltBuilderInterface | null = null) {\n        super();\n        this.setXmlResolver(xmlResolver || new XmlResolver());\n        this.setXsltBuilder(xsltBuilder || new SaxonbCliBuilder('/usr/bin/saxonb-xslt'));\n    }\n\n    protected createVersionedMultiValidator(): MultiValidator {\n        const factory = new MultiValidatorFactory();\n\n        return factory.newReceived33();\n    }\n}\n\nexport { CfdiValidator33 };\n","import {\n    SaxonbCliBuilder,\n    XmlResolver,\n    XmlResolverPropertyInterface,\n    XsltBuilderInterface,\n    XsltBuilderPropertyInterface\n} from '@nodecfdi/cfdiutils-core';\nimport { CfdiValidatorTrait } from './cfdi-validator-trait';\nimport { MultiValidator } from './multi-validator';\nimport { MultiValidatorFactory } from './multi-validator-factory';\n\nclass CfdiValidator40 extends CfdiValidatorTrait implements XmlResolverPropertyInterface, XsltBuilderPropertyInterface {\n    /**\n     * This class uses a default XmlResolver if not provided or null.\n     * If you really want to remove the XmlResolver then use the method setXmlResolver after construction.\n     *\n     * @param xmlResolver -\n     * @param xsltBuilder -\n     */\n    constructor(xmlResolver: XmlResolver | null = null, xsltBuilder: XsltBuilderInterface | null = null) {\n        super();\n        this.setXmlResolver(xmlResolver || new XmlResolver());\n        this.setXsltBuilder(xsltBuilder || new SaxonbCliBuilder('/usr/bin/saxonb-xslt'));\n    }\n\n    protected createVersionedMultiValidator(): MultiValidator {\n        const factory = new MultiValidatorFactory();\n\n        return factory.newReceived40();\n    }\n}\n\nexport { CfdiValidator40 };\n"],"names":["XmlStringPropertyTrait","_xmlString","setXmlString","xmlString","getXmlString","StatusLvl","Status","constructor","value","_status","toString","ERROR","WARNING","OK","NONE","SyntaxError","ok","error","warn","none","isError","isWarning","isOk","isNone","when","condition","errorStatus","equalsTo","status","compareTo","Math","sign","comparableValue","Object","values","indexOf","SelloDigitalCertificadoValidatorTrait","Mixin","XmlResolverPropertyTrait","XsltBuilderPropertyTrait","_asserts","_certificado","registerAsserts","asserts","SELLO01","SELLO02","SELLO03","SELLO04","SELLO05","SELLO06","SELLO07","SELLO08","entries","forEach","code","title","put","validate","comprobante","extractor","NodeCertificado","certificado","version","obtain","getVersion","e","putStatus","message","Promise","resolve","validateNoCertificado","get","hasRegistroFiscal","searchNodes","length","noCertificadoSAT","searchAttribute","validateRfc","validateNombre","validateFecha","validateSello","buildCadenaOrigen","xsltLocation","getXmlResolver","resolveCadenaOrigenLocation","getXsltBuilder","build","noCertificado","expectedNumber","serialNumber","bytes","emisorRfc","expectedRfc","rfc","emisorNombre","compareNames","legalName","fechaSource","fecha","DateTime","fromISO","toMillis","validFrom","validFromDateTime","validTo","validToDateTime","explanation","toFormat","fromMillis","selloBase64","sello","obtainSello","cadena","selloIsValid","publicKey","verify","Buffer","from","first","second","castNombre","nombre","searchString","replace","toUpperCase","TimbreFiscalDigitalSelloValidatorTrait","assert","hasXmlResolver","setExplanation","tfd","searchNode","validationSellosMatch","setStatus","certificadoSAT","SatCertificateNumber","isValidCertificateNumber","resolver","certificadoUrl","remoteUrl","hasLocalPath","temporaryFile","openSync","prefix","certificadoFile","path","getDownloader","downloadTo","Certificate","openFile","cleanupSync","XmlResolver","TYPE_CER","tfdCadenaOrigen","TfdCadenaDeOrigen","set","source","XmlNodeUtils","nodeToXmlString","signature","verification","join","TimbreFiscalDigitalVersionValidatorTrait","tfdVersion","XmlFollowSchema","canValidateCfdiVersion","_version","content","schemaValidator","SchemaValidator","createFromString","schemas","buildSchemas","changeSchemasUsingRetriever","validateWithSchemas","mustStop","retriever","newXsdRetriever","schema","location","getLocation","localPath","buildPath","existsSync","retrieve","insert","Schema","getNamespace","AbstractVersion33","AbstractRecepcionPagos10","pagos10","validateRecepcionPagos","AbstractDiscoverableVersion33","AbstractVersion40","AbstractDiscoverableVersion40","ComprobanteDecimalesMoneda","_currency","MONDEC01","MONDEC02","MONDEC03","MONDEC04","MONDEC05","CurrencyDecimals","newFromKnownCurrencies","validateValue","impuestos","node","attribute","required","checkValue","currency","decimals","offsetExists","doesNotExceedDecimals","ComprobanteDescuento","descuento","parseFloat","subtotal","ComprobanteFormaPago","existsComplementoPagos","undefined","existsFormaPago","ComprobanteImpuestos","assertDescriptions","COMPIMPUESTOSC01","COMPIMPUESTOSC02","COMPIMPUESTOSC03","nodeImpuestos","existsTotalTrasladados","existsTotalRetenidos","hasTraslados","hasRetenciones","ComprobanteTipoCambio","registerAssets","TIPOCAMBIO01","TIPOCAMBIO02","TIPOCAMBIO03","TIPOCAMBIO04","existsTipoCambio","tipoCambio","moneda","abs","pattern","match","ComprobanteTipoDeComprobante","assertsDescriptions","TIPOCOMP01","TIPOCOMP02","TIPOCOMP03","TIPOCOMP04","TIPOCOMP05","TIPOCOMP06","TIPOCOMP07","TIPOCOMP08","TIPOCOMP09","TIPOCOMP10","tipoComprobante","checkConceptosDoesNotHaveDescuento","isZero","checkConceptosValorUnitarioIsGreaterThanZero","concepto","isGreaterThanZero","isNaN","Number","ComprobanteTotal","ConceptoDescuento","checked","i","conceptoHasInvalidDiscount","getStatus","importe","ConceptoImpuestos","CONCEPIMPC01","CONCEPIMPC02","CONCEPIMPC03","CONCEPIMPC04","CONCEPIMPC05","CONCEPIMPC06","status01","status02","status03","status04","status05","status06","conceptoImpuestosHasTrasladosOrRetenciones","traslados","traslado","k","impuestoHasBaseGreaterThanZero","trasladoHasTipoFactorExento","trasladoHasTipoFactorTasaOCuota","retenciones","retencion","j","attributes","impuesto","EmisorRegimenFiscal","regimenFiscal","validCodes","includes","trim","EmisorRfc","Rfc","checkIsValid","DISALLOW_FOREIGN","DISALLOW_GENERIC","AssertFechaFormat","assertFormat","label","text","hasFormat","format","rawDate","expectedFormat","FechaComprobante","_maximumDate","_tolerance","getMinimumDate","fromObject","hour","minute","month","day","year","getMaximumDate","Date","now","getTolerance","setMaximumDate","maximumDate","setTolerance","tolerance","assertBetween","exists","testDate","minimumDate","ReceptorResidenciaFiscal","RESFISC01","RESFISC02","RESFISC03","receptor","CNode","existsComercioExterior","isValidResidenciaFiscal","ReceptorRfc","receptorRfc","SelloDigitalCertificado","TimbreFiscalDigitalSello","TimbreFiscalDigitalVersion","CfdiRelacionados","cfdiRelacionados","ComplementoPagos","pagosExists","isTipoPago","ComprobantePagos","pagos","Conceptos","checkConceptos","conceptos","Error","conceptosCount","children","conceptoCount","REQUIRED_CLAVEPRODSERV","REQUIRED_CANTIDAD","test","REQUIRED_CLAVEUNIDAD","REQUIRED_DESCRIPCION","REQUIRED_VALORUNITARIO","REQUIRED_IMPORTE","Assert","_title","_explanation","_code","getTitle","getExplanation","getCode","setTitle","Symbol","iterator","Asserts","_assets","Map","_mustStop","size","add","newValue","previous","hasStatus","getFirstStatus","hasErrors","hasWarnings","byStatus","filter","item","has","oks","errors","warnings","nones","index","indexKey","keys","remove","delete","removeByCode","removeAll","clear","import","assign","create","getPrototypeOf","_Symbol$iterator","FormaPagoEntry","entry","_key","_description","_allowSenderRfc","_allowSenderAccount","_senderAccountPattern","_allowReceiverRfc","_allowReceiverAccount","_receiverAccountPattern","_allowPaymentSignature","key","description","useSenderRfc","useSenderAccount","useSenderAccountRegExp","useReceiverRfc","useReceiverAccount","useReceiverAccountRegExp","allowPaymentSignature","allowed","allowSenderRfc","allowSenderAccount","senderAccountPattern","allowReceiverRfc","allowReceiverAccount","receiverAccountPattern","FormaPagoCatalog","map","findIndex","keyEntry","RangeError","ValidatePagoException","AbstractPagoValidator","registerInAssets","isGreaterThan","compare","isEqual","expected","createCurrencyDecimals","createPaymentType","paymentType","Fecha","validatePago","pago","FormaDePago","MonedaPago","TipoCambioExists","TipoCambioValue","reason","decimalsCount","MontoGreaterThanZero","MontoDecimals","CalculateDocumentAmountTrait","calculateDocumentAmount","doctoRelacionado","doctosCount","MontoBetweenIntervalSumOfDocuments","pagoAmount","bounds","calculateDocumentsAmountBounds","currencyDecimals","lower","round","upper","documents","document","calculateDocumentAmountBounds","reduce","a","b","amount","impPagado","tipoCambioDR","exchangeRate","numDecimalsAmount","getNumDecimals","numDecimalsExchangeRate","almostTwo","lowerAmount","lowerExchangeRate","upperAmount","upperExchangeRate","numeric","pointPosition","BancoOrdenanteRfcCorrecto","BancoOrdenanteNombreRequerido","RFC_FOREIGN","BancoOrdenanteRfcProhibido","payment","CuentaOrdenanteProhibida","CuentaOrdenantePatron","BancoBeneficiarioRfcCorrecto","BancoBeneficiarioRfcProhibido","CuentaBeneficiariaProhibida","CuentaBeneficiariaPatron","TipoCadenaPagoProhibido","TipoCadenaPagoCertificado","notEmpty","TipoCadenaPagoCadena","TipoCadenaPagoSello","ValidateDoctoException","_index","_validatorCode","setIndex","setValidatorCode","validatorCode","getIndex","getValidatorCode","AbstractDoctoRelacionadoValidator","_pago","exception","getPago","setPago","Moneda","validateDoctoRelacionado","docto","TipoCambioRequerido","currencyIsEqual","TipoCambioValor","ImporteSaldoAnteriorValor","ImportePagadoValor","ImporteSaldoInsolutoValor","ImportesDecimales","ImportePagadoRequerido","documentsCount","NumeroParcialidadRequerido","ImporteSaldoAnteriorRequerido","ImporteSaldoInsolutoRequerido","DoctoRelacionado","validators","createValidators","getValidators","validator","MontoGreaterOrEqualThanSumOfDocuments","sumOfDocuments","calculateSumOfDocuments","Pago","_validators","pagoNodes","pagoNode","name","setDoctoRelacionadoStatus","setPagoStatus","padStart","pagoIndex","doctoIndex","doctoCode","Pagos","pagoCollection","UsoCfdi","Hydrater","hydrate","isRequireXmlStringInterface","isRequireXmlResolverInterface","setXmlResolver","isRequireXsltBuilderInterface","setXsltBuilder","object","instance","hasXsltBuilder","CfdiValidatorTrait","createVersionedMultiValidator","hydrater","validateXml","nodeFromXmlString","validateNode","MultiValidator","localAsserts","push","addMulti","splice","XmlDefinition","CFDI40_NAMESPACE","SumasConceptosComprobanteImpuestos","_comprobante","_sumasConceptos","SUMAS01","SUMAS02","SUMAS03","SUMAS04","SUMAS05","SUMAS06","SUMAS07","SUMAS08","SUMAS09","SUMAS10","SUMAS11","SUMAS12","SumasConceptos","validateSubTotal","validateDescuento","validateTotal","validateImpuestosTrasladados","validateTrasladosMatch","validateImpuestosRetenidos","validateRetencionesMatch","validateDescuentoLessOrEqualThanSubTotal","validateValues","getSubTotal","getDescuento","getTotal","getImpuestosTrasladados","getImpuestosRetenidos","validateImpuestosMatch","getTraslados","getRetenciones","assertOffset","type","expectedItems","impuestosPath","impuestosKeys","extractedItems","extracted","newTemp","impuestoKey","newKey","allExpectedAreFound","allValuesMatch","expectedOffSet","expectedKey","expectedItem","extractedItem","Importe","thisValueMatch","validateImpuestoImporte","extractedWithoutMatch","expectedLabel","expectedValue","compareLabel","compareValue","compareImportesAreEqual","delta","MultiValidatorFactory","newCreated33","multiValidator","standardFiles","recepcionFiles","newReceived33","newCreated40","SelloDigitalCertificado40","TimbreFiscalDigitalSello40","TimbreFiscalDigitalVersion40","newReceived40","CfdiValidator33","xmlResolver","xsltBuilder","SaxonbCliBuilder","factory","CfdiValidator40"],"mappings":"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"}