facturacionelectronicapy-recibo-xmlgen
Version:
API Node JS para generar el archivo XML del Recibo similar al exigido por la SET en base a JSON
378 lines (377 loc) • 34.7 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 Constante_service_1 = __importDefault(require("./Constante.service"));
class JSonDteItemService {
/**
* E8. Campos que describen los ítems de la operación (E700-E899)
*
* @param params
* @param data
* @param options
*/
generateDatosItemsOperacion(params, data, config) {
const jsonResult = [];
//Recorrer array de infoCuotas e informar en el JSON
if (data['items'] && data['items'].length > 0) {
for (let i = 0; i < data['items'].length; i++) {
const item = data['items'][i];
const gCamItem = {
dCodInt: item['codigo'],
};
if (item['partidaArancelaria']) {
gCamItem['dParAranc'] = item['partidaArancelaria'];
}
if (item['ncm']) {
gCamItem['dNCM'] = item['ncm'];
}
if (data['cliente']['tipoOperacion'] && data['cliente']['tipoOperacion'] === 3) {
gCamItem['dDncpG'] = StringUtil_service_1.default.leftZero(item['dncp']['codigoNivelGeneral'], 8);
gCamItem['dDncpE'] = item['dncp']['codigoNivelEspecifico'];
gCamItem['dGtin'] = item['dncp']['codigoGtinProducto'];
gCamItem['dGtinPq'] = item['dncp']['codigoNivelPaquete'];
}
gCamItem['dDesProSer'] = item['descripcion']; // RG 24/2019
gCamItem['cUniMed'] = item['unidadMedida'];
gCamItem['dDesUniMed'] = Constante_service_1.default.unidadesMedidas
.filter((um) => um.codigo === item['unidadMedida'])[0]['representacion'].trim();
gCamItem['dCantProSer'] = item['cantidad'];
if (item['pais']) {
gCamItem['cPaisOrig'] = item['pais'];
gCamItem['dDesPaisOrig'] = Constante_service_1.default.paises.filter((pais) => pais.codigo === item['pais'])[0]['descripcion'];
}
if (item['observacion'] && item['observacion'].trim().length > 0) {
gCamItem['dInfItem'] = item['observacion'].trim();
}
if (data['tipoDocumento'] === 7) {
if (item['tolerancia']) {
gCamItem['cRelMerc'] = item['tolerancia'];
gCamItem['dDesRelMerc'] = Constante_service_1.default.relevanciasMercaderias.filter((um) => um.codigo === item['tolerancia'])[0]['descripcion'];
gCamItem['dCanQuiMer'] = item['toleranciaCantidad'];
gCamItem['dPorQuiMer'] = item['toleranciaPorcentaje'];
}
}
//Tratamiento E719. Tiene relacion con generateDatosGeneralesInherentesOperacion
if (data['tipoDocumento'] == 1 || data['tipoDocumento'] == 4) {
if (data['tipoTransaccion'] === 9) {
if (item['cdcAnticipo']) {
gCamItem['dCDCAnticipo'] = item['cdcAnticipo'];
}
}
}
if (data['tipoDocumento'] != 7) {
//Oblitatorio informar
gCamItem['gValorItem'] = this.generateDatosItemsOperacionPrecioTipoCambioTotal(params, data, item, i, config);
}
if (data['tipoImpuesto'] == 1 ||
data['tipoImpuesto'] == 3 ||
data['tipoImpuesto'] == 4 ||
data['tipoImpuesto'] == 5) {
if (data['tipoDocumento'] != 4 && data['tipoDocumento'] != 7) {
gCamItem['gCamIVA'] = this.generateDatosItemsOperacionIVA(params, data, item, i, Object.assign({}, gCamItem), config);
}
}
//Rastreo
if (item['lote'] ||
item['vencimiento'] ||
item['numeroSerie'] ||
item['numeroPedido'] ||
item['numeroSeguimiento'] ||
item['registroSenave'] ||
item['registroEntidadComercial']) {
gCamItem['gRasMerc'] = this.generateDatosItemsOperacionRastreoMercaderias(params, data, item, i);
}
//Automotores
if (item['sectorAutomotor'] && item['sectorAutomotor']['tipo']) {
gCamItem['gVehNuevo'] = this.generateDatosItemsOperacionSectorAutomotores(params, data, item, i);
}
jsonResult.push(gCamItem);
} //end-for
}
return jsonResult;
}
/**
* E8.1. Campos que describen el precio, tipo de cambio y valor total de la operación por ítem (E720-E729)
*
* @param params
* @param data
* @param options
* @param items Es el item actual del array de items de "data" que se está iterando
*/
generateDatosItemsOperacionPrecioTipoCambioTotal(params, data, item, i, config) {
const jsonResult = {
dPUniProSer: item['precioUnitario'],
};
jsonResult['dTotBruOpeItem'] = parseFloat(item['precioUnitario']) * parseFloat(item['cantidad']);
console.log('res parcial', jsonResult['dTotBruOpeItem'], 'decimal', config.decimals);
jsonResult['dTotBruOpeItem'] = parseFloat(jsonResult['dTotBruOpeItem'].toFixed(config.decimals));
if (data.moneda === 'PYG') {
jsonResult['dTotBruOpeItem'] = parseFloat(jsonResult['dTotBruOpeItem'].toFixed(0));
}
if (data['condicionTipoCambio'] && data['condicionTipoCambio'] == 2) {
jsonResult['dTiCamIt'] = item['cambio'];
}
jsonResult['gValorRestaItem'] = this.generateDatosItemsOperacionDescuentoAnticipoValorTotal(params, data, item, i, config);
return jsonResult;
}
/**
* E8.1.1 Campos que describen los descuentos, anticipos y valor total por ítem (EA001-EA050)
*
* @param params
* @param data
* @param options
* @param items Es el item actual del array de items de "data" que se está iterando
*/
generateDatosItemsOperacionDescuentoAnticipoValorTotal(params, data, item, i, config) {
const jsonResult = {};
jsonResult['dDescItem'] = 0;
if (item['descuento'] && +item['descuento'] > 0) {
//Validar que si el descuento es mayor al precio
if (+item['descuento'] == +item['precioUnitario']) {
//Validar IVA
//Quiere decir que no va a ir nada en exenta, gravada5 y gravada10, para este item.
if (item['ivaTipo'] != 3) {
/*throw new Error(
'Descuento igual a Precio Unitario corresponde tener Tipo de Iva = 3-Exento en data.items[' +
i +
'].ivaTipo',
);*/
//console.log("=================>>>>>>>>>>>>>>>>>>>>>>>> se asigna iva tipo = 3 tres");
/*item['ivaTipo'] = 3; //Exenta
item['ivaBase'] = 0;
item['iva'] = 0;*/
}
}
jsonResult['dDescItem'] = parseFloat(item['descuento']).toFixed(config.decimals);
//Calcula solo el % Descuento
jsonResult['dPorcDesIt'] = Math.round((parseFloat(item['descuento']) * 100) / parseFloat(item['precioUnitario']));
}
jsonResult['dDescGloItem'] = 0;
if (data['porcentajeDescuento'] && data['porcentajeDescuento'] > 0) {
//Si hay un descuento global, entonces FacturaSend prorratea entre los items
jsonResult['dDescGloItem'] = (data['porcentajeDescuento'] * parseFloat(item['precioUnitario'])) / 100;
jsonResult['dDescGloItem'] = parseFloat(jsonResult['dDescGloItem']).toFixed(config.decimals);
}
jsonResult['dAntPreUniIt'] = 0;
if (item['anticipo'] && item['anticipo'] > 0) {
jsonResult['dAntPreUniIt'] = item['anticipo'];
}
/* dTotOpeItem (EA008)
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 (data['tipoImpuesto'] == 1 ||
data['tipoImpuesto'] == 3 ||
data['tipoImpuesto'] == 4 ||
data['tipoImpuesto'] == 5) {
const valores = parseFloat(item['precioUnitario']) -
parseFloat(jsonResult['dDescItem'] || 0) -
parseFloat(jsonResult['dDescGloItem'] || 0) -
parseFloat(jsonResult['dAntPreUniIt'] || 0) -
parseFloat(jsonResult['dAntGloPreUniIt'] || 0);
jsonResult['dTotOpeItem'] = parseFloat(valores + '') * parseFloat(item['cantidad']);
jsonResult['dTotOpeItem'] = parseFloat(jsonResult['dTotOpeItem'].toFixed(config.decimals));
if (data.moneda === 'PYG') {
jsonResult['dTotOpeItem'] = parseFloat(jsonResult['dTotOpeItem'].toFixed(0));
}
}
if (data['tipoDocumento'] == 4) {
//Si es Autofactura
jsonResult['dTotOpeItem'] = parseFloat(item['precioUnitario']) * parseFloat(item['cantidad']);
jsonResult['dTotOpeItem'] = parseFloat(jsonResult['dTotOpeItem'].toFixed(config.decimals));
if (data.moneda === 'PYG') {
jsonResult['dTotOpeItem'] = parseFloat(jsonResult['dTotOpeItem'].toFixed(0));
}
}
if (data['condicionTipoCambio'] == 2) {
jsonResult['dTotOpeGs'] = jsonResult['dTotOpeItem'] * item['cambio'];
}
return jsonResult;
}
/**
* E8.2. Campos que describen el IVA de la operación por ítem (E730-E739)
*
* @param params
* @param data
* @param options
* @param items Es el item actual del array de items de "data" que se está iterando
*/
generateDatosItemsOperacionIVA(params, data, item, i, gCamItem, config) {
const jsonResult = {
iAfecIVA: item['ivaTipo'],
dDesAfecIVA: Constante_service_1.default.codigosAfectaciones.filter((ca) => ca.codigo === item['ivaTipo'])[0]['descripcion'],
dPropIVA: item['ivaBase'],
dTasaIVA: item['iva'],
};
/* Calculo para E735
Si E731 = 1 o 4 este campo es igual al resultado del cálculo
[EA008 * (E733/100)] / 1,1 si la tasa es del 10%
[EA008 * (E733/100)] / 1,05 si la tasa es del 5%
Si E731 = 2 o 3 este campo es igual 0
*/
jsonResult['dBasGravIVA'] = 0;
if (item['ivaTipo'] == 1 || item['ivaTipo'] == 4) {
if (item['iva'] == 10) {
jsonResult['dBasGravIVA'] =
(gCamItem['gValorItem']['gValorRestaItem']['dTotOpeItem'] * (item['ivaBase'] / 100)) / 1.1;
}
if (item['iva'] == 5) {
jsonResult['dBasGravIVA'] =
(gCamItem['gValorItem']['gValorRestaItem']['dTotOpeItem'] * (item['ivaBase'] / 100)) / 1.05;
}
//Redondeo inicial a 2 decimales
if (jsonResult['dBasGravIVA']) {
jsonResult['dBasGravIVA'] = parseFloat(jsonResult['dBasGravIVA'].toFixed(config.decimals));
if (data.moneda === 'PYG') {
jsonResult['dBasGravIVA'] = parseFloat(jsonResult['dBasGravIVA'].toFixed(0));
}
}
}
/* Calculo para E736
Corresponde al cálculo aritmético:
E735 * ( E734 / 100 )
Si E731 = 2 o 3 este campo es igual 0
*/
jsonResult['dLiqIVAItem'] = 0;
if (item['ivaTipo'] == 1 || item['ivaTipo'] == 4) {
jsonResult['dLiqIVAItem'] = (jsonResult['dBasGravIVA'] * item['iva']) / 100;
//Redondeo
jsonResult['dLiqIVAItem'] = parseFloat(jsonResult['dLiqIVAItem'].toFixed(config.decimals));
if (data.moneda === 'PYG') {
jsonResult['dLiqIVAItem'] = parseFloat(jsonResult['dLiqIVAItem'].toFixed(0));
}
}
return jsonResult;
}
/**
* E8.4. Grupo de rastreo de la mercadería (E750-E760)
*
* @param params
* @param data
* @param options
* @param items Es el item actual del array de items de "data" que se está iterando
*/
generateDatosItemsOperacionRastreoMercaderias(params, data, item, i) {
const jsonResult = {};
if (item['lote']) {
jsonResult['dNumLote'] = item['lote'];
}
if (item['vencimiento']) {
jsonResult['dVencMerc'] = item['vencimiento'];
}
if (item['numeroSerie']) {
jsonResult['dNSerie'] = item['numeroSerie'];
}
if (item['numeroPedido']) {
jsonResult['dNumPedi'] = item['numeroPedido'];
}
if (item['numeroSeguimiento']) {
jsonResult['dNumSegui'] = item['numeroSeguimiento'];
}
if (item['importador'] && item['importador']['nombre']) {
jsonResult['dNomImp'] = item['importador']['nombre'].substring(0, 60);
jsonResult['dDirImp'] = item['importador']['direccion'].substring(0, 255);
jsonResult['dNumFir'] = item['importador']['registroImportador'].substring(0, 20);
//jsonResult['dNumReg'] = item['importador']['registroSenave'].substring(0, 20);
//jsonResult['dNumRegEntCom'] = item['importador']['registroEntidadComercial'].substring(0, 20);
}
if (item['registroSenave']) {
jsonResult['dNumReg'] = item['registroSenave'];
}
if (item['registroEntidadComercial']) {
jsonResult['dNumRegEntCom'] = item['registroEntidadComercial'];
}
return jsonResult;
}
/**
* E8.5. Sector de automotores nuevos y usados (E770-E789)
*
* @param params
* @param data
* @param options
* @param items Es el item actual del array de items de "data" que se está iterando
*/
generateDatosItemsOperacionSectorAutomotores(params, data, item, i) {
if (!item['sectorAutomotor']) {
//Como no indica que este campo es obligatorio, si no se informa sale con vacio
return null;
}
/*if (
constanteService.tiposOperacionesVehiculos.filter((um) => um.codigo === item['sectorAutomotor']['tipo']).length ==
0
) {
throw new Error(
"Tipo de Operación de Venta de Automotor '" +
item['sectorAutomotor']['tipo'] +
"' en data.items[" +
i +
'].sectorAutomotor.tipo no encontrado. Valores: ' +
constanteService.tiposOperacionesVehiculos.map((a) => a.codigo + '-' + a.descripcion),
);
}
if (
constanteService.tiposCombustibles.filter((um) => um.codigo === item['sectorAutomotor']['tipoCombustible'])
.length == 0
) {
throw new Error(
"Tipo de Combustible '" +
item['sectorAutomotor']['tipoCombustible'] +
"' en data.items[" +
i +
'].sectorAutomotor.tipoCombustible no encontrado. Valores: ' +
constanteService.tiposCombustibles.map((a) => a.codigo + '-' + a.descripcion),
);
}*/
/*if (item['sectorAutomotor']['chasis']) {
if (item['sectorAutomotor']['chasis'].length != 17) {
throw new Error(
"El Chasis '" + item['sectorAutomotor']['chasis'] + "' en data.items[" + i + '] debe tener 17 caracteres',
);
}
}*/
/*if (item['sectorAutomotor']['cilindradas']) {
if ((item['sectorAutomotor']['cilindradas'] + '').length != 4) {
throw new Error(
"La Cilindradas '" +
item['sectorAutomotor']['cilindradas'] +
"' en data.items[" +
i +
'] debe tener 4 caracteres',
);
}
}*/
const jsonResult = {
iTipOpVN: item['sectorAutomotor']['tipo'],
dDesTipOpVN: Constante_service_1.default.tiposOperacionesVehiculos.filter((ov) => ov.codigo === item['sectorAutomotor']['tipo'])[0]['descripcion'],
dChasis: item['sectorAutomotor']['chasis'],
dColor: item['sectorAutomotor']['color'],
dPotencia: item['sectorAutomotor']['potencia'],
dCapMot: item['sectorAutomotor']['capacidadMotor'],
dPNet: item['sectorAutomotor']['pesoNeto'],
dPBruto: item['sectorAutomotor']['pesoBruto'],
iTipCom: item['sectorAutomotor']['tipoCombustible'],
dDesTipCom: Constante_service_1.default.tiposCombustibles.filter((tc) => tc.codigo === item['sectorAutomotor']['tipoCombustible'])[0]['descripcion'],
dNroMotor: item['sectorAutomotor']['numeroMotor'],
dCapTracc: item['sectorAutomotor']['capacidadTraccion'],
dAnoFab: item['sectorAutomotor']['año'],
cTipVeh: item['sectorAutomotor']['tipoVehiculo'],
dCapac: item['sectorAutomotor']['capacidadPasajeros'],
};
if (item['sectorAutomotor']['cilindradas']) {
jsonResult['dCilin'] = item['sectorAutomotor']['cilindradas'] + '';
}
//Se puede hacer todo por if, para no enviar null
return jsonResult;
}
}
exports.default = new JSonDteItemService();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkR0ZUl0ZW0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9qc29uRHRlSXRlbS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOEVBQXFEO0FBQ3JELDRFQUFtRDtBQUduRCxNQUFNLGtCQUFrQjtJQUN0Qjs7Ozs7O09BTUc7SUFDSSwyQkFBMkIsQ0FBQyxNQUFXLEVBQUUsSUFBUyxFQUFFLE1BQW9CO1FBQzdFLE1BQU0sVUFBVSxHQUFRLEVBQUUsQ0FBQztRQUUzQixvREFBb0Q7UUFDcEQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFOUIsTUFBTSxRQUFRLEdBQVE7b0JBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2lCQUN4QixDQUFDO2dCQUVGLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7b0JBQzlCLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztpQkFDcEQ7Z0JBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ2YsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDaEM7Z0JBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMs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