UNPKG

facturacionelectronicapy-xmlgen

Version:

API Node JS para generar el archivo XML del Documento electrónico exigido por SIFEN en base a JSON

122 lines 10.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const StringUtil_service_1 = __importDefault(require("./StringUtil.service")); const FechaUtil_service_1 = __importDefault(require("./FechaUtil.service")); class JSonDteAlgoritmosService { /** * Calcula Digito Verificador numérico con entrada alfanumérica y basemax 11 */ calcularDigitoVerificador(cdc, baseMax = 11) { let v_total = 0; let v_resto = 0; let k = 0; let v_numero_aux = 0; let v_numero_al = ''; let v_caracter = ''; let v_digit = 0; // Cambia la ultima letra por ascii en caso que la cedula termine en letra for (let i = 0; i < cdc.length; i++) { v_caracter = cdc.toUpperCase().substring(i, i + 1); if (!(v_caracter.charCodeAt(0) >= 48 && v_caracter.charCodeAt(0) <= 57)) { v_numero_al = v_numero_al + v_caracter.charCodeAt(0); } else { v_numero_al = v_numero_al + v_caracter; } } // Calcula el DV k = 2; v_total = 0; //FOR i IN REVERSE 1 .. LENGTH(v_numero_al) LOOP for (let i = v_numero_al.length; i > 0; i--) { if (k > baseMax) { k = 2; } v_numero_aux = parseInt(v_numero_al.substring(i - 1, i)); v_total = v_total + v_numero_aux * k; k = k + 1; } v_resto = v_total % 11; if (v_resto > 1) { v_digit = 11 - v_resto; } else { v_digit = 0; } return v_digit; } /** * Generacion del codigo de control de 44 digitos * * Conformacion del CDC * 1. Tipo de Documento, iTiDE, 2, Completar con left zero hasta alcanzar 2 digit. * 2. Ruc Emisor, dRucEm, 8, Completar con left zero hasta 8 * 3. DV del Emisor, dDVEmi, 1, Digito verificador del emisor. * 4. Establecimiento, dEst, 3, Establecimiento * 5. Punto de Expedicion, dPunExp, 3, Punto de Expe. * 6. Numero de Docummento, dNumDoc, 7, Numero de DE, completar con left zero hasta 7 * 7. Tipo de Contribuyente, iTipCon, 1, Codigo del tipo de contribuyente * 8. Fecha Emision, dFeEmiDE, 8, en formato AAAAMMDD * 9. Tipo de Emision, iTipEmi, 1, Tipo de Emision * 10. Codigo de Seguridad, dCodSeg, 9, Num. Aleatorio * 11. Digito Verificador, dDVId, 1, Resultado del Algoritmo M. 11 * * @param data * @returns */ generateCodigoControl(params, data, codigoSeguridad) { if (params['ruc'].indexOf('-') == -1) { throw new Error('RUC debe contener dígito verificador en params.ruc'); } const tipoDocumento = data['tipoDocumento']; let rucEmisor = params['ruc'].split('-')[0]; rucEmisor = StringUtil_service_1.default.leftZero(rucEmisor, 8); const dvEmisor = params['ruc'].split('-')[1]; const establecimiento = StringUtil_service_1.default.leftZero(data['establecimiento'], 3); const punto = StringUtil_service_1.default.leftZero(data['punto'], 3); const numero = StringUtil_service_1.default.leftZero(data['numero'], 7); const tipoContribuyente = params['tipoContribuyente']; const fechaEmision = FechaUtil_service_1.default.convertToAAAAMMDD(new Date(data['fecha'])); const tipoEmision = data['tipoEmision']; //1=Normal 2=Contingencia const codigoSeguridadAleatorio = codigoSeguridad; let cdc = StringUtil_service_1.default.leftZero(tipoDocumento, 2) + rucEmisor + dvEmisor + establecimiento + punto + numero + tipoContribuyente + fechaEmision + tipoEmision + codigoSeguridadAleatorio; let rucEmisorParaCalculoDV = params['ruc'].split('-')[0]; //Si el RUC tiene letras A, B o C, esas letras hay que reemplazar con el código ASCII rucEmisorParaCalculoDV = rucEmisorParaCalculoDV.replace('A', '65'); rucEmisorParaCalculoDV = rucEmisorParaCalculoDV.replace('B', '66'); rucEmisorParaCalculoDV = rucEmisorParaCalculoDV.replace('C', '67'); rucEmisorParaCalculoDV = rucEmisorParaCalculoDV.replace('a', '97'); rucEmisorParaCalculoDV = rucEmisorParaCalculoDV.replace('b', '98'); rucEmisorParaCalculoDV = rucEmisorParaCalculoDV.replace('c', '99'); rucEmisorParaCalculoDV = StringUtil_service_1.default.leftZero(rucEmisorParaCalculoDV, 8); const dvEmisorParaCalculoDV = params['ruc'].split('-')[1]; let cdcParaCalculoDV = StringUtil_service_1.default.leftZero(tipoDocumento, 2) + rucEmisorParaCalculoDV + dvEmisorParaCalculoDV + establecimiento + punto + numero + tipoContribuyente + fechaEmision + tipoEmision + codigoSeguridadAleatorio; //const digitoVerificador = this.calcularDigitoVerificador(cdcParaCalculoDV, 11); const digitoVerificador = this.calcularDigitoVerificador(cdc, 11); cdc += digitoVerificador; return cdc; } } exports.default = new JSonDteAlgoritmosService(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkR0ZUFsZ29yaXRtb3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9qc29uRHRlQWxnb3JpdG1vcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOEVBQXFEO0FBQ3JELDRFQUFtRDtBQUVuRCxNQUFNLHdCQUF3QjtJQUM1Qjs7T0FFRztJQUNJLHlCQUF5QixDQUFDLEdBQVcsRUFBRSxVQUFrQixFQUFFO1FBQ2hFLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBRWhCLDBFQUEwRTtRQUMxRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7Z0JBQ3ZFLFdBQVcsR0FBRyxXQUFXLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0RDtpQkFBTTtnQkFDTCxXQUFXLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQzthQUN4QztTQUNGO1FBRUQsZ0JBQWdCO1FBQ2hC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