facturacionelectronicapy-recibo-xmlgen
Version:
API Node JS para generar el archivo XML del Recibo similar al exigido por la SET en base a JSON
973 lines (970 loc) • 162 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const xml2js = __importStar(require("xml2js"));
const StringUtil_service_1 = __importDefault(require("./StringUtil.service"));
const FechaUtil_service_1 = __importDefault(require("./FechaUtil.service"));
const Constante_service_1 = __importDefault(require("./Constante.service"));
const jsonDteItem_service_1 = __importDefault(require("./jsonDteItem.service"));
const jsonDteAlgoritmos_service_1 = __importDefault(require("./jsonDteAlgoritmos.service"));
const jsonDteComplementario_service_1 = __importDefault(require("./jsonDteComplementario.service"));
const jsonDteTransporte_service_1 = __importDefault(require("./jsonDteTransporte.service"));
const jsonDteTotales_service_1 = __importDefault(require("./jsonDteTotales.service"));
const jsonDteComplementariosComerciales_service_1 = __importDefault(require("./jsonDteComplementariosComerciales.service"));
const jsonDteIdentificacionDocumento_service_1 = __importDefault(require("./jsonDteIdentificacionDocumento.service"));
const jsonDeMainValidate_service_1 = __importDefault(require("./jsonDeMainValidate.service"));
class JSonDeMainService {
constructor() {
this.codigoSeguridad = null;
this.codigoControl = null;
this.json = {};
this.validateError = true;
}
generateXMLDE(params, data, config) {
return new Promise((resolve, reject) => {
try {
let defaultConfig = {
defaultValues: true,
//arrayValuesSeparator : ', ',
errorSeparator: '; ',
errorLimit: 10,
redondeoSedeco: true,
decimals: 2,
};
defaultConfig = Object.assign(defaultConfig, config);
resolve(this.generateXMLDeService(params, data, defaultConfig));
}
catch (error) {
reject(error);
}
});
}
/**
* Metodo principal de generacion de XML del DE
* @param params
* @param data
* @returns
*/
generateXMLDeService(params, data, config) {
this.removeUnderscoreAndPutCamelCase(data);
this.addDefaultValues(data);
if (this.validateError) {
jsonDeMainValidate_service_1.default.validateValues(Object.assign({}, params), Object.assign({}, data), config);
}
this.json = {};
this.generateCodigoControl(params, data); //Luego genera el código de Control
this.generateRte(params);
this.json['rDE']['DE'] = this.generateDe(params, data);
//---
this.generateDatosOperacion(params, data);
this.generateDatosTimbrado(params, data);
this.generateDatosGenerales(params, data, config);
//---
this.generateDatosEspecificosPorTipoDE(params, data, config);
if (data['tipoDocumento'] == 1 || data['tipoDocumento'] == 4) {
this.generateDatosCondicionOperacionDE(params, data);
}
//['gDtipDE']=E001
this.json['rDE']['DE']['gDtipDE']['gCamItem'] = jsonDteItem_service_1.default.generateDatosItemsOperacion(params, data, config);
this.json['rDE']['DE']['gDtipDE']['gCamEsp'] =
jsonDteComplementario_service_1.default.generateDatosComplementariosComercialesDeUsoEspecificos(params, data);
if (data['tipoDocumento'] == 1 || data['tipoDocumento'] == 7) {
//1 Opcional, 7 Obligatorio
if (data['detalleTransporte']) {
this.json['rDE']['DE']['gDtipDE']['gTransp'] = jsonDteTransporte_service_1.default.generateDatosTransporte(params, data);
}
}
if (data['tipoDocumento'] != 7) {
const items = this.json['rDE']['DE']['gDtipDE']['gCamItem'];
this.json['rDE']['DE']['gTotSub'] = jsonDteTotales_service_1.default.generateDatosTotales(params, data, items, config);
}
if (data['complementarios']) {
this.json['rDE']['DE']['gCamGen'] = jsonDteComplementariosComerciales_service_1.default.generateDatosComercialesUsoGeneral(params, data);
}
if (data['tipoDocumento'] == 4 || data['tipoDocumento'] == 5 || data['tipoDocumento'] == 6) {
if (!data['documentoAsociado']) {
/*throw new Error(
'Documento asociado es obligatorio para el tipo de documento electrónico (' +
data['tipoDocumento'] +
') seleccionado',
);*/
}
}
if (data['tipoDocumento'] == 1 ||
data['tipoDocumento'] == 4 ||
data['tipoDocumento'] == 5 ||
data['tipoDocumento'] == 6 ||
data['tipoDocumento'] == 7) {
//this.json['rDE']['DE']['gDtipDE']['gCamDEAsoc'] = jsonDteIdentificacionDocumento.generateDatosDocumentoAsociado(params, data);
if (data['documentoAsociado']) {
this.json['rDE']['DE']['gCamDEAsoc'] = jsonDteIdentificacionDocumento_service_1.default.generateDatosDocumentoAsociado(params, data);
}
}
var builder = new xml2js.Builder({
xmldec: {
version: '1.0',
encoding: 'UTF-8',
standalone: false,
},
});
var xml = builder.buildObject(this.json);
return this.normalizeXML(xml); //Para firmar tiene que estar normalizado
}
/**
* Genera el CDC para la Factura
* Corresponde al Id del DE
*
* @param params
* @param data
*/
generateCodigoControl(params, data) {
if (data.cdc && (data.cdc + '').length == 44) {
//Caso ya se le pase el CDC
this.codigoSeguridad = data.cdc.substring(34, 43);
this.codigoControl = data.cdc;
//Como se va utilizar el CDC enviado como parametro, va a verificar que todos los datos del XML coincidan con el CDC.
const tipoDocumentoCDC = this.codigoControl.substring(0, 2);
//const rucCDC = this.codigoControl.substring(2, 10);
//const dvCDC = this.codigoControl.substring(10, 11);
const establecimientoCDC = this.codigoControl.substring(11, 14);
const puntoCDC = this.codigoControl.substring(14, 17);
const numeroCDC = this.codigoControl.substring(17, 24);
//const tipoContribuyenteCDC = this.codigoControl.substring(24, 25);
const fechaCDC = this.codigoControl.substring(25, 33);
const tipoEmisionCDC = this.codigoControl.substring(33, 34);
if (+data['tipoDocumento'] != +tipoDocumentoCDC) {
/*throw new Error(
"El Tipo de Documento '" +
data['tipoDocumento'] +
"' en data.tipoDocumento debe coincidir con el CDC reutilizado (" +
+tipoDocumentoCDC +
')',
);*/
}
const establecimiento = StringUtil_service_1.default.leftZero(data['establecimiento'], 3);
if (establecimiento != establecimientoCDC) {
/*throw new Error(
"El Establecimiento '" +
establecimiento +
"'en data.establecimiento debe coincidir con el CDC reutilizado (" +
establecimientoCDC +
')',
);*/
}
const punto = StringUtil_service_1.default.leftZero(data['punto'], 3);
if (punto != puntoCDC) {
/*throw new Error(
"El Punto '" + punto + "' en data.punto debe coincidir con el CDC reutilizado (" + puntoCDC + ')',
);*/
}
const numero = StringUtil_service_1.default.leftZero(data['numero'], 7);
if (numero != numeroCDC) {
/*throw new Error(
"El Numero de Documento '" +
numero +
"'en data.numero debe coincidir con el CDC reutilizado (" +
numeroCDC +
')',
);*/
}
/*if (+data['tipoContribuyente'] != +tipoContribuyenteCDC) {
//throw new Error("El Tipo de Contribuyente '" + data['tipoContribuyente'] + "' en data.tipoContribuyente debe coincidir con el CDC reutilizado (" + tipoContribuyenteCDC + ")");
}*/
const fecha = (data['fecha'] + '').substring(0, 4) +
(data['fecha'] + '').substring(5, 7) +
(data['fecha'] + '').substring(8, 10);
if (fecha != fechaCDC) {
/*throw new Error(
"La fecha '" + fecha + "' en data.fecha debe coincidir con el CDC reutilizado (" + fechaCDC + ')',
);*/
}
if (+data['tipoEmision'] != +tipoEmisionCDC) {
/*throw new Error(
"El Tipo de Emisión '" +
data['tipoEmision'] +
"' en data.tipoEmision debe coincidir con el CDC reutilizado (" +
tipoEmisionCDC +
')',
);*/
}
}
else {
this.codigoSeguridad = StringUtil_service_1.default.leftZero(data.codigoSeguridadAleatorio, 9);
this.codigoControl = jsonDteAlgoritmos_service_1.default.generateCodigoControl(params, data, this.codigoSeguridad);
}
}
/**
* Si los valores vienen en underscore, crea los valores en formato variableJava que
* sera utilizado dentro del proceso,
*
* Ej. si viene tipo_documento crea una variable tipoDocumento, con el mismo valor.
*
* @param data
*/
removeUnderscoreAndPutCamelCase(data) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10;
if (data.tipo_documento) {
data.tipoDocumento = data.tipo_documento;
}
if (data.tipo_contribuyente) {
data.tipoContribuyente = data.tipo_contribuyente;
}
if (data.tipo_emision) {
data.tipoEmision = data.tipo_emision;
}
if (data.tipo_transaccion) {
data.tipoTransaccion = data.tipo_transaccion;
}
if (data.tipo_impuesto) {
data.tipoImpuesto = data.tipo_impuesto;
}
if (data.condicion_anticipo) {
data.condicionAnticipo = data.condicion_anticipo;
}
if (data.condicion_tipo_cambio) {
data.condicionTipoCambio = data.condicion_tipo_cambio;
}
//Objeto Cliente
if ((_a = data.cliente) === null || _a === void 0 ? void 0 : _a.razon_social) {
data.cliente.razonSocial = data.cliente.razon_social;
}
if ((_b = data.cliente) === null || _b === void 0 ? void 0 : _b.nombre_fantasia) {
data.cliente.nombreFantasia = data.cliente.nombre_fantasia;
}
if ((_c = data.cliente) === null || _c === void 0 ? void 0 : _c.tipo_operacion) {
data.cliente.tipoOperacion = data.cliente.tipo_operacion;
}
//Campo que puede ser un numero = 0, hay que validar de esta forma
if (typeof data.cliente != 'undefined' && typeof data.cliente.numero_casa != 'undefined') {
data.cliente.numeroCasa = data.cliente.numero_casa + '';
}
if ((_d = data.cliente) === null || _d === void 0 ? void 0 : _d.tipo_contribuyente) {
data.cliente.tipoContribuyente = data.cliente.tipo_contribuyente;
}
if ((_e = data.cliente) === null || _e === void 0 ? void 0 : _e.documento_tipo) {
data.cliente.documentoTipo = data.cliente.documento_tipo;
}
if ((_f = data.cliente) === null || _f === void 0 ? void 0 : _f.documento_numero) {
data.cliente.documentoNumero = data.cliente.documento_numero;
}
//Usuario
if ((_g = data.usuario) === null || _g === void 0 ? void 0 : _g.documento_tipo) {
data.usuario.documentoTipo = data.usuario.documento_tipo;
}
if ((_h = data.usuario) === null || _h === void 0 ? void 0 : _h.documento_numero) {
data.usuario.documentoNumero = data.usuario.documento_numero;
}
//Factura
if ((_j = data.factura) === null || _j === void 0 ? void 0 : _j.fecha_envio) {
data.factura.fechaEnvio = data.usuario.fecha_envio;
}
//AutoFactura
if (data.auto_factura) {
data.autoFactura = Object.assign({}, data.auto_factura);
}
if ((_k = data.autoFactura) === null || _k === void 0 ? void 0 : _k.tipo_vendedor) {
data.autoFactura.tipoVendedor = data.autoFactura.tipo_vendedor;
}
if ((_l = data.autoFactura) === null || _l === void 0 ? void 0 : _l.documentoTipo) {
data.autoFactura.documentoTipo = data.autoFactura.documentoTipo;
}
if ((_m = data.autoFactura) === null || _m === void 0 ? void 0 : _m.documento_numero) {
data.autoFactura.documentoNumero = data.autoFactura.documento_numero;
}
//Remision
if ((_o = data.remision) === null || _o === void 0 ? void 0 : _o.tipo_responsable) {
data.remision.tipoResponsable = data.remision.tipo_resonsable;
}
//Condicion entregas
if (((_p = data.condicion) === null || _p === void 0 ? void 0 : _p.entregas) && ((_q = data.condicion) === null || _q === void 0 ? void 0 : _q.entregas.length) > 0) {
for (let i = 0; i < data.condicion.entregas.length; i++) {
const entrega = data.condicion.entregas[i];
if (entrega.info_tarjeta) {
entrega.infoTarjeta = Object.assign({}, entrega.info_tarjeta);
}
if ((_r = entrega.infoTarjeta) === null || _r === void 0 ? void 0 : _r.numero_tarjeta) {
entrega.infoTarjeta.numeroTarjeta = entrega.infoTarjeta.numero_tarjeta;
}
if ((_s = entrega.infoTarjeta) === null || _s === void 0 ? void 0 : _s.razon_social) {
entrega.infoTarjeta.razonSocial = entrega.infoTarjeta.razon_social;
}
if ((_t = entrega.infoTarjeta) === null || _t === void 0 ? void 0 : _t.medio_pago) {
entrega.infoTarjeta.medioPago = entrega.infoTarjeta.medio_pago;
}
if ((_u = entrega.infoTarjeta) === null || _u === void 0 ? void 0 : _u.codigo_autorizacion) {
entrega.infoTarjeta.codigoAutorizacion = entrega.infoTarjeta.codigo_autorizacion;
}
if (entrega.info_cheque) {
entrega.infoCheque = Object.assign({}, entrega.info_cheque);
}
if ((_v = entrega.infoCheque) === null || _v === void 0 ? void 0 : _v.numero_cheque) {
entrega.infoCheque.numeroCheque = entrega.infoCheque.numero_cheque;
}
}
}
if (((_w = data.condicion) === null || _w === void 0 ? void 0 : _w.credito) && ((_x = data.condicion) === null || _x === void 0 ? void 0 : _x.credito.length) > 0) {
for (let i = 0; i < data.condicion.credito.length; i++) {
const credito = data.condicion.credito[i];
if (credito.monto_entrega) {
credito.montoEntrega = credito.monto_entrega;
}
if (credito.info_cuotas) {
credito.infoCuotas = Object.assign({}, credito.info_cuotas);
}
}
}
//Items
if (data.items && ((_y = data.items) === null || _y === void 0 ? void 0 : _y.length) > 0) {
for (let i = 0; i < data.items.length; i++) {
const item = data.items[i];
if (item.partida_arancelaria) {
item.partidaArancelaria = item.partida_arancelaria;
}
if (item.unidad_medida) {
item.unidadMedida = item.unidad_medida;
}
if (item.precio_unitario) {
item.precioUnitario = item.precio_unitario;
}
if (item.descuento_porcentaje) {
item.descuentoPorcentaje = item.descuento_porcentaje;
}
if (item.tolerancia_cantidad) {
item.toleranciaCantidad = item.tolerancia_cantidad;
}
if (item.tolerancia_porcentaje) {
item.toleranciaPorcentaje = item.tolerancia_porcentaje;
}
if (item.cdc_anticipo) {
item.cdcAnticipo = item.cdc_anticipo;
}
if (item.iva_tipo) {
item.ivaTipo = item.iva_tipo;
}
if (item.iva_base) {
item.ivaBase = item.iva_base;
}
if (item.numero_serie) {
item.numeroSerie = item.numero_serie;
}
if (item.numero_pedido) {
item.numeroPedido = item.numero_pedido;
}
if (item.numero_seguimiento) {
item.numeroSeguimiento = item.numero_seguimiento;
}
//DNCP
if (item.dncp) {
if (item.dncp.codigo_nivel_general) {
item.dncp.codigoNivelGeneral = item.dncp.codigo_nivel_general;
}
if (item.dncp.codigo_nivel_especifico) {
item.dncp.codigoNivelEspecifico = item.dncp.codigo_nivel_especifico;
}
if (item.dncp.codigo_gtin_producto) {
item.dncp.codigoGtinProducto = item.dncp.codigo_gtin_producto;
}
if (item.dncp.codigo_nivel_paquete) {
item.dncp.codigoNivelPaquete = item.dncp.codigo_nivel_paquete;
}
}
//Importador
if (item.importador) {
if (item.importador.registro_importador) {
item.importador.registroImportador = item.importador.registro_importador;
}
if (item.registro_senave) {
item.registroSenave = item.registro_senave;
}
if (item.registro_entidad_comercial) {
item.registroEntidadComercial = item.registro_entidad_comercial;
}
}
//Sector Automotor
if (item.sector_automotor) {
if (item.sector_automotor.capacidad_motor) {
item.sector_automotor.capacidadMotor = item.sector_automotor.capacidad_motor;
}
if (item.sector_automotor.capacidad_pasajeros) {
item.sector_automotor.capacidadPasajeros = item.sector_automotor.capacidad_pasajeros;
}
if (item.sector_automotor.peso_bruto) {
item.sector_automotor.pesoBruto = item.sector_automotor.peso_bruto;
}
if (item.sector_automotor.peso_neto) {
item.sector_automotor.pesoNeto = item.sector_automotor.peso_neto;
}
if (item.sector_automotor.tipo_combustible) {
item.sector_automotor.tipoCombustible = item.sector_automotor.tipo_combustible;
}
if (item.sector_automotor.numero_motor) {
item.sector_automotor.numeroMotor = item.sector_automotor.numero_motor;
}
if (item.sector_automotor.capacidad_traccion) {
item.sector_automotor.capacidadTraccion = item.sector_automotor.capacidad_traccion;
}
if (item.sector_automotor.tipo_vehiculo) {
item.sector_automotor.tipoVehiculo = item.sector_automotor.tipo_vehiculo;
}
}
}
}
//Sector Energia
if (data.sector_energia_electrica) {
data.sectorEnergiaElectrica = Object.assign({}, data.sector_energia_electrica);
}
if ((_z = data.sectorEnergiaElectrica) === null || _z === void 0 ? void 0 : _z.numero_medidor) {
data.sectorEnergiaElectrica.numeroMedidor = data.sectorEnergiaElectrica.numero_medidor;
}
if ((_0 = data.sectorEnergiaElectrica) === null || _0 === void 0 ? void 0 : _0.codigo_actividad) {
data.sectorEnergiaElectrica.codigoActividad = data.sectorEnergiaElectrica.codigo_actividad;
}
if ((_1 = data.sectorEnergiaElectrica) === null || _1 === void 0 ? void 0 : _1.codigo_categoria) {
data.sectorEnergiaElectrica.codigoCategoria = data.sectorEnergiaElectrica.codigo_categoria;
}
if ((_2 = data.sectorEnergiaElectrica) === null || _2 === void 0 ? void 0 : _2.lectura_anterior) {
data.sectorEnergiaElectrica.lecturaAnterior = data.sectorEnergiaElectrica.lectura_anterior;
}
if ((_3 = data.sectorEnergiaElectrica) === null || _3 === void 0 ? void 0 : _3.lectura_actual) {
data.sectorEnergiaElectrica.lecturaActual = data.sectorEnergiaElectrica.lectura_actual;
}
//Sector Seguros
if (data.sector_seguros) {
data.sectorSeguros = Object.assign({}, data.sector_seguros);
}
if ((_4 = data.sectorSeguros) === null || _4 === void 0 ? void 0 : _4.codigo_aseguradora) {
data.sectorSeguros.codigoAseguradora = data.sectorSeguros.codigo_aseguradora;
}
if ((_5 = data.sectorSeguros) === null || _5 === void 0 ? void 0 : _5.codigo_poliza) {
data.sectorSeguros.codigoPoliza = data.sectorSeguros.codigo_poliza;
}
if ((_6 = data.sectorSeguros) === null || _6 === void 0 ? void 0 : _6.numero_poliza) {
data.sectorSeguros.numeroPoliza = data.sectorSeguros.numero_poliza;
}
if ((_7 = data.sectorSeguros) === null || _7 === void 0 ? void 0 : _7.vigencia_unidad) {
data.sectorSeguros.vigenciaUnidad = data.sectorSeguros.vigencia_unidad;
}
if ((_8 = data.sectorSeguros) === null || _8 === void 0 ? void 0 : _8.inicio_vigencia) {
data.sectorSeguros.inicioVigencia = data.sectorSeguros.inicio_vigencia;
}
if ((_9 = data.sectorSeguros) === null || _9 === void 0 ? void 0 : _9.fin_vigencia) {
data.sectorSeguros.finVigencia = data.sectorSeguros.fin_vigencia;
}
if ((_10 = data.sectorSeguros) === null || _10 === void 0 ? void 0 : _10.codigo_interno_item) {
data.sectorSeguros.codigoInternoItem = data.sectorSeguros.codigo_interno_item;
}
}
/**
* Añade algunos valores por defecto al JSON de entrada, valido para
* todas las operaciones
* @param data
*/
addDefaultValues(data) {
if (Constante_service_1.default.tiposDocumentos.filter((um) => um.codigo === data['tipoDocumento']).length == 0) {
//No quitar este throw
throw (new Error("Tipo de Documento '" + data['tipoDocumento']) +
"' en data.tipoDocumento no válido. Valores: " +
Constante_service_1.default.tiposDocumentos.map((a) => a.codigo + '-' + a.descripcion));
}
data['tipoDocumentoDescripcion'] = Constante_service_1.default.tiposDocumentos.filter((td) => td.codigo == data['tipoDocumento'])[0]['descripcion'];
if (!data['tipoEmision']) {
data['tipoEmision'] = 1;
}
if (!data['tipoTransaccion']) {
data['tipoTransaccion'] = 1;
}
if (!data['moneda']) {
data['moneda'] = 'PYG';
}
//Valores por defecto para los items
if (data['items'] && data['items'].length > 0) {
for (let i = 0; i < data['items'].length; i++) {
const item = data['items'][i];
if (!item['unidadMedida']) {
item['unidadMedida'] = 77;
}
}
}
}
generateRte(params) {
this.json = {
rDE: {
$: {
xmlns: 'http://ekuatia.set.gov.py/sifen/xsd',
'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'xsi:schemaLocation': 'http://ekuatia.set.gov.py/sifen/xsd siRecepDE_v150.xsd',
},
dVerFor: params.version,
},
};
}
generateDe(params, data) {
if (params['ruc'].indexOf('-') == -1) {
//throw new Error('RUC debe contener dígito verificador en params.ruc');
}
const rucEmisor = params['ruc'].split('-')[0];
const dvEmisor = params['ruc'].split('-')[1];
if (this.validateError) {
var reg = new RegExp(/^\d+$/);
if (!reg.test(rucEmisor)) {
//throw new Error("El RUC '" + rucEmisor + "' debe ser numérico");
}
if (!reg.test(dvEmisor)) {
//throw new Error("El DV del RUC '" + dvEmisor + "' debe ser numérico");
}
}
const id = this.codigoControl;
const fechaFirmaDigital = new Date(params.fechaFirmaDigital);
let digitoVerificadorString = this.codigoControl + '';
const jsonResult = {
$: {
Id: id,
},
dDVId: digitoVerificadorString.substring(digitoVerificadorString.length - 1, digitoVerificadorString.length),
dFecFirma: FechaUtil_service_1.default.convertToJSONFormat(new Date()),
dSisFact: 1,
};
return jsonResult;
}
/**
* Datos inerentes a la operacion
* <gOpeDE>
<iTipEmi>1</iTipEmi>
<dDesTipEmi>Normal</dDesTipEmi>
<dCodSeg>000000023</dCodSeg>
<dInfoEmi>1</dInfoEmi>
<dInfoFisc>Información de interés del Fisco respecto al DE</dInfoFisc>
</gOpeDE>
* @param params
* @param data
* @param options
*/
generateDatosOperacion(params, data) {
if (params['ruc'].indexOf('-') == -1) {
//throw new Error('RUC debe contener dígito verificador en params.ruc');
}
const rucEmisor = params['ruc'].split('-')[0];
const dvEmisor = params['ruc'].split('-')[1];
const id = jsonDteAlgoritmos_service_1.default.generateCodigoControl(params, data, this.codigoSeguridad);
const digitoVerificador = jsonDteAlgoritmos_service_1.default.calcularDigitoVerificador(rucEmisor, 11);
if (id.length != 44) {
}
const codigoSeguridadAleatorio = this.codigoSeguridad;
if (Constante_service_1.default.tiposEmisiones.filter((um) => um.codigo === data['tipoEmision']).length == 0) {
/*throw new Error(
"Tipo de Emisión '" +
data['tipoEmision'] +
"' en data.tipoEmision no válido. Valores: " +
constanteService.tiposEmisiones.map((a) => a.codigo + '-' + a.descripcion),
);*/
}
this.json['rDE']['DE']['gOpeDE'] = {
iTipEmi: data['tipoEmision'],
dDesTipEmi: Constante_service_1.default.tiposEmisiones.filter((td) => td.codigo == data['tipoEmision'])[0]['descripcion'],
dCodSeg: codigoSeguridadAleatorio,
};
if (data['observacion'] && data['observacion'].length > 0) {
this.json['rDE']['DE']['gOpeDE']['dInfoEmi'] = data['observacion'];
}
if (data['descripcion'] && data['descripcion'].length > 0) {
this.json['rDE']['DE']['gOpeDE']['dInfoFisc'] = data['descripcion'];
}
//Validar aqui "dInfoFisc"
if (data['tipoDocumento'] == 7) {
//Nota de Remision
if (this.validateError) {
if (!(data['descripcion'] && data['descripcion'].length > 0)) {
//throw new Error('Debe informar la Descripción en data.descripcion para el Documento Electrónico');
}
}
}
}
/**
* Genera los datos del timbrado
*
* <gTimb>
<iTiDE>1</iTiDE>
<dDesTiDE>Factura electrónica</dDesTiDE>
<dNumTim>12345678</dNumTim>
<dEst>001</dEst>
<dPunExp>001</dPunExp>
<dNumDoc>1000050</dNumDoc>
<dSerieNum>AB</dSerieNum>
<dFeIniT>2019-08-13</dFeIniT>
</gTimb>
* @param params
* @param data
* @param options
*/
generateDatosTimbrado(params, data) {
this.json['rDE']['DE']['gTimb'] = {
iTiDE: data['tipoDocumento'],
dDesTiDE: data['tipoDocumentoDescripcion'],
dNumTim: params['timbradoNumero'],
dEst: StringUtil_service_1.default.leftZero(data['establecimiento'], 3),
dPunExp: StringUtil_service_1.default.leftZero(data['punto'], 3),
dNumDoc: StringUtil_service_1.default.leftZero(data['numero'], 7),
//dSerieNum : null,
dFeIniT: params['timbradoFecha'].substring(0, 10),
};
if (data['numeroSerie']) {
this.json['rDE']['DE']['gTimb']['dSerieNum'] = data['numeroSerie'];
}
}
/**
* Genera los campos generales, divide las actividades en diferentes metodos
*
* <gDatGralOpe>
<dFeEmiDE>2020-05-07T15:03:57</dFeEmiDE>
</gDatGralOpe>
*
* @param params
* @param data
* @param options
*/
generateDatosGenerales(params, data, config) {
this.json['rDE']['DE']['gDatGralOpe'] = {
dFeEmiDE: data['fecha'],
};
this.generateDatosGeneralesInherentesOperacion(params, data, config);
this.generateDatosGeneralesEmisorDE(params, data);
if (data['usuario']) {
//No es obligatorio
this.generateDatosGeneralesResponsableGeneracionDE(params, data);
}
this.generateDatosGeneralesReceptorDE(params, data);
}
/**
* D1. Campos inherentes a la operación comercial (D010-D099)
* Pertenece al grupo de datos generales
*
* <gOpeCom>
<iTipTra>1</iTipTra>
<dDesTipTra>Venta de mercadería</dDesTipTra>
<iTImp>1</iTImp>
<dDesTImp>IVA</dDesTImp>
<cMoneOpe>PYG</cMoneOpe>
<dDesMoneOpe>Guarani</dDesMoneOpe>
</gOpeCom>
* @param params
* @param data
* @param options
*/
generateDatosGeneralesInherentesOperacion(params, data, config) {
if (data['tipoDocumento'] == 7) {
//C002
return; //No informa si el tipo de documento es 7
}
if (!data['tipoImpuesto']) {
//throw new Error('Debe especificar el Tipo de Impuesto en data.tipoImpuesto');
}
if (Constante_service_1.default.tiposImpuestos.filter((um) => um.codigo === data['tipoImpuesto']).length == 0) {
/*throw new Error(
"Tipo de Impuesto '" +
data['tipoImpuesto'] +
"' en data.tipoImpuesto no válido. Valores: " +
constanteService.tiposImpuestos.map((a) => a.codigo + '-' + a.descripcion),
);*/
}
let moneda = data['moneda'];
if (!moneda && config.defaultValues === true) {
moneda = 'PYG';
}
if (Constante_service_1.default.monedas.filter((um) => um.codigo === moneda).length == 0) {
/*throw new Error(
"Moneda '" +
moneda +
"' en data.moneda no válido. Valores: " +
constanteService.monedas.map((a) => a.codigo + '-' + a.descripcion),
);*/
}
if (data['condicionAnticipo']) {
if (Constante_service_1.default.globalPorItem.filter((um) => um.codigo === data['condicionAnticipo']).length == 0) {
/*throw new Error(
"Condición de Anticipo '" +
data['condicionAnticipo'] +
"' en data.condicionAnticipo no válido. Valores: " +
constanteService.globalPorItem.map((a) => a.codigo + '-Anticipo ' + a.descripcion),
);*/
}
}
if (Constante_service_1.default.tiposTransacciones.filter((um) => um.codigo === data['tipoTransaccion']).length == 0) {
/*throw new Error(
"Tipo de Transacción '" +
data['tipoTransaccion'] +
"' en data.tipoTransaccion no válido. Valores: " +
constanteService.tiposTransacciones.map((a) => a.codigo + '-' + a.descripcion),
);*/
}
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom'] = {};
if (data['tipoDocumento'] == 1 || data['tipoDocumento'] == 4) {
//Obligatorio informar iTipTra D011
if (!data['tipoTransaccion']) {
//throw new Error('Debe proveer el Tipo de Transacción en data.tipoTransaccion');
}
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['iTipTra'] = data['tipoTransaccion'];
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['dDesTipTra'] = Constante_service_1.default.tiposTransacciones.filter((tt) => tt.codigo == data['tipoTransaccion'])[0]['descripcion'];
}
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['iTImp'] = data['tipoImpuesto']; //D013
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['dDesTImp'] = Constante_service_1.default.tiposImpuestos.filter((ti) => ti.codigo == data['tipoImpuesto'])[0]['descripcion']; //D013
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['cMoneOpe'] = moneda; //D015
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['dDesMoneOpe'] = Constante_service_1.default.monedas.filter((m) => m.codigo == moneda)[0]['descripcion'];
if (moneda != 'PYG') {
if (!data['condicionTipoCambio']) {
//throw new Error('Debe informar el tipo de Cambio en data.condicionTipoCambio');
}
//Obligatorio informar dCondTiCam D017
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['dCondTiCam'] = data['condicionTipoCambio'];
}
if (data['condicionTipoCambio'] == 1 && moneda != 'PYG') {
if (!(data['cambio'] && data['cambio'] > 0)) {
//throw new Error('Debe informar el valor del Cambio en data.cambio');
}
//Obligatorio informar dCondTiCam D018
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['dTiCam'] = data['cambio'];
}
if (data['condicionAnticipo']) {
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['iCondAnt'] = data['condicionAnticipo'];
this.json['rDE']['DE']['gDatGralOpe']['gOpeCom']['dDesCondAnt'] =
'Anticipo ' +
Constante_service_1.default.globalPorItem.filter((ca) => ca.codigo == data['condicionAnticipo'])[0]['descripcion'];
}
}
/**
* D2. Campos que identifican al emisor del Documento Electrónico DE (D100-D129)
* Pertenece al grupo de datos generales
*
* @param params
* @param data
* @param options
*/
generateDatosGeneralesEmisorDE(params, data) {
if (!(params && params.establecimientos)) {
//throw new Error('Debe proveer un Array con la información de los establecimientos en params');
}
//Validar si el establecimiento viene en params
let establecimiento = StringUtil_service_1.default.leftZero(data['establecimiento'], 3);
//let punto = stringUtilService.leftZero(data['punto'], 3);
if (params.establecimientos.filter((um) => um.codigo === establecimiento).length == 0) {
/*throw new Error(
"Establecimiento '" +
establecimiento +
"' no encontrado en params.establecimientos*.codigo. Valores: " +
params.establecimientos.map((a: any) => a.codigo + '-' + a.denominacion),
);*/
}
if (params['ruc'].indexOf('-') == -1) {
//throw new Error('RUC debe contener dígito verificador en params.ruc');
}
this.json['rDE']['DE']['gDatGralOpe']['gEmis'] = {
dRucEm: params['ruc'].split('-')[0],
dDVEmi: params['ruc'].split('-')[1],
iTipCont: params['tipoContribuyente'],
cTipReg: params['tipoRegimen'],
dNomEmi: params['razonSocial'],
dNomFanEmi: params['nombreFantasia'],
dDirEmi: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['direccion'],
dNumCas: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['numeroCasa'],
dCompDir1: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['complementoDireccion1'],
dCompDir2: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['complementoDireccion2'],
cDepEmi: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['departamento'],
dDesDepEmi: Constante_service_1.default.departamentos.filter((td) => td.codigo === params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['departamento'])[0]['descripcion'],
cDisEmi: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['distrito'],
dDesDisEmi: Constante_service_1.default.distritos.filter((td) => td.codigo === params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['distrito'])[0]['descripcion'],
cCiuEmi: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['ciudad'],
dDesCiuEmi: Constante_service_1.default.ciudades.filter((td) => td.codigo === params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['ciudad'])[0]['descripcion'],
dTelEmi: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['telefono'],
dEmailE: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['email'],
dDenSuc: params['establecimientos'].filter((e) => e.codigo === establecimiento)[0]['denominacion'],
};
if (params['actividadesEconomicas'] && params['actividadesEconomicas'].length > 0) {
this.json['rDE']['DE']['gDatGralOpe']['gEmis']['gActEco'] = [];
for (let i = 0; i < params['actividadesEconomicas'].length; i++) {
const actividadEconomica = params['actividadesEconomicas'][i];
const gActEco = {
cActEco: actividadEconomica.codigo,
dDesActEco: actividadEconomica.descripcion,
};
this.json['rDE']['DE']['gDatGralOpe']['gEmis']['gActEco'].push(gActEco);
}
}
else {
//throw new Error('Debe proveer el array de actividades económicas en params.actividadesEconomicas');
}
}
/**
* Datos generales del responsable de generacion del DE
*
* @param params
* @param data
* @param options
*/
generateDatosGeneralesResponsableGeneracionDE(params, data) {
if (Constante_service_1.default.tiposDocumentosIdentidades.filter((um) => um.codigo === data['usuario']['documentoTipo'])
.length == 0) {
/*throw new Error(
"Tipo de Documento '" +
data['usuario']['documentoTipo'] +
"' no encontrado en data.usuario.documentoTipo. Valores: " +
constanteService.tiposDocumentosIdentidades.map((a: any) => a.codigo + '-' + a.descripcion),
);*/
}
this.json['rDE']['DE']['gDatGralOpe']['gEmis']['gRespDE'] = {
iTipIDRespDE: data['usuario']['documentoTipo'],
dDTipIDRespDE: Constante_service_1.default.tiposDocumentosIdentidades.filter((td) => td.codigo === data['usuario']['documentoTipo'])[0]['descripcion'],
};
if (this.validateError) {
if (!data['usuario']['documentoNumero']) {
//throw new Error('El Documento del responsable en data.usuario.documentoNumero no puede ser vacio');
}
if (!data['usuario']['nombre']) {
//throw new Error('El Nombre del responsable en data.usuario.nombre no puede ser vacio');
}
if (!data['usuario']['cargo']) {
//throw new Error('El Cargo del responsable en data.usuario.cargo no puede ser vacio');
}
}
this.json['rDE']['DE']['gDatGralOpe']['gEmis']['gRespDE']['dNumIDRespDE'] = data['usuario']['documentoNumero'];
this.json['rDE']['DE']['gDatGralOpe']['gEmis']['gRespDE']['dNomRespDE'] = data['usuario']['nombre'];
this.json['rDE']['DE']['gDatGralOpe']['gEmis']['gRespDE']['dCarRespDE'] = data['usuario']['cargo'];
}
/**
* Datos generales del receptor del documento electrónico
* Pertenece al grupo de datos generales
*
* <gDatRec>
<iNatRec>1</iNatRec>
<iTiOpe>1</iTiOpe>
<cPaisRec>PRY</cPaisRec>
<dDesPaisRe>Paraguay</dDesPaisRe>
<iTiContRec>2</iTiContRec>
<dRucRec>00000002</dRucRec>
<dDVRec>7</dDVRec>
<dNomRec>RECEPTOR DEL DOCUMENTO</dNomRec>
<dDirRec>CALLE 1 ENTRE CALLE 2 Y CALLE 3</dDirRec>
<dNumCasRec>123</dNumCasRec>
<cDepRec>1</cDepRec>
<dDesDepRec>CAPITAL</dDesDepRec>
<cDisRec>1</cDisRec>
<dDesDisRec>ASUNCION (DISTRITO)</dDesDisRec>
<cCiuRec>1</cCiuRec>
<dDesCiuRec>ASUNCION (DISTRITO)</dDesCiuRec>
<dTelRec>012123456</dTelRec>
<dCodCliente>AAA</dCodCliente>
</gDatRec>
*
* @param params
* @param data
* @param options
*/
generateDatosGeneralesReceptorDE(params, data) {
if (!data['cliente']['contribuyente'] && data['cliente']['tipoOperacion'] != 4) {
if (Constante_service_1.default.tiposDocumentosReceptor.filter((um) => um.codigo === data['cliente']['documentoTipo'])
.length == 0) {
/*throw new Error(
"Tipo de Documento '" +
data['cliente']['documentoTipo'] +
"' del Cliente en data.cliente.documentoTipo no encontrado. Valores: " +
constanteService.tiposDocumentosReceptor.map((a: any) => a.codigo + '-' + a.descripcion),
);*/
}
}
var regExpOnlyNumber = new RegExp(/^\d+$/);
if (data['cliente']['contribuyente']) {
if (this.validateError) {
if (!data['cliente']['ruc']) {
//throw new Error('Debe proporcionar el RUC en data.cliente.ruc');
}
if (data['cliente']['ruc'].indexOf('-') == -1) {
//throw new Error('RUC debe contener dígito verificador en data.cliente.ruc');
}
const rucCliente = data['cliente']['ruc'].split('-');
if (!regExpOnlyNumber.test((rucCliente[0] + '').trim())) {
//throw new Error("El RUC del Cliente '" + rucCliente[0] + "' en data.cliente.ruc debe ser numérico");
}
if (!regExpOnlyNumber.test((rucCliente[1] + '').trim())) {
//throw new Error("El DV del RUC del Cliente '" + rucCliente[1] + "' en data.cliente.ruc debe ser numérico");
}
}
}
if (Constante_service_1.default.paises.filter((pais) => pais.codigo === data['cliente']['pais']).length == 0) {
/*throw new Error(
"Pais '" +
data['cliente']['pais'] +
"' del Cliente en data.cliente.pais no encontrado. Valores: " +
constanteService.paises.map((a: any) => a.codigo + '-' + a.descripcion),
);*/
}
if (data['tipoDocumento'] == 4) {
if (this.validateError) {
if (data['cliente']['tipoOperacion'] != 2) {
//throw new Error('El Tipo de Operación debe ser 2-B2C para el Tipo de Documento AutoFactura');
}
}
}
this.json['rDE']['DE']['gDatGralOpe']['gDatRec'] = {
iNatRec: data['cliente']['contribuyente'] ? 1 : 2,
iTiOpe: data['cliente']['tipoOperacion'],
cPaisRec: data['cliente']['pais'],
dDesPaisRe: Constante_service_1.default.paises.filter((pais) => pais.codigo === data['cliente']['pais'])[0]['descripcion'],
};
if (data['cliente']['contribuyente']) {
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['iTiContRec'] = data['cliente']['tipoContribuyente'];
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['dRucRec'] = (data['cliente']['ruc'].split('-')[0] + '').trim();
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['dDVRec'] = (data['cliente']['ruc'].split('-')[1] + '').trim();
}
if (!data['cliente']['contribuyente'] && data['cliente']['tipoOperacion']) {
//Obligatorio completar D210
if (this.validateError) {
if (data['cliente']['tipoOperacion'] != 4 && !data['cliente']['documentoNumero']) {
//throw new Error('Debe informar el número de documento en data.cliente.documentoNumero');
}
if (!data['cliente']['contribuyente'] && data['cliente']['tipoOperacion'] != 4) {
if (!data['cliente']['documentoTipo']) {
//throw new Error('Debe informar el Tipo de Documento del Cliente en data.cliente.documentoTipo');
}
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['iTipIDRec'] = data['cliente']['documentoTipo'];
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['dDTipIDRec'] =
Constante_service_1.default.tiposDocumentosReceptor.filter((tdr) => tdr.codigo === data['cliente']['documentoTipo'])[0]['descripcion'];
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['dNumIDRec'] = data['cliente']['documentoNumero'].trim();
}
if (+data['cliente']['documentoTipo'] === 5) {
//Si es innominado completar con cero
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['dNumIDRec'] = '0';
}
}
}
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['dNomRec'] = data['cliente']['razonSocial'].trim();
if (+data['cliente']['documentoTipo'] === 5) {
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['dNomRec'] = 'Sin Nombre';
}
//if (data['cliente']['documentoTipo'] === 5) {
if (data['cliente']['nombreFantasia']) {
this.json['rDE']['DE']['gDatGralOpe']['gDatRec']['dNomFanRec'] = data['cliente']['nombreFantasia'].trim();
}
//}
if (data['tipoDocumento'] === 7 || data['cliente']['tipoOperacion'] === 4) {
if (!data['cliente']['direccion']) {
//throw new Error('data.cliente.direccion es Obligatorio para Tipo de Documento 7 o Tipo de Operación 4');
}