Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/app/components/top/solicitudes/formNuevaSolicitud.html
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<plex-title [size]="size? size : ''" main titulo="NUEVA SOLICITUD DE {{tipoSolicitud.toUpperCase()}}">
<plex-button [size]="size? size : ''" class="float-left mr-1" position="left" type="danger" label="Cancelar"
(click)="cancelar()">
<plex-button size="sm" position="left" class="mr-1" type="success" icon="check" tooltip="Guardar"
(click)="confirmGuardar($event)" [autodisabled]="true" [validateForm]="form">
</plex-button>
<plex-button size="sm" position="right" type="danger" icon="close" tooltip="Cerrar" (click)="cancelar()">
</plex-button>
<plex-button [size]="size? size : ''" position="right" class="float-right mr-1" type="success" label="Guardar"
(click)="confirmGuardar($event)" [autodisabled]="true" [validateForm]="form"> </plex-button>
</plex-title>
<form #form="ngForm">
<!-- SOLICITUD ENTRADA -->
Expand Down Expand Up @@ -107,7 +107,7 @@
</ng-container>
<!-- /SOLICITUD SALIDA -->
<!-- Adjuntar Archivos -->
<plex-title [size]="size? size : ''" titulo="Cargar adjuntos"></plex-title>
<plex-title titulo="Cargar adjuntos" size="md"></plex-title>
<plex-wrapper>
<upload-file label="Adjuntar archivo" (onUpload)="onUpload($event)" [extensiones]="extensions" [modulo]="'top'">
</upload-file>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ export class CalendarioDia {
// Para enmarcar los días correspondientes en el calendario
if (unaAgenda.estado === 'disponible' || unaAgenda.estado === 'publicada') {
if (tipoTurno === 'gestion') {
if (this.gestionDisponibles > 0 && !autocitado) {
if ((this.gestionDisponibles > 0 || this.programadosDisponibles > 0) && !autocitado) {
this.estado = 'disponible';
hayTurnosDisponibles = true;
} else if (this.profesionalDisponibles > 0 && autocitado) {
Expand Down
130 changes: 107 additions & 23 deletions src/app/components/turnos/dar-turnos/dar-turnos.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import { TurnoService } from './../../../services/turnos/turno.service';
import { EstadosAgenda } from './../enums';
import { CalendarioDia } from './calendario-dia.class';
import { EstadosDarTurnos } from './enums';
import { IPrestacion } from 'src/app/modules/rup/interfaces/prestacion.interface';

@Component({
selector: 'dar-turnos',
Expand Down Expand Up @@ -183,6 +184,7 @@ export class DarTurnosComponent implements OnInit {
prestacionesAlternativa;
turnosFuturos = [];
modalTurnosRepetidos = false;
origen = '';

// Muestra sólo las agendas a las que se puede asignar el turno (oculta las "con/sin alternativa")
mostrarNoDisponibles = false;
Expand All @@ -197,6 +199,7 @@ export class DarTurnosComponent implements OnInit {
private eventoProfesional: any = null;
public mostrarCalendario = false;
public condicionLlaveAgenda: any;
private solicitudesPendientes: IPrestacion[];

constructor(
public serviceProfesional: ProfesionalService,
Expand All @@ -206,7 +209,7 @@ export class DarTurnosComponent implements OnInit {
public servicePaciente: PacienteService,
public servicioCarpetaPaciente: CarpetaPacienteService,
public conceptosTurneablesService: ConceptosTurneablesService,
public servicioPrestacionPaciente: PrestacionesService,
public prestacionesService: PrestacionesService,
public servicioOS: ObraSocialService,
public plex: Plex,
public auth: Auth,
Expand All @@ -219,16 +222,27 @@ export class DarTurnosComponent implements OnInit {
this.hoy = new Date();
this.autorizado = this.auth.getPermissions('turnos:darTurnos:?').length > 0;
this.puedeDarSobreturno = this.auth.check('turnos:puntoInicio:darSobreturno');
this.permisos = this.auth.getPermissions('turnos:darTurnos:prestacion:?');
this.opciones.fecha = moment().toDate();

const paramsSolicitudes = {
idPaciente: this._pacienteSeleccionado?.id,
solicitudDesde: moment().subtract(1, 'years').toDate(),
solicitudHasta: moment().toDate(),
organizacion: this.organizacion.id,
estados: 'pendiente'
};
this.prestacionesService.getSolicitudes(paramsSolicitudes).subscribe(solicitudes => {
this.solicitudesPendientes = solicitudes.filter(s => !s.solicitud.turno); // solicitudes sin turno asignado
});

this.carpetaEfector = {
organizacion: {
_id: this.organizacion.id,
nombre: this.organizacion.nombre
},
nroCarpeta: ''
};
this.permisos = this.auth.getPermissions('turnos:darTurnos:prestacion:?');

if (this._pacienteSeleccionado) {
this.pacientesSearch = false;
Expand Down Expand Up @@ -358,6 +372,41 @@ export class DarTurnosComponent implements OnInit {
this.prestacionSeleccionada = this.opciones.tipoPrestacion;
this.profesionalSeleccionado = this.opciones.profesional;

if (this.solicitudesPendientes?.length && this.router.url.includes('citas/punto-inicio')) {
if (this.prestacionSeleccionada) {
let solicitudPendiente = this.solicitudesPendientes.filter(s => s.solicitud.tipoPrestacion.id === this.prestacionSeleccionada.id);
if (solicitudPendiente.length) {
return new Promise(resolve => { // promise para cortar el flujo hasta que se responda el alert
this.plex.confirm(
'El paciente tiene una solicitud pendiente para esta prestación. ¿Desea asignar un turno para resolverla?',
'Turno para solicitud pendiente',
'Turno para solicitud',
'Turno programado',
'success',
'info')
.then(respuesta => {
if (respuesta) {
/* caso especial para pacientes con solicitudes aún no resueltas que intentan sacar un turno directo ..
buscamos solicitudes en estado 'pendiente' para la prestación seleccionada */
if (solicitudPendiente.length && this.profesionalSeleccionado) {
solicitudPendiente = solicitudPendiente.filter(s => s.solicitud.profesional?.id === this.profesionalSeleccionado.id);
}
if (solicitudPendiente.length) {
this.solicitudPrestacion = solicitudPendiente[0];
this.tipoPrestacionesPermitidas = this.solicitudPrestacion.solicitud.tipoPrestacion;
}
}
});
return resolve(null);
});
}
} else {
// a este punto solo se llega limpiando el campo de tipo prestacion, dando un turno por ventanilla a un paciente con solicitudes pendientes
this.solicitudPrestacion = null;
this.tipoPrestacionesPermitidas = null;
}
}

const search = {
'tipoPrestacion': this.opciones.tipoPrestacion ? this.opciones.tipoPrestacion : null,
'profesional': this.opciones.profesional ? this.opciones.profesional : null,
Expand Down Expand Up @@ -407,6 +456,59 @@ export class DarTurnosComponent implements OnInit {
}
}


/* Filtra las agendas a mostrar en el calendario segun se acceda desde el listado de pacientes
o el de solicitudes.
*/
filtrarSegunOrigen(): IAgenda[] {
let arrAgendas: IAgenda[] = [];
this.agendas.forEach(agenda => {

const delDia = agenda.horaInicio >= moment().startOf('day').toDate() && agenda.horaInicio <= moment().endOf('day').toDate();
// por estados
const publicada = agenda.estado === 'publicada';
const disponible = agenda.estado === 'disponible';
const esGestion = this.tipoTurno === 'gestion';
// por tipo
const dinamicaDelDiaConCupoDisponible = agenda.dinamica && delDia && ((agenda as any).cupo > 0 || agenda.cupo === -1) && !esGestion;
const delDiaConTurnosDisponibles = (agenda.turnosRestantesDelDia + agenda.turnosRestantesProgramados) > 0 && delDia;
const programadaConTurnosDisponibles = agenda.turnosRestantesProgramados > 0 && !delDia;
const autocitadoConTurnosDisponibles = this.autocitado && agenda.turnosRestantesProfesional > 0;
const llaveConTurnosDisponibles = !this.autocitado && agenda.turnosRestantesGestion > 0;
// condiciones
const accesoDirectoConTurnosDisponibles = (!esGestion || this.desdeDemanda) && ((delDiaConTurnosDisponibles && this.hayTurnosEnHorario(agenda)) || programadaConTurnosDisponibles);
const gestionConTurnosDisponibles = esGestion && (autocitadoConTurnosDisponibles || llaveConTurnosDisponibles);
const agendaDinamicaOconLlave = (publicada && accesoDirectoConTurnosDisponibles) ||
((publicada || disponible) && (gestionConTurnosDisponibles || dinamicaDelDiaConCupoDisponible || agenda.condicionLlave));

if (this.solicitudPrestacion?.id && this.router.url.includes('citas/punto-inicio')) { // ventanilla citas, dando turno a paciente con solicitud pendiente
// Verificamos si existen agendas con llave y limpiamos el array (por si existen agendas programadas y del dia).
if (agendaDinamicaOconLlave) {
if (arrAgendas.length && (arrAgendas[arrAgendas.length - 1].turnosRestantesDelDia > 0 || arrAgendas[arrAgendas.length - 1].turnosRestantesProgramados > 0)) {
arrAgendas = [];
}
arrAgendas.push(agenda);
// Verificamos si existen agendas con turnos programados y limpiamos el array (por si existen agendas programadas)
} else if (programadaConTurnosDisponibles) {
if (arrAgendas.length && arrAgendas[arrAgendas.length - 1].turnosRestantesDelDia > 0) {
arrAgendas = [];
}
arrAgendas.push(agenda);
} else if (delDiaConTurnosDisponibles) {
arrAgendas.push(agenda);
}
} else { // ventanilla citas (turno común) o desde listado de TOP
const cond = (publicada && accesoDirectoConTurnosDisponibles) ||
((publicada || disponible) && (gestionConTurnosDisponibles || dinamicaDelDiaConCupoDisponible || agenda.condicionLlave));
if (cond) {
arrAgendas.push(agenda);
}
}
});
return arrAgendas;
}


actualizar() {
if (this._solicitudPrestacion && !this.tipoPrestacionesPermitidas) {
this.opciones.tipoPrestacion = this._solicitudPrestacion.solicitud.tipoPrestacion;
Expand Down Expand Up @@ -470,26 +572,8 @@ export class DarTurnosComponent implements OnInit {

// Por defecto no se muestran las agendas que no tienen turnos disponibles
if (!this.mostrarNoDisponibles) {
this.agendas = this.agendas.filter(agenda => {
const delDia = agenda.horaInicio >= moment().startOf('day').toDate() && agenda.horaInicio <= moment().endOf('day').toDate();
// por estados
const publicada = agenda.estado === 'publicada';
const disponible = agenda.estado === 'disponible';
const esGestion = this.tipoTurno === 'gestion';
// por tipo
const dinamicaDelDiaConCupoDisponible = agenda.dinamica && delDia && ((agenda as any).cupo > 0 || agenda.cupo === -1) && !esGestion;
const delDiaConTurnosDisponibles = (agenda.turnosRestantesDelDia + agenda.turnosRestantesProgramados) > 0 && delDia;
const programadaConTurnosDisponibles = agenda.turnosRestantesProgramados > 0 && !delDia;
const autocitadoConTurnosDisponibles = this.autocitado && agenda.turnosRestantesProfesional > 0;
const llaveConTurnosDisponibles = !this.autocitado && agenda.turnosRestantesGestion > 0;
// condiciones
const accesoDirectoConTurnosDisponibles = (!esGestion || this.desdeDemanda) && ((delDiaConTurnosDisponibles && this.hayTurnosEnHorario(agenda)) || programadaConTurnosDisponibles);
const gestionConTurnosDisponibles = esGestion && (autocitadoConTurnosDisponibles || llaveConTurnosDisponibles);

const cond = (publicada && accesoDirectoConTurnosDisponibles) ||
((publicada || disponible) && (gestionConTurnosDisponibles || dinamicaDelDiaConCupoDisponible || agenda.condicionLlave));
return cond;
});
// filtramos agendas a mostrar segun el origen de la dación de turno
this.agendas = this.filtrarSegunOrigen();
}
// Ordena las Agendas por fecha/hora de inicio
this.agendas = this.agendas.sort((a, b) => {
Expand Down Expand Up @@ -1151,7 +1235,7 @@ export class DarTurnosComponent implements OnInit {
op: 'asignarTurno',
idTurno: this.turno.id
};
this.servicioPrestacionPaciente.patch(this._solicitudPrestacion.id, params).subscribe(prestacion => {
this.prestacionesService.patch(this._solicitudPrestacion.id, params).subscribe(prestacion => {
this.volverValidacion.emit(prestacion);
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import { Component, Input, OnInit, Output, EventEmitter, HostBinding, Pipe, PipeTransform } from '@angular/core';
import { Component, Input, OnInit, Output, EventEmitter, HostBinding } from '@angular/core';
import { Router } from '@angular/router';
import { Auth } from '@andes/auth';
import { Plex } from '@andes/plex';
import { PrestacionesService } from '../../../../modules/rup/services/prestaciones.service';

// Interfaces
import { IPaciente } from '../../../../core/mpi/interfaces/IPaciente';
import { IPrestacion } from 'src/app/modules/rup/interfaces/prestacion.interface';

@Component({
Expand All @@ -32,7 +30,7 @@ export class ListaSolicitudTurnoVentanillaComponent implements OnInit {

public autorizado = false;
public solicitudesPrestaciones = [];
showCargarSolicitud = false;
public showCargarSolicitud = false;
public tipoSolicitud = 'entrada';
public itemsDropdown = [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@

</td>
<td>
<plex-button *ngIf="puedeDarTurno(prestacion)" type="info" size="sm"
<plex-button *ngIf="puedeDarTurno(prestacion)" type="success" size="sm"
icon="calendar-plus" tooltip="Dar turno" tooltipPosition="left"
(click)="darTurno(prestacion)">
</plex-button>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@



<form-nueva-solicitud [paciente]="paciente" size="sm" [tipoSolicitud]="tipoSolicitud" (operacionFinalizada)="returnForm()">
</form-nueva-solicitud>
<form-nueva-solicitud [paciente]="paciente" size="sm" [tipoSolicitud]="tipoSolicitud"
(operacionFinalizada)="returnForm()">
</form-nueva-solicitud>