UNPKG

facturacionelectronicapy-ts-xmlgen

Version:

Genera el contenido del archivo XML del Documento electrónico exigido por la SET

926 lines (920 loc) 38.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.EDocDataSchema = void 0; const zod_1 = require("zod"); const currencies_table_1 = require("../data/currencies.table"); const eDocumentTypes_table_1 = require("../data/eDocumentTypes.table"); const emissionTypes_table_1 = require("../data/emissionTypes.table"); const operationTypes_table_1 = require("../data/operationTypes.table"); const paymentTypes_table_1 = require("../data/paymentTypes.table"); const remissionReasons_table_1 = require("../data/remissionReasons.table"); const globalAndPerItem_table_1 = require("../data/shared/globalAndPerItem.table"); const taxTreatments_table_1 = require("../data/taxTreatments.table"); const taxTypes_table_1 = require("../data/taxTypes.table"); const transactionTypes_table_1 = require("../data/transactionTypes.table"); const DateHelper_1 = __importDefault(require("../helpers/DateHelper")); const getTotals_1 = __importDefault(require("../helpers/getTotals")); const Path_1 = require("../helpers/Path"); const CommonValidators_1 = __importDefault(require("../helpers/validation/CommonValidators")); const NumberLenght_1 = __importDefault(require("../helpers/validation/NumberLenght")); const ZodValidator_1 = __importDefault(require("../helpers/validation/ZodValidator")); const db_service_1 = __importDefault(require("../services/db.service")); const autoFactura_schema_1 = require("./data/autoFactura.schema"); const cliente_schema_1 = require("./data/cliente.schema"); const complementarios_schema_1 = require("./data/complementarios.schema"); const condicion_schema_1 = require("./data/condicion.schema"); const dncp_schema_1 = require("./data/dncp.schema"); const documentoAsociado_schema_1 = require("./data/documentoAsociado.schema"); const factura_schema_1 = require("./data/factura.schema"); const item_schema_1 = require("./data/item.schema"); const notaCheditoDebito_schema_1 = require("./data/notaCheditoDebito.schema"); const obligacion_schema_1 = require("./data/obligacion.schema"); const remision_schema_1 = require("./data/remision.schema"); const sectorAdicional_schema_1 = require("./data/sectorAdicional.schema"); const sectorEnergiaElectrica_schema_1 = require("./data/sectorEnergiaElectrica.schema"); const sectorSeguros_schema_1 = require("./data/sectorSeguros.schema"); const sectorSupermercados_schema_1 = require("./data/sectorSupermercados.schema"); const transporte_schema_1 = require("./data/transporte.schema"); const usuario_schema_1 = require("./data/usuario.schema"); const SDParser_1 = __importDefault(require("../helpers/SDParser")); /** El esquema no incluye... * * ...campos que se definen en EDocParams: * D2. Campos que identifican al emisor del Documento Electrónico DE (D100-D129) * D2.1 Campos que describen la actividad económica del emisor (D130-D139) * * ...J. Campos fuera de la Firma Digital (J001-J049) */ exports.EDocDataSchema = zod_1.z .object({ // A. Campos firmados del Documento Electrónico (A001-A099) // para calcular A002 cdc: CommonValidators_1.default.cdc().optional().describe(SDParser_1.default.stringify('A002')), // A004 fechaFirmaDigital: zod_1.z.coerce .date() .optional() .transform((value, ctx) => { return value ? DateHelper_1.default.getIsoDateTime(value) : DateHelper_1.default.getIsoDateTime(new Date()); }) .describe(SDParser_1.default.stringify('A004')), // B. Campos inherentes a la operación de Documentos Electrónicos (B001-B099) // B002 tipoEmision: zod_1.z .nativeEnum(emissionTypes_table_1.EmissionType) .default(emissionTypes_table_1.EmissionType.NORMAL) .describe(SDParser_1.default.stringify('B002', { e: 'EmissionType', d: 'NORMAL por defecto', })), // B004 // VER: 10.3. Generación del código de seguridad codigoSeguridadAleatorio: zod_1.z .number() .optional() .transform((value, ctx) => { if (value == undefined) return; new NumberLenght_1.default(value, ctx).int().length(9); return value.toString(); }) .describe(SDParser_1.default.stringify('B004')), // B005 observacion: zod_1.z .string() .min(1) .max(3000) .optional() .describe(SDParser_1.default.stringify('B005')), // B006 descripcion: zod_1.z .string() .min(1) .max(3000) .optional() .describe(SDParser_1.default.stringify('B006')), // C. Campos de datos del Timbrado (C001-C099) // C002 tipoDocumento: zod_1.z.nativeEnum(eDocumentTypes_table_1.EDocumentType).describe(SDParser_1.default.stringify('C002', { e: 'EDocumentType', })), // C005: Debe coincidir con la estructura de timbrado establecimiento: CommonValidators_1.default.zeroPadToLength(3).describe(SDParser_1.default.stringify('C005')), // C006: Debe coincidir con la estructura de timbrado punto: CommonValidators_1.default.zeroPadToLength(3).describe(SDParser_1.default.stringify('C006')), // C007: Debe coincidir con la estructura de timbrado numero: CommonValidators_1.default.zeroPadToLength(7).describe(SDParser_1.default.stringify('C007')), // C010: obligatorio cuando se consumió la numeración permitida // VER: "10.5. Manejo del timbrado y Numeración" serie: CommonValidators_1.default.serie() .optional() .describe(SDParser_1.default.stringify('C010', { d: 'Obligatorio cuando se consumió la numeración permitida', v: '10.5. Manejo del timbrado y Numeración', })), // D. Campos Generales del Documento Electrónico DE (D001-D299) // D002 fecha: CommonValidators_1.default.isoDateTime().describe(SDParser_1.default.stringify('D002')), // D011: En este repo se agrega el tipo por defecto tipoTransaccion: zod_1.z .nativeEnum(transactionTypes_table_1.TransactionType) .default(transactionTypes_table_1.TransactionType.VENTA_DE_MERCADERIA) .describe(SDParser_1.default.stringify('D011', { e: 'TransactionType', d: 'Por defecto venta de mercadería', })), // D013 tipoImpuesto: zod_1.z.nativeEnum(taxTypes_table_1.TaxType).describe(SDParser_1.default.stringify('D013', { e: 'TaxType', })), // D015 moneda: CommonValidators_1.default.currency() .default(currencies_table_1.Currency.GUARANI) .describe(SDParser_1.default.stringify('D015', { e: 'Currency', d: 'Guarani por defecto' })), // D017 condicionTipoCambio: zod_1.z .nativeEnum(globalAndPerItem_table_1.GlobalAndPerItem) .optional() .describe(SDParser_1.default.stringify('D017', { e: 'GlobalAndPerItem' })), // D018 cambio: CommonValidators_1.default.currencyChange() .optional() .describe(SDParser_1.default.stringify('D018')), // D019 condicionAnticipo: zod_1.z .nativeEnum(globalAndPerItem_table_1.GlobalAndPerItem) .optional() .describe(SDParser_1.default.stringify('D019', { e: 'GlobalAndPerItem' })), // VER: https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_018_MT_V150-+Junio.pdf/2ace18c4-5c03-c339-7f5c-bed6d5b5eb5e?t=1717699899642 // D1.1. Campos que identifican las obligaciones afectadas (D030-D040) obligaciones: zod_1.z .array(obligacion_schema_1.ObligacionSchema) .max(11) .optional() .describe(SDParser_1.default.stringify('D1.1', { d: 'Campos que identifican las obligaciones afectadas (D030-D040)', v: 'https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_018_MT_V150-+Junio.pdf/2ace18c4-5c03-c339-7f5c-bed6d5b5eb5e?t=1717699899642', })), // ⚠️ No es del manual, pero si del repo original // Es el valor monetario total a descontar de la suma de los items // Se usa para calcular EA004 descuentoGlobal: zod_1.z .number() .default(0) .describe(SDParser_1.default.stringify('para calcular EA004', { d: 'Es el valor monetario total a descontar de la suma de los items', })), // ⚠️ No es del manual, pero si del repo original // Es el valor monetario total que se aplica como anticipo a la suma de los items // Se usa para calcular EA007 anticipoGlobal: zod_1.z .number() .default(0) .describe(SDParser_1.default.stringify('para calcular EA007', { d: 'Es el valor monetario total que se aplica como anticipo a la suma de los items', })), // D2.2 Campos que identifican al responsable de la generación del DE (D140-D160) usuario: usuario_schema_1.UsuarioSchema.optional().describe(SDParser_1.default.stringify('D2.2', { d: 'Campos que identifican al responsable de la generación del DE (D140-D160)', })), // D3. Campos que identifican al receptor del Documento Electrónico DE (D200-D299) cliente: cliente_schema_1.ClienteSchema.describe(SDParser_1.default.stringify('D3', { d: 'Campos que identifican al receptor del Documento Electrónico DE (D200-D299)', })), // E1. Campos que componen la Factura Electrónica FE (E002-E099) factura: factura_schema_1.FacturaSchema.optional().describe(SDParser_1.default.stringify('E1', { d: 'Campos que componen la Factura Electrónica FE (E002-E099)', })), // E1.1. Campos de informaciones de Compras Públicas (E020-E029) dncp: dncp_schema_1.DncpSchema.optional().describe(SDParser_1.default.stringify('E1.1', { d: 'Campos de informaciones de Compras Públicas (E020-E029)', })), // E4. Campos que componen la Autofactura Electrónica AFE (E300-E399) autoFactura: autoFactura_schema_1.AutoFacturaSchema.optional().describe(SDParser_1.default.stringify('E4', { d: 'Campos que componen la Autofactura Electrónica AFE (E300-E399)', })), // E5. Campos que componen la Nota de Crédito/Débito Electrónica NCE-NDE (E400-E499) notaCreditoDebito: notaCheditoDebito_schema_1.NotaCreditoDebitoSchema.optional().describe(SDParser_1.default.stringify('E5', { d: 'Campos que componen la Nota de Crédito/Débito Electrónica NCE-NDE (E400-E499)', })), // E6. Campos que componen la Nota de Remisión Electrónica (E500-E599) remision: remision_schema_1.RemisionSchema.optional().describe(SDParser_1.default.stringify('E6', { d: 'Campos que componen la Nota de Remisión Electrónica (E500-E599)', })), // E7. Campos que describen la condición de la operación (E600-E699) condicion: condicion_schema_1.CondicionSchema.optional().describe(SDParser_1.default.stringify('E7', { d: 'Campos que describen la condición de la operación (E600-E699)', })), // E8. Campos que describen los ítems de la operación (E700-E899) items: zod_1.z.array(item_schema_1.ItemSchema).describe(SDParser_1.default.stringify('E8', { d: 'Campos que describen los ítems de la operación (E700-E899)', })), // E9. Campos complementarios comerciales de uso específico (E790-E899) // VER: https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_023_MT_V150.pdf/9580922b-5dd5-60f9-4857-ae66a757898f?t=1724956850006 // E9.2. Sector Energía Eléctrica (E791-E799) sectorEnergiaElectrica: sectorEnergiaElectrica_schema_1.SectorEnergiaElectricaSchema.optional().describe(SDParser_1.default.stringify('E9.2', { d: 'Sector Energía Eléctrica (E791-E799)', v: 'https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_023_MT_V150.pdf/9580922b-5dd5-60f9-4857-ae66a757898f?t=1724956850006', })), // E9.3. Sector de Seguros (E800-E809) sectorSeguros: sectorSeguros_schema_1.SectorSegurosSchema.optional().describe(SDParser_1.default.stringify('E9.3', { d: 'Sector de Seguros (E800-E809)', })), // E9.4. Sector de Supermercados (E810-E819) sectorSupermercados: sectorSupermercados_schema_1.SectorSupermercadosSchema.optional().describe(SDParser_1.default.stringify('E9.4', { d: 'Sector de Supermercados (E810-E819)', })), // E9.5. Grupo de datos adicionales de uso comercial (E820-E829) sectorAdicional: sectorAdicional_schema_1.SectorAdicionalSchema.optional().describe(SDParser_1.default.stringify('E9.5', { d: 'Grupo de datos adicionales de uso comercial (E820-E829)', })), // E10. Campos que describen el transporte de las mercaderías (E900-E999) transporte: transporte_schema_1.TransporteSchema.optional().describe(SDParser_1.default.stringify('E10', { d: 'Campos que describen el transporte de las mercaderías (E900-E999)', })), // F025 comision: zod_1.z .number() .optional() .superRefine((value, ctx) => { if (value == undefined) return; new NumberLenght_1.default(value, ctx).max(15).maxDecimals(8); }) .describe(SDParser_1.default.stringify('F025')), // G. Campos complementarios comerciales de uso general (G001-G049) complementarios: complementarios_schema_1.ComplementariosSchema.optional().describe(SDParser_1.default.stringify('G', { d: 'Campos complementarios comerciales de uso general (G001-G049)', })), // H. Campos que identifican al documento asociado (H001-H049) documentoAsociado: zod_1.z .union([documentoAsociado_schema_1.DocumentoAsociadoSchema, documentoAsociado_schema_1.DocumentoAsociadoSchema.array().max(99)]) .optional() .describe(SDParser_1.default.stringify('H', { d: 'Campos que identifican al documento asociado (H001-H049)', })), }) .transform((data, ctx) => { const validator = new ZodValidator_1.default(ctx, data); const transportPath = new Path_1.Path('transporte'); const associatedDocumentPath = new Path_1.Path('documentoAsociado'); const clientePath = new Path_1.Path('cliente'); const dncpPath = new Path_1.Path('dncp'); const remisionPath = new Path_1.Path('remision'); const itemsPath = new Path_1.Path('items'); const complementariosPath = new Path_1.Path('complementarios'); /**C002 = 1 */ const isElectronicInvoice = data.tipoDocumento == eDocumentTypes_table_1.EDocumentType.FACTURA_ELECTRONICA; /**C002 = 4 */ const isAutoInvoice = data.tipoDocumento == eDocumentTypes_table_1.EDocumentType.AUTOFACTURA_ELECTRONICA; /**C002 = 5 */ const isElectronicCreditNote = data.tipoDocumento == eDocumentTypes_table_1.EDocumentType.NOTA_DE_CREDITO_ELECTRONICA; /**C002 = 6 */ const isElectronicDebitNote = data.tipoDocumento == eDocumentTypes_table_1.EDocumentType.NOTA_DE_DEBITO_ELECTRONICA; /**C002 = 7 */ const isElectronicRemissionNote = data.tipoDocumento == eDocumentTypes_table_1.EDocumentType.NOTA_DE_REMISION_ELECTRONICA; /**D015 = PYG */ const currencyIsGuarani = data.moneda == currencies_table_1.Currency.GUARANI; /**D017 = 1 */ const currencyChangeConditionIsGlobal = data.condicionTipoCambio == globalAndPerItem_table_1.GlobalAndPerItem.GLOBAL; /**D017 = 2 */ const currencyChangeConditionIsPerItem = data.condicionTipoCambio == globalAndPerItem_table_1.GlobalAndPerItem.POR_ITEM; /**D202 = 3 */ const operationIsB2G = data.cliente.tipoOperacion == operationTypes_table_1.OperationType.B2G; /**D011 = 9 */ const transactionTypeIsAsociatedInvoice = data.tipoTransaccion == transactionTypes_table_1.TransactionType.ANTICIPO; /**D011 = 12 */ const transactionTypeIsTaxCreditSale = data.tipoTransaccion == transactionTypes_table_1.TransactionType.VENTA_DE_CREDITO_FISCAL; /**D013 = 1 */ const taxIsIVA = data.tipoImpuesto == taxTypes_table_1.TaxType.IVA; /**D013 = 2 */ const taxIsISC = data.tipoImpuesto == taxTypes_table_1.TaxType.ISC; /**D013 = 3 */ const taxIsRent = data.tipoImpuesto == taxTypes_table_1.TaxType.RENTA; /**D013 = 4 */ const taxIsNone = data.tipoImpuesto == taxTypes_table_1.TaxType.NINGUNO; /**D013 = 5 */ const taxIsIvaRent = data.tipoImpuesto == taxTypes_table_1.TaxType.IVA___RENTA; /**E501 = 5 */ const remissionReasonIsImport = data.remision?.motivo == remissionReasons_table_1.RemissionReason.IMPORTACION; // B004 { // ⚠️ según el repo original if (data.cdc) { //Caso ya se le pase el CDC data.codigoSeguridadAleatorio = data.cdc.substring(34, 43); } } // B006 - descripcion { /* Cuando el tipo de documento es Nota de remisión (C002=7) es obligatorio informar el mensaje En caso de realizar Factura Exportación, en este campo en la FE se debe completar con los siguientes datos y en este orden de conformidad al Art 20 numeral 15 del Decreto N° 10797/2013: a) Tipo de Operación, b) Condición de Negociación, (CIF, FOB, otros.) c) País de Destino, d) Empresa Fletera o Exportador Nacional, e) Agente de Transporte, f) Instrucciones de Pago para el cliente (Beneficiario, Banco, N° de cuenta, Código SWIFT, Cartas de Crédito, otro). g) Número/s de Conocimiento/s de Embarque. h) Número/s de Manifiesto/s Internacional/es de Carga. i) Número de barcaza o remolcador, descripción y cantidad del bien transportado (en los casos de Flete Internacional), j) Las demás informaciones que sean fijadas por la Administración Tributaria, en normas de carácter general ". VER: https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_007_MT_V150.pdf/d6b31757-8906-a326-4e92-f9ec4b5d7706?t=1687353746603 */ if (isElectronicRemissionNote) { validator.requiredField('descripcion'); } } // D011 - tipoTransaccion { /* Obligatorio si C002 = 1 o 4 No informar si C002 ≠ 1 o 4 */ if (isElectronicInvoice || isAutoInvoice) { validator.requiredField('tipoTransaccion'); } else { validator.undesiredField('tipoTransaccion'); } } // D017 - condicionTipoCambio { /* Obligatorio si D015 ≠ PYG No informar si D015 = PYG */ /** En este repo se agrega el tipo por defecto */ if (!currencyIsGuarani) { data.condicionTipoCambio = globalAndPerItem_table_1.GlobalAndPerItem.GLOBAL; } else { validator.undesiredField('condicionTipoCambio'); } } // D018 - cambio { /* Obligatorio si D017 = 1 No informar si D017 = 2 */ if (currencyChangeConditionIsGlobal) { validator.requiredField('cambio'); } else if (currencyChangeConditionIsPerItem) { validator.undesiredField('cambio'); } } // D213 - cliente.direccion { /* Campo obligatorio cuando C002=7 o cuando D202=4 (se valida en ClienteSchema) */ if (isElectronicRemissionNote) { validator.requiredField(clientePath.concat('direccion')); } } // E010 - factura { /* Obligatorio si C002 = 1 No informar si C002 ≠ 1 */ if (isElectronicInvoice) { validator.requiredField('factura'); } else { validator.undesiredField('factura'); } } // E020 - dncp { /* Obligatorio si D202 = 3 (Tipo de operación B2G) */ if (operationIsB2G) { validator.requiredField('dncp'); } } // E025 - dncp.fecha { /* Esta fecha debe ser anterior a la fecha de emisión de la FE */ const dncpDatePath = dncpPath.concat('fecha'); validator.validate('fecha', Boolean(isElectronicInvoice && data.dncp && data.dncp.fecha > data.fecha), `La fecha de emisión $path de la FE debe ser anterior a '${dncpDatePath}'`); } // E400 - notaCreditoDebito { /* Obligatorio si C002 = 5 o 6 (NCE y NDE) No informar si C002 ≠ 5 o 6 */ if (isElectronicCreditNote || isElectronicDebitNote) { validator.requiredField('notaCreditoDebito'); } else { validator.undesiredField('notaCreditoDebito'); } } // E500 - remission { /* Obligatorio si C002 = 7 No informar si C002 ≠ 7 */ if (isElectronicRemissionNote) { validator.requiredField('remision'); } else { validator.undesiredField('remision'); } } // E506 - fechaFactura { /* Obs.: Informar cuando no se ha emitido aún la factura electrónica, en caso que corresponda */ if (data.remision?.fechaFactura) { const fechaFactura = new Date(data.remision.fechaFactura); const fechaEmision = new Date(data.fecha); const datePath = new Path_1.Path('fecha'); validator.validate(remisionPath.concat('fechaFactura'), fechaFactura > fechaEmision, `$path debe ser antes de la fecha de emisión '${datePath}'`); } } // E600 - condicion { /* Obligatorio si C002 = 1 o 4 No informar si C002 ≠ 1 o 4 */ if (isElectronicInvoice || isAutoInvoice) { validator.requiredField('condicion'); } else { validator.undesiredField('condicion'); } } // E704 - data.items.dncp.codigoNivelGeneral { /* Obligatorio si D202 = 3 OBS: Informar se existe el código de la DNCP */ if (operationIsB2G) { data.items.forEach((_item, i) => { validator.requiredField(itemsPath.concat(i).concat('dncp').concat('codigoNivelGeneral')); }); } } // E719 - data.items.cdcAnticipo { /* Obligatorio cuando se utilice una factura asociada con el tipo de transacción igual a Anticipo (D011 de la factura asociada igual a 9) */ if (transactionTypeIsAsociatedInvoice) { data.items.forEach((_item, i) => { validator.requiredField(itemsPath.concat(i).concat('cdcAnticipo')); }); } } // E720 - data.items.monto { /* Obligatorio si C002 ≠ 7 No informar si C002 = 7 */ if (!isElectronicRemissionNote) { data.items.forEach((_item, i) => { validator.requiredField(itemsPath.concat(i).concat('monto')); }); } else { data.items.forEach((_item, i) => { validator.undesiredField(itemsPath.concat(i).concat('monto')); }); } } // E725 - data.items.cambio { /* Obligatorio si D017 = 2 No informar si D017 = 1 */ if (currencyChangeConditionIsPerItem) { data.items.forEach((_item, i) => { validator.requiredField(itemsPath.concat(i).concat('monto').concat('cambio')); }); } else if (currencyChangeConditionIsGlobal) { data.items.forEach((_item, i) => { validator.undesiredField(itemsPath.concat(i).concat('monto').concat('cambio')); }); } } // E730 - data.items.impuesto { /* Obligatorio si D013=1, 3, 4 o 5 y C002 ≠ 4 o 7 No informar si D013=2 y C002= 4 */ if ((taxIsIVA || taxIsRent || taxIsNone || taxIsIvaRent) && !isAutoInvoice && !isElectronicRemissionNote) { data.items.forEach((_item, i) => { validator.requiredField(itemsPath.concat(i).concat('impuesto')); }); } else if (taxIsISC && isAutoInvoice) { data.items.forEach((_item, i) => { validator.undesiredField(itemsPath.concat(i).concat('impuesto')); }); } } // E900 - transporte { /* Obligatorio si C002 = 7 Opcional si C002 = 1 No informar si C002= 4, 5, 6 */ if (isElectronicRemissionNote) { validator.requiredField('transporte'); } else if (isAutoInvoice || isElectronicCreditNote || isElectronicDebitNote) { validator.undesiredField('transporte'); } } // E901 - transporte.tipo { /* Obligatorio si C002 = 7 */ if (isElectronicRemissionNote) { validator.requiredField(transportPath.concat('tipo')); } } // E908 - transporte.numeroDespachoImportacion { /* Obligatorio si E501 = 5 */ if (remissionReasonIsImport) { validator.requiredField(transportPath.concat('numeroDespachoImportacion')); } } // E909 - transporte.inicioEstimadoTranslado { /* Obligatorio si C002 = 7 */ if (isElectronicRemissionNote) { validator.requiredField(transportPath.concat('inicioEstimadoTranslado')); } } // E920 - transporte.salida { /* Obligatorio si C002 = 7 No informar si C002 = 4, 5, 6 */ if (isElectronicRemissionNote) { validator.requiredField(transportPath.concat('salida')); } else if (isAutoInvoice || isElectronicCreditNote || isElectronicDebitNote) { validator.undesiredField(transportPath.concat('salida')); } } // E940 - transporte.entrega { /* Obligatorio si C002 = 7 No informar si C002 = 4, 5, 6 */ if (isElectronicRemissionNote) { validator.requiredField(transportPath.concat('entrega')); } else if (isAutoInvoice || isElectronicCreditNote || isElectronicDebitNote) { validator.undesiredField(transportPath.concat('entrega')); } } // E960 - transporte.vehiculo { /* Obligatorio si C002 = 7 No informar si C002 = 4, 5, 6 */ if (isElectronicRemissionNote) { validator.requiredField(transportPath.concat('vehiculo')); } else if (isAutoInvoice || isElectronicCreditNote || isElectronicDebitNote) { validator.undesiredField(transportPath.concat('vehiculo')); } } // E980 - transporte.transportista { /* Obligatorio si C002 = 7 No informar si C002 = 4, 5, 6 VER: https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_010_MT_V150.pdf/d64a693b-6c63-86e1-ec6a-d4fe5ec4eeea?t=1687353747196 */ if (isElectronicRemissionNote) { validator.requiredField(transportPath.concat('transportista')); } else if (isAutoInvoice || isElectronicCreditNote || isElectronicDebitNote) { validator.undesiredField(transportPath.concat('transportista')); } } // G050 - complementarios.carga { /* Opcional cuando C002=1 o C002=7 No informar para C002 ≠ 1 y C002≠7 */ if (!isElectronicInvoice && !isElectronicRemissionNote) { validator.undesiredField(complementariosPath.concat('carga')); } } // H001 - documentoAsociado { /* Obligatorio si C002 = 4, 5, 6 Opcional si C002=1 o 7 */ if (isAutoInvoice || isElectronicCreditNote || isElectronicDebitNote) { validator.requiredField(associatedDocumentPath.concat('formato')); } } // H012 - documentoAsociado.numeroRetencion { /* No informar si E606 ≠ 10 */ if (!data.condicion?.entregas?.some((d) => d.tipo == paymentTypes_table_1.PaymentType.RETENCION)) { validator.undesiredField(associatedDocumentPath.concat('numeroRetencion')); } } // H013 - documentoAsociado.resolucionCreditoFiscal { /* Si D011 = 12 obligatorio informar número de resolución de crédito fiscal No informar si D011 ≠ 12 */ if (transactionTypeIsTaxCreditSale) { validator.requiredField(associatedDocumentPath.concat('resolucionCreditoFiscal')); } else { validator.undesiredField(associatedDocumentPath.concat('resolucionCreditoFiscal')); } } const totalItemsPrice = data.items.reduce((acc, item) => acc + (item.monto?.precioUnitario || 0) * item.cantidad, 0); // EA004 - descuentoGlobalItem const calcDescuentoGlobalItem = (item, itemPercentageOfAllItems) => { /* Calculo según manual: https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_001_MT_V150.pdf/c4d2ab8e-632b-dc8f-d3f6-6a144a3a3d9c?t=1687353745680 ⚠️ Calculo del repo original */ if (!data.descuentoGlobal) return undefined; const globalDiscountItem = (data.descuentoGlobal * itemPercentageOfAllItems) / 100; const globalDiscountItemUnit = globalDiscountItem / item.cantidad; return globalDiscountItemUnit; }; // EA007 - anticipoGlobalItem const calcAnticipoGlobalItem = (item, itemPercentageOfAllItems) => { // ⚠️ Calculo del repo original if (!data.anticipoGlobal) return undefined; const globalDiscountItem = (data.anticipoGlobal * itemPercentageOfAllItems) / 100; const globalDiscountItemUnit = globalDiscountItem / item.cantidad; return globalDiscountItemUnit; }; // EA008 - totalOperacion const calcTotalOperacion = (itemQuantity_E711, itemAmmountData) => { /* Si D013 = 1, 3, 4 o 5 (afectado al IVA, Renta, ninguno, IVA - Renta), entonces EA008 corresponde al cálculo aritmético: ( E721 (Precio unitario) – EA002 (Descuento particular) – EA004 (Descuento global) – EA006 (Anticipo particular) – EA007 (Anticipo global) ) * E711(cantidad) Cálculo para Autofactura (C002=4): E721*E711 */ if (!itemAmmountData) return 0; const itemPrice = isAutoInvoice ? itemAmmountData.precioUnitario : itemAmmountData.precioUnitario - data.descuentoGlobal - data.anticipoGlobal - (itemAmmountData.descuento || 0) - (itemAmmountData.anticipo || 0); // TODO_TEST: que pasa si es ISC y no es auto-factura? ahora retorna 0, pero no se como se debería de tratar if ([ taxTypes_table_1.TaxType.IVA, taxTypes_table_1.TaxType.RENTA, taxTypes_table_1.TaxType.NINGUNO, taxTypes_table_1.TaxType.IVA___RENTA, ].includes(data.tipoImpuesto)) { return itemPrice * itemQuantity_E711; } if (isAutoInvoice) { return itemPrice * itemQuantity_E711; } return 0; }; // EA009 - totalOperacionGuaranies const calcTotalOperacionGuaranies = (totalOperacion_EA008, currencyChange_E725) => { if (!currencyChange_E725) return 0; return totalOperacion_EA008 * currencyChange_E725; }; // E735 - ivaBase const calcIvaBase = (itemTaxData, totalOperacion_EA008) => { /* Si E731 = 1 o 4 este campo es igual al resultado del cálculo: [100 * EA008 * E733] / [10000 + (E734 * E733)] Si E731 = 2 o 3 este campo es igual 0 VER: https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_013_MT_V150.pdf/ba73ec3b-5901-ae28-5d8c-9bed5632ab89?t=1687353747529 */ /**E731 = 1 */ const isGravado = itemTaxData.ivaTipo == taxTreatments_table_1.TaxTreatment.GRAVADO_IVA; /**E731 = 2 */ const isExonerado = itemTaxData.ivaTipo == taxTreatments_table_1.TaxTreatment.EXONERADO__ART__100___LEY_6380_2019_; /**E731 = 3 */ const isExento = itemTaxData.ivaTipo == taxTreatments_table_1.TaxTreatment.EXENTO; /**E731 = 4 */ const isGravadoParcial = itemTaxData.ivaTipo == taxTreatments_table_1.TaxTreatment.GRAVADO_PARCIAL__GRAV__EXENTO_; if (isGravado || isGravadoParcial) { return ((100 * totalOperacion_EA008 * itemTaxData.proporcionGravada) / (10000 + itemTaxData.iva * itemTaxData.proporcionGravada)); } else if (isExonerado || isExento) { return 0; } else { throw new Error('El tipo de iva no se reconoce en el calculo de E735 en NT013'); } }; // E736 - liquidacionIvaPorItem const calcLiquidacionIvaPorItem = (iva_E734, ivaBase_E735) => { /* Corresponde al cálculo aritmético: E735 * (E734/100) Si E731 = 2 o 3 este campo es igual 0 */ // esto resume el calculo // si es exonerado o exento (E731 = 2 o 3) iva cera 0 y el resto son matemáticas return ivaBase_E735 * (iva_E734 / 100); }; // E737 - baseExentaIva // VER: https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_013_MT_V150.pdf/ba73ec3b-5901-ae28-5d8c-9bed5632ab89?t=1687353747529 const calcBaseExentaIva = (itemTaxData, totalOperacion_EA008) => { /* Si E731 = 4 este campo es igual al resultado del cálculo: [100 * EA008 * (100 – E733)] / [10000 + (E734 * E733)] Si E731 = 1 , 2 o 3 este campo es igual 0 */ /**E731 = 1 */ const isGravado = itemTaxData.ivaTipo == taxTreatments_table_1.TaxTreatment.GRAVADO_IVA; /**E731 = 2 */ const isExonerado = itemTaxData.ivaTipo == taxTreatments_table_1.TaxTreatment.EXONERADO__ART__100___LEY_6380_2019_; /**E731 = 3 */ const isExento = itemTaxData.ivaTipo == taxTreatments_table_1.TaxTreatment.EXENTO; /**E731 = 4 */ const isGravadoParcial = itemTaxData.ivaTipo == taxTreatments_table_1.TaxTreatment.GRAVADO_PARCIAL__GRAV__EXENTO_; if (isGravadoParcial) { return ((100 * totalOperacion_EA008 * (100 - itemTaxData.proporcionGravada)) / (10000 + itemTaxData.iva * itemTaxData.proporcionGravada)); } else if (isGravado || isExonerado || isExento) { return 0; } else { throw new Error('El tipo de iva no se reconoce en el calculo de E737 en NT013'); } }; const items = data.items.map((item) => { const totalItemPrice = (item.monto?.precioUnitario || 0) * item.cantidad; const percentageInAllItems = (totalItemPrice * 100) / totalItemsPrice; const descuentoGlobalItem = calcDescuentoGlobalItem(item, percentageInAllItems); const anticipoGlobalItem = calcAnticipoGlobalItem(item, percentageInAllItems); const totalOperacion = calcTotalOperacion(item.cantidad, item.monto); // E720 let monto; if (item.monto) { const totalOperacionGuaranies = calcTotalOperacionGuaranies(totalOperacion, item.monto.cambio); monto = { ...item.monto, /**EA004 */ descuentoGlobalItem, /**EA007 */ anticipoGlobalItem, /**EA008 */ totalOperacion, /**EA009 */ totalOperacionGuaranies, }; } // E730 let impuesto; if (item.impuesto) { const ivaBase = calcIvaBase(item.impuesto, totalOperacion); const baseExentaIva = calcBaseExentaIva(item.impuesto, totalOperacion); impuesto = { ...item.impuesto, /**E735 */ ivaBase, /**E736 */ liquidacionIvaPorItem: calcLiquidacionIvaPorItem(item.impuesto.iva, ivaBase), /**E737 */ baseExentaIva, }; } return { ...item, monto, impuesto, }; }); return { ...data, // A002 y A003 se definen en EDocSchema // A005 sistemaDeFacturacion: 1, // B003 descripcionEmision: db_service_1.default.emissionTypes._findById(data.tipoEmision) .description, // C003 descripcionDocumento: db_service_1.default.eDocumentTypes._findById(data.tipoDocumento).description, // C004 se define en EDocSchema y C008 en EDocParamsSchema // VER: https://www.dnit.gov.py/documents/20123/420595/NT_E_KUATIA_010_MT_V150.pdf/d64a693b-6c63-86e1-ec6a-d4fe5ec4eeea?t=1687353747196 // D012 descripcionTipoTransaccion: db_service_1.default.transactionTypes._findById(data.tipoTransaccion).description, // D014 descripcionTipoImpuesto: db_service_1.default.taxTypes._findById(data.tipoImpuesto) .description, // D016 descripcionMoneda: db_service_1.default.currencies._findById(data.moneda) .description, // D020 descripcionCondicionAnticipo: db_service_1.default.advancePaymentConditions._findByIdIfExist(data.condicionAnticipo)?.description, items, // F001 totales: (0, getTotals_1.default)({ items, isElectronicRemissionNote, isAutoInvoice, tipoImpuesto: data.tipoImpuesto, isGuarani: currencyIsGuarani, currencyChangeConditionIsGlobal, currencyChangeConditionIsPerItem, cambio: data.cambio, comision: data.comision, }), }; });