From 3a5ed10beff93c131a66faa348a2ff6668b4a109 Mon Sep 17 00:00:00 2001 From: ma7payne Date: Wed, 12 Jul 2023 15:43:21 -0300 Subject: [PATCH] feat(HUDS): implementa mockups de prestaciones --- src/app/modules/rup/components/core/_rup.scss | 41 +- .../ejecucion/hudsBusqueda.component.ts | 134 +++++- .../components/ejecucion/hudsBusqueda.html | 410 ++++++++++-------- .../components/ejecucion/hudsBusqueda.scss | 353 +++++++++++---- .../ejecucion/vistaHuds.component.ts | 8 +- .../rup/components/ejecucion/vistaHuds.html | 169 ++++---- .../rup/components/ejecucion/vistaHuds.scss | 8 +- .../elementos/adjuntarDocumento.component.ts | 2 +- .../elementos/adjuntarDocumento.html | 4 +- .../deprecated/informeEpicrisis.scss | 14 - .../rupers/seccionado/seccion.component.html | 2 +- .../solicitudPrestacionDefault.component.ts | 2 +- .../components/huds/detallePrestacion.html | 111 +++++ .../components/huds/detallePrestacion.scss | 60 +++ .../rup/components/huds/detallePrestacion.ts | 43 ++ .../rup/components/huds/detalleRegistro.html | 149 +++++++ .../rup/components/huds/detalleRegistro.scss | 52 +++ .../rup/components/huds/detalleRegistro.ts | 80 ++++ .../huds/detalleRegistroInterno.html | 28 ++ .../huds/detalleRegistroInterno.scss | 33 ++ .../components/huds/detalleRegistroInterno.ts | 26 ++ .../detalleRegistroInternacion.html | 237 ++++++++++ .../detalleRegistroInternacion.scss | 82 ++++ ...leRegistroInternaci\303\263n.component.ts" | 123 ++++++ .../internacion/paciente/detallePaciente.html | 17 + .../internacion/paciente/detallePaciente.ts | 11 + .../registro/listadoRegistros.html | 74 ++++ .../internacion/registro/listadoRegistros.ts | 13 + .../rup/components/huds/vistaCDA.component.ts | 6 +- .../modules/rup/components/huds/vistaCDA.html | 147 ++----- .../modules/rup/components/huds/vistaCDA.scss | 45 ++ .../huds/vistaContextoPrestacion.html | 2 +- .../rup/components/huds/vistaPrestacion.html | 32 +- .../rup/components/huds/vistaPrestacion.ts | 5 +- .../components/huds/vistaProcedimiento.html | 4 +- .../components/huds/vistaSolicitudTop.html | 117 ++--- .../components/huds/vistaSolicitudTop.scss | 53 +++ .../rup/components/huds/vistaSolicitudTop.ts | 26 +- src/app/modules/rup/components/variables.scss | 4 + src/app/modules/rup/huds-lib.module.ts | 18 +- src/app/modules/rup/services/huds.service.ts | 10 +- 41 files changed, 2160 insertions(+), 595 deletions(-) create mode 100644 src/app/modules/rup/components/huds/detallePrestacion.html create mode 100644 src/app/modules/rup/components/huds/detallePrestacion.scss create mode 100644 src/app/modules/rup/components/huds/detallePrestacion.ts create mode 100644 src/app/modules/rup/components/huds/detalleRegistro.html create mode 100644 src/app/modules/rup/components/huds/detalleRegistro.scss create mode 100644 src/app/modules/rup/components/huds/detalleRegistro.ts create mode 100644 src/app/modules/rup/components/huds/detalleRegistroInterno.html create mode 100644 src/app/modules/rup/components/huds/detalleRegistroInterno.scss create mode 100644 src/app/modules/rup/components/huds/detalleRegistroInterno.ts create mode 100644 src/app/modules/rup/components/huds/internacion/detalleRegistroInternacion.html create mode 100644 src/app/modules/rup/components/huds/internacion/detalleRegistroInternacion.scss create mode 100644 "src/app/modules/rup/components/huds/internacion/detalleRegistroInternaci\303\263n.component.ts" create mode 100644 src/app/modules/rup/components/huds/internacion/paciente/detallePaciente.html create mode 100644 src/app/modules/rup/components/huds/internacion/paciente/detallePaciente.ts create mode 100644 src/app/modules/rup/components/huds/internacion/registro/listadoRegistros.html create mode 100644 src/app/modules/rup/components/huds/internacion/registro/listadoRegistros.ts create mode 100644 src/app/modules/rup/components/huds/vistaCDA.scss create mode 100644 src/app/modules/rup/components/huds/vistaSolicitudTop.scss diff --git a/src/app/modules/rup/components/core/_rup.scss b/src/app/modules/rup/components/core/_rup.scss index 857945f8ed..3e4b1d1eab 100644 --- a/src/app/modules/rup/components/core/_rup.scss +++ b/src/app/modules/rup/components/core/_rup.scss @@ -64,10 +64,9 @@ $rotate: -90deg; } &.#{$tag} { + &:hover, &.active { - box-shadow: 1px 1px 20px 1px rgba($color, 0.22); - .rup-header { .icon-rup { background: $color; @@ -83,6 +82,9 @@ $rotate: -90deg; .icon-rup { border: 2px solid $color; background: white; + display: flex; + justify-content: center; + align-items: center; i { color: $color; @@ -97,17 +99,16 @@ $rotate: -90deg; &.#{$tag}:not(.mini) { &:hover { border: 2px solid $color; - box-shadow: 1px 1px 20px 1px rgba($color, 0.22); } - > .rup-header, - > .rup-header .icon-rup, + >.rup-header, + >.rup-header .icon-rup, .rup-body .legend, .rup-footer .type { background: $color !important; } - > .rup-header .icon-rup { + >.rup-header .icon-rup { border-bottom: 1px solid $color; background: $color !important; mix-blend-mode: hard-light; @@ -241,15 +242,15 @@ $rotate: -90deg; border: 0; } - > .rup-header, - > .rup-header .icon-rup, + >.rup-header, + >.rup-header .icon-rup, .rup-body .legend, .rup-footer .type { background: transparent !important; color: white; } - > .rup-header .icon-rup { + >.rup-header .icon-rup { border-bottom: 1px solid $color; background: transparent !important; } @@ -439,7 +440,7 @@ $rotate: -90deg; font-weight: normal; text-transform: uppercase; color: $color; - border: 1px solid $color; + border: 1px solid $color; &:focus { outline: 0; @@ -471,7 +472,6 @@ $rotate: -90deg; i:hover { border: 2px solid $color; - box-shadow: 1px 1px 20px 1px rgba($color, 0.22); } } @@ -491,7 +491,7 @@ $rotate: -90deg; } .form-group { - & > label { + &>label { margin-bottom: 0 !important; } } @@ -532,7 +532,8 @@ $rotate: -90deg; .grid-envolvente { display: grid; grid-template-rows: auto 1fr; - > .prestacion-offset { + + >.prestacion-offset { padding: 10px; h4 { @@ -542,11 +543,8 @@ $rotate: -90deg; } } -@mixin grid-columnas( - $cols: ( - 1fr 1fr, - ) -) { +@mixin grid-columnas($cols: (1fr 1fr, + )) { display: grid; grid-template-columns: $cols; grid-column-gap: 40px; @@ -753,15 +751,16 @@ observaciones { // Adaptación Rup-card plex-layout [type="invert"] { .rup-card .rup-header { - + .title { background: transparent; } - + .actions { background: transparent; + plex-badge { - & > span { + &>span { color: white; } } diff --git a/src/app/modules/rup/components/ejecucion/hudsBusqueda.component.ts b/src/app/modules/rup/components/ejecucion/hudsBusqueda.component.ts index 13ac0213b2..936247eb00 100644 --- a/src/app/modules/rup/components/ejecucion/hudsBusqueda.component.ts +++ b/src/app/modules/rup/components/ejecucion/hudsBusqueda.component.ts @@ -4,6 +4,7 @@ import { AfterContentInit, Component, EventEmitter, Input, Optional, Output, Vie import * as moment from 'moment'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; +import { InternacionResumenHTTP } from 'src/app/apps/rup/mapa-camas/services/resumen-internacion.http'; import { SECCION_CLASIFICACION } from 'src/app/modules/epidemiologia/constantes'; import { FormsEpidemiologiaService } from 'src/app/modules/epidemiologia/services/ficha-epidemiologia.service'; import { ConceptosTurneablesService } from 'src/app/services/conceptos-turneables.service'; @@ -15,12 +16,10 @@ import { EmitConcepto, RupEjecucionService } from '../../services/ejecucion.serv import { HUDSService } from '../../services/huds.service'; import { PrestacionesService } from './../../services/prestaciones.service'; - @Component({ selector: 'rup-hudsBusqueda', templateUrl: 'hudsBusqueda.html', styleUrls: ['hudsBusqueda.scss', 'buscador.scss'], - // Use to disable CSS Encapsulation for this component encapsulation: ViewEncapsulation.None }) export class HudsBusquedaComponent implements AfterContentInit { @@ -64,9 +63,12 @@ export class HudsBusquedaComponent implements AfterContentInit { public prestacionSeleccionada = []; private _prestaciones: any = []; private prestacionesCopia: any = []; + private internaciones; + get prestaciones() { return this._prestaciones; } + set prestaciones(value) { this._prestaciones = value.sort((a, b) => { return moment(b.fecha).diff(a.fecha); @@ -83,8 +85,8 @@ export class HudsBusquedaComponent implements AfterContentInit { public hallazgosCronicos: any = []; /** - * Listado de todos los hallazgos no activos - */ + * Listado de todos los hallazgos no activos + */ public hallazgosNoActivos: any = []; public fechaInicio; public fechaFin; @@ -127,6 +129,25 @@ export class HudsBusquedaComponent implements AfterContentInit { public txtABuscar; public efectorRestringido = this.auth.check('huds:soloEfectorActual'); + public indiceInternaciones; + public otrasPrestaciones; + + /** + * Ids correspondientes a Prescripción de Medicamentos y Seguimiento Hídrico respectivamente + */ + public condicionRegistros = ['33633005', '430147008']; + + public filtros = [ + { key: 'planes', titulo: 'prestaciones', icono: 'clipboard-check-outline' }, + { key: 'solicitudes', titulo: 'solicitudes', icono: 'mano-corazon' }, + { key: 'hallazgo', titulo: 'hallazgos', icono: 'hallazgo' }, + { key: 'trastorno', titulo: 'trastornos', icono: 'trastorno' }, + { key: 'procedimiento', titulo: 'procedimientos', icono: 'termometro' }, + { key: 'producto', titulo: 'productos', icono: 'pildoras' }, + { key: 'laboratorios', titulo: 'laboratorios', icono: 'recipiente' }, + { key: 'vacunas', titulo: 'vacunas', icono: 'vacuna' }, + { key: 'dominios', titulo: 'dominios nacionales', icono: 'hospital' }, + ]; constructor( public servicioPrestacion: PrestacionesService, @@ -134,6 +155,7 @@ export class HudsBusquedaComponent implements AfterContentInit { public auth: Auth, public huds: HUDSService, private formEpidemiologiaService: FormsEpidemiologiaService, + private resumenHTTP: InternacionResumenHTTP, public ipsService: IPSService, @Optional() private ejecucionService: RupEjecucionService ) { @@ -146,6 +168,7 @@ export class HudsBusquedaComponent implements AfterContentInit { */ ngAfterContentInit() { if (this.paciente) { + this.listarInternaciones(); this.listarPrestaciones(); this.listarConceptos(); this.listarDominios(); @@ -158,6 +181,10 @@ export class HudsBusquedaComponent implements AfterContentInit { }, 1000 * 30); } + getTitulo(filtroactual) { + return this.filtros.find(filtro => filtro.key === filtroactual).titulo; + } + dragStart(e) { this._onDragStart.emit(e); } @@ -254,13 +281,26 @@ export class HudsBusquedaComponent implements AfterContentInit { registro.class = 'plan'; registro.params = params; break; + case 'internacion': + gtag('huds-open', 'rup', 'internacion', index); + registro.id = registro.id; + registro.tipo = 'internacion'; + registro.index = index; + break; } this.huds.toogle(registro, tipo); } - listarPrestaciones() { + listarInternaciones() { + this.resumenHTTP.search({ + organizacion: this.auth.organizacion.id, + ingreso: this.resumenHTTP.queryDateParams(this.fechaInicio, this.fechaFin), + paciente: this.paciente.id, + }).subscribe((internaciones) => this.internaciones = internaciones); + } + listarPrestaciones() { function groupBy(prestaciones: IPrestacion[]) { const resultado = []; const diccionario = {}; @@ -279,7 +319,6 @@ export class HudsBusquedaComponent implements AfterContentInit { Object.values(diccionario).forEach(dc => resultado.push(dc)); return resultado; - } @@ -364,6 +403,8 @@ export class HudsBusquedaComponent implements AfterContentInit { this.cargarSolicitudesMezcladas(); }); }); + + }); } @@ -385,11 +426,8 @@ export class HudsBusquedaComponent implements AfterContentInit { }); } - - // Trae los cdas registrados para el paciente buscarCDAPacientes(token) { - this.servicioPrestacion.getCDAByPaciente(this.paciente.id, token).subscribe(registros => { this.cdas = registros.map(cda => { cda.id = cda.cda_id; @@ -506,6 +544,80 @@ export class HudsBusquedaComponent implements AfterContentInit { return filtro; } + filtrarOtrasPrestaciones(prestaciones, prestacionesEnInternacion) { + const filtroPrestaciones = prestaciones.filter(prestacion => + !prestacionesEnInternacion.some(filtro => filtro.data.id === prestacion.data.id)); + + const registros = filtroPrestaciones.flatMap((prestacion) => prestacion.data.ejecucion.registros); + + const indiceRegistros = registros.reduce((grupo, registro) => { + const { concepto: { conceptId, term }, id, idPrestacion, createdAt: fecha } = registro; + const data = { conceptId, term, id, idPrestacion, fecha }; + + if (this.condicionRegistros.includes(data.conceptId)) { + return ({ + indices: { ...grupo.indices, [data.conceptId]: data }, + registros: { ...grupo.registros, [data.conceptId]: { ...grupo.registros[data.conceptId], [data.conceptId]: registro } } + }); + } + + return ({ indices: { ...grupo.indices, ['otras']: { ...grupo.indices['otras'], [data.conceptId]: data } }, registros: { ...grupo.registros, ['otras']: { ...grupo.registros['otras'], [data.conceptId]: registro } } }); + }, { indices: {}, registros: {} }); + + const fechas = registros.map((registro) => registro.createdAt); + const fechaDesde = fechas[fechas.length - 1]; + const fechaHasta = fechas[0]; + + this.otrasPrestaciones = { fechaDesde, fechaHasta, indices: Object.values(indiceRegistros.indices), registros: Object.values(indiceRegistros.registros) }; + } + + filtrarPorInternacion(prestaciones) { + const prestacionesEnInternacion = []; + + const internaciones = this.internaciones + .map(internacion => { + const prestacionesPorInternacion = prestaciones.filter(prestacion => { + const fechaIngresoValida = moment(prestacion.fecha).isSameOrAfter(internacion.fechaIngreso); + const fechaEgresoValida = internacion.fechaEgreso ? moment(prestacion.fecha).isSameOrBefore(internacion.fechaEgreso) : moment(prestacion.fecha).isSameOrBefore(moment().toDate()); + const organizacionValida = internacion.organizacion.id === prestacion.organizacion; + + if (fechaIngresoValida && fechaEgresoValida && organizacionValida) { + prestacionesEnInternacion.push(prestacion); + + return prestacion; + } else { return null; } + }); + + const indicePrestaciones = prestacionesPorInternacion.reduce((grupo, prestacion, index) => { + return ({ ...grupo, [prestacion.data.id]: prestacion }); + }, {}); + + const registros = prestacionesPorInternacion.flatMap((prestacion) => prestacion.data.ejecucion.registros); + + const grupoRegistros = registros.reduce((grupo, registro) => { + const dataRegistro = { conceptId: registro.concepto.conceptId, term: registro.concepto.term, id: registro.id, idPrestacion: registro.idPrestacion }; + + if (this.condicionRegistros.includes(registro.concepto.conceptId)) { + return ({ ...grupo, [registro.concepto.conceptId]: dataRegistro }); + } + + return ({ ...grupo, ['otras']: { ...grupo['otras'], [registro.idPrestacion]: { ...indicePrestaciones[registro.idPrestacion] } } }); + }, {}); + + return { + id: internacion.id, + fechaIngreso: internacion.fechaIngreso, + fechaEgreso: internacion.fechaEgreso, + organizacion: internacion.organizacion.nombre, + registros: Object.values(grupoRegistros) + }; + }) + .filter(grupo => grupo.registros.length); + + this.indiceInternaciones = internaciones.reverse(); + + this.filtrarOtrasPrestaciones(prestaciones, prestacionesEnInternacion); + } filtrar() { this.prestaciones = this.prestacionesCopia.slice(); @@ -523,6 +635,10 @@ export class HudsBusquedaComponent implements AfterContentInit { if (this.ambitoOrigen) { this.prestaciones = this.prestaciones.filter(p => p.ambito === this.ambitoOrigen); + + if (this.ambitoOrigen === 'internacion') { + this.filtrarPorInternacion(this.prestaciones); + } } if (this.organizacionSeleccionada) { diff --git a/src/app/modules/rup/components/ejecucion/hudsBusqueda.html b/src/app/modules/rup/components/ejecucion/hudsBusqueda.html index a786fdf7bf..13230adbb1 100644 --- a/src/app/modules/rup/components/ejecucion/hudsBusqueda.html +++ b/src/app/modules/rup/components/ejecucion/hudsBusqueda.html @@ -1,132 +1,37 @@ -