facturacionelectronicapy-ts-xmlgen
Version:
Genera el contenido del archivo XML del Documento electrónico exigido por la SET
93 lines (92 loc) • 4.17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const zod_1 = require("zod");
const calcDV_1 = __importDefault(require("./calcDV"));
const DateHelper_1 = __importDefault(require("./DateHelper"));
// VER: 10.1. Estructura del código de control (CDC) de los DE
class CDCHelper {
/** Verificar que el CDC coincida los los datos relacionados del documento. */
validateCDC(params, data, ctx) {
if (!data.cdc)
return;
const addError = (error, path) => {
ctx.addIssue({
code: zod_1.z.ZodIssueCode.custom,
message: error,
path,
});
};
const cdc = {
// COO2
documentType: Number(data.cdc.substring(0, 2)),
// D101
rucID: data.cdc.substring(2, 10),
// D102
rucDV: data.cdc.substring(10, 11),
// C005
establishment: data.cdc.substring(11, 14),
// C006
point: data.cdc.substring(14, 17),
// C007
number: data.cdc.substring(17, 24),
// D103
taxpayerType: Number(data.cdc.substring(24, 25)),
// D002
date: data.cdc.substring(25, 33),
// B002
issuanceType: Number(data.cdc.substring(33, 34)),
// B004 y A003: no se valida porque se define de forma automática
// securityCode: EDoc.cdc.substring(34, 43),
// dv: EDoc.cdc.substring(44, 45),
};
if (data.tipoDocumento != cdc.documentType) {
addError(`El Tipo de Documento con _id "${data.tipoDocumento}" debe coincidir con el tipo de documento del CDC "${cdc.documentType}"`, ['tipoDocumento']);
}
if (params.rucID != cdc.rucID || params.rucDV != cdc.rucDV) {
// convertimos a numero para eliminar los ceros a la izquierda
const cdcRuc = `${Number(cdc.rucID)}-${cdc.rucDV}`;
addError(`El RUC '${params.ruc}' debe coincidir con el RUC del CDC '${cdcRuc}'`, ['rucID']);
}
if (data.establecimiento != cdc.establishment) {
addError(`El Establecimiento '${data.establecimiento}' debe coincidir con el establecimiento del CDC '${cdc.establishment}'`, ['establecimiento']);
}
if (data.punto != cdc.point) {
addError(`El Punto '${data.punto}' debe coincidir con el punto del CDC '${cdc.point}'`, ['punto']);
}
if (data.numero != cdc.number) {
addError(`El Numero de Documento '${data.numero}' debe coincidir con el numero del documento del CDC '${cdc.number}'`, ['numero']);
}
if (params.tipoContribuyente != cdc.taxpayerType) {
addError(`El Tipo de Contribuyente '${params.tipoContribuyente}' debe coincidir con el del CDC '${cdc.taxpayerType}'`, ['tipoContribuyente']);
}
const formattedDate = DateHelper_1.default.getCdcFormatDate(new Date(data.fecha));
if (formattedDate != cdc.date) {
addError(`La fecha de emisión de la FE debe coincidir con la fecha del CDC '${cdc.date}'`, ['fecha']);
}
if (data.tipoEmision != cdc.issuanceType) {
addError(`El Tipo de Emisión '${data.tipoEmision}' debe coincidir con el del CDC '${cdc.issuanceType}'`, ['tipoEmision']);
}
}
/**
* Generacion del codigo de control de 44 digitos
*/
generateCDC(params, data) {
const fechaEmision = DateHelper_1.default.getCdcFormatDate(new Date(data.fecha));
let cdc = data.tipoDocumento.toString().padStart(2, '0') +
params.rucID.padStart(8, '0') +
params.rucDV +
data.establecimiento +
data.punto +
data.numero +
params.tipoContribuyente +
fechaEmision +
data.tipoEmision +
data.codigoSeguridadAleatorio;
cdc += (0, calcDV_1.default)(cdc, 11);
return cdc;
}
}
exports.default = new CDCHelper();