UNPKG

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
"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'); }