public IMDResponse <List <EntColaborador> > CGetColaborador([FromUri] int?piIdColaborador = null, [FromUri] int?piIdTipoDoctor = null, [FromUri] int?piIdEspecialidad = null, [FromUri] int?piIdUsuarioCGU = null)
        {
            IMDResponse <List <EntColaborador> > response = new IMDResponse <List <EntColaborador> >();

            string metodo = nameof(this.CGetColaborador);

            logger.Info(IMDSerialize.Serialize(67823458476445, $"Inicia {metodo}([FromUri]int? piIdColaborador = null, [FromUri]int? piIdTipoDoctor = null, [FromUri]int? piIdEspecialidad = null, [FromUri]int? piIdUsuarioCGU = null)", piIdColaborador, piIdTipoDoctor, piIdEspecialidad, piIdUsuarioCGU));

            try
            {
                BusColaborador busColaborador = new BusColaborador();
                response = busColaborador.BGetColaborador(piIdColaborador, piIdTipoDoctor, piIdEspecialidad, piIdUsuarioCGU);
            }
            catch (Exception ex)
            {
                response.Code    = 67823458477222;
                response.Message = "Ocurrió un error inesperado en el servicio al consultar los colaboradores.";

                logger.Error(IMDSerialize.Serialize(67823458477222, $"Error en {metodo}([FromUri]int? piIdColaborador = null, [FromUri]int? piIdTipoDoctor = null, [FromUri]int? piIdEspecialidad = null, [FromUri]int? piIdUsuarioCGU = null): {ex.Message}", piIdColaborador, piIdTipoDoctor, piIdEspecialidad, piIdUsuarioCGU, ex, response));
            }
            return(response);
        }
Esempio n. 2
0
        /// <summary>
        /// Crea o busca la consulta para un paciente dependiendo del tipo de colaborador basandose en el folio proporcionado
        /// </summary>
        /// <param name="iIdColaborador"></param>
        /// <param name="sFolio"></param>
        /// <param name="iIdUsuarioMod"></param>
        /// <returns></returns>
        public IMDResponse <EntCallCenter> BAccesoConsulta(int iIdColaborador, string sFolio, int iIdUsuarioMod)
        {
            IMDResponse <EntCallCenter> response = new IMDResponse <EntCallCenter>();

            string metodo = nameof(this.BAccesoConsulta);

            logger.Info(IMDSerialize.Serialize(67823458513741, $"Inicia {metodo}(int iIdColaborador, string sFolio, int iIdUsuarioMod)", iIdColaborador, sFolio, iIdUsuarioMod));

            try
            {
                EntCallCenter entCallCenter = new EntCallCenter();

                //Obtener info de colaborador
                IMDResponse <List <EntColaborador> > resGetColaborador = busColaborador.BGetColaborador(piIdColaborador: iIdColaborador);
                if (resGetColaborador.Code != 0)
                {
                    return(resGetColaborador.GetResponse <EntCallCenter>());
                }
                if (resGetColaborador.Result.Count != 1)
                {
                    response.Code    = -88793457892374;
                    response.Message = "No se encontró la información del colaborador.";
                    return(response);
                }

                entCallCenter.entColaborador = resGetColaborador.Result.First();

                //Obtener info del folio
                IMDResponse <List <EntFolioReporte> > resGetFolio = busFolio.BGetFolios(psFolio: sFolio, pbActivo: null, pbBaja: null);
                if (resGetFolio.Code != 0)
                {
                    return(resGetFolio.GetResponse <EntCallCenter>());
                }
                if (resGetFolio.Result.Count != 1)
                {
                    response.Code    = -23459710761984;
                    response.Message = "No se encontró el folio solicitado.";
                    return(response);
                }

                entCallCenter.entFolio = resGetFolio.Result.First();

                if (entCallCenter.entFolio.dtFechaVencimiento != null)
                {
                    if (DateTime.Now > entCallCenter.entFolio.dtFechaVencimiento)
                    {
                        response.Code    = -9776259868345;
                        response.Message = $"El folio expiró el {entCallCenter.entFolio.dtFechaVencimiento?.ToString("dd/MM/yyyy")} a las {entCallCenter.entFolio.dtFechaVencimiento?.ToString("hh:mm tt")}";
                        return(response);
                    }
                }

                //Obtener información del paciente
                IMDResponse <List <EntPaciente> > resGetPaciente = busPaciente.BGetPacientes(piIdFolio: entCallCenter.entFolio.iIdFolio);
                if (resGetPaciente.Code != 0)
                {
                    return(resGetPaciente.GetResponse <EntCallCenter>());
                }

                if (resGetPaciente.Result.Count != 1)
                {
                    response.Code    = -2345771987764112;
                    response.Message = "No se encontró información del paciente.";
                    return(response);
                }

                entCallCenter.entPaciente = resGetPaciente.Result.First();

                //Validar tipo de colaborador
                if (entCallCenter.entColaborador.iIdTipoDoctor == (int)EnumTipoDoctor.MedicoCallCenter || entCallCenter.entColaborador.iIdTipoDoctor == (int)EnumTipoDoctor.MedicoAdministrativo)
                {
                    if (entCallCenter.entFolio.iIdOrigen == (int)EnumOrigen.Particular)
                    {
                        response.Code    = -19854873834598;
                        response.Message = "El folio proporcionado solo es válido para consultas programadas con Especialistas.";
                        return(response);
                    }

                    if (!entCallCenter.entFolio.bActivo || entCallCenter.entFolio.bBaja)
                    {
                        response.Code    = -8634576876234;
                        response.Message = "El folio ha expirado o ha sido dado de baja.";
                        return(response);
                    }

                    //Para doctores callcenter, generar la consulta y retornar datos
                    EntConsulta entConsulta = new EntConsulta
                    {
                        iIdColaborador          = entCallCenter.entColaborador.iIdColaborador,
                        iIdPaciente             = entCallCenter.entPaciente.iIdPaciente,
                        iIdEstatusConsulta      = (int)EnumEstatusConsulta.CreadoProgramado,
                        dtFechaProgramadaInicio = DateTime.Now
                    };

                    IMDResponse <EntConsulta> resSaveConsulta = busConsulta.BSaveConsulta(entConsulta, iIdUsuarioMod);
                    if (resSaveConsulta.Code != 0)
                    {
                        return(resSaveConsulta.GetResponse <EntCallCenter>());
                    }

                    entCallCenter.entConsulta = resSaveConsulta.Result;

                    //Consultar historial clínico generado por otros colaboradores callcenter
                    List <int> doctoresCallCenter = new List <int> {
                        (int)EnumTipoDoctor.MedicoCallCenter, (int)EnumTipoDoctor.MedicoAdministrativo
                    };

                    IMDResponse <List <EntHistorialClinico> > resGetHistorial = busConsulta.BGetHistorialMedico(piIdFolio: entCallCenter.entFolio.iIdFolio, psIdTipoDoctor: string.Join(",", doctoresCallCenter));
                    if (resGetHistorial.Code != 0)
                    {
                        return(resGetHistorial.GetResponse <EntCallCenter>());
                    }

                    entCallCenter.lstHistorialClinico = resGetHistorial.Result;
                }
                else if (entCallCenter.entColaborador.iIdTipoDoctor == (int)EnumTipoDoctor.MedicoEspecialista)
                {
                    //Para doctores especialistas, buscar consultas programadas en la agenda
                    IMDResponse <List <EntDetalleConsulta> > resVerificarConsulta = busConsulta.BGetConsultaMomento(entCallCenter.entPaciente.iIdPaciente, entCallCenter.entColaborador.iIdColaborador);
                    if (resVerificarConsulta.Code != 0)
                    {
                        return(resVerificarConsulta.GetResponse <EntCallCenter>());
                    }

                    if (resVerificarConsulta.Result.Count < 1)
                    {
                        response.Code    = -56878843909375;
                        response.Message = $"No se encontró una consulta programada para el paciente. La tolerancia para el horario programado de la consulta es de {ConfigurationManager.AppSettings["iMinToleraciaConsultaInicio"]} minutos antes de la hora.";
                        return(response);
                    }

                    //Validar que la consulta programada esté en el horario programada y con status válido
                    List <EntDetalleConsulta> HayConsultaProgramadaOReprograma = resVerificarConsulta.Result.Where(x => x.iIdEstatusConsulta != (int)EnumEstatusConsulta.Finalizado && x.iIdEstatusConsulta != (int)EnumEstatusConsulta.Cancelado).ToList();
                    if (HayConsultaProgramadaOReprograma.Count > 0)
                    {
                        EntDetalleConsulta entDetalleConsulta = HayConsultaProgramadaOReprograma.First();

                        EntConsulta entConsulta = new EntConsulta
                        {
                            iIdConsulta        = (int)entDetalleConsulta.iIdConsulta,
                            iIdColaborador     = entCallCenter.entColaborador.iIdColaborador,
                            iIdPaciente        = entCallCenter.entPaciente.iIdPaciente,
                            iIdEstatusConsulta = entDetalleConsulta.iIdEstatusConsulta,
                        };

                        entCallCenter.entConsulta = entConsulta;
                    }
                    else
                    {
                        EntDetalleConsulta entDetalleConsulta = resVerificarConsulta.Result.Last();

                        if (entDetalleConsulta.iIdEstatusConsulta == (int)EnumEstatusConsulta.Cancelado)
                        {
                            response.Code    = -978912879598735;
                            response.Message = $"La consulta ya fue cancelada.";
                            return(response);
                        }

                        if (entDetalleConsulta.iIdEstatusConsulta == (int)EnumEstatusConsulta.Finalizado)
                        {
                            response.Code    = -4498871498234;
                            response.Message = $"La consulta ya ha finalizado.";
                            return(response);
                        }
                    }

                    //Obtener historial clínico sólo de las consultas con el colaborador especialista actual
                    IMDResponse <List <EntHistorialClinico> > resGetHistorial = busConsulta.BGetHistorialMedico(piIdFolio: entCallCenter.entFolio.iIdFolio, piIdColaborador: entCallCenter.entColaborador.iIdColaborador);
                    if (resGetHistorial.Code != 0)
                    {
                        return(resGetHistorial.GetResponse <EntCallCenter>());
                    }

                    entCallCenter.lstHistorialClinico = resGetHistorial.Result;
                }
                else
                {
                    response.Code    = -3338296867623;
                    response.Message = $"No se puede determinar el tipo de cuenta del usuario.";
                    return(response);
                }



                response.Code    = 0;
                response.Result  = entCallCenter;
                response.Message = "Se ha accedido a la consulta.";
            }
            catch (Exception ex)
            {
                response.Code    = 67823458514518;
                response.Message = "Ocurrió un error inesperado al acceder a la consulta del paciente.";

                logger.Error(IMDSerialize.Serialize(67823458514518, $"Error en {metodo}(int iIdColaborador, string sFolio, int iIdUsuarioMod): {ex.Message}", iIdColaborador, sFolio, iIdUsuarioMod, ex, response));
            }
            return(response);
        }