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
JavaScript
"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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