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

633 lines 66.7 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 constants_service_1 = __importDefault(require("./constants.service")); class JSonReciboValidateService { constructor() { this.errors = new Array(); } /** * Valida los datos ingresados en el data * @param data */ validateValues(params, data, config) { this.errors = new Array(); 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.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['documentoAsociado']) { this.generateDatosDocumentosAsociadosValidate(params, data); } else { if (!data['concepto']) { this.errors.push('Debe especificar el Concepto en data.concepto o especificar los Documentos Asociados'); } } //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'); } //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"); } let moneda = data['moneda']; if (!moneda && defaultValues === true) { moneda = 'PYG'; } if (constants_service_1.default.monedas.filter((um) => um.codigo === moneda).length == 0) { this.errors.push("Moneda '" + moneda + "' en data.moneda no válido. Valores: " + constants_service_1.default.monedas.map((a) => a.codigo + '-' + a.descripcion)); } if (data['condicionAnticipo']) { if (constants_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: " + constants_service_1.default.globalPorItem.map((a) => a.codigo + '-Anticipo ' + 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 (constants_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: " + constants_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']) { if (constants_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: " + constants_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'); } else { 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 (constants_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: " + constants_service_1.default.paises.map((a) => a.codigo + '-' + a.descripcion)); } 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']['ciudad']) { if (constants_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: " + constants_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 = constants_service_1.default.ciudades.filter((ciu) => ciu.codigo === +data['cliente']['ciudad']); let objDistrito = constants_service_1.default.distritos.filter((dis) => dis.codigo === +objCiudad[0]['distrito']); let objDepartamento = constants_service_1.default.distritos.filter((dep) => dep.codigo === +objDistrito[0]['departamento']); data['cliente']['distrito'] = objDistrito[0]['codigo']; data['cliente']['departamento'] = objDepartamento[0]['codigo']; } if (data['cliente']['direccion']) { if (!data['cliente']['distrito']) { this.errors.push('Obligatorio especificar el Distrito en data.cliente.distrito'); } else { if (constants_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: " + constants_service_1.default.distritos.map((a) => a.codigo + '-' + a.descripcion)); } } } if (data['cliente']['direccion']) { if (!data['cliente']['departamento']) { this.errors.push('Obligatorio especificar el Departamento en data.cliente.departamento para Tipo de Documento != 4'); } else { if (constants_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: " + constants_service_1.default.departamentos.map((a) => a.codigo + '-' + a.descripcion)); } } } constants_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"); } } } 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 (data['condicion']) { if (constants_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: " + constants_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 (constants_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: ' + constants_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 (constants_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: ' + constants_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 (constants_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: ' + constants_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 (constants_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: " + constants_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 (constants_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: ' + constants_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'); } } } /** * * @param params * @param data * @param options */ generateDatosDocumentosAsociadosValidate(params, data) { if (data['documentoAsociado']) { if (Array.isArray(data['documentoAsociado'])) { for (let i = 0; i < data['documentoAsociado'].length; i++) { this.generateDatosDocumentoAsociadoValidate(params, data['documentoAsociado'][i], i); } } else { this.generateDatosDocumentoAsociadoValidate(params, data['documentoAsociado'], 0); } } } /** * H. Campos que identifican al documento asociado (H001-H049) * * @param params * @param documentoAsociado * @param options */ generateDatosDocumentoAsociadoValidate(params, documentoAsociado, i) { //Validaciones if (constants_service_1.default.tiposDocumentosAsociados.filter((um) => um.codigo === documentoAsociado['formato']).length == 0) { this.errors.push("Formato de Documento Asociado '" + documentoAsociado['formato'] + "' en data.documentoAsociado[" + i + '].formato no encontrado. Valores: ' + constants_service_1.default.tiposDocumentosAsociados.map((a) => a.codigo + '-' + a.descripcion)); } else { //Si ya tiene formato if (+documentoAsociado['formato'] == 1) { //H002 = Electronico if (documentoAsociado['cdc']) { if (documentoAsociado['cdc'].length != 44) { this.errors.push('El CDC asociado debe tener 44 digitos en data.documentoAsociado[' + i + '].cdc'); } } } if (+documentoAsociado['formato'] == 2) { if (constants_service_1.default.tiposDocumentosImpresos.filter((um) => um.codigo === documentoAsociado['tipoDocumentoImpreso']).length == 0) { this.errors.push("Tipo de Documento impreso '" + documentoAsociado['tipoDocumentoImpreso'] + "' en data.documentoAsociado[" + i + '].tipoDocumentoImpreso no encontrado. Valores: ' + constants_service_1.default.tiposDocumentosImpresos.map((a) => a.codigo + '-' + a.descripcion)); } if (documentoAsociado['timbrado']) { if ((documentoAsociado['timbrado'] + '').length != 8) { this.errors.push('El Timbrado asociado debe tener 8 digitos en data.documentoAsociado[' + i + '].timbrado'); } } else { this.errors.push('Debe especificar el Timbrado asociado en data.documentoAsociado[' + i + '].timbrado'); } if (!documentoAsociado['establecimiento']) { this.errors.push('Debe especificar el Establecimiento asociado en data.documentoAsociado[' + i + '].establecimiento'); } if (!documentoAsociado['punto']) { this.errors.push('Debe especificar el Punto asociado en data.documentoAsociado[' + i + '].punto'); } if (!documentoAsociado['numero']) { this.errors.push('Debe especificar el Numero asociado en data.documentoAsociado[' + i + '].numero'); } if (documentoAsociado['fecha']) { if (documentoAsociado['fecha'].length != 10) { this.errors.push('La Fecha del asociado debe tener 10 digitos en data.documentoAsociado[' + i + '].fecha'); } } else { this.errors.push('Debe especificar La Fecha del asociado en data.documentoAsociado[' + i + '].fecha'); } } } } } exports.default = new JSonReciboValidateService(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSnNvblJlY2lib1ZhbGlkYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvSnNvblJlY2lib1ZhbGlkYXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4RUFBcUQ7QUFDckQsNEVBQW1EO0FBQ25ELDRFQUFtRDtBQUduRCxNQUFNLHlCQUF5QjtJQUc3QjtRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksY0FBYyxDQUFDLE1BQVcsRUFBRSxJQUFTLEVBQUUsTUFBb0I7UUFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBRWxDLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksV0FBVyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdEQUF3RCxDQUFDLENBQUM7U0FDNUU7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNuQixJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLFdBQVcsRUFBRTtnQkFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsOEZBQThGLENBQy9GLENBQUM7YUFDSDtZQUVELElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksV0FBVyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCw4RkFBOEYsQ0FDL0YsQ0FBQzthQUNIO1lBRUQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUU7Z0JB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