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

835 lines 94.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const StringUtil_service_1 = __importDefault(require("./StringUtil.service")); const FechaUtil_service_1 = __importDefault(require("./FechaUtil.service")); const constante_service_1 = __importDefault(require("./constante.service")); class JSonDeMainValidateService { constructor() { this.errors = new Array(); } /** * Valida los datos ingresados en el data * @param data */ validateValues(params, data, config) { this.errors = new Array(); if (constante_service_1.default.tiposDocumentos.filter((um) => um.codigo === data['tipoDocumento']).length == 0) { this.errors.push("Tipo de Documento '" + data['tipoDocumento']) + "' en data.tipoDocumento no válido. Valores: " + constante_service_1.default.tiposDocumentos.map((a) => a.codigo + '-' + a.descripcion); } if (typeof data['cliente'] == 'undefined') { this.errors.push('Debe especificar los datos del Cliente en data.cliente'); } if (data['cliente']) { if (typeof data['cliente']['contribuyente'] == 'undefined') { this.errors.push('Debe indicar si el Cliente es o no un Contribuyente true|false en data.cliente.contribuyente'); } if (typeof data['cliente']['contribuyente'] == 'undefined') { this.errors.push('Debe indicar si el Cliente es o no un Contribuyente true|false en data.cliente.contribuyente'); } if (!(data['cliente']['contribuyente'] === true || data['cliente']['contribuyente'] === false)) { this.errors.push('data.cliente.contribuyente debe ser true|false'); } } this.generateCodigoControlValidate(params, data); this.generateDeValidate(params, data); this.generateDatosOperacionValidate(params, data); this.generateDatosGeneralesValidate(params, data); this.generateDatosEspecificosPorTipoDEValidate(params, data); this.generateDatosCondicionOperacionDEValidate(params, data); this.generateDatosTotalesValidate(params, data); if (data['moneda'] != 'PYG' && data['condicionTipoCambio'] == 1) { if (!data['cambio']) { this.errors.push('Debe especificar el valor del Cambio en data.cambio cuando moneda != PYG y la Cotización es Global'); } } if (!data['documentoAsociados']) { this.errors.push('Datos de/los Documento/s asociado/s es/son obligatorio/s'); } this.generateDatosDocumentoAsociadoValidate(params, data); //Tratamiento Final, del Envio del Error, no tocar if (this.errors.length > 0) { let errorExit = new Error(); let msgErrorExit = ''; let recorrerHasta = this.errors.length; if ((config.errorLimit || 3) < recorrerHasta) { recorrerHasta = config.errorLimit || 3; } for (let i = 0; i < recorrerHasta; i++) { const error = this.errors[i]; msgErrorExit += error; if (i < recorrerHasta - 1) { msgErrorExit += config.errorSeparator + ''; } } errorExit.message = msgErrorExit; /*errorExit.firstMessage = this.errors[0]; errorExit.errorsArray = this.errors;*/ throw errorExit; } } generateCodigoControlValidate(params, data) { if (data.cdc && (data.cdc + '').length == 44) { //Caso ya se le pase el CDC //const codigoSeguridad = data.cdc.substring(34, 43); const 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 = codigoControl.substring(0, 2); //const rucCDC = this.codigoControl.substring(2, 10); //const dvCDC = this.codigoControl.substring(10, 11); const establecimientoCDC = codigoControl.substring(11, 14); const puntoCDC = codigoControl.substring(14, 17); const numeroCDC = codigoControl.substring(17, 24); //const tipoContribuyenteCDC = this.codigoControl.substring(24, 25); const fechaCDC = codigoControl.substring(25, 33); const tipoEmisionCDC = codigoControl.substring(33, 34); if (+data['tipoDocumento'] != +tipoDocumentoCDC) { this.errors.push("El Tipo de Documento '" + data['tipoDocumento'] + "' en data.tipoDocumento debe coincidir con el CDC re-utilizado (" + +tipoDocumentoCDC + ')'); } const establecimiento = StringUtil_service_1.default.leftZero(data['establecimiento'], 3); if (establecimiento != establecimientoCDC) { this.errors.push("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) { this.errors.push("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) { this.errors.push("El Numero de Documento '" + numero + "'en data.numero debe coincidir con el CDC reutilizado (" + numeroCDC + ')'); } /*if (+data['tipoContribuyente'] != +tipoContribuyenteCDC) { this.errors.push("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) { this.errors.push("La fecha '" + fecha + "' en data.fecha debe coincidir con el CDC reutilizado (" + fechaCDC + ')'); } if (+data['tipoEmision'] != +tipoEmisionCDC) { this.errors.push("El Tipo de Emisión '" + data['tipoEmision'] + "' en data.tipoEmision debe coincidir con el CDC reutilizado (" + tipoEmisionCDC + ')'); } } } generateDeValidate(params, data) { if (params['ruc'].indexOf('-') == -1) { this.errors.push('RUC debe contener dígito verificador en params.ruc'); } let rucEmisor = params['ruc'].split('-')[0]; const dvEmisor = params['ruc'].split('-')[1]; var reg = new RegExp(/^\d+$/); if (!reg.test(rucEmisor)) { this.errors.push("El RUC '" + rucEmisor + "' debe ser numérico"); } if (!reg.test(dvEmisor)) { this.errors.push("El DV del RUC '" + dvEmisor + "' debe ser numérico"); } if (rucEmisor.length > 8) { this.errors.push("El RUC '" + rucEmisor + "' debe contener de 1 a 8 caracteres"); } if (dvEmisor > 9) { this.errors.push("El DV del RUC '" + dvEmisor + "' debe ser del 1 al 9"); } } generateDatosOperacionValidate(params, data) { if (params['ruc'].indexOf('-') == -1) { this.errors.push('RUC debe contener dígito verificador en params.ruc'); } if (constante_service_1.default.tiposEmisiones.filter((um) => um.codigo === data['tipoEmision']).length == 0) { this.errors.push("Tipo de Emisión '" + data['tipoEmision'] + "' en data.tipoEmision no válido. Valores: " + constante_service_1.default.tiposEmisiones.map((a) => a.codigo + '-' + a.descripcion)); } //Validar aqui "dInfoFisc" if (data['tipoDocumento'] == 7) { //Nota de Remision if (!(data['descripcion'] && data['descripcion'].length > 0)) { this.errors.push('Debe informar la Descripción en data.descripcion para el Documento Electrónico'); } } } generateDatosGeneralesValidate(params, data, defaultValues) { this.generateDatosGeneralesInherentesOperacionValidate(params, data, defaultValues); this.generateDatosGeneralesEmisorDEValidate(params, data); if (data['usuario']) { //No es obligatorio this.generateDatosGeneralesResponsableGeneracionDEValidate(params, data); } this.generateDatosGeneralesReceptorDEValidate(params, data); } generateDatosGeneralesInherentesOperacionValidate(params, data, defaultValues) { if (data['tipoDocumento'] == 7) { //C002 return; //No informa si el tipo de documento es 7 } if (!FechaUtil_service_1.default.isIsoDate(data['fecha'])) { this.errors.push("Valor de la Fecha '" + data['fecha'] + "' en data.fecha no válido. Formato: yyyy-MM-ddTHH:mm:ss"); } if (!data['tipoImpuesto']) { this.errors.push('Debe especificar el Tipo de Impuesto en data.tipoImpuesto'); } else { if (constante_service_1.default.tiposImpuestos.filter((um) => um.codigo === data['tipoImpuesto']).length == 0) { this.errors.push("Tipo de Impuesto '" + data['tipoImpuesto'] + "' en data.tipoImpuesto no válido. Valores: " + constante_service_1.default.tiposImpuestos.map((a) => a.codigo + '-' + a.descripcion)); } } let moneda = data['moneda']; if (!moneda && defaultValues === true) { moneda = 'PYG'; } if (constante_service_1.default.monedas.filter((um) => um.codigo === moneda).length == 0) { this.errors.push("Moneda '" + moneda + "' en data.moneda no válido. Valores: " + constante_service_1.default.monedas.map((a) => a.codigo + '-' + a.descripcion)); } if (data['condicionAnticipo']) { if (constante_service_1.default.globalPorItem.filter((um) => um.codigo === data['condicionAnticipo']).length == 0) { this.errors.push("Condición de Anticipo '" + data['condicionAnticipo'] + "' en data.condicionAnticipo no válido. Valores: " + constante_service_1.default.globalPorItem.map((a) => a.codigo + '-Anticipo ' + a.descripcion)); } } if (constante_service_1.default.tiposTransacciones.filter((um) => um.codigo === data['tipoTransaccion']).length == 0) { this.errors.push("Tipo de Transacción '" + data['tipoTransaccion'] + "' en data.tipoTransaccion no válido. Valores: " + constante_service_1.default.tiposTransacciones.map((a) => a.codigo + '-' + a.descripcion)); } if (data['tipoDocumento'] == 1 || data['tipoDocumento'] == 4) { //Obligatorio informar iTipTra D011 if (!data['tipoTransaccion']) { this.errors.push('Debe proveer el Tipo de Transacción en data.tipoTransaccion'); } } if (moneda != 'PYG') { if (!data['condicionTipoCambio']) { this.errors.push('Debe informar el tipo de Cambio en data.condicionTipoCambio'); } } if (data['condicionTipoCambio'] == 1 && moneda != 'PYG') { if (!(data['cambio'] && data['cambio'] > 0)) { this.errors.push('Debe informar el valor del Cambio en data.cambio'); } } } generateDatosGeneralesEmisorDEValidate(params, data) { if (!(params && params.establecimientos)) { this.errors.push('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) { this.errors.push("Establecimiento '" + establecimiento + "' no encontrado en params.establecimientos*.codigo. Valores: " + params.establecimientos.map((a) => a.codigo + '-' + a.denominacion)); } if (params['ruc'].indexOf('-') == -1) { this.errors.push('RUC debe contener dígito verificador en params.ruc'); } if (!(params['actividadesEconomicas'] && params['actividadesEconomicas'].length > 0)) { this.errors.push('Debe proveer el array de actividades económicas en params.actividadesEconomicas'); } } generateDatosGeneralesResponsableGeneracionDEValidate(params, data) { if (constante_service_1.default.tiposDocumentosIdentidades.filter((um) => um.codigo === data['usuario']['documentoTipo']) .length == 0) { this.errors.push("Tipo de Documento '" + data['usuario']['documentoTipo'] + "' no encontrado en data.usuario.documentoTipo. Valores: " + constante_service_1.default.tiposDocumentosIdentidades.map((a) => a.codigo + '-' + a.descripcion)); } if (!data['usuario']['documentoNumero']) { this.errors.push('El Documento del Responsable en data.usuario.documentoNumero no puede ser vacio'); } if (!data['usuario']['nombre']) { this.errors.push('El Nombre del Responsable en data.usuario.nombre no puede ser vacio'); } if (!data['usuario']['cargo']) { this.errors.push('El Cargo del Responsable en data.usuario.cargo no puede ser vacio'); } } generateDatosGeneralesReceptorDEValidate(params, data) { if (!data['cliente']) { return; //El error de cliente vacio, ya fue validado arriba } if (!data['cliente']['contribuyente'] && data['cliente']['tipoOperacion'] != 4) { if (constante_service_1.default.tiposDocumentosReceptor.filter((um) => um.codigo === data['cliente']['documentoTipo']) .length == 0) { this.errors.push("Tipo de Documento '" + data['cliente']['documentoTipo'] + "' del Cliente en data.cliente.documentoTipo no encontrado. Valores: " + constante_service_1.default.tiposDocumentosReceptor.map((a) => a.codigo + '-' + a.descripcion)); } } var regExpOnlyNumber = new RegExp(/^\d+$/); if (data['cliente']['contribuyente']) { if (!data['cliente']['ruc']) { this.errors.push('Debe proporcionar el RUC en data.cliente.ruc'); } if (data['cliente']['ruc'].indexOf('-') == -1) { this.errors.push('RUC debe contener dígito verificador en data.cliente.ruc'); } const rucCliente = data['cliente']['ruc'].split('-'); if (!regExpOnlyNumber.test((rucCliente[0] + '').trim())) { this.errors.push("El RUC del Cliente '" + rucCliente[0] + "' en data.cliente.ruc debe ser numérico"); } if (!regExpOnlyNumber.test((rucCliente[1] + '').trim())) { this.errors.push("El DV del RUC del Cliente '" + rucCliente[1] + "' en data.cliente.ruc debe ser numérico"); } if (rucCliente[0].length > 8) { this.errors.push("El RUC '" + rucCliente[0] + "' debe contener de 1 a 8 caracteres"); } if (rucCliente[1] > 9) { this.errors.push("El DV del RUC '" + rucCliente[1] + "' debe ser del 1 al 9"); } } if (constante_service_1.default.paises.filter((pais) => pais.codigo === data['cliente']['pais']).length == 0) { this.errors.push("Pais '" + data['cliente']['pais'] + "' del Cliente en data.cliente.pais no encontrado. Valores: " + constante_service_1.default.paises.map((a) => a.codigo + '-' + a.descripcion)); } if (data['tipoDocumento'] == 4) { if (data['cliente']['tipoOperacion'] != 2) { this.errors.push('El Tipo de Operación debe ser 2-B2C para el Tipo de Documento AutoFactura'); } } if (!data['cliente']['contribuyente'] && data['cliente']['tipoOperacion']) { //Obligatorio completar D210 if (data['cliente']['tipoOperacion'] != 4 && !data['cliente']['documentoNumero']) { this.errors.push('Debe informar el número de documento en data.cliente.documentoNumero'); } if (!data['cliente']['contribuyente'] && data['cliente']['tipoOperacion'] != 4) { if (!data['cliente']['documentoTipo']) { this.errors.push('Debe informar el Tipo de Documento del Cliente en data.cliente.documentoTipo'); } } } if (data['tipoDocumento'] === 7 || data['cliente']['tipoOperacion'] === 4) { if (!data['cliente']['direccion']) { this.errors.push('data.cliente.direccion es Obligatorio para Tipo de Documento 7 o Tipo de Operación 4'); } } if (data['cliente']['direccion']) { //Si tiene dirección hay que completar numero de casa. if (!data['cliente']['numeroCasa']) { this.errors.push('Debe informar el Número de casa del Receptor en data.cliente.numeroCasa'); } } if (data['cliente']['numeroCasa']) { if (!regExpOnlyNumber.test(data['cliente']['numeroCasa'])) { this.errors.push('El Número de Casa en data.cliente.numeroCasa debe ser numérico'); } } if (data['cliente']['direccion'] && data['cliente']['tipoOperacion'] != 4) { if (!data['cliente']['ciudad']) { this.errors.push('Obligatorio especificar la Ciudad en data.cliente.ciudad para Tipo de Documento != 4'); } else { if (constante_service_1.default.ciudades.filter((ciudad) => ciudad.codigo === +data['cliente']['ciudad']).length == 0) { this.errors.push("Ciudad '" + data['cliente']['ciudad'] + "' del Cliente en data.cliente.ciudad no encontrado. Valores: " + constante_service_1.default.ciudades.map((a) => a.codigo + '-' + a.descripcion)); } //De acuerdo a la Ciudad pasada como parametro, buscar el distrito y departamento y asignar dichos //valores de forma predeterminada, auque este valor sera sobre-escrito, caso el usuario envie //data['cliente']['distrito'] y data['cliente']['departamento'] let objCiudad = constante_service_1.default.ciudades.filter((ciu) => ciu.codigo === +data['cliente']['ciudad']); console.log("ciudad", objCiudad); let objDistrito = constante_service_1.default.distritos.filter((dis) => dis.codigo === +objCiudad[0]['distrito']); console.log("objDistrito", objDistrito); let objDepartamento = constante_service_1.default.distritos.filter((dep) => dep.codigo === +objDistrito[0]['departamento']); console.log("objDepartamento", objDepartamento); data['cliente']['distrito'] = objDistrito[0]['codigo']; data['cliente']['departamento'] = objDepartamento[0]['codigo']; } if (data['cliente']['direccion'] && data['cliente']['tipoOperacion'] != 4) { if (!data['cliente']['distrito']) { this.errors.push('Obligatorio especificar el Distrito en data.cliente.distrito para Tipo de Documento != 4'); } else { if (constante_service_1.default.distritos.filter((distrito) => distrito.codigo === +data['cliente']['distrito']).length == 0) { this.errors.push("Distrito '" + data['cliente']['distrito'] + "' del Cliente en data.cliente.distrito no encontrado. Valores: " + constante_service_1.default.distritos.map((a) => a.codigo + '-' + a.descripcion)); } } } if (data['cliente']['direccion'] && data['cliente']['tipoOperacion'] != 4) { if (!data['cliente']['departamento']) { this.errors.push('Obligatorio especificar el Departamento en data.cliente.departamento para Tipo de Documento != 4'); } else { if (constante_service_1.default.departamentos.filter((departamento) => departamento.codigo === +data['cliente']['departamento']).length == 0) { this.errors.push("Departamento '" + data['cliente']['departamento'] + "' del Cliente en data.cliente.departamento no encontrado. Valores: " + constante_service_1.default.departamentos.map((a) => a.codigo + '-' + a.descripcion)); } } } } constante_service_1.default.validateDepartamentoDistritoCiudad('data.cliente', +data['cliente']['departamento'], +data['cliente']['distrito'], +data['cliente']['ciudad'], this.errors); if (data['cliente']['telefono']) { if (!(data['cliente']['telefono'].length >= 6 && data['cliente']['telefono'].length <= 15)) { this.errors.push("El valor '" + data['cliente']['telefono'] + "' en data.cliente.telefono debe tener una longitud de 6 a 15 caracteres"); } } if (data['cliente']['celular']) { if (!(data['cliente']['celular'].length >= 10 && data['cliente']['celular'].length <= 20)) { this.errors.push("El valor '" + data['cliente']['celular'] + "' en data.cliente.celular debe tener una longitud de 10 a 20 caracteres"); } } if (data['cliente']['email']) { let email = new String(data['cliente']['email']); //Hace una copia, para no alterar. //Verificar si tiene varios correos. if (email.indexOf(',') > -1) { //Si el Email tiene , (coma) entonces va enviar solo el primer valor, ya que la SET no acepta Comas email = email.split(',')[0].trim(); } //Verificar espacios if (email.indexOf(' ') > -1) { this.errors.push("El valor '" + email + "' en data.cliente.email no puede poseer espacios"); } if (!(email.length >= 3 && email.length <= 80)) { this.errors.push("El valor '" + email + "' en data.cliente.email debe tener una longitud de 3 a 80 caracteres"); } } if (data['cliente']['codigo']) { if (!((data['cliente']['codigo'] + '').length >= 3)) { this.errors.push("El código del Cliente '" + data['cliente']['codigo'] + "' en data.cliente.codigo debe tener al menos 3 caracteres"); } } } generateDatosEspecificosPorTipoDEValidate(params, data) { if (data['tipoDocumento'] === 1) { this.generateDatosEspecificosPorTipoDE_FacturaElectronicaValidate(params, data); } if (data['tipoDocumento'] === 4) { this.generateDatosEspecificosPorTipoDE_AutofacturaValidate(params, data); } if (data['tipoDocumento'] === 5 || data['tipoDocumento'] === 6) { this.generateDatosEspecificosPorTipoDE_NotaCreditoDebitoValidate(params, data); } if (data['tipoDocumento'] === 7) { this.generateDatosEspecificosPorTipoDE_RemisionElectronicaValidate(params, data); } } generateDatosEspecificosPorTipoDE_FacturaElectronicaValidate(params, data) { if (!data['factura']) { this.errors.push('Debe indicar los datos especificos de la Factura en data.factura'); return; // Termina el metodos } if (constante_service_1.default.indicadoresPresencias.filter((um) => um.codigo === data['factura']['presencia']).length == 0) { this.errors.push("Indicador de Presencia '" + data['factura']['presencia'] + "' en data.factura.presencia no encontrado. Valores: " + constante_service_1.default.indicadoresPresencias.map((a) => a.codigo + '-' + a.descripcion)); } if (data['factura']['fechaEnvio']) { let fechaFactura = new Date(data['fecha']); let fechaEnvio = new Date(data['factura']['fechaEnvio']); if (fechaFactura.getTime() > fechaEnvio.getTime()) { this.errors.push("La Fecha de envío '" + data['factura']['fechaEnvio'] + "'en data.factura.fechaEnvio, debe ser despues de la fecha de Factura"); } } if (data['cliente']['tipoOperacion'] === 3) { this.generateDatosEspecificosPorTipoDE_ComprasPublicasValidate(params, data); } } /** * Datos especificos cuando el tipo de operacion del receptor es B2G (Campo D202) * Dentro de la factura electronica * * @param params * @param data * @param options */ generateDatosEspecificosPorTipoDE_ComprasPublicasValidate(params, data) { if (!(data['dncp'] && data['dncp']['modalidad'] && data['dncp']['modalidad'].length > 0)) { this.errors.push('Debe informar la modalidad de Contratación DNCP en data.dncp.modalidad'); } if (!(data['dncp'] && data['dncp']['entidad'] && data['dncp']['entidad'].length > 0)) { this.errors.push('Debe informar la entidad de Contratación DNCP en data.dncp.entidad'); } if (!(data['dncp'] && data['dncp']['año'] && data['dncp']['año'].length > 0)) { this.errors.push('Debe informar la año de Contratación DNCP en data.dncp.año'); } if (!(data['dncp'] && data['dncp']['secuencia'] && data['dncp']['secuencia'].length > 0)) { this.errors.push('Debe informar la secuencia de Contratación DNCP en data.dncp.secuencia'); } if (!(data['dncp'] && data['dncp']['fecha'] && data['dncp']['fecha'].length > 0)) { this.errors.push('Debe informar la fecha de emisión de código de Contratación DNCP en data.dncp.fecha'); } } generateDatosEspecificosPorTipoDE_AutofacturaValidate(params, data) { if (!data['autoFactura']) { this.errors.push('Para tipoDocumento = 4 debe proveer los datos de Autofactura en data.autoFactura'); } if (!data['autoFactura']['ubicacion']) { this.errors.push('Para tipoDocumento = 4 debe proveer los datos del Lugar de Transacción de la Autofactura en data.autoFactura.ubicacion'); } if (!data['autoFactura']['tipoVendedor']) { this.errors.push('Debe especificar la Naturaleza del Vendedor en data.autoFactura.tipoVendedor'); } if (!data['autoFactura']['documentoTipo']) { this.errors.push('Debe especificar el Tipo de Documento del Vendedor en data.autoFactura.documentoTipo'); } if (constante_service_1.default.naturalezaVendedorAutofactura.filter((um) => um.codigo === data['autoFactura']['tipoVendedor']).length == 0) { this.errors.push("Tipo de Vendedor '" + data['autoFactura']['tipoVendedor'] + "' en data.autoFactura.tipoVendedor no encontrado. Valores: " + constante_service_1.default.naturalezaVendedorAutofactura.map((a) => a.codigo + '-' + a.descripcion)); } if (constante_service_1.default.tiposDocumentosIdentidades.filter((um) => um.codigo === data['autoFactura']['documentoTipo']).length == 0) { this.errors.push("Tipo de Documento '" + data['autoFactura']['documentoTipo'] + "' en data.autoFactura.documentoTipo no encontrado. Valores: " + constante_service_1.default.tiposDocumentosIdentidades.map((a) => a.codigo + '-' + a.descripcion)); } if (!data['autoFactura']['ubicacion']) { this.errors.push('Debe especificar la ubicación de la transacción en data.autoFactura.ubicacion'); } if (!data['autoFactura']['documentoNumero']) { this.errors.push('Debe especificar el Nro. de Documento del Vendedor en data.autoFactura.documentoNumero'); } if (!data['autoFactura']['nombre']) { this.errors.push('Debe especificar el Nombre del Vendedor en data.autoFactura.nombre'); } if (!data['autoFactura']['direccion']) { this.errors.push('Debe especificar la Dirección del Vendedor en data.autoFactura.direccion'); } if (!data['autoFactura']['numeroCasa']) { this.errors.push('Debe especificar el Número de Casa del Vendedor en data.autoFactura.numeroCasa'); } if (!data['autoFactura']['departamento']) { this.errors.push('Debe especificar el Departamento del Vendedor en data.autoFactura.departamento'); } if (!data['autoFactura']['distrito']) { this.errors.push('Debe especificar el Distrito Vendedor en data.autoFactura.distrito'); } if (!data['autoFactura']['ciudad']) { this.errors.push('Debe especificar la Ciudad del Vendedor en data.autoFactura.ciudad'); } if (!data['autoFactura']['ubicacion']['departamento']) { this.errors.push('Debe especificar el Departamento del Lugar de la Transacción en data.autoFactura.ubicacion.departamento'); } if (!data['autoFactura']['ubicacion']['distrito']) { this.errors.push('Debe especificar el Distrito del Lugar de la Transacciónen data.autoFactura.ubicacion.distrito'); } if (!data['autoFactura']['ubicacion']['ciudad']) { this.errors.push('Debe especificar la Ciudad del Lugar de la Transacción en data.autoFactura.ubicacion.ciudad'); } constante_service_1.default.validateDepartamentoDistritoCiudad('data.autoFactura', +data['autoFactura']['departamento'], +data['autoFactura']['distrito'], +data['autoFactura']['ciudad'], this.errors); constante_service_1.default.validateDepartamentoDistritoCiudad('data.autoFactura.ubicacion', +data['autoFactura']['ubicacion']['departamento'], +data['autoFactura']['ubicacion']['distrito'], +data['autoFactura']['ubicacion']['ciudad'], this.errors); } generateDatosEspecificosPorTipoDE_NotaCreditoDebitoValidate(params, data) { if (!data['notaCreditoDebito']['motivo']) { this.errors.push('Debe completar el motivo para la nota de crédito/débito en data.notaCreditoDebito.motivo'); } if (constante_service_1.default.notasCreditosMotivos.filter((um) => um.codigo === data['notaCreditoDebito']['motivo']) .length == 0) { this.errors.push("Motivo de la Nota de Crédito/Débito '" + data['notaCreditoDebito']['motivo'] + "' en data.notaCreditoDebito.motivo no encontrado. Valores: " + constante_service_1.default.notasCreditosMotivos.map((a) => a.codigo + '-' + a.descripcion)); } } generateDatosEspecificosPorTipoDE_RemisionElectronicaValidate(params, data) { if (!(data['remision'] && data['remision']['motivo'])) { this.errors.push('No fue pasado el Motivo de la Remisión en data.remision.motivo.'); } if (!(data['remision'] && data['remision']['tipoResponsable'])) { this.errors.push('No fue pasado el Tipo de Responsable de la Remisión en data.remision.tipoResponsable.'); } if (constante_service_1.default.remisionesMotivos.filter((um) => um.codigo === data['remision']['motivo']).length == 0) { this.errors.push("Motivo de la Remisión '" + data['remision']['motivo'] + "' en data.remision.motivo no encontrado. Valores: " + constante_service_1.default.remisionesMotivos.map((a) => a.codigo + '-' + a.descripcion)); } if (data['remision'] && data['remision']['motivo'] == 7) { if (data['cliente']['ruc'] != params['ruc']) { this.errors.push('RUC del receptor no coincidente con el RUC del emisor'); } } if (constante_service_1.default.remisionesResponsables.filter((um) => um.codigo === data['remision']['tipoResponsable']) .length == 0) { this.errors.push("Tipo de Responsable '" + data['remision']['tipoResponsable'] + "' en data.remision.tipoResponsable no encontrado. Valores: " + constante_service_1.default.remisionesResponsables.map((a) => a.codigo + '-' + a.descripcion)); } } generateDatosCondicionOperacionDEValidate(params, data) { if (!data['condicion']) { this.errors.push('Debe indicar los datos de la Condición de la Operación en data.condicion'); return; // sale metodo } if (constante_service_1.default.condicionesOperaciones.filter((um) => um.codigo === data['condicion']['tipo']).length == 0) { this.errors.push("Condición de la Operación '" + data['condicion']['tipo'] + "' en data.condicion.tipo no encontrado. Valores: " + constante_service_1.default.condicionesOperaciones.map((a) => a.codigo + '-' + a.descripcion)); } //if (data['condicion']['tipo'] === 1) { this.generateDatosCondicionOperacionDE_ContadoValidate(params, data); //} if (data['condicion']['tipo'] === 2) { this.generateDatosCondicionOperacionDE_CreditoValidate(params, data); } } /** * E7.1. Campos que describen la forma de pago de la operación al contado o del monto * de la entrega inicial (E605-E619) * @param params * @param data * @param options */ generateDatosCondicionOperacionDE_ContadoValidate(params, data) { if (data['condicion']['tipo'] === 1) { if (!(data['condicion']['entregas'] && data['condicion']['entregas'].length > 0)) { this.errors.push('El Tipo de Condición es 1 en data.condicion.tipo pero no se encontraron entregas en data.condicion.entregas'); } } if (data['condicion']['entregas'] && data['condicion']['entregas'].length > 0) { for (let i = 0; i < data['condicion']['entregas'].length; i++) { const dataEntrega = data['condicion']['entregas'][i]; if (constante_service_1.default.condicionesTiposPagos.filter((um) => um.codigo === dataEntrega['tipo']).length == 0) { this.errors.push("Condición de Tipo de Pago '" + dataEntrega['tipo'] + "' en data.condicion.entregas[" + i + '].tipo no encontrado. Valores: ' + constante_service_1.default.condicionesTiposPagos.map((a) => a.codigo + '-' + a.descripcion)); } if (!dataEntrega['moneda']) { this.errors.push('Moneda es obligatorio en data.condicion.entregas[' + i + '].moneda'); } if (constante_service_1.default.monedas.filter((um) => um.codigo === dataEntrega['moneda']).length == 0) { this.errors.push("Moneda '" + dataEntrega['moneda']) + "' data.condicion.entregas[" + i + '].moneda no válido. Valores: ' + constante_service_1.default.monedas.map((a) => a.codigo + '-' + a.descripcion); } //Verificar si el Pago es con Tarjeta de crédito if (dataEntrega['tipo'] === 3 || dataEntrega['tipo'] === 4) { if (!dataEntrega['infoTarjeta']) { this.errors.push('Debe informar sobre la tarjeta en data.condicion.entregas[' + i + '].infoTarjeta si la forma de Pago es a Tarjeta'); } if (constante_service_1.default.condicionesOperaciones.filter((um) => um.codigo === dataEntrega['infoTarjeta']['tipo']).length == 0) { this.errors.push("Tipo de Tarjeta de Crédito '" + dataEntrega['infoTarjeta']['tipo'] + "' en data.condicion.entregas[" + i + '].infoTarjeta.tipo no encontrado. Valores: ' + constante_service_1.default.condicionesOperaciones.map((a) => a.codigo + '-' + a.descripcion)); } if (dataEntrega['infoTarjeta']['ruc'].indexOf('-') == -1) { this.errors.push('Ruc de Proveedor de Tarjeta debe contener digito verificador en data.condicion.entregas[' + i + '].infoTarjeta.ruc'); } if (dataEntrega['infoTarjeta']['codigoAutorizacion']) { if (!((dataEntrega['infoTarjeta']['codigoAutorizacion'] + '').length >= 6 && (dataEntrega['infoTarjeta']['codigoAutorizacion'] + '').length <= 10)) { this.errors.push('El código de Autorización en data.condicion.entregas[' + i + '].infoTarjeta.codigoAutorizacion debe tener de 6 y 10 caracteres'); } } if (dataEntrega['infoTarjeta']['numero']) { if (!((dataEntrega['infoTarjeta']['numero'] + '').length == 4)) { this.errors.push('El código de Autorización en data.condicion.entregas[' + i + '].infoTarjeta.numero debe tener de 4 caracteres'); } } } //Verificar si el Pago es con Cheque if (dataEntrega['tipo'] === 2) { if (!dataEntrega['infoCheque']) { this.errors.push('Debe informar sobre el cheque en data.condicion.entregas[' + i + '].infoCheque si la forma de Pago es 2-Cheques'); } } } } } /** * E7.2. Campos que describen la operación a crédito (E640-E649) * * @param params * @param data * @param options */ generateDatosCondicionOperacionDE_CreditoValidate(params, data) { if (!data['condicion']['credito']['tipo']) { this.errors.push('El tipo de Crédito en data.condicion.credito.tipo es obligatorio si la condición posee créditos'); } if (constante_service_1.default.condicionesCreditosTipos.filter((um) => um.codigo === data['condicion']['credito']['tipo']) .length == 0) { this.errors.push("Tipo de Crédito '" + data['condicion']['credito']['tipo'] + "' en data.condicion.credito.tipo no encontrado. Valores: " + constante_service_1.default.condicionesCreditosTipos.map((a) => a.codigo + '-' + a.descripcion)); } if (+data['condicion']['credito']['tipo'] === 1) { //Plazo if (!data['condicion']['credito']['plazo']) { this.errors.push('El tipo de Crédito en data.condicion.credito.tipo es 1 entonces data.condicion.credito.plazo es obligatorio'); } } if (+data['condicion']['credito']['tipo'] === 2) { //Cuota if (!data['condicion']['credito']['cuotas']) { this.errors.push('El tipo de Crédito en data.condicion.credito.tipo es 2 entonces data.condicion.credito.cuotas es obligatorio'); } } //Recorrer array de infoCuotas e informar en el JSON if (data['condicion']['credito']['tipo'] === 2) { //A Cuotas if (data['condicion']['credito']['infoCuotas'] && data['condicion']['credito']['infoCuotas'].length > 0) { for (let i = 0; i < data['condicion']['credito']['infoCuotas'].length; i++) { const infoCuota = data['condicion']['credito']['infoCuotas'][i]; if (constante_service_1.default.monedas.filter((um) => um.codigo === infoCuota['moneda']).length == 0) { this.errors.push("Moneda '" + infoCuota['moneda'] + "' en data.condicion.credito.infoCuotas[" + i + '].moneda no encontrado. Valores: ' + constante_service_1.default.monedas.map((a) => a.codigo + '-' + a.descripcion)); } } } else { this.errors.push('Debe proporcionar data.condicion.credito.infoCuotas[]'); } } } generateDatosTotalesValidate(params, data) { if (data['moneda'] != 'PYG' && data['condicionTipoCambio'] == 1) { if (!data['cambio']) { this.errors.push('Debe especificar el valor del Cambio en data.cambio cuando moneda != PYG y la Cotización es Global'); } } } /** * H. Campos que identifican al documento asociado (H001-H049) * * @param params * @param data * @param options */ generateDatosDocumentoAsociadoValidate(params, data) { if (data['tipoTransaccion'] == 11 && !data['documentoAsociado']['resolucionCreditoFiscal']) { this.errors.push('Obligatorio informar data.documentoAsociado.resolucionCreditoFiscal'); } //Validaciones if (constante_service_1.default.tiposDocumentosAsociados.filter((um) => um.codigo === data['documentoAsociado']['formato']) .length == 0) { this.errors.push("Formato de Documento Asociado '" + data['documentoAsociado']['formato'] + "' en data.documentoAsociado.formato no encontrado. Valores: " + constante_service_1.default.tiposDocumentosAsociados.map((a) => a.codigo + '-' + a.descripcion)); } if (data['documentoAsociado']['tipo'] == 2) { if (constante_service_1.default.tiposDocumentosImpresos.filter((um) => um.codigo === data['documentoAsociado']['tipoDocumentoImpreso']).length == 0) { this.errors.push("Tipo de Documento impreso '" + data['documentoAsociado']['tipoDocumentoImpreso'] + "' en data.documentoAsociado.tipoDocumentoImpreso no encontrado. Valores: " + constante_service_1.default.tiposDocumentosImpresos.map((a) => a.codigo + '-' + a.descripcion)); } } if (data['documentoAsociado']['formato'] == 1) { //H002 = Electronico if (!(data['documentoAsociado']['cdc'] && data['documentoAsociado']['cdc'].length >= 44)) { this.errors.push('Debe indicar el CDC asociado en data.documentoAsociado.cdc'); } } if (data['documentoAsociado']['formato'] == 2) { //H002 = Impreso if (!data['documentoAsociado']['timbrado']) { this.errors.push('Debe especificar el Timbrado del Documento impreso Asociado en data.documentoAsociado.timbrado'); } if (!data['documentoAsociado']['establecimiento']) { this.errors.push('Debe especificar el Establecimiento del Documento impreso Asociado en data.documentoAsociado.establecimiento'); } if (!data['documentoAsociado']['punto']) { this.errors.push('Debe especificar el Punto del Documento impreso Asociado en data.documentoAsociado.punto'); } if (!data['documentoAsociado']['numero']) { this.errors.push('Debe especificar el Número del Documento impreso Asociado en data.documentoAsociado.numero'); } if (!data['documentoAsociado']['tipoDocumentoImpreso']) { this.errors.push('Debe especificar el Tipo del Documento Impreso Asociado en data.documentoAsociado.tipoDocumentoImpreso'); } if (data['documentoAsociado']['fecha']) { if ((data['documentoAsociado']['fecha'] + '').length != 10) { this.errors.push('La Fecha del Documento impreso Asociado en data.documentoAsociado.fecha debe tener una longitud de 10 caracteres'); } } else { this.errors.push('Debe especificar la Fecha del Documento impreso Asociado en data.documentoAsociado.fecha'); } } if (data['documentoAsociado']['formato'] == 3) { //H002 = Constancia electronica if (data['documentoAsociado']['constanciaTipo']) { if (constante_service_1.default.tiposConstancias.filter((um) => um.codigo === data['documentoAsociado']['constanciaTipo']) .length == 0) { this.errors.push("Tipo de Constancia '" + data['documentoAsociado']['constanciaTipo'] + "' en data.documentoAsociado.constanciaTipo no encontrado. Valores: " + constante_service_1.default.tiposConstancias.map((a) => a.codigo + '-' + a.descripcion)); } } } } } exports.default = new JSonDeMainValidateService(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaWJvWG1sTWFpblZhbGlkYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcmVjaWJvWG1sTWFpblZhbGlkYXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4RUFBcUQ7QUFDckQsNEVBQW1EO0FBQ25ELDRFQUFtRDtBQUduRCxNQUFNLHlCQUF5QjtJQUc3QjtRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksY0FBYyxDQUFDLE1BQVcsRUFBRSxJQUFTLEVBQUUsTUFBb0I7UUFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBRWxDLElBQUksMkJBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3BHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDN0QsOENBQThDO2dCQUM5QywyQkFBZ0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDL0U7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFdBQVcsRUFBRTtZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1NBQzVFO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxXQUFXLEVBQUU7Z0JBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLDhGQUE4RixDQUMvRixDQUFDO2FBQ0g7WUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLFdBQVcsRUFBRTtnQkFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsOEZBQThGLENBQy9GLENBQUM7YUFDSDtZQUVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO2dCQUM5RixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ3BFO1NBQ0Y7UUFFRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsOEJBQThCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQ