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
JavaScript
"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,
}),
};
});