diff --git a/facturacion/configJson/configJson.ts b/facturacion/configJson/configJson.ts index 406eef2..2ed856b 100644 --- a/facturacion/configJson/configJson.ts +++ b/facturacion/configJson/configJson.ts @@ -1,17 +1,9 @@ -import * as moment from 'moment'; import { userScheduler } from '../config.private'; import { msFacturacionLog } from '../logger/msFacturacion'; const log = msFacturacionLog.startTrace(); - -import { facturaSumar } from './../facturar/sumar/factura-sumar'; import { facturaRecupero } from './../facturar/recupero-financiero/factura-recupero'; -import { drNiñoSano, drOtoemisiones } from './datos-reportables'; - -import { QuerySumar } from './../facturar/sumar/query-sumar'; import { QueryRecupero, getIdTipoNomencladorSIPS, updateRelPacienteObraSocial } from './../facturar/recupero-financiero/query-recupero'; - import { IDtoFacturacion } from './../interfaces/IDtoFacturacion'; -import { IDtoSumar } from '../interfaces/IDtoSumar'; import { IDtoRecupero } from '../interfaces/IDtoRecupero'; /** @@ -23,69 +15,7 @@ import { IDtoRecupero } from '../interfaces/IDtoRecupero'; * @param {*} datosConfiguracionAutomatica */ export async function exportarFacturacion(pool, dtoFacturacion: IDtoFacturacion) { - let querySumar = new QuerySumar(); - let afiliadoSumar: any = await querySumar.getAfiliadoSumar(pool, dtoFacturacion.paciente.dni); - - let facturacion = { - /* Prestación Otoemisiones */ - /* TODO: poner la expresión que corresponda */ - otoemisiones: { - term: 'otoemisiones', - sumar: (arrayPrestacion, arrayConfiguracion) => { - let dto = { - pool: pool, - dtoFacturacion: dtoFacturacion, - arrayPrestacion: arrayPrestacion, - arrayConfiguracion: arrayConfiguracion, - afiliadoSumar: afiliadoSumar - }; - return drOtoemisiones(dto); - } - }, - - /* Prestación Niño Sano 410621008*/ - /* TODO: poner la expresión que corresponda */ - niño_sano: { - term: 'niño sano', - sumar: async (arrayPrestacion, arrayConfiguracion) => { - let dto = { - pool: pool, - dtoFacturacion: dtoFacturacion, - arrayPrestacion: arrayPrestacion, - arrayConfiguracion: arrayConfiguracion, - afiliadoSumar: afiliadoSumar - }; - return drNiñoSano(dto); - }, - }, - main: async (prestacion: any, tipoFacturacion: String) => { - if (tipoFacturacion === 'recupero') { - let dto: any = { - factura: 'recupero' - }; - - return dto; - } else if (tipoFacturacion === 'sumar') { - const arrayPrestacion = (prestacion.prestacion.datosReportables !== null) ? prestacion.prestacion.datosReportables.map((dr: any) => dr).filter((value) => value !== undefined) : null; - const arrayConfiguracion = (dtoFacturacion.configAutomatica) ? dtoFacturacion.configAutomatica.sumar.datosReportables.map((config: any) => config.valores) : null; - - if (arrayConfiguracion) { - let dto: any = { - factura: 'sumar', - diagnostico: dtoFacturacion.configAutomatica.sumar.diagnostico[0].diagnostico, - datosReportables: await facturacion[dtoFacturacion.configAutomatica.sumar.key_datosreportables].sumar(arrayPrestacion, arrayConfiguracion) - }; - return dto; - } else { - return null; - } - } - } - }; - - let dtoSumar: IDtoSumar; let dtoRecupero: IDtoRecupero; - let tipoFacturacion: String = ''; const fechaTurno = dtoFacturacion.turno.fechaTurno; if (dtoFacturacion.obraSocial.financiador !== 'SUMAR') { /* Paciente tiene OS Se factura por Recupero */ @@ -94,7 +24,7 @@ export async function exportarFacturacion(pool, dtoFacturacion: IDtoFacturacion) const configAutomatica = dtoFacturacion.configAutomatica; if (configAutomatica) { let queryRecupero = new QueryRecupero(); - const idPaciente = await queryRecupero.getIdPacienteSips(pool, dtoFacturacion.paciente.dni); + const idPaciente = await queryRecupero.getIdPacienteSips(pool, dtoFacturacion.paciente.documento); if (idPaciente) { dtoRecupero = { @@ -104,7 +34,7 @@ export async function exportarFacturacion(pool, dtoFacturacion: IDtoFacturacion) codigo: configAutomatica.recuperoFinanciero.codigo, idServicio: configAutomatica.recuperoFinanciero.idServicio, idPaciente, - dniProfesional: dtoFacturacion.profesional.dni, + dniProfesional: dtoFacturacion.profesional.documento, codigoFinanciador: os, idEfector: dtoFacturacion.organizacion.idSips, motivoDeConsulta: dtoFacturacion.motivoConsulta, @@ -125,33 +55,5 @@ export async function exportarFacturacion(pool, dtoFacturacion: IDtoFacturacion) } else { log.error('jsonFacturacion:recupero:sinConfiguracion', { prestacion: dtoFacturacion.prestacion }, 'la prestacion no está configurada', userScheduler); } - } else { - /* Paciente NO TIENE OS se factura por Sumar */ - tipoFacturacion = 'sumar'; - let main = await facturacion.main(dtoFacturacion, tipoFacturacion); - try { - dtoSumar = { - idPrestacion: dtoFacturacion.idPrestacion, - idNomenclador: (dtoFacturacion.configAutomatica) ? dtoFacturacion.configAutomatica.sumar.idNomenclador : null, - fechaTurno, - objectId: dtoFacturacion.turno._id, - cuie: dtoFacturacion.organizacion.cuie, - diagnostico: (main) ? main.diagnostico : null, - dniPaciente: dtoFacturacion.paciente.dni, - profesional: dtoFacturacion.profesional, - claveBeneficiario: afiliadoSumar.clavebeneficiario, - idAfiliado: afiliadoSumar.id_smiafiliados, - edad: moment(new Date()).diff(dtoFacturacion.paciente.fechaNacimiento, 'years'), - sexo: (dtoFacturacion.paciente.sexo === 'masculino') ? 'M' : 'F', - fechaNacimiento: dtoFacturacion.paciente.fechaNacimiento, - anio: moment(dtoFacturacion.paciente.fechaNacimiento).format('YYYY'), - mes: moment(dtoFacturacion.paciente.fechaNacimiento).format('MM'), - dia: moment(dtoFacturacion.paciente.fechaNacimiento).format('DD'), - datosReportables: (main) ? main.datosReportables : null - }; - await facturaSumar(pool, dtoSumar); - } catch (error) { - log.error('jsonFacturacion:sumar:error', { dtoFacturacion, dtoSumar }, error, userScheduler); - } } } diff --git a/facturacion/configJson/datos-reportables.ts b/facturacion/configJson/datos-reportables.ts deleted file mode 100644 index f7d5b24..0000000 --- a/facturacion/configJson/datos-reportables.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { validaDatosReportables } from '../facturar/sumar/factura-sumar'; -import async = require('async'); - - -export async function drOtoemisiones(dto) { - let datoReportable = []; - if ((dto.arrayPrestacion) && (dto.arrayPrestacion.length > 0) && (preCondicionSumar(dto))) { - let dr = { - idDatoReportable: '', - datoReportable: '' - }; - - dto.arrayPrestacion = dto.arrayPrestacion.filter((obj: any) => obj !== null).map((obj: any) => obj); - dto.arrayConfiguracion = dto.arrayConfiguracion.map((ac: any) => ac[0]); - let flagDatosReportables = true; - - dto.arrayPrestacion.forEach((element, index) => { - let oido = dto.arrayConfiguracion.find((obj: any) => obj.conceptId === element.conceptId); - - if (oido) { - let valor = dto.arrayConfiguracion.find((obj: any) => obj.conceptId === element.valor.conceptId); - if (valor) { - dr.datoReportable += oido.valor + valor.valor + '/'; - } else { - flagDatosReportables = false; - } - } - }); - if (flagDatosReportables) { - dr.idDatoReportable = dto.dtoFacturacion.configAutomatica.sumar.datosReportables[0].idDatosReportables; - dr.datoReportable = dr.datoReportable.slice(0, -1); - - datoReportable.push(dr); - - return datoReportable; - } else { - return null; - } - } else { - return null; - } -} - -export async function drNiñoSano(dto) { - let datoReportable = []; - if ((dto.arrayPrestacion) && (dto.arrayPrestacion.length > 0) && (preCondicionSumar(dto))) { - dto.arrayPrestacion = dto.arrayPrestacion.filter((obj: any) => obj !== null).map((obj: any) => obj); - - let ta = ''; - const talla = '2'; - const tensionArterial = '3'; - - await async.forEachOf(dto.arrayPrestacion, async (element: any, cb: any) => { - let dr = { - idDatoReportable: '', - datoReportable: '' - }; - - if (element.idDatoReportable === tensionArterial) { - let taValida = await validaTA(element); - if (taValida) { - if (element.valor.toString().length < 3) { - element.valor = 0 + element.valor.toString(); - - } - ta += element.valor + '/'; - - dr.idDatoReportable = element.idDatoReportable; - dr.datoReportable = ta; - } else { - datoReportable = null; - } - } else if (element.idDatoReportable === talla) { - dr.idDatoReportable = element.idDatoReportable; - dr.datoReportable = Math.round(element.valor).toString(); - } else { - dr.idDatoReportable = element.idDatoReportable; - dr.datoReportable = element.valor; - } - - if (datoReportable) { - datoReportable.push(dr); - } - }); - - if ((datoReportable && datoReportable[2]) && (datoReportable[2].idDatoReportable === tensionArterial)) { - datoReportable.splice(2, 1); - datoReportable[2].datoReportable = datoReportable[2].datoReportable.slice(0, -1); - } - - return datoReportable; - } else { - return null; - } -} - -function validaTA(tArterial) { - let valida = false; - const tsSistolica = '271649006'; - const taDiastolica = '271650006'; - if ((tArterial.conceptId === tsSistolica) && (tArterial.valor >= 50) && (tArterial.valor <= 300)) { - valida = true; - } - - if ((tArterial.conceptId === taDiastolica) && (tArterial.valor >= 40) && (tArterial.valor <= 150)) { - valida = true; - } - return (valida); -} - -function preCondicionSumar(dto) { - let valido = false; - let esAfiliado = (dto.afiliadoSumar) ? true : false; - - let niñoSano = true; /* Se valida que si la prestación es niño sano se pueda facturar si fue validada por un médico*/ - if ((dto.configAutomatica) && (dto.configAutomatica.sumar.key_datosreportables === 'niño_sano')) { - if (dto.profesional.formacionGrado !== 'medico') { - niñoSano = false; - } - } - - let datosReportables = (dto.dtoFacturacion.prestacion.datosReportables) ? validaDatosReportables(dto.dtoFacturacion) : true; - - let conditionsArray = [ - esAfiliado, - niñoSano, - datosReportables - ]; - - if (conditionsArray.indexOf(false) === -1) { - valido = true; - } - - return valido; -} \ No newline at end of file diff --git a/facturacion/facturar/dto-facturacion.ts b/facturacion/facturar/dto-facturacion.ts index ff29ae8..dd8cffa 100644 --- a/facturacion/facturar/dto-facturacion.ts +++ b/facturacion/facturar/dto-facturacion.ts @@ -1,228 +1,49 @@ import { getOrganizacion } from './../services/organizacion.service'; import { getProfesional } from './../services/profesional.service'; -import { getSnomed } from './../services/snomed.service'; -import { getPrestacion } from './../services/prestaciones.service'; -import { getConfigAutomatica } from './../services/config-factAutomatica.service'; - - -function facturacionAutomatica(datosFactura: any) { - let factura = {}; - let facturaArray = []; - - for (let x = 0; x < datosFactura.length; x++) { - factura = { - turno: { - _id: datosFactura[x].idTurno, - fechaTurno: datosFactura[x].fechaPrestacion, - }, - idPrestacion: datosFactura[x].idPrestacion, - motivoConsulta: datosFactura[x].motivoDeConsulta, - paciente: { - nombre: datosFactura[x].paciente.nombre, - apellido: datosFactura[x].paciente.apellido, - dni: datosFactura[x].paciente.documento, - fechaNacimiento: datosFactura[x].paciente.fechaNacimiento, - sexo: datosFactura[x].paciente.sexo - }, - prestacion: { - conceptId: datosFactura[x].prestacion.conceptId, - term: datosFactura[x].prestacion.term, - fsn: datosFactura[x].prestacion.fsn, - datosReportables: (datosFactura[x].datosReportables) ? datosFactura[x].datosReportables : null, - }, - organizacion: { - nombre: datosFactura[x].organizacion.nombre, - cuie: datosFactura[x].organizacion.cuie, - idSips: datosFactura[x].organizacion.idSips - }, - obraSocial: datosFactura[x].obraSocial, - profesional: (datosFactura[x].profesional) ? { - nombre: datosFactura[x].profesional.nombre, - apellido: datosFactura[x].profesional.apellido, - dni: datosFactura[x].profesional.dni, - formacionGrado: (datosFactura[x].profesional.formacionGrado.length > 0) ? datosFactura[x].profesional.formacionGrado.find(f => f.profesion.nombre).profesion.nombre.toLowerCase() : null - } : null, - configAutomatica: datosFactura[x].configAutomatica - }; - facturaArray.push(factura); - } - return facturaArray; -} - -export async function facturaBuscador(prestacion: any) { - let datos: any = await getDatos(prestacion); - let dtoDatos = {}; - let dtoDatosArray = []; - - let z = (datos[3]) ? datos[3].ejecucion.registros.length : 1; - for (let x = 0; x < z; x++) { - - let idPrestacionEjecutada = (datos[3]) ? datos[3].ejecucion.registros[x].concepto.conceptId : null; - let idPrestacionTurneable = (datos[3]) ? datos[3].solicitud.tipoPrestacion.conceptId : null; - let configAuto: any = await getConfigAutomatica(idPrestacionTurneable, idPrestacionEjecutada); - - dtoDatos = { - idTurno: (prestacion.turno && prestacion.turno._id) ? prestacion.turno._id : prestacion.idPrestacion, - idPrestacion: prestacion.idPrestacion, - fechaPrestacion: (prestacion.turno && prestacion.turno.horainicio) ? prestacion.turno.horaInicio : prestacion.fecha, - organizacion: datos[0].organizacion, - obraSocial: (datos[1]) ? (datos[1]) : null, - profesional: (datos[2]) ? datos[2].profesional : null, - paciente: prestacion.paciente, - prestacion: prestacion.tipoPrestacion, - configAutomatica: configAuto, - datosReportables: (datos[3]) ? await getDatosReportables(datos[3], configAuto) : null - }; - - dtoDatosArray.push(dtoDatos); - } - return await facturacionAutomatica(dtoDatosArray); -} +import { getConfigAutomatica } from '../../facturacion/services/prestaciones.service'; export async function facturaTurno(prestacion: any) { - let datos: any = await getDatos(prestacion); - let configAuto: any = await getConfigAutomatica(prestacion.tipoPrestacion.conceptId, null); + const organizacion = await getOrganizacion(prestacion.organizacion._id); + const profesional: any = await getProfesionalPrestacion(prestacion); + const obraSocial = getObraSocial(prestacion); let fechaPrestacion = prestacion.fecha || prestacion.horaInicio; if (prestacion.turno && prestacion.turno.horaInicio) { fechaPrestacion = prestacion.turno.horaInicio; } + const turno = { + _id: prestacion.id || prestacion._id || prestacion.idPrestacion, + fechaTurno: fechaPrestacion, + }; + let configAuto: any = await getConfigAutomatica(prestacion.tipoPrestacion.conceptId, null); let dtoDatos = [{ - idTurno: prestacion.id || prestacion._id || prestacion.idPrestacion, + turno, idPrestacion: prestacion.idPrestacion || prestacion.id, - fechaPrestacion, - organizacion: datos[0].organizacion, - obraSocial: (datos[1]) ? (datos[1]) : null, - profesional: datos[2].profesional, + organizacion, + obraSocial, + profesional, paciente: prestacion.paciente, prestacion: prestacion.tipoPrestacion, - motivoDeConsulta: (prestacion.motivoConsulta) ? prestacion.motivoConsulta : '', + motivoConsulta: (prestacion.motivoConsulta) ? prestacion.motivoConsulta : '', configAutomatica: configAuto, - datosReportables: null }]; - return facturacionAutomatica(dtoDatos); -} - -export async function facturaRup(prestacion: any) { - let datos: any = await getDatos(prestacion); - let configAuto: any = await getConfigAutomatica(prestacion.tipoPrestacion.conceptId, null); - - let dtoDatos = { - idTurno: prestacion.data.solicitud.turno, - organizacion: datos[0].organizacion, - obraSocial: (datos[1]) ? (datos[1]) : null, - profesional: datos[2].profesional, - paciente: prestacion.data.paciente, - prestacion: prestacion.data.solicitud.tipoPrestacion, - configAutomatica: configAuto, - datosReportables: datos[3] - }; - return dtoDatos; } -async function getDatos(prestacion) { - let _datosOrganizacion: any = getOrganizacion(prestacion.organizacion._id); - let _obraSocialPaciente: any = (prestacion.paciente.obraSocial) ? (prestacion.paciente.obraSocial) : null; - if (prestacion.obraSocial === 'prepaga' && prestacion.prepaga) { - _obraSocialPaciente = prestacion.prepaga; - } - let _datosProfesional: any = (prestacion.profesionales.length > 0) ? (prestacion.profesionales[0]._id) ? getProfesional(prestacion.profesionales[0]._id) : getProfesional(prestacion.profesionales[0].id) : null; - let _getDR = (prestacion.idPrestacion) ? getPrestacion(prestacion.idPrestacion) : null; - - return await Promise.all([_datosOrganizacion, _obraSocialPaciente, _datosProfesional, _getDR]); -} - -async function getDatosReportables(prestacion: any, configAuto: any) { - if (prestacion.solicitud) { - if ((configAuto) && (configAuto.sumar)) { - if (configAuto.sumar.datosReportables.length > 0) { - let conceptos: any = []; - const expresionesDR = configAuto.sumar.datosReportables.map((config: any) => config); - - let promises = expresionesDR.map(async (exp, index) => { - let docs: any = await getSnomed(exp.valores[0].expresion); - - conceptos = docs.map((item: any) => { - return { - fsn: item.fsn, - term: item.term, - conceptId: item.conceptId, - semanticTag: item.semanticTag - }; - }); - - // ejecutamos busqueda recursiva - let data: any = await buscarEnHudsFacturacion(prestacion, conceptos); - - if (data.length > 0) { - let datoReportable = { - idDatoReportable: exp.idDatosReportables, - conceptId: data[0].registro.concepto.conceptId, - term: data[0].registro.concepto.term, - valor: (!data[0].registro.valor) ? null : (data[0].registro.valor.concepto) ? { - conceptId: (data[0].registro.valor.concepto) ? data[0].registro.valor.concepto.conceptId : data[0].registro.valor, - nombre: (data[0].registro.valor.concepto) ? data[0].registro.valor.concepto.term : data[0].registro.concepto.term - } : data[0].registro.valor - }; - - return datoReportable; - } else { - return null; - } - }); - - return await Promise.all(promises).then((results) => { - return results; - }); - } else { - return null; - } - } else { - return null; - } - +async function getProfesionalPrestacion(prestacion) { + if (prestacion.profesionales.length) { + let profesional = prestacion.profesionales[0]; + const profesionalId = profesional._id || profesional.id; + profesional = await getProfesional(profesionalId); + profesional.formacionGrado = profesional.formacionGrado.length ? profesional.formacionGrado.find(f => f.profesion.nombre).profesion.nombre.toLowerCase() : null; + return profesional; } return null; } -function buscarEnHudsFacturacion(prestacion, conceptos) { - return new Promise(async (resolve, reject) => { - let data = []; - - prestacion.ejecucion.registros.forEach(async registro => { - // verificamos si el registro de la prestacion tiene alguno de - // los conceptos en su array de registros - let resultado = await matchConceptsFacturacion(registro, conceptos); - - if (resultado) { - // agregamos el resultado a a devolver - data.push({ - registro: resultado - }); - } - }); - resolve(data); - }); -} - -function matchConceptsFacturacion(registro, conceptos) { - // almacenamos la variable de matcheo para devolver el resultado - let match = false; - - // Si no es un array entra - if (!Array.isArray(registro['registros']) || registro['registros'].length <= 0) { - // verificamos que el concepto coincida con alguno de los elementos enviados en los conceptos - if (registro.concepto && registro.concepto.conceptId && conceptos.find(c => c.conceptId === registro.concepto.conceptId)) { - match = registro; - } - - } else { - registro['registros'].forEach((reg: any) => { - let encontrado = null; - if (encontrado = matchConceptsFacturacion(reg, conceptos)) { - match = encontrado; - } - }); +function getObraSocial(prestacion) { + let obraSocial = prestacion.paciente.obraSocial; + if (prestacion.obraSocial === 'prepaga' && prestacion.prepaga) { + obraSocial = prestacion.prepaga; } - return match; -} + return obraSocial; +} \ No newline at end of file diff --git a/facturacion/facturar/recupero-financiero/factura-recupero.ts b/facturacion/facturar/recupero-financiero/factura-recupero.ts index 91e22eb..3142a49 100644 --- a/facturacion/facturar/recupero-financiero/factura-recupero.ts +++ b/facturacion/facturar/recupero-financiero/factura-recupero.ts @@ -17,9 +17,9 @@ let queryRecupero = new QueryRecupero(); * @param {*} datosConfiguracionAutomatica */ export async function facturaRecupero(pool, dtoRecupero: IDtoRecupero) { - let existeOrden = await validaOrden(pool, dtoRecupero); + const idOrden = await queryRecupero.getIdOrdenDePrestacion(pool, dtoRecupero.objectId); - if (!existeOrden) { + if (!idOrden) { const transaction = new sql.Transaction(pool); await transaction.begin(); const request = await new sql.Request(transaction); @@ -80,16 +80,3 @@ export async function facturaRecupero(pool, dtoRecupero: IDtoRecupero) { } } } - -/* Valida si la orden de prestación ya fue creada en la BD de Recupero Finanicero */ -async function validaOrden(pool: any, dtoRecupero: IDtoRecupero): Promise { - let existe = false; - - let orden = await queryRecupero.getOrdenDePrestacion(pool, dtoRecupero); - - if (orden > 0) { - existe = true; - } - - return existe; -} diff --git a/facturacion/facturar/recupero-financiero/query-recupero.ts b/facturacion/facturar/recupero-financiero/query-recupero.ts index 0bb9223..788e407 100644 --- a/facturacion/facturar/recupero-financiero/query-recupero.ts +++ b/facturacion/facturar/recupero-financiero/query-recupero.ts @@ -69,14 +69,16 @@ export class QueryRecupero { } } - async getOrdenDePrestacion(pool: any, dtoRecupero: IDtoRecupero) { - const query = 'SELECT TOP 1 * FROM dbo.FAC_Orden WHERE objectId = @objectId'; + async getIdOrdenDePrestacion(pool: any, objectId) { + const query = 'SELECT TOP 1 idOrden FROM dbo.FAC_Orden WHERE objectId = @objectId'; try { const resultado = await new sql.Request(pool) - .input('objectId', sql.VarChar(100), dtoRecupero.objectId) + .input('objectId', sql.VarChar(100), objectId) .query(query); - - return resultado.recordset.length; + if (resultado.recordset[0]) { + return resultado.recordset[0].idOrden; + } + return null; } catch (error) { log.error('query-recupero:getOrdenDePrestacion', { query }, error, userScheduler); return null; @@ -149,7 +151,7 @@ export class QueryRecupero { .input('fecha', sql.DateTime, new Date(dtoOrden.fecha)) .input('fechaPractica', sql.DateTime, new Date(dtoOrden.fechaPractica)) .input('idTipoPractica', sql.Int, dtoOrden.idTipoPractica) - .input('observaciones', sql.VarChar(500), dtoOrden.motivoConsulta) + .input('observaciones', sql.VarChar(500), dtoOrden.motivoConsulta || '') .input('idObraSocial', sql.Int, dtoOrden.idObraSocial) .input('idUsuarioRegistro', sql.Int, dtoOrden.idUsuarioRegistro) .input('fechaRegistro', sql.DateTime, new Date(dtoOrden.fechaRegistro)) diff --git a/facturacion/facturar/sumar/factura-sumar.ts b/facturacion/facturar/sumar/factura-sumar.ts index 8941d50..26b70e1 100644 --- a/facturacion/facturar/sumar/factura-sumar.ts +++ b/facturacion/facturar/sumar/factura-sumar.ts @@ -1,164 +1,135 @@ -import * as sql from 'mssql'; -import { QuerySumar } from './query-sumar'; -import { IDtoFacturacion } from './../../interfaces/IDtoFacturacion'; -import { IDtoSumar } from './../../interfaces/IDtoSumar'; -import moment = require('moment'); -import 'moment/locale/es'; -import { updateEstadoFacturacionSinTurno, updateEstadoFacturacionConTurno, getDatosTurno } from '../../services/prestaciones.service'; - -import { userScheduler } from './../../config.private'; -import { msFacturacionLog } from './../../logger/msFacturacion'; +import { userScheduler } from '../../config.private'; +import { getAfiliadoSumar, getComprobante, getNomencladorSumar, getPrestacionSips, insertComprobante, saveDatosReportablesSumar, savePrestacionSumar } from '../../facturar/sumar/query-sumar'; +import { getDatosReportables, getDatosTurno, getPrestacion, updateEstadoFacturacionConTurno, updateEstadoFacturacionSinTurno } from '../../services/prestaciones.service'; +import { msFacturacionLog } from '../../logger/msFacturacion'; +import { getOrganizacion } from '../../services/organizacion.service'; const log = msFacturacionLog.startTrace(); +const sql = require('mssql'); -let querySumar = new QuerySumar(); - -/** - * - * - * @export - * @param {*} pool - * @param {IDtoSumar} dtoSumar - * @param {*} datosConfiguracionAutomatica - */ -export async function facturaSumar(pool: any, dtoSumar: IDtoSumar) { +export async function facturacionSumar(pool, data) { + let estado = 'Sin Comprobante'; const transaction = new sql.Transaction(pool); - let _estado = 'Sin Comprobante'; - let dtoComprobante, prestacion, datosReportables, estadoFacturacion; + await transaction.begin(); try { - await transaction.begin(); const request = await new sql.Request(transaction); + const objectId = data.turno?._id ? data.turno._id : data.idPrestacion; + const fechaPrestacion = data.turno?.horainicio ? data.turno.horaInicio : data.fecha; + const organizacion: any = await getOrganizacion(data.organizacion._id); + const cuie = organizacion.codigo.cuie; + const afiliadoSumar: any = await getAfiliadoSumar(pool, data.paciente.documento); - let idComprobante = await validaComprobante(pool, dtoSumar); + let idComprobante = await getComprobante(pool, objectId); if (!idComprobante) { - _estado = 'Comprobante sin prestacion'; - - dtoComprobante = { - cuie: dtoSumar.cuie, - fechaComprobante: moment(dtoSumar.fechaTurno).format('MM/DD/YYYY'), - claveBeneficiario: dtoSumar.claveBeneficiario, - idAfiliado: dtoSumar.idAfiliado, - fechaCarga: new Date(), - comentario: 'Carga Automática', - periodo: moment(dtoSumar.fechaTurno, 'YYYY/MM/DD').format('YYYY') + '/' + moment(dtoSumar.fechaTurno, 'YYYY/MM/DD').format('MM'), - activo: 'S', - idTipoPrestacion: 1, - objectId: dtoSumar.objectId - }; - - idComprobante = await querySumar.saveComprobanteSumar(request, dtoComprobante); + estado = 'Comprobante sin prestacion'; + idComprobante = await insertComprobante(request, cuie, fechaPrestacion, afiliadoSumar, objectId); } - if (dtoSumar.datosReportables) { - let existePrestacion = await validaPrestacion(pool, dtoSumar); - - if (!existePrestacion) { - let precioPrestacion: any = await querySumar.getNomencladorSumar(pool, dtoSumar.idNomenclador); - - moment.locale('es'); - prestacion = { - idComprobante, - idNomenclador: dtoSumar.idNomenclador, - cantidad: 1, - precioPrestacion: precioPrestacion.precio, - idAnexo: 301, - peso: 0, - tensionArterial: '00/00', - diagnostico: dtoSumar.diagnostico, - edad: dtoSumar.edad, - sexo: dtoSumar.sexo, - fechaNacimiento: dtoSumar.fechaNacimiento, - fechaPrestacion: moment(dtoSumar.fechaTurno).format('MM/DD/YYYY'), - anio: dtoSumar.anio, - mes: dtoSumar.mes, - dia: dtoSumar.dia, - objectId: dtoSumar.objectId - }; - - let newIdPrestacion = await querySumar.savePrestacionSumar(request, prestacion); - - for (let x = 0; x < dtoSumar.datosReportables.length; x++) { - let datosReportables = { - idPrestacion: newIdPrestacion, - idDatoReportable: dtoSumar.datosReportables[x].idDatoReportable, - valor: dtoSumar.datosReportables[x].datoReportable - }; - - await querySumar.saveDatosReportablesSumar(request, datosReportables); - } - _estado = 'Comprobante con prestacion'; + const prestacion: any = await getPrestacion(data.idPrestacion); + const configuracionFacturacion = await getDatosReportables(prestacion); + if (configuracionFacturacion?.length) { + + const configuracionSumar = configuracionFacturacion[0].sumar; + const idNomenclador = configuracionSumar.idNomenclador; + const diagnostico = configuracionSumar.diagnostico.diagnostico; + let idPrestacion = await getPrestacionSips(pool, fechaPrestacion, afiliadoSumar.id_smiafiliados, idNomenclador); + if (!idPrestacion) { + let precioPrestacion: any = (await getNomencladorSumar(request, idNomenclador)).precio; + idPrestacion = await savePrestacionSumar(request, data.paciente, diagnostico, idComprobante, idNomenclador, precioPrestacion, fechaPrestacion, objectId); + + await saveDatosReportables(request, configuracionSumar, prestacion, idPrestacion); + estado = 'Comprobante con prestacion'; } } await transaction.commit(); - - let turno: any; - if (dtoSumar.objectId) { - turno = await getDatosTurno(dtoSumar.objectId); - } - - estadoFacturacion = { - tipo: 'sumar', - numeroComprobante: idComprobante, - estado: _estado - }; - - if (!turno) { - updateEstadoFacturacionSinTurno(dtoSumar.idPrestacion, estadoFacturacion); - } else { - let idTurno = dtoSumar.objectId; - let idAgenda = turno.idAgenda; - let idBloque = turno.idBloque; - - updateEstadoFacturacionConTurno(idAgenda, idBloque, idTurno, estadoFacturacion); - } + await updateEstadoFacturacion(objectId, data.idPrestacion, idComprobante, estado); } catch (e) { transaction.rollback(error => { - log.error('facturaSumar:rollback crear comprobante sumar', { dtoComprobante, prestacion, datosReportables, estadoFacturacion }, e, userScheduler); + log.error('facturaSumar:rollback crear comprobante sumar', { data }, error, userScheduler); }); } } -/* Valida que los datos reportables cargados en RUP sean los mismos que están en la colección configFacturacionAutomatica */ -export function validaDatosReportables(dtoFacturacion: IDtoFacturacion) { - if (dtoFacturacion.prestacion.datosReportables) { - let drPrestacion: any = dtoFacturacion.prestacion.datosReportables.filter((obj: any) => obj !== null).map(obj => obj); - let drConfigAutomatica: any = dtoFacturacion.configAutomatica.sumar.datosReportables.map(obj => obj); - let valida = true; +async function updateEstadoFacturacion(objectId, idPrestacion, idComprobante, estado) { + let turno: any; + if (objectId) { + turno = await getDatosTurno(objectId); + } - for (let x = 0; x < drConfigAutomatica.length; x++) { - for (let z = 0; z < drPrestacion.length; z++) { - if (drConfigAutomatica[x].valores[0].conceptId === drPrestacion[z].conceptId) { - if (!drPrestacion[z].valor) { - valida = false; - } - } - } - } - return valida; + const estadoFacturacion = { + tipo: 'sumar', + numeroComprobante: idComprobante, + estado + }; + + if (!turno) { + updateEstadoFacturacionSinTurno(idPrestacion, estadoFacturacion); } else { - return false; + updateEstadoFacturacionConTurno(turno.idAgenda, turno.idBloque, turno.id, estadoFacturacion); } } -/* Valida si el comprobante ya fue creado en la BD de SUMAR */ -async function validaComprobante(pool: any, dtoSumar: IDtoSumar): Promise { - let idComprobante: any = await querySumar.getComprobante(pool, dtoSumar); - - if (idComprobante) { - return idComprobante; - } else { - return null; +async function saveDatosReportables(request, configuracionSumar, prestacion, idPrestacion) { + let { datosReportables } = configuracionSumar; + datosReportables = validar(datosReportables, prestacion.ejecucion.registros) + for (const dato of datosReportables) { + let reportable; + if (dato.fx && dato.fx.type === 'reduce') { + reportable = dato.fx.concepts.reduce((acc,e,i) => { + let reg = prestacion.ejecucion.registros.find(r => r.concepto.conceptId === Object.keys(e)[0]); + return `${acc}${Object.values(e)[0]}${dato.fx.values[reg.valor.id]}${dato.fx.concepts[i+1]?dato.fx.separator:''}`; + }, '') + } else { + reportable = searchRegister(prestacion.ejecucion.registros, dato.conceptId)?.valor; + } + await saveDatosReportablesSumar(request, idPrestacion, dato.idDatoReportable, reportable); } } -/* Valida si la prestación ya fue creada en la BD de SUMAR desde ANDES */ -async function validaPrestacion(pool: any, dtoSumar: IDtoSumar): Promise { - let idPrestacion: any = await querySumar.getPrestacionSips(pool, dtoSumar); +function validar(datosReportables, registros) { + let datosValidados = [...datosReportables]; + + for (const dato of datosReportables) { + if (dato.validations) { + let valid = true; + const reg = searchRegister(registros, dato.conceptId); + for (const key of Object.keys(dato.validations)) { + const validationValue = dato.validations[key]; + switch (key) { + case 'concepts': + valid = validationValue.includes(reg.valor.concept.conceptId); + break; + case 'lte': + valid = reg.valor !== null && reg.valor !== undefined && reg.valor <= validationValue; + break; + case 'gte': + valid = reg.valor !== null && reg.valor !== undefined && reg.valor >= validationValue; + break; + } - if (idPrestacion) { - return idPrestacion; - } else { - return null; + if (!valid) { + datosValidados.slice(datosValidados.indexOf(dato), 1); + } + } + } } + return datosValidados; } + +function searchRegister(regs, conceptId) { + let found = null; + let i = 0; + + while (!found && i < regs.length) { + let reg = regs[i]; + if (reg.concepto.conceptId === conceptId) { + found = reg; + } else if (reg.registros.length) { + found = searchRegister(reg.registros, conceptId); + } + i++; + } + + return found; +}; diff --git a/facturacion/facturar/sumar/query-sumar.ts b/facturacion/facturar/sumar/query-sumar.ts index 25bcbc5..cd35184 100644 --- a/facturacion/facturar/sumar/query-sumar.ts +++ b/facturacion/facturar/sumar/query-sumar.ts @@ -7,176 +7,157 @@ import { userScheduler } from '../../config.private'; const log = msFacturacionLog.startTrace(); -export class QuerySumar { - - /** - * - * - * @param {*} transaction - * @param {*} dtoComprobante - * @returns - * @memberof QuerySumar - */ - async saveComprobanteSumar(request: any, dtoComprobante: any) { +export async function getComprobante(pool, objectId) { + const query = 'SELECT id_comprobante FROM dbo.PN_comprobante WHERE objectId = @objectId'; + try { + const result = await new sql.Request(pool) + .input('objectId', sql.VarChar(100), objectId) + .query(query); + + return result.recordset.length ? result.recordset[0].id_comprobante : null; + } catch (err) { + log.error('query-sumar:getComprobante', { objectId, query }, err, userScheduler); + return null; + } +} + +export async function insertComprobante(request, cuie, fechaComprobante, afiliadoSumar, objectId) { + try { + const periodo = moment(fechaComprobante, 'YYYY/MM/DD').format('YYYY') + '/' + moment(fechaComprobante, 'YYYY/MM/DD').format('MM'); const query = 'INSERT INTO dbo.PN_comprobante (cuie, id_factura, nombre_medico, fecha_comprobante, clavebeneficiario, id_smiafiliados, fecha_carga, comentario, marca, periodo, activo, idTipoDePrestacion,objectId,factAutomatico) ' + - ' values (@cuie, NULL, NULL, @fechaComprobante, @claveBeneficiario, @idAfiliado, @fechaCarga, @comentario, @marca, @periodo, @activo, @idTipoPrestacion, @objectId, @factAutomatico)' + + ' values (@cuie, NULL, NULL, @fechaComprobante, @clavebeneficiario, @id_smiafiliados, @fecha_carga, @comentario, @marca, @periodo, @activo, @idTipoPrestacion, @objectId, @factAutomatico)' + ' SELECT SCOPE_IDENTITY() AS id'; - try { - const result = await request - .input('cuie', sql.VarChar(10), dtoComprobante.cuie) - .input('fechaComprobante', sql.DateTime, new Date(dtoComprobante.fechaComprobante)) - .input('claveBeneficiario', sql.VarChar(50), dtoComprobante.claveBeneficiario) - .input('idAfiliado', sql.Int, dtoComprobante.idAfiliado) - .input('fechaCarga', sql.DateTime, dtoComprobante.fechaCarga) - .input('comentario', sql.VarChar(500), dtoComprobante.comentario) - .input('marca', sql.VarChar(10), dtoComprobante.marca) - .input('periodo', sql.VarChar(7), dtoComprobante.periodo) - .input('activo', sql.VarChar(1), dtoComprobante.activo) - .input('idTipoPrestacion', sql.Int, dtoComprobante.idTipoPrestacion) - .input('objectId', sql.VarChar(50), dtoComprobante.objectId) - .input('factAutomatico', sql.VarChar(50), 'prestacion') - .query(query); - return result.recordset[0].id; - } catch (error) { - log.error('query-sumar:saveComprobanteSumar', { dtoComprobante, query }, error, userScheduler); - return null; - } + const result = await request + .input('cuie', sql.VarChar(10), cuie) + .input('fechaComprobante', sql.DateTime, new Date(fechaComprobante)) + .input('clavebeneficiario', sql.VarChar(50), afiliadoSumar.clavebeneficiario) + .input('id_smiafiliados', sql.Int, afiliadoSumar.id_smiafiliados) + .input('fecha_carga', sql.DateTime, new Date()) + .input('comentario', sql.VarChar(500), 'Carga Automática') + .input('marca', sql.VarChar(10), null) + .input('periodo', sql.VarChar(7), periodo) + .input('activo', sql.VarChar(1), 'S') + .input('idTipoPrestacion', sql.Int, 1) + .input('objectId', sql.VarChar(50), objectId) + .input('factAutomatico', sql.VarChar(50), 'prestacion') + .query(query); + + return result.recordset[0].id; + } catch (error) { + log.error('query-sumar:getComprobante', { error }, error, userScheduler); + return null; } +} - /** - * - * - * @param {*} transaction - * @param {*} dtoPrestacion - * @returns - * @memberof QuerySumar - */ - async savePrestacionSumar(request: any, dtoPrestacion: any) { - const query = 'INSERT INTO [dbo].[PN_prestacion] ([id_comprobante],[id_nomenclador],[cantidad],[precio_prestacion],[id_anexo],[peso],[tension_arterial],[diagnostico],[edad],[sexo],[fecha_nacimiento],[fecha_prestacion],[anio],[mes],[dia],[objectId],[factAutomatico] )' + - ' VALUES (@idComprobante,@idNomenclador,@cantidad,@precioPrestacion,@idAnexo,@peso,@tensionArterial,@diagnostico,@edad,@sexo,@fechaNacimiento,@fechaPrestacion,@anio,@mes,@dia,@objectId,@factAutomatico)' + - ' SELECT SCOPE_IDENTITY() AS id'; +export async function savePrestacionSumar(request, paciente, diagnostico, idComprobante, idNomenclador, precioPrestacion, fechaPrestacion, objectId) { + const query = 'INSERT INTO [dbo].[PN_prestacion] ([id_comprobante],[id_nomenclador],[cantidad],[precio_prestacion],[id_anexo],[peso],[tension_arterial],[diagnostico],[edad],[sexo],[fecha_nacimiento],[fecha_prestacion],[anio],[mes],[dia],[objectId],[factAutomatico] )' + + ' VALUES (@idComprobante,@idNomenclador,@cantidad,@precioPrestacion,@idAnexo,@peso,@tensionArterial,@diagnostico,@edad,@sexo,@fechaNacimiento,@fechaPrestacion,@anio,@mes,@dia,@objectId,@factAutomatico)' + + ' SELECT SCOPE_IDENTITY() AS id'; - try { - const result = await request - .input('idComprobante', sql.Int, dtoPrestacion.idComprobante) - .input('idNomenclador', sql.Int, dtoPrestacion.idNomenclador) - .input('cantidad', sql.Int, 1) // Valor por defecto - .input('precioPrestacion', sql.Decimal, dtoPrestacion.precioPrestacion) - .input('idAnexo', sql.Int, 301) // Valor por defecto (No corresponde) - .input('peso', sql.Decimal, 0) - .input('tensionArterial', sql.VarChar(7), '00/00') - .input('diagnostico', sql.VarChar(500), dtoPrestacion.diagnostico) - .input('edad', sql.VarChar(2), dtoPrestacion.edad) - .input('sexo', sql.VarChar(2), dtoPrestacion.sexo) - .input('fechaNacimiento', sql.DateTime, new Date(dtoPrestacion.fechaNacimiento)) - .input('fechaPrestacion', sql.DateTime, new Date(dtoPrestacion.fechaPrestacion)) - .input('anio', sql.Int, dtoPrestacion.anio) - .input('mes', sql.Int, dtoPrestacion.mes) - .input('dia', sql.Int, dtoPrestacion.dia) - .input('objectId', sql.VarChar(50), dtoPrestacion.objectId) - .input('factAutomatico', sql.VarChar(50), 'prestacion') - .query(query); - return result.recordset[0].id; - } catch (error) { - log.error('query-sumar:savePrestacionSumar', { dtoPrestacion, query }, error, userScheduler); - return null; - } + try { + const result = await request + .input('idComprobante', sql.Int, idComprobante) + .input('idNomenclador', sql.Int, idNomenclador) + .input('cantidad', sql.Int, 1) // Valor por defecto + .input('precioPrestacion', sql.Decimal, precioPrestacion) + .input('idAnexo', sql.Int, 301) // Valor por defecto (No corresponde) + .input('peso', sql.Decimal, 0) + .input('tensionArterial', sql.VarChar(7), '00/00') + .input('diagnostico', sql.VarChar(500), diagnostico) + .input('edad', sql.VarChar(2), moment(new Date()).diff(paciente.fechaNacimiento, 'years')) + .input('sexo', sql.VarChar(2), paciente.sexo === 'masculino' ? 'M' : 'F') + .input('fechaNacimiento', sql.DateTime, new Date(paciente.fechaNacimiento)) + .input('fechaPrestacion', sql.DateTime, new Date(fechaPrestacion)) + .input('anio', sql.Int, moment(paciente.fechaNacimiento).format('YYYY')) + .input('mes', sql.Int, moment(paciente.fechaNacimiento).format('MM')) + .input('dia', sql.Int, moment(paciente.fechaNacimiento).format('DD')) + .input('objectId', sql.VarChar(50), objectId) + .input('factAutomatico', sql.VarChar(50), 'prestacion') + .query(query); + return result.recordset[0].id; + } catch (error) { + log.error('query-sumar:savePrestacionSumar', { query }, error, userScheduler); + return null; } +} - /** - * - * - * @param {*} transaction - * @param {*} dtoPrestacion - * @returns - * @memberof QuerySumar - */ - async saveDatosReportablesSumar(request: any, dtoPrestacion: any) { - const query = 'INSERT INTO [dbo].[PN_Rel_PrestacionXDatoReportable] ([idPrestacion], [idDatoReportable], [valor])' + - ' values (@idPrestacion, @idDatoReportable, @valor)' + - 'SELECT SCOPE_IDENTITY() AS id'; - - try { - const result = await request - .input('idPrestacion', sql.Int, dtoPrestacion.idPrestacion) - .input('idDatoReportable', sql.Int, dtoPrestacion.idDatoReportable) - .input('valor', sql.VarChar(500), dtoPrestacion.valor) - .query(query); - return result.recordset[0].id; - } catch (error) { - log.error('query-sumar:saveDatosReportablesSumar', { dtoPrestacion, query }, error, userScheduler); - return null; - } +export async function getAfiliadoSumar(pool: any, documento: any) { + const query = 'SELECT TOP 1 * FROM dbo.PN_smiafiliados WHERE afidni = @documento AND activo = @activo'; + try { + const resultado = await new sql.Request(pool) + .input('documento', sql.VarChar(50), documento) + .input('activo', sql.VarChar(1), 'S') + .query(query); + return resultado.recordset.length ? resultado.recordset[0] : null; + + } catch (error) { + log.error('query-sumar:getAfiliadoSumar', { documento, query }, error, userScheduler); + return null; } +} - async getAfiliadoSumar(pool: any, documento: any) { - const query = 'SELECT * FROM dbo.PN_smiafiliados WHERE afidni = @documento AND activo = @activo'; - try { - const resultado = await new sql.Request(pool) - .input('documento', sql.VarChar(50), documento) - .input('activo', sql.VarChar(1), 'S') - .query(query); - return resultado.recordset.length ? resultado.recordset[0] : null; - - } catch (error) { - log.error('query-sumar:getAfiliadoSumar', { documento, query }, error, userScheduler); - return null; - } +export async function getPrestacionSips(pool, fechaTurno, idAfiliado, idNomenclador) { + try { + const fechaPrestacion = moment(fechaTurno).format('YYYY-MM-DD'); + const result = await new sql.Request(pool) + .input('idAfiliado', sql.Int, idAfiliado) + .input('idNomenclador', sql.Int, idNomenclador) + .input('fechaPrestacion', sql.Date, fechaPrestacion) + .output('idPrestacion', sql.Int) + .execute('PN_ValidaPrestacionPaciente'); + return result.recordset.length ? result.recordset[0].id_prestacion : null; } + catch (error) { + log.error('query-sumar:getPrestacionSips', { fechaTurno, idAfiliado, idNomenclador }, error, userScheduler); + return null; + } +} - /** - * - * - * @param {*} pool - * @param {*} idNomeclador - * @returns - * @memberof QuerySumar - */ - async getNomencladorSumar(pool: any, idNomenclador: any) { - const query = 'SELECT * FROM [dbo].[PN_nomenclador] where id_nomenclador = @idNomenclador'; - try { - const resultado = await new sql.Request(pool) - .input('idNomenclador', sql.VarChar(50), idNomenclador) +export async function getNomencladorRecupero(request, codigo, idTipoNomenclador) { + const query = 'SELECT idNomenclador, idTipoPractica, valorUnidad, descripcion FROM dbo.FAC_Nomenclador WHERE codigo = @codigo and idTipoNomenclador = @idTipoNomenclador'; + try { + const resultado = await request + .input('codigo', sql.VarChar(50), codigo) + .input('idTipoNomenclador', sql.Int, idTipoNomenclador) .query(query); - return resultado.recordset.length ? { precio: resultado.recordset[0].precio } : null; - } catch (error) { - log.error('query-sumar:getNomencladorSumar', { idNomenclador, query }, error, userScheduler); - return null; - } - + return resultado.recordset[0]; + } catch (error) { + log.error('query-recupero:getNomencladorRecupero', { query }, error, userScheduler); + return null; } +} + +export async function getNomencladorSumar(request, idNomenclador: any) { + const query = 'SELECT * FROM [dbo].[PN_nomenclador] where id_nomenclador = @idNomenclador'; + try { + const resultado = await request + .input('idNomenclador', sql.VarChar(50), idNomenclador) + .query(query); - async getComprobante(pool: any, dtoSumar: IDtoSumar) { - const query = 'SELECT id_comprobante FROM dbo.PN_comprobante WHERE objectId = @objectId'; - try { - const result = await new sql.Request(pool) - .input('objectId', sql.VarChar(100), dtoSumar.objectId) - .query(query); - - return result.recordset.length ? result.recordset[0].id_comprobante : null; - } - catch (err) { - log.error('query-sumar:getComprobante', { dtoSumar, query }, err, userScheduler); - return null; - } + return resultado.recordset.length ? { precio: resultado.recordset[0].precio } : null; + } catch (error) { + log.error('query-sumar:getNomencladorSumar', { idNomenclador, query }, error, userScheduler); + return null; } + +} - async getPrestacionSips(pool: any, dtoSumar: IDtoSumar) { - try { - const fechaPrestacion = moment(dtoSumar.fechaTurno).format('YYYY-MM-DD'); - const result = await pool.request() - .input('idAfiliado', sql.Int, dtoSumar.idAfiliado) - .input('idNomenclador', sql.Int, dtoSumar.idNomenclador) - .input('fechaPrestacion', sql.Date, fechaPrestacion) - .output('idPrestacion', sql.Int) - .execute('PN_ValidaPrestacionPaciente'); - return result.recordset.length ? result.recordset[0].id_prestacion : null; - } - catch (error) { - log.error('query-sumar:getPrestacionSips', { dtoSumar }, error, userScheduler); - return null; - } +export async function saveDatosReportablesSumar(request, idPrestacion, idDatoReportable, valor) { + const query = 'INSERT INTO [dbo].[PN_Rel_PrestacionXDatoReportable] ([idPrestacion], [idDatoReportable], [valor])' + + ' values (@idPrestacion, @idDatoReportable, @valor)' + + 'SELECT SCOPE_IDENTITY() AS id'; + + try { + const result = await request + .input('idPrestacion', sql.Int, idPrestacion) + .input('idDatoReportable', sql.Int, idDatoReportable) + .input('valor', sql.VarChar(500), valor) + .query(query); + return result.recordset[0].id; + } catch (error) { + log.error('query-sumar:saveDatosReportablesSumar', { query }, error, userScheduler); + return null; } } diff --git a/facturacion/index.ts b/facturacion/index.ts index 5571e39..3d248dc 100644 --- a/facturacion/index.ts +++ b/facturacion/index.ts @@ -1,14 +1,15 @@ import { logDatabase, SipsDBConfiguration } from './config.private'; -import { facturaBuscador, facturaTurno } from './facturar/dto-facturacion'; +import { facturaTurno } from './facturar/dto-facturacion'; import { Microservice } from '@andes/bootstrap'; import { Connections } from '@andes/log'; import { userScheduler } from './config.private'; import { msFacturacionLog } from './logger/msFacturacion'; +const log = msFacturacionLog.startTrace(); import { exportarFacturacion } from './configJson/configJson'; +import { facturacionSumar } from './facturar/sumar/factura-sumar'; const sql = require('mssql') const pkg = require('./package.json'); const ms = new Microservice(pkg); -const log = msFacturacionLog.startTrace(); const router = ms.router(); @@ -28,10 +29,11 @@ router.group('/facturacion', (group) => { const event = req.body.event; + if (event === 'facturacion:factura:buscador') { + return await facturacionSumar(pool, data); + } + switch (event) { - case 'facturacion:factura:buscador': - dtoFacturacion = await facturaBuscador(data); - break; case 'facturacion:factura:recupero_financiero': dtoFacturacion = await facturaTurno(data); break; @@ -43,7 +45,7 @@ router.group('/facturacion', (group) => { log.error('facturacion:create', { event, data }, 'Origen facturación inválido', userScheduler); break; } - + for (let x = 0; x < dtoFacturacion.length; x++) { await exportarFacturacion(pool, dtoFacturacion[x]); } diff --git a/facturacion/interfaces/IDtoFacturacion.ts b/facturacion/interfaces/IDtoFacturacion.ts index 80ffef8..0bdfe4d 100644 --- a/facturacion/interfaces/IDtoFacturacion.ts +++ b/facturacion/interfaces/IDtoFacturacion.ts @@ -6,7 +6,7 @@ export interface IDtoFacturacion { { nombre: String; apellido: String; - dni: String; + documento: String; fechaNacimiento: Date; sexo: String; }; @@ -38,7 +38,7 @@ export interface IDtoFacturacion { { nombre: String; apellido: String; - dni: String; + documento: String; formacionGrado: String; }; configAutomatica: any; diff --git a/facturacion/services/config-factAutomatica.service.ts b/facturacion/services/config-factAutomatica.service.ts deleted file mode 100644 index b52a941..0000000 --- a/facturacion/services/config-factAutomatica.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ANDES_HOST, ANDES_KEY } from './../config.private'; -const request = require('request'); - -export async function getConfigAutomatica(idPrestacionTurneable, idPrestacionEjecutada) { - return new Promise((resolve, reject) => { - const url = `${ANDES_HOST}/modules/facturacionAutomatica/configFacturacionAutomatica?idPrestacionTurneable=${idPrestacionTurneable}&idPrestacionEjecutada=${idPrestacionEjecutada}&token=${ANDES_KEY}`; - request(url, (error, response, body) => { - if (!error && response.statusCode >= 200 && response.statusCode < 300) { - const confAuto: any[] = JSON.parse(body); - if (confAuto && confAuto.length) { - resolve(confAuto[0]); - } else { - resolve(null); - } - } else { - reject('No se encuentra facturación: ' + body); - } - }); - }); -} diff --git a/facturacion/services/organizacion.service.ts b/facturacion/services/organizacion.service.ts index dbecbcc..975ec7d 100644 --- a/facturacion/services/organizacion.service.ts +++ b/facturacion/services/organizacion.service.ts @@ -3,20 +3,10 @@ const request = require('request'); export async function getOrganizacion(idOrganizacion) { return new Promise((resolve, reject) => { - const url = `${ANDES_HOST}/core/tm/organizaciones?ids=${idOrganizacion}&token=${ANDES_KEY}`; + const url = `${ANDES_HOST}/core/tm/organizaciones/${idOrganizacion}?token=${ANDES_KEY}`; request(url, (error, response, body) => { - if (!error && response.statusCode >= 200 && response.statusCode < 300) { - const orgs: any[] = JSON.parse(body); - const organizacion: any = {}; - if (orgs && orgs.length) { - resolve({ - organizacion: { - nombre: orgs[0].nombre, - cuie: orgs[0].codigo.cuie, - idSips: orgs[0].codigo.sips - } - }); - } + if (!error && response.statusCode >= 200 && response.statusCode < 300 && body) { + resolve(JSON.parse(body)); } reject('No se encuentra organización' + body); }); diff --git a/facturacion/services/prestaciones.service.ts b/facturacion/services/prestaciones.service.ts index d719f79..b8cf6ff 100644 --- a/facturacion/services/prestaciones.service.ts +++ b/facturacion/services/prestaciones.service.ts @@ -40,7 +40,6 @@ export async function getDatosTurno(idTurno) { }); } - /** * * @@ -100,3 +99,35 @@ export async function updateEstadoFacturacionSinTurno(idPrestacion, _estadoFactu }); }); } + +export async function getDatosReportables(prestacion) { + const idPrestacionTurneable = prestacion.solicitud.tipoPrestacion.conceptId; + const configAutomatica = []; + for (const registro of prestacion.ejecucion.registros) { + const idPrestacionEjecutada = registro.concepto.conceptId; + const config: any = await getConfigAutomatica(idPrestacionTurneable, idPrestacionEjecutada) + + if (config && !configAutomatica.find(c => c._id === config._id)) { + configAutomatica.push(config); + } + } + return configAutomatica; +} + +export async function getConfigAutomatica(idPrestacionTurneable, idPrestacionEjecutada) { + return new Promise((resolve, reject) => { + const url = `${ANDES_HOST}/modules/facturacionAutomatica/configFacturacionAutomatica?idPrestacionTurneable=${idPrestacionTurneable}&idPrestacionEjecutada=${idPrestacionEjecutada}&token=${ANDES_KEY}`; + request(url, (error, response, body) => { + if (!error && response.statusCode >= 200 && response.statusCode < 300) { + const confAuto: any[] = JSON.parse(body); + if (confAuto && confAuto.length) { + resolve(confAuto[0]); + } else { + resolve(null); + } + } else { + reject('No se encuentra facturación: ' + body); + } + }); + }); +} diff --git a/facturacion/services/profesional.service.ts b/facturacion/services/profesional.service.ts index e21e35d..8a5b86a 100644 --- a/facturacion/services/profesional.service.ts +++ b/facturacion/services/profesional.service.ts @@ -3,21 +3,10 @@ const request = require('request'); export async function getProfesional(idProfesional) { return new Promise((resolve, reject) => { - const url = `${ANDES_HOST}/core/tm/profesionales?id=${idProfesional}&token=${ANDES_KEY}`; + const url = `${ANDES_HOST}/core/tm/profesionales/${idProfesional}?token=${ANDES_KEY}`; request(url, (error, response, body) => { if (!error && response.statusCode >= 200 && response.statusCode < 300) { - const prof: any[] = JSON.parse(body); - const profesional: any = {}; - if (prof && prof.length) { - resolve({ - profesional: { - nombre: prof[0].nombre, - apellido: prof[0].apellido, - dni: prof[0].documento, - formacionGrado: prof[0].formacionGrado - } - }); - } + resolve(JSON.parse(body)); } reject('No se encuentra profesional: ' + body); });