diff --git a/src/app/apps/rup/mapa-camas/interfaces/ISalaComun.ts b/src/app/apps/rup/mapa-camas/interfaces/ISalaComun.ts new file mode 100644 index 0000000000..e239ebf75c --- /dev/null +++ b/src/app/apps/rup/mapa-camas/interfaces/ISalaComun.ts @@ -0,0 +1,17 @@ +import { ISnomedConcept } from '../../../../modules/rup/interfaces/snomed-concept.interface'; +import { ISectores } from '../../../../interfaces/IOrganizacion'; + +export interface ISalaComun { + id: String; + nombre: string; + organizacion: { + id: String, + nombre: String + }; + capacidad?: number; + ambito: string; + unidadOrganizativas: ISnomedConcept[]; + sectores: ISectores[]; + estado: string; + lastSync?: Date; +} diff --git a/src/app/apps/rup/mapa-camas/interfaces/ISnapshot.ts b/src/app/apps/rup/mapa-camas/interfaces/ISnapshot.ts index 28615c5620..0c1e3fe40b 100644 --- a/src/app/apps/rup/mapa-camas/interfaces/ISnapshot.ts +++ b/src/app/apps/rup/mapa-camas/interfaces/ISnapshot.ts @@ -32,10 +32,12 @@ export interface ISnapshot { _id: String, nombre: String }; + sala?: boolean; extras: { ingreso?: boolean, egreso?: boolean, - idInternacion?: boolean + idInternacion?: String, + tipo_egreso?: String, }; nota: String; createdAt?: Date; diff --git a/src/app/apps/rup/mapa-camas/mapa-camas.module.ts b/src/app/apps/rup/mapa-camas/mapa-camas.module.ts index 6e689fddc0..208bffd15f 100644 --- a/src/app/apps/rup/mapa-camas/mapa-camas.module.ts +++ b/src/app/apps/rup/mapa-camas/mapa-camas.module.ts @@ -45,6 +45,8 @@ import { RegistrosHudsDetalleComponent } from './sidebar/registros-huds-detalle/ import { ElementosRUPModule } from '../../../modules/rup/elementos-rup.module'; import { RegistroHUDSItemComponent } from './sidebar/registros-huds-detalle/registros-huds-item/registros-huds-item.component'; import { IngresoPacienteWorkflowComponent } from './sidebar/ingreso/ingreso-paciente-workflow/ingreso-paciente-workflow.component'; +import { SalaComunComponent } from './views/sala-comun/sala-comun.component'; +import { SalaComunService } from './views/sala-comun/sala-comun.service'; import { NgDragDropModule } from 'ng-drag-drop'; import { RUPLibModule } from '../../../modules/rup/rup-lib.module'; @@ -76,13 +78,15 @@ export const INTERNACION_COMPONENTS = [ NuevoRegistroSaludComponent, RegistrosHudsDetalleComponent, RegistroHUDSItemComponent, - IngresoPacienteWorkflowComponent + IngresoPacienteWorkflowComponent, + SalaComunComponent, ]; export const INTERNACION_PROVIDERS = [ MapaCamasService, MaquinaEstadosHTTP, ListadoInternacionService, + SalaComunService, ScrollDispatcher, ]; diff --git a/src/app/apps/rup/mapa-camas/mapa-camas.routing.ts b/src/app/apps/rup/mapa-camas/mapa-camas.routing.ts index 20ba834302..c635380fc4 100644 --- a/src/app/apps/rup/mapa-camas/mapa-camas.routing.ts +++ b/src/app/apps/rup/mapa-camas/mapa-camas.routing.ts @@ -7,6 +7,7 @@ import { CensosDiariosComponent } from './views/censos/censo-diario/censo-diario import { CensosMensualesComponent } from './views/censos/censo-mensual/censo-mensual.component'; import { InternacionListadoComponent } from './views/listado-internacion/listado-internacion.component'; import { InternacionListaEsperaComponent } from './views/lista-espera/lista-espera.component'; +import { SalaComunComponent } from './views/sala-comun/sala-comun.component'; export const INTERNACION_ROUTES = [ { path: 'mapa-camas', component: MapaCamasMainComponent }, @@ -25,6 +26,10 @@ export const INTERNACION_ROUTES = [ { path: ':ambito/:capa/lista-espera', component: InternacionListaEsperaComponent }, + { path: 'sala-comun', component: SalaComunComponent }, + + { path: 'sala-comun/:id', component: SalaComunComponent }, + { path: '', redirectTo: 'mapa-camas', pathMatch: 'full' } ]; diff --git a/src/app/apps/rup/mapa-camas/services/mapa-camas.http.ts b/src/app/apps/rup/mapa-camas/services/mapa-camas.http.ts index 48bcc496fd..4d15efaba0 100644 --- a/src/app/apps/rup/mapa-camas/services/mapa-camas.http.ts +++ b/src/app/apps/rup/mapa-camas/services/mapa-camas.http.ts @@ -8,7 +8,7 @@ export type IFiltrosHistorial = any; @Injectable({ providedIn: 'root', - }) +}) export class MapaCamasHTTP { private url = '/modules/rup/internacion'; @@ -40,6 +40,15 @@ export class MapaCamasHTTP { return this.server.get(`${this.url}/camas/historial`, { params }); } + historialInternacion(ambito: string, capa: string, desde: Date, hasta: Date, idInternacion: string): Observable { + const params = { + ambito, + desde, + hasta + }; + return this.server.get(`${this.url}/${capa}/${idInternacion}/historial`, { params }); + } + get(ambito: string, capa: string, fecha: Date, idCama: string): Observable { return this.server.get(`${this.url}/camas/${idCama}`, { params: { ambito, capa, fecha }, diff --git a/src/app/apps/rup/mapa-camas/services/mapa-camas.service.ts b/src/app/apps/rup/mapa-camas/services/mapa-camas.service.ts index df9689041f..e10c02a745 100644 --- a/src/app/apps/rup/mapa-camas/services/mapa-camas.service.ts +++ b/src/app/apps/rup/mapa-camas/services/mapa-camas.service.ts @@ -13,6 +13,7 @@ import { PrestacionesService } from '../../../../modules/rup/services/prestacion import { MaquinaEstadosHTTP } from './maquina-estados.http'; import { PacienteService } from '../../../../core/mpi/services/paciente.service'; import { IPaciente } from '../../../../core/mpi/interfaces/IPaciente'; +import { SalaComunService } from '../views/sala-comun/sala-comun.service'; @Injectable() @@ -73,7 +74,8 @@ export class MapaCamasService { private camasHTTP: MapaCamasHTTP, private prestacionService: PrestacionesService, private pacienteService: PacienteService, - private maquinaEstadosHTTP: MaquinaEstadosHTTP + private maquinaEstadosHTTP: MaquinaEstadosHTTP, + private salaComunService: SalaComunService, ) { this.maquinaDeEstado$ = combineLatest( this.ambito2, @@ -235,10 +237,10 @@ export class MapaCamasService { private getCamasDisponiblesCama(camas: ISnapshot[], cama: ISnapshot) { let camasMismaUO = []; let camasDistintaUO = []; - if (cama.idCama) { + if (cama.id) { camas.map(c => { - if (c.estado === 'disponible') { - if (c.idCama !== cama.idCama) { + if (c.sala || c.estado === 'disponible') { + if (c.id !== cama.id) { if (c.unidadOrganizativa.conceptId === cama.unidadOrganizativa.conceptId) { camasMismaUO.push(c); } else { @@ -322,7 +324,7 @@ export class MapaCamasService { } if (tipoCama) { - camasFiltradas = camasFiltradas.filter((snap: ISnapshot) => snap.tipoCama.conceptId === tipoCama.conceptId); + camasFiltradas = camasFiltradas.filter((snap: ISnapshot) => (snap.tipoCama && snap.tipoCama.conceptId === tipoCama.conceptId)); } if (estado) { @@ -397,7 +399,7 @@ export class MapaCamasService { return combineLatest( this.ambito2, this.capa2, - this.selectedCama.pipe(filter(snap => !!snap.idCama)), + this.selectedCama.pipe(filter(snap => !!snap.id)), this.selectedPrestacion, this.view ).pipe( @@ -406,9 +408,9 @@ export class MapaCamasService { return this.camasHTTP.historial(ambito, capa, desde, hasta, { idCama: selectedCama.idCama }); } else if (type === 'internacion') { if (view === 'mapa-camas' && selectedCama.idInternacion) { - return this.camasHTTP.historial(ambito, capa, desde, hasta, { idInternacion: selectedCama.idInternacion, esMovimiento: true }); + return this.camasHTTP.historialInternacion(ambito, capa, desde, hasta, selectedCama.idInternacion); } else if (view === 'listado-internacion' && selectedPrestacion.id) { - return this.camasHTTP.historial(ambito, capa, desde, hasta, { idInternacion: selectedPrestacion.id, esMovimiento: true }); + return this.camasHTTP.historialInternacion(ambito, capa, desde, hasta, selectedPrestacion.id); } return of([]); } @@ -421,9 +423,17 @@ export class MapaCamasService { return this.camasHTTP.get(this.ambito, this.capa, fecha, idCama); } - save(data, fecha, esMovimiento = true): Observable { - data.esMovimiento = esMovimiento; - return this.camasHTTP.save(this.ambito, this.capa, fecha, data); + save(data, fecha, esMovimiento = true): Observable { + if (!data.sala) { + data.esMovimiento = esMovimiento; + return this.camasHTTP.save(this.ambito, this.capa, fecha, data); + } else { + if (data.estado === 'ocupada') { + return this.salaComunService.ingresarPaciente(data, fecha); + } else { + return this.salaComunService.egresarPaciente(data, fecha); + } + } } changeTime(cama, fechaOriginal, nuevaFecha, idInternacion, ambito: string = null, capa: string = null) { diff --git a/src/app/apps/rup/mapa-camas/sidebar/cama-detalle/cama-detalle.component.html b/src/app/apps/rup/mapa-camas/sidebar/cama-detalle/cama-detalle.component.html index cae9d51e17..55608aae86 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/cama-detalle/cama-detalle.component.html +++ b/src/app/apps/rup/mapa-camas/sidebar/cama-detalle/cama-detalle.component.html @@ -46,7 +46,8 @@ - + + @@ -89,7 +90,7 @@ - + \ No newline at end of file diff --git a/src/app/apps/rup/mapa-camas/sidebar/desocupar-cama/cambiar-cama.component.html b/src/app/apps/rup/mapa-camas/sidebar/desocupar-cama/cambiar-cama.component.html index b81e5215f8..2edd349b96 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/desocupar-cama/cambiar-cama.component.html +++ b/src/app/apps/rup/mapa-camas/sidebar/desocupar-cama/cambiar-cama.component.html @@ -9,7 +9,7 @@ diff --git a/src/app/apps/rup/mapa-camas/sidebar/desocupar-cama/cambiar-cama.component.ts b/src/app/apps/rup/mapa-camas/sidebar/desocupar-cama/cambiar-cama.component.ts index 8dcfbc1375..f76c4e67db 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/desocupar-cama/cambiar-cama.component.ts +++ b/src/app/apps/rup/mapa-camas/sidebar/desocupar-cama/cambiar-cama.component.ts @@ -64,26 +64,39 @@ export class CambiarCamaComponent implements OnInit, OnDestroy { } cambiarCama(camaActual, camaNueva, fecha) { - const camaDesocupada = { - _id: camaActual.idCama, + let camaDesocupada = { + _id: camaActual.id, estado: 'disponible', idInternacion: null, - paciente: null + paciente: null, + sala: camaActual.sala, }; - const camaOcupada = { - _id: camaNueva.idCama, + + let camaOcupada = { + _id: camaNueva.id, estado: camaActual.estado, idInternacion: camaActual.idInternacion, paciente: camaActual.paciente, - nota: camaActual.nota + nota: (!camaActual.sala) ? camaActual.nota : null, + sala: camaNueva.sala, }; + if (camaActual.sala) { + camaDesocupada = camaActual; + camaDesocupada.estado = 'disponible'; + } + + if (camaNueva.sala) { + camaOcupada = camaNueva; + camaOcupada.estado = 'ocupada'; + camaOcupada.paciente = camaActual.paciente; + camaOcupada.idInternacion = camaActual.idInternacion; + } if (this.cambiarUO) { camaOcupada['extras'] = { unidadOrganizativaOrigen: camaActual.unidadOrganizativa }; } - return forkJoin( this.mapaCamasService.save(camaOcupada, fecha), this.mapaCamasService.save(camaDesocupada, fecha) diff --git a/src/app/apps/rup/mapa-camas/sidebar/egreso/egresar-paciente.component.ts b/src/app/apps/rup/mapa-camas/sidebar/egreso/egresar-paciente.component.ts index 6dae5f4f5f..3927861655 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/egreso/egresar-paciente.component.ts +++ b/src/app/apps/rup/mapa-camas/sidebar/egreso/egresar-paciente.component.ts @@ -12,6 +12,7 @@ import { IMaquinaEstados } from '../../interfaces/IMaquinaEstados'; import { IPrestacion } from '../../../../../modules/rup/interfaces/prestacion.interface'; import { combineLatest, Subscription, Observable } from 'rxjs'; import { ListadoInternacionService } from '../../views/listado-internacion/listado-internacion.service'; +import { SalaComunService } from '../../views/sala-comun/sala-comun.service'; @Component({ selector: 'app-egresar-paciente', @@ -166,7 +167,7 @@ export class EgresarPacienteComponent implements OnInit, OnDestroy { }); } } - if (cama.idCama) { + if (cama.id) { this.cama = cama; this.fechaMin = moment(this.cama.fecha).add(1, 'm').toDate(); this.fecha = fecha; @@ -209,18 +210,29 @@ export class EgresarPacienteComponent implements OnInit, OnDestroy { egresoSimplificado(estado) { if ((this.prestacion && !this.prestacion.ejecucion.registros[1]) || !this.prestacion) { - const estadoPatch = { - _id: this.cama.idCama, - estado: estado, - idInternacion: null, - paciente: null, - extras: { + let estadoPatch = {}; + if (!this.cama.sala) { + estadoPatch = { + _id: this.cama.id, + estado: estado, + idInternacion: null, + paciente: null, + nota: null, + extras: { + egreso: true, + idInternacion: this.cama.idInternacion, + tipo_egreso: this.registro.valor.InformeEgreso.tipoEgreso.id + } + }; + } else { + this.cama.estado = estado; + this.cama.extras = { egreso: true, idInternacion: this.cama.idInternacion, tipo_egreso: this.registro.valor.InformeEgreso.tipoEgreso.id - }, - nota: null, - }; + }; + estadoPatch = this.cama; + } this.mapaCamasService.save(estadoPatch, this.registro.valor.InformeEgreso.fechaEgreso).subscribe(camaActualizada => { this.plex.toast('success', 'Prestacion guardada correctamente', 'Prestacion guardada', 100); @@ -232,7 +244,7 @@ export class EgresarPacienteComponent implements OnInit, OnDestroy { } this.onSave.emit(); }, (err1) => { - this.plex.info('danger', err1, 'Error al intentar desocupar la cama'); + this.plex.info('danger', err1, 'Error al egresar paciente!'); }); } } @@ -491,7 +503,7 @@ export class EgresarPacienteComponent implements OnInit, OnDestroy { // La cama este disponible en la fecha que la quiero usar, checkEstadoCama() { - this.mapaCamasService.get(this.fecha, this.cama.idCama).subscribe((cama) => { + this.mapaCamasService.get(this.fecha, this.cama.id).subscribe((cama) => { if (cama && cama.estado !== 'disponible') { if (!cama.idInternacion || (cama.idInternacion && cama.idInternacion !== this.prestacion.id)) { this.registro.valor.InformeEgreso.fechaEgreso = this.fechaEgresoOriginal; diff --git a/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/estado-servicio.component.html b/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/estado-servicio.component.html index cb2fceaf65..bec6afafa1 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/estado-servicio.component.html +++ b/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/estado-servicio.component.html @@ -1,4 +1,4 @@ - + {{fecha | date: 'dd/MM/yyyy'}} | {{fecha | date: 'HH:mm'}} @@ -16,12 +16,27 @@
- + -
+
+ + + +
+ + + + +
+
\ No newline at end of file diff --git a/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/estado-servicio.component.ts b/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/estado-servicio.component.ts index 9f4ca3e42e..1d35308d1e 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/estado-servicio.component.ts +++ b/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/estado-servicio.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; import { MapaCamasService } from '../../services/mapa-camas.service'; -import { Observable, Subscription, timer, of } from 'rxjs'; -import { map, tap, defaultIfEmpty, startWith } from 'rxjs/operators'; +import { Observable, Subscription, timer, of, from } from 'rxjs'; +import { map, tap, defaultIfEmpty, startWith, switchMap, filter, distinct, toArray } from 'rxjs/operators'; import { ISnapshot } from '../../interfaces/ISnapshot'; @Component({ @@ -19,6 +19,9 @@ export class EstadoServicioComponent implements OnInit, OnDestroy { private sub: Subscription; + salas$: Observable; + salasPaciente$: Observable; + constructor( public mapaCamasService: MapaCamasService, ) { } @@ -31,11 +34,31 @@ export class EstadoServicioComponent implements OnInit, OnDestroy { ); this.sub = this.mapaCamasService.snapshotFiltrado$.pipe( + map(camas => camas.filter(c => !c.sala && c.estado !== 'inactiva')), tap((snapshot) => { this.total = snapshot.length; this.camasXEstado = this.groupBy(snapshot, 'estado'); }) ).subscribe(); + + this.salas$ = this.mapaCamasService.snapshotFiltrado$.pipe( + switchMap((camas) => { + return from(camas).pipe( + filter(c => c.sala), + distinct(c => c.id), + toArray() + ); + }) + ); + + this.salasPaciente$ = this.mapaCamasService.snapshotFiltrado$.pipe( + switchMap((camas) => { + return from(camas).pipe( + filter(c => c.sala && !!c.paciente), + toArray() + ); + }) + ); } ngOnDestroy() { diff --git a/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/iconito-cama/icono-camita.component.html b/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/iconito-cama/icono-camita.component.html index f88977a970..79807cd854 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/iconito-cama/icono-camita.component.html +++ b/src/app/apps/rup/mapa-camas/sidebar/estado-servicio/iconito-cama/icono-camita.component.html @@ -5,7 +5,7 @@ {{cantidad}}
- Camas {{nombre}} + {{nombre}}
\ No newline at end of file diff --git a/src/app/apps/rup/mapa-camas/sidebar/ingreso/elegir-paciente.component.ts b/src/app/apps/rup/mapa-camas/sidebar/ingreso/elegir-paciente.component.ts index a258989c81..ca66058f20 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/ingreso/elegir-paciente.component.ts +++ b/src/app/apps/rup/mapa-camas/sidebar/ingreso/elegir-paciente.component.ts @@ -51,7 +51,7 @@ export class ElegirPacienteComponent implements OnInit, OnDestroy { let cama = null; this.snapshot.map((snap) => { if (snap.estado === 'ocupada') { - if (snap.idCama !== this.selectedCama.idCama) { + if (snap.id !== this.selectedCama.id) { if (snap.paciente.id === paciente.id) { cama = snap; } diff --git a/src/app/apps/rup/mapa-camas/sidebar/ingreso/ingresar-paciente.component.html b/src/app/apps/rup/mapa-camas/sidebar/ingreso/ingresar-paciente.component.html index 82700e5e29..cd7bb2b223 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/ingreso/ingresar-paciente.component.html +++ b/src/app/apps/rup/mapa-camas/sidebar/ingreso/ingresar-paciente.component.html @@ -35,7 +35,7 @@
diff --git a/src/app/apps/rup/mapa-camas/sidebar/ingreso/ingresar-paciente.component.ts b/src/app/apps/rup/mapa-camas/sidebar/ingreso/ingresar-paciente.component.ts index aadad22f07..097d534f49 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/ingreso/ingresar-paciente.component.ts +++ b/src/app/apps/rup/mapa-camas/sidebar/ingreso/ingresar-paciente.component.ts @@ -16,6 +16,8 @@ import { ObjectID } from 'bson'; import { ListadoInternacionService } from '../../views/listado-internacion/listado-internacion.service'; import { Auth } from '@andes/auth'; import { IngresoPacienteService } from './ingreso-paciente-workflow/ingreso-paciente-workflow.service'; +import { SalaComunService } from '../../views/sala-comun/sala-comun.service'; +import { IOrganizacion } from '../../../../../interfaces/IOrganizacion'; @Component({ selector: 'app-ingresar-paciente', @@ -83,6 +85,7 @@ export class IngresarPacienteComponent implements OnInit, OnDestroy { public mapaCamasService: MapaCamasService, private listadoInternacionService: ListadoInternacionService, private auth: Auth, + private salaComunService: SalaComunService, @Optional() private ingresoPacienteService: IngresoPacienteService ) { } @@ -165,9 +168,9 @@ export class IngresarPacienteComponent implements OnInit, OnDestroy { } } - if (cama.idCama) { + if (cama.id) { this.cama = cama; - if (cama.estado === 'ocupada') { + if (cama.estado === 'ocupada' && !cama.sala) { this.paciente = cama.paciente; } if (this.informeIngreso.especialidades.length === 0) { @@ -192,15 +195,15 @@ export class IngresarPacienteComponent implements OnInit, OnDestroy { let cama = null; snapshot.map(snap => { - if (snap.estado === 'ocupada') { + if (snap.estado === 'ocupada' && !snap.sala) { if (snap.paciente.id === this.paciente.id) { if (!this.cama) { cama = snap; - } else if (this.cama.idCama !== snap.idCama) { + } else if (this.cama.id !== snap.id) { cama = snap; } } - } else if (snap.estado === 'disponible') { + } else if (snap.estado === 'disponible' || snap.sala) { camasDisponibles.push(snap); } }); @@ -211,7 +214,6 @@ export class IngresarPacienteComponent implements OnInit, OnDestroy { en la cama ${cama.nombre} en ${cama.sectores[cama.sectores.length - 1].nombre} de la unidad organizativa ${cama.unidadOrganizativa.term}.`, 'Paciente ya internado'); } - return camasDisponibles; }) ); @@ -338,13 +340,23 @@ export class IngresarPacienteComponent implements OnInit, OnDestroy { } else { delete this.cama['sectorName']; this.cama.extras = { ingreso: true }; - this.mapaCamasService.save(this.cama, this.informeIngreso.fechaIngreso).subscribe(camaActualizada => { - this.plex.info('success', 'Paciente internado'); - this.mapaCamasService.setFecha(this.informeIngreso.fechaIngreso); - this.onSave.emit(); - }, (err1) => { - this.plex.info('danger', err1, 'Error al intentar ocupar la cama'); - }); + if (!this.cama.sala) { + this.mapaCamasService.save(this.cama, this.informeIngreso.fechaIngreso).subscribe(camaActualizada => { + this.plex.info('success', 'Paciente internado'); + this.mapaCamasService.setFecha(this.informeIngreso.fechaIngreso); + this.onSave.emit(); + }, (err1) => { + this.plex.info('danger', err1, 'Error al ingresar paciente'); + }); + } else { + this.salaComunService.ingresarPaciente(this.cama, this.informeIngreso.fechaIngreso).subscribe(camaActualizada => { + this.plex.info('success', 'Paciente internado'); + this.mapaCamasService.setFecha(this.informeIngreso.fechaIngreso); + this.onSave.emit(); + }, (err1) => { + this.plex.info('danger', err1, 'Error al ingresar paciente'); + }); + } } } @@ -462,7 +474,7 @@ export class IngresarPacienteComponent implements OnInit, OnDestroy { checkEstadoCama() { this.checkMovimientos(); - this.mapaCamasService.get(this.informeIngreso.fechaIngreso, this.cama.idCama).subscribe((cama) => { + this.mapaCamasService.get(this.informeIngreso.fechaIngreso, this.cama.id).subscribe((cama) => { if (cama && cama.estado !== 'disponible') { if (!cama.idInternacion || (cama.idInternacion && cama.idInternacion !== this.prestacion.id)) { this.informeIngreso.fechaIngreso = this.fechaIngresoOriginal; diff --git a/src/app/apps/rup/mapa-camas/sidebar/movimientos-internacion/movimientos-internacion.component.html b/src/app/apps/rup/mapa-camas/sidebar/movimientos-internacion/movimientos-internacion.component.html index 0031c82086..4f146557a7 100644 --- a/src/app/apps/rup/mapa-camas/sidebar/movimientos-internacion/movimientos-internacion.component.html +++ b/src/app/apps/rup/mapa-camas/sidebar/movimientos-internacion/movimientos-internacion.component.html @@ -53,9 +53,12 @@ - + {{ movimiento.unidadOrganizativa.term }} + + {{ movimiento.unidadOrganizativas[0].term }} + diff --git a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/filtros-cama/filtros-camas.component.ts b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/filtros-cama/filtros-camas.component.ts index 06b302f52f..3f92637978 100644 --- a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/filtros-cama/filtros-camas.component.ts +++ b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/filtros-cama/filtros-camas.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { MapaCamasService } from '../../../services/mapa-camas.service'; -import { Observable } from 'rxjs'; +import { Observable, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; function arrayToSet(array, key, itemFn) { @@ -59,11 +59,11 @@ export class FiltrosCamasComponent implements OnInit { ); this.tipoCamaList$ = this.mapaCamasService.snapshot$.pipe( - map((camas) => arrayToSet(camas, 'conceptId', (item) => item.tipoCama)) + map((camas) => arrayToSet(camas.filter( snap => !snap.sala), 'conceptId', (item) => item.tipoCama)) ); this.equipamientoList$ = this.mapaCamasService.snapshot$.pipe( - map((camas) => arrayToSet(camas, 'conceptId', ((item) => item.equipamiento ? item.equipamiento : []))), + map((camas) => arrayToSet(camas.filter( snap => !snap.sala), 'conceptId', ((item) => item.equipamiento ? item.equipamiento : []))), ); this.estadoList$ = this.mapaCamasService.snapshot$.pipe( diff --git a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/item-cama/item-cama.component.html b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/item-cama/item-cama.component.html index 40df61aec2..fb84e464a7 100644 --- a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/item-cama/item-cama.component.html +++ b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/item-cama/item-cama.component.html @@ -27,18 +27,21 @@ - - {{estadoCama?.label}} - - - O2 - - - R - - - M - + + {{estadoCama?.label}} + + + + + + O2 + + + R + + + M + diff --git a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/item-cama/item-cama.component.ts b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/item-cama/item-cama.component.ts index d453457e69..9c66569cc8 100644 --- a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/item-cama/item-cama.component.ts +++ b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/item-cama/item-cama.component.ts @@ -18,7 +18,7 @@ export class ItemCamaComponent implements OnChanges { @Input() estadoCama: any; @Output() accionCama = new EventEmitter(); - canEdit = this.auth.check('internacion:cama:edit'); + canEdit = false; canMovimientos = this.auth.check('internacion:movimientos'); public equipos = { @@ -38,6 +38,8 @@ export class ItemCamaComponent implements OnChanges { } ngOnChanges() { + this.canEdit = this.cama.sala ? this.auth.check('internacion:sala:edit') : this.auth.check('internacion:cama:edit'); + this.equipos = { aporteOxigeno: false, respirador: false, @@ -61,7 +63,11 @@ export class ItemCamaComponent implements OnChanges { } goTo() { - this.router.navigate([`/internacion/cama/${this.cama._id}`]); + if (this.cama.sala) { + this.router.navigate([`/internacion/sala-comun/${this.cama.id}`]); + } else { + this.router.navigate([`/internacion/cama/${this.cama.id}`]); + } } accion(relacion, $event) { diff --git a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/mapa-camas-capa.component.html b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/mapa-camas-capa.component.html index 0fb7ee9f7d..53a1fae0c3 100644 --- a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/mapa-camas-capa.component.html +++ b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/mapa-camas-capa.component.html @@ -16,9 +16,12 @@ - + + + @@ -63,8 +66,9 @@ + [permisoIngreso]="permisoIngreso" [permisoBloqueo]="permisoBloqueo" + (accionCama)="selectCama(cama, $event)" (click)="verDetalle(cama, selectedCama)" + [class.invert]="(cama.estado !== 'ocupada') ? selectedCama.id === cama.id : selectedCama.idInternacion && cama.idInternacion === selectedCama.idInternacion"> diff --git a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/mapa-camas-capa.component.ts b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/mapa-camas-capa.component.ts index d0b2f2b4cf..6a16fa81a3 100644 --- a/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/mapa-camas-capa.component.ts +++ b/src/app/apps/rup/mapa-camas/views/mapa-camas-capa/mapa-camas-capa.component.ts @@ -20,7 +20,7 @@ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; }) export class MapaCamasCapaComponent implements OnInit, OnDestroy { - @ViewChild(CdkVirtualScrollViewport, {static: false}) + @ViewChild(CdkVirtualScrollViewport, { static: false }) public viewPort: CdkVirtualScrollViewport; capa$: Observable; @@ -52,14 +52,18 @@ export class MapaCamasCapaComponent implements OnInit, OnDestroy { public permisoIngreso = false; public permisoBloqueo = false; public permisoCenso = false; - public permisoCrearCama = false; + public permisoCrearCama = this.auth.check('internacion:cama:create'); + public permisoCrearSala = this.auth.check('internacion:sala:create'); + + itemsCrearDropdown = []; + public get inverseOfTranslation(): string { if (!this.viewPort || !this.viewPort['_renderedContentOffset']) { - return '-0px'; + return '-0px'; } let offset = this.viewPort['_renderedContentOffset']; return `-${offset}px`; - } + } constructor( public auth: Auth, @@ -111,14 +115,25 @@ export class MapaCamasCapaComponent implements OnInit, OnDestroy { this.permisoIngreso = this.auth.check('internacion:ingreso'); this.permisoBloqueo = this.auth.check('internacion:bloqueo'); this.permisoCenso = this.auth.check('internacion:censo'); - this.permisoCrearCama = this.auth.check('internacion:cama:create'); + + if (this.permisoCrearCama) { + this.itemsCrearDropdown.push( + { label: 'CAMA', route: `/internacion/cama` } + ); + } + + if (this.permisoCrearSala) { + this.itemsCrearDropdown.push( + { label: 'SALA COMUN', route: `/internacion/sala-comun` } + ); + } this.mapaCamasService.setView('mapa-camas'); this.ambito = this.mapaCamasService.ambito; this.selectedCama$ = this.mapaCamasService.selectedCama.map((cama) => { - if (cama.idCama && !this.accion) { + if (cama.id && !this.accion) { this.accion = 'verDetalle'; } return cama; @@ -139,7 +154,9 @@ export class MapaCamasCapaComponent implements OnInit, OnDestroy { } this.camas = this.mapaCamasService.snapshotOrdenado$.pipe( - map(snapshots => snapshots.filter(snap => snap.estado !== 'inactiva')) + map(snapshots => { + return snapshots.filter(snap => snap.estado !== 'inactiva'); + }) ); } @@ -194,7 +211,7 @@ export class MapaCamasCapaComponent implements OnInit, OnDestroy { } verDetalle(cama: ISnapshot, selectedCama: ISnapshot) { - if (!selectedCama.idCama || selectedCama.idCama !== cama.idCama) { + if (!selectedCama.id || selectedCama.id !== cama.id) { this.mapaCamasService.select(cama); this.accion = 'verDetalle'; } else { diff --git a/src/app/apps/rup/mapa-camas/views/sala-comun/sala-comun.component.html b/src/app/apps/rup/mapa-camas/views/sala-comun/sala-comun.component.html new file mode 100644 index 0000000000..66ab9a1296 --- /dev/null +++ b/src/app/apps/rup/mapa-camas/views/sala-comun/sala-comun.component.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + + + + + + + + + + + +
+
+ + +
+ + +
+
+
\ No newline at end of file diff --git a/src/app/apps/rup/mapa-camas/views/sala-comun/sala-comun.component.ts b/src/app/apps/rup/mapa-camas/views/sala-comun/sala-comun.component.ts new file mode 100644 index 0000000000..85490ada91 --- /dev/null +++ b/src/app/apps/rup/mapa-camas/views/sala-comun/sala-comun.component.ts @@ -0,0 +1,120 @@ +import { Component, OnInit } from '@angular/core'; +import { Location } from '@angular/common'; +import { Auth } from '@andes/auth'; +import { Plex } from '@andes/plex'; +import { SalaComunService } from './sala-comun.service'; +import { ActivatedRoute } from '@angular/router'; +import { ISalaComun } from '../../interfaces/ISalaComun'; +import { Observable } from 'rxjs'; +import { MapaCamasService } from '../../services/mapa-camas.service'; +import { OrganizacionService } from '../../../../../services/organizacion.service'; +import { cache } from '@andes/shared'; +import { map, pluck } from 'rxjs/operators'; +import { SnomedExpression } from '../../../../mitos'; +import { IOrganizacion } from '../../../../../interfaces/IOrganizacion'; + +@Component({ + selector: 'app-sala-comun', + templateUrl: './sala-comun.component.html', +}) + +export class SalaComunComponent implements OnInit { + public expr = SnomedExpression; + + public sectores$: Observable; + public mapaSectores$: Observable; + public unidadesOrganizativas$: Observable; + public organizacion$: Observable; + public organizacion; + public salaComun: ISalaComun = { + id: null, + nombre: null, + organizacion: null, + unidadOrganizativas: null, + ambito: null, + estado: null, + sectores: null, + }; + + public puedeEliminar = false; + public puedeEditar = true; + public disabled = false; + + constructor( + public auth: Auth, + private plex: Plex, + private location: Location, + private route: ActivatedRoute, + private organizacionService: OrganizacionService, + private salaComunService: SalaComunService, + ) { } + + ngOnInit() { + this.plex.updateTitle([{ + route: '/inicio', + name: 'Andes' + }, { + name: 'Internacion' + }, { + name: 'Sala Comun' + }]); + + this.organizacion = this.auth.organizacion; + this.getOrganizacion(); + this.getSala(); + } + + getOrganizacion() { + this.organizacion$ = this.organizacionService.getById(this.auth.organizacion.id).pipe( + cache() + ); + this.sectores$ = this.organizacion$.pipe( + map(organizacion => { + return this.organizacionService.getFlatTree(organizacion); + }) + ); + this.mapaSectores$ = this.organizacion$.pipe(pluck('mapaSectores')); + this.unidadesOrganizativas$ = this.organizacion$.pipe(pluck('unidadesOrganizativas')); + } + + getSala() { + const id = this.route.snapshot.params.id; + if (id) { + if (!this.auth.check('internacion:sala:edit')) { + this.puedeEditar = false; + } + if (this.auth.check('internacion:sala:delete')) { + this.puedeEliminar = true; + } + this.salaComunService.get(id).subscribe(salaComun => { + this.salaComun = salaComun; + }); + } else { + if (!this.auth.check('internacion:sala:create')) { + this.puedeEditar = false; + } + this.salaComun.capacidad = null; + } + } + + save(valid) { + if (!valid.formValid) { + this.plex.info('danger', 'Revisar los datos ingresados'); + return; + } + this.disabled = true; + this.salaComunService.save(this.organizacion, this.salaComun).subscribe(salaComun => { + this.disabled = false; + this.plex.info('success', 'La sala fue guardada exitosamente', 'Sala guardada!'); + this.volver(); + }); + } + + onSectorSelect($event, organizacion) { + this.salaComun.sectores = this.organizacionService.getRuta(organizacion, $event.value); + } + + volver() { + this.location.back(); + } +} diff --git a/src/app/apps/rup/mapa-camas/views/sala-comun/sala-comun.service.ts b/src/app/apps/rup/mapa-camas/views/sala-comun/sala-comun.service.ts new file mode 100644 index 0000000000..2621b4666c --- /dev/null +++ b/src/app/apps/rup/mapa-camas/views/sala-comun/sala-comun.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; +import { ISalaComun } from '../../interfaces/ISalaComun'; +import { Server } from '@andes/shared'; +import { Observable } from 'rxjs'; +import { IOrganizacion } from '../../../../../interfaces/IOrganizacion'; +import { ISnapshot } from '../../interfaces/ISnapshot'; + +@Injectable() +export class SalaComunService { + private url = '/modules/rup/internacion'; + + constructor( + private server: Server + + ) { } + + get(idSala: string): Observable { + return this.server.get(`${this.url}/sala-comun/${idSala}`); + } + + save(organizacion: IOrganizacion, salaComun: ISalaComun): Observable { + if (salaComun.id) { + return this.server.patch(`${this.url}/sala-comun/${salaComun.id}`, { ...salaComun, organizacion }); + } else { + return this.server.post(`${this.url}/sala-comun`, { ...salaComun, organizacion }); + } + } + + ingresarPaciente(salaComun: ISnapshot, fecha: Date): Observable { + return this.server.post(`${this.url}/sala-comun/${salaComun.id}/patients`, { ...salaComun, fecha }); + } + + egresarPaciente(salaComun: ISnapshot, fecha: Date): Observable { + return this.server.patch(`${this.url}/sala-comun/${salaComun.id}/patients`, { ...salaComun, fecha }); + } +}