facturacionelectronicapy-recibo-xmlgen
Version:
API Node JS para generar el archivo XML del Recibo similar al exigido por la SET en base a JSON
102 lines • 8.07 kB
JavaScript
;
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 = 55; //Valor fijo para recibo
const rucEmisor = StringUtil_service_1.default.leftZero(params['ruc'].split('-')[0], 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 tipoEmision = 1; //1=Normal 2=Contingencia
const codigoSeguridadAleatorio = codigoSeguridad;
//const codigoSeguridadAleatorio = 111111; //Valor fijo para recibo
let cdc = StringUtil_service_1.default.leftZero(tipoDocumento, 2) +
rucEmisor +
dvEmisor +
establecimiento +
punto +
numero +
tipoContribuyente +
fechaEmision +
tipoEmision +
codigoSeguridadAleatorio;
const digitoVerificador = this.calcularDigitoVerificador(cdc, 11);
cdc += digitoVerificador;
return cdc;
}
}
exports.default = new JSonDteAlgoritmosService();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaWJvWG1sQWxnb3JpdG1vcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3JlY2lib1htbEFsZ29yaXRtb3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDhFQUFxRDtBQUNyRCw0RUFBbUQ7QUFFbkQsTUFBTSx3QkFBd0I7SUFDNUI7O09BRUc7SUFDSSx5QkFBeUIsQ0FBQyxHQUFXLEVBQUUsVUFBa0IsRUFBRTtRQUNoRSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUVoQiwwRUFBMEU7UUFDMUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2dCQUN2RSxXQUFXLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEQ7aUJBQU07Z0JBQ0wsV0FBVyxHQUFHLFdBQVcsR0FBRyxVQUFVLENBQUM7YUFDeEM7U0FDRjtRQUVELGdCQUFnQjtR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