private List<string> ValidarPrestacionHumana(LQCEEntities context, CARGA_PRESTACIONES_HUMANAS_DETALLE objDetalle)
        {
            RepositorioPRESTACION_HUMANA _RepositorioPRESTACION_HUMANA = new RepositorioPRESTACION_HUMANA(context);
            RepositorioCLIENTE _RepositorioCLIENTE = new RepositorioCLIENTE(context);
            RepositorioCLIENTE_SINONIMO _RepositorioCLIENTE_SINONIMO = new RepositorioCLIENTE_SINONIMO(context);
            RepositorioPREVISION _RepositorioPREVISION = new RepositorioPREVISION(context);
            RepositorioGARANTIA _RepositorioGARANTIA = new RepositorioGARANTIA(context);
            RepositorioCARGA_PRESTACIONES_DETALLE_ESTADO _RepositorioCARGA_PRESTACIONES_DETALLE_ESTADO = new RepositorioCARGA_PRESTACIONES_DETALLE_ESTADO(context);
            RepositorioEXAMEN _RepositorioEXAMEN = new RepositorioEXAMEN(context);
            RepositorioEXAMEN_SINONIMO _RepositorioEXAMEN_SINONIMO = new RepositorioEXAMEN_SINONIMO(context);

            var EstadoConError = _RepositorioCARGA_PRESTACIONES_DETALLE_ESTADO.GetById((int)ENUM_CARGA_PRESTACIONES_DETALLE_ESTADO.ConError);
            if(EstadoConError == null)
                throw new Exception("No se encuentra registro de error en la tabla Estado de Detalle Carga Prestaciones");

            var EstadoValidado = _RepositorioCARGA_PRESTACIONES_DETALLE_ESTADO.GetById((int)ENUM_CARGA_PRESTACIONES_DETALLE_ESTADO.Validado);
            if (EstadoValidado == null)
                throw new Exception("No se encuentra registro de error en la tabla Estado de Detalle Carga Prestaciones");

            List<string> ListaValidaciones = new List<string>();

            // Nombre
            if (string.IsNullOrEmpty(objDetalle.NOMBRE))
            {
                ListaValidaciones.Add("No se ha señalado nombre del paciente");
            }

            // Ficha
            if (string.IsNullOrEmpty(objDetalle.FICHA))
            {
                ListaValidaciones.Add("No se ha señalado numero de ficha");
            }
            else
            {
                int? _ficha = ISConvert.ToNullableInteger(objDetalle.FICHA);
                if (!_ficha.HasValue)
                {
                    ListaValidaciones.Add("FICHA debe ser numérico");
                }
                else
                {
                    objDetalle.VALOR_FICHA = _ficha.Value;

                    var objPrestacionHumana = _RepositorioPRESTACION_HUMANA.GetById(_ficha.Value);
                    if (objPrestacionHumana != null)
                        ListaValidaciones.Add("Ya existe una prestación en el sistema con el mismo número de ficha");
                }
            }

            // Fecha de Recepcion
            if (string.IsNullOrEmpty(objDetalle.FECHA_RECEPCION))
            {
                ListaValidaciones.Add("No se ha señalado FECHA DE RECEPCIÓN en la ficha");
            }
            else
            {
                DateTime? pasoFR = ISConvert.ToNullableDateTime(objDetalle.FECHA_RECEPCION);
                if (!pasoFR.HasValue)
                {
                    ListaValidaciones.Add("FECHA DE RECEPCIÓN no tiene el formato correcto");
                }
                else
                {
                    objDetalle.VALOR_FECHA_RECEPCION = pasoFR.Value;
                }
            }

            // Cliente
            if (string.IsNullOrEmpty(objDetalle.PROCEDENCIA))
            {
                ListaValidaciones.Add("No se ha señalado PROCEDENCIA en la ficha");
            }
            else
            {
                var objCliente = _RepositorioCLIENTE.GetByFilter(null, null, null, null, "", objDetalle.PROCEDENCIA).FirstOrDefault();
                if (objCliente != null)
                {
                    objDetalle.CLIENTE = objCliente;
                }
                else
                {
                    var objClienteSinonimo = _RepositorioCLIENTE_SINONIMO.GetByFilterWithReferences(null, objDetalle.PROCEDENCIA).FirstOrDefault();
                    if (objClienteSinonimo != null)
                    {
                        objDetalle.CLIENTE = objClienteSinonimo.CLIENTE;
                    }
                    else
                    {
                        ListaValidaciones.Add("No se ha podido identificar PROCEDENCIA de la prestación");
                    }
                }
            }

            // Prevision
            if (string.IsNullOrEmpty(objDetalle.PREVISION))
            {
                //ListaValidaciones.Add("No se ha señalado PREVISION en la ficha");
            }
            else
            {
                var objPrevision = _RepositorioPREVISION.GetByFilter(objDetalle.PREVISION).FirstOrDefault();
                if (objPrevision != null)
                {
                    objDetalle.PREVISION1 = objPrevision;
                }
                else
                {
                    ListaValidaciones.Add("No se ha podido identificar la PREVISION en la ficha");
                }
            }

            // Garantia
            if (string.IsNullOrEmpty(objDetalle.GARANTIA))
            {
                //ListaValidaciones.Add("No se ha señalado GARANTIA en la ficha");
            }
            else
            {
                var objGarantia = _RepositorioGARANTIA.GetByFilter(objDetalle.GARANTIA).FirstOrDefault();
                if (objGarantia != null)
                {
                    objDetalle.GARANTIA1 = objGarantia;
                }
                else
                {
                    ListaValidaciones.Add("No se ha podido identificar la GARANTIA en la ficha");
                }
            }

               // Total
            if (string.IsNullOrEmpty(objDetalle.TOTAL))
            {
                ListaValidaciones.Add("No se ha señalado TOTAL en la ficha");
            }
            else
            {
                int? _total = ISConvert.ToNullableInteger(objDetalle.TOTAL);
                if (!_total.HasValue)
                {
                    ListaValidaciones.Add("Total no tiene el formato correcto");
                }
                else
                {
                    objDetalle.VALOR_TOTAL = _total.Value;
                }
            }

            // Examenes
            int contadorExamen = 1;
            int contadorExamenesRegistrados = 0;
            int contadorValorExamen = 0;
            foreach (var item in objDetalle.CARGA_PRESTACIONES_HUMANAS_EXAMEN.Where(pe => pe.ACTIVO))
            {
                if (!string.IsNullOrEmpty(item.VALOR_EXAMEN) || !string.IsNullOrEmpty(item.NOMBRE_EXAMEN))
                {
                    contadorExamenesRegistrados++;
                    if (string.IsNullOrEmpty(item.NOMBRE_EXAMEN))
                    {
                        ListaValidaciones.Add("No ha señalado nombre de examen [" + contadorExamen.ToString() + "]");
                    }
                    else
                    {
                        bool ExamenExiste = false;
                        var objExamen = _RepositorioEXAMEN.GetByFilter((int)ENUM_TIPO_PRESTACION.Humanas, "", item.NOMBRE_EXAMEN).FirstOrDefault();
                        if (objExamen != null)
                        {
                            ExamenExiste = true;
                            item.EXAMEN = objExamen;
                        }
                        else
                        {
                            var objExamenSinonimo = _RepositorioEXAMEN_SINONIMO.GetByFilterWithReferences(null, item.NOMBRE_EXAMEN).FirstOrDefault();
                            if (objExamenSinonimo != null)
                            {
                                ExamenExiste = true;
                                item.EXAMEN = objExamenSinonimo.EXAMEN;
                            }
                            else
                            {
                                ListaValidaciones.Add("No se ha encontrado información del examen [" + contadorExamen.ToString() + "; " + item.NOMBRE_EXAMEN  + "]");
                            }
                        }
                        if (ExamenExiste && string.IsNullOrEmpty(item.VALOR_EXAMEN))
                        {
                            ListaValidaciones.Add("No se ha señalado valor del examen [" + contadorExamen.ToString() + "; " + item.NOMBRE_EXAMEN + "]");
                        }
                    }
                    if (string.IsNullOrEmpty(item.VALOR_EXAMEN))
                    {
                        //ListaValidaciones.Add("No se ha señalado valor de examen [" + contadorExamen.ToString() + "]");
                    }
                    else
                    {
                        int? _valorExamen = ISConvert.ToNullableInteger(item.VALOR_EXAMEN);
                        if (!_valorExamen.HasValue)
                        {
                            ListaValidaciones.Add("Valor de examen no tiene el formato correcto [" + contadorExamen.ToString() + "]");
                        }
                        //else if (_valorExamen == 0)
                        //{
                        //    //ListaValidaciones.Add("Valor de examen no tiene el formato correcto [" + contadorExamen.ToString() + "]");
                        //}
                        else
                        {
                            contadorValorExamen++;
                            item.VALOR_VALOR_EXAMEN = _valorExamen;
                        }
                    }
                     //PENDIENTE: Validar que el valor del examen sea igual al convenio

                    //context.ApplyPropertyChanges("CARGA_PRESTACIONES_HUMANAS_EXAMEN", item);
                }
                else if (contadorExamen == 1)
                {
                    ListaValidaciones.Add("No ha señalado nombre y valor de examen [" + contadorExamen.ToString() + "]");
                }
                contadorExamen++;
            }

            if (contadorExamenesRegistrados == 0)
                ListaValidaciones.Add("La ficha debe registrar al menos 1 examen. ");
            if (contadorValorExamen == 0)
                ListaValidaciones.Add("La ficha debe registrar al menos 1 examen con valor. ");

            if (ListaValidaciones.Any())
            {
                objDetalle.CARGA_PRESTACIONES_DETALLE_ESTADO = EstadoConError;
                string errores = "";
                foreach (var item in ListaValidaciones)
                    errores += item + Environment.NewLine;
                objDetalle.MENSAJE_ERROR = errores;
            }
            else
            {
                objDetalle.CARGA_PRESTACIONES_DETALLE_ESTADO = EstadoValidado;
                objDetalle.MENSAJE_ERROR = "";
            }
            //context.ApplyPropertyChanges("CARGA_PRESTACIONES_HUMANAS_DETALLE", objDetalle);

            return ListaValidaciones;
        }
        /// <summary>
        /// Realiza carga en tablas temporales del contenido del archivo Excel
        /// </summary>
        /// <param name="IdTipoPrestacion">Id. de tipo de prestación</param>
        /// <param name="NombreArchivo">Nombre del archivo adjunto</param>
        /// <param name="ContenidoArchivo">Contenido binario del archivo adjunto</param>
        /// <returns>Retorna Id. de encabezado de carga de prestaciones</returns>
        public int UploadArchivoPrestaciones(int IdTipoPrestacion, string NombreArchivo, byte[] ContenidoArchivo)
        {
            Init();
            try
            {
                using (LQCEEntities context = new LQCEEntities())
                {
                    if (string.IsNullOrEmpty(NombreArchivo))
                        throw new Exception("No se ha señalado nombre de archivo Excel");
                    if (ContenidoArchivo == null)
                        throw new Exception("No se ha incluido contenido del archivo Excel");

                    RepositorioTIPO_PRESTACION _RepositorioTIPO_PRESTACION = new RepositorioTIPO_PRESTACION(context);
                    RepositorioCARGA_PRESTACIONES_ESTADO _RepositorioCARGA_PRESTACIONES_ESTADO = new RepositorioCARGA_PRESTACIONES_ESTADO(context);
                    RepositorioCARGA_PRESTACIONES_DETALLE_ESTADO _RepositorioCARGA_PRESTACIONES_DETALLE_ESTADO = new RepositorioCARGA_PRESTACIONES_DETALLE_ESTADO(context);

                    var objTipoPrestacion = _RepositorioTIPO_PRESTACION.GetById(IdTipoPrestacion);
                    if (objTipoPrestacion == null)
                        throw new Exception("No se ha encontrado información del Tipo de Prestación");

                    var objEstado = _RepositorioCARGA_PRESTACIONES_ESTADO.GetById((int)ENUM_CARGA_PRESTACIONES_ESTADO.Pendiente);
                    if (objEstado == null)
                        throw new Exception("No se ha encontrado información del Estado de Carga de Prestaciones");

                    var objEstadoDetalle = _RepositorioCARGA_PRESTACIONES_DETALLE_ESTADO.GetById((int)ENUM_CARGA_PRESTACIONES_DETALLE_ESTADO.Pendiente);
                    if (objEstadoDetalle == null)
                        throw new Exception("No se ha encontrado información del Estado de Detalle de Carga de Prestaciones");

                    string archivo = DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + NombreArchivo;
                    File.WriteAllBytes(Properties.Settings.Default.DIR_CARGA_EXCEL + archivo, ContenidoArchivo);

                    var datos = ISExcel.ReadExcelFile(Properties.Settings.Default.DIR_CARGA_EXCEL + archivo, true);
                    if (datos == null)
                        throw new Exception("No se ha leido información en la planilla Excel");

                    CARGA_PRESTACIONES_ENCABEZADO objEncabezado = new CARGA_PRESTACIONES_ENCABEZADO();
                    objEncabezado.FECHA_CARGA = DateTime.Now;
                    objEncabezado.TIPO_PRESTACION = objTipoPrestacion;
                    objEncabezado.CARGA_PRESTACIONES_ESTADO = objEstado;
                    objEncabezado.ARCHIVO = archivo;
                    objEncabezado.ACTIVO = true;
                    context.AddToCARGA_PRESTACIONES_ENCABEZADO(objEncabezado);

                    if (IdTipoPrestacion == (int)ENUM_TIPO_PRESTACION.Humanas)
                    {
                        foreach (DataRow item in datos.Rows)
                        {
                            bool TieneDatos = false;
                            foreach (var col in item.ItemArray)
                            {
                                if (!string.IsNullOrEmpty(col.ToString()))
                                    TieneDatos = true;
                            }
                            if (TieneDatos)
                            {
                                // Convertir fecha formato dd.mm.aa
                                DateTime? pasoFR = null;
                                if (!string.IsNullOrEmpty(item["FECHA RECEPCION"].ToString()))
                                {
                                    string[] arrFechaRecepcion = item["FECHA RECEPCION"].ToString().Split('.');
                                    if (arrFechaRecepcion.Count() == 3)
                                    {
                                        int? dias = ISConvert.ToNullableInteger(arrFechaRecepcion[0]);
                                        int? mes = ISConvert.ToNullableInteger(arrFechaRecepcion[1]);
                                        int? año = ISConvert.ToNullableInteger(arrFechaRecepcion[2]);
                                        if (dias.HasValue && mes.HasValue && año.HasValue)
                                        {
                                            if (año < 100)
                                            {
                                                año = año + 2000;
                                            }
                                            string fr = dias.Value.ToString() + "-"
                                                + mes.Value.ToString() + "-"
                                                + año.Value.ToString();
                                            pasoFR = ISConvert.ToNullableDateTime(fr);
                                        }
                                    }
                                }

                                CARGA_PRESTACIONES_HUMANAS_DETALLE objDetalle = new CARGA_PRESTACIONES_HUMANAS_DETALLE();
                                objDetalle.CARGA_PRESTACIONES_ENCABEZADO = objEncabezado;
                                objDetalle.NOMBRE = item["NOMBRE"].ToString();
                                objDetalle.FICHA = item["FICHA"].ToString();
                                if (pasoFR.HasValue)
                                {
                                    objDetalle.FECHA_RECEPCION = pasoFR.Value.ToString("dd-MM-yyyy") + " " + item["HORA RECEPCION"].ToString();
                                }
                                else
                                {
                                    objDetalle.FECHA_RECEPCION = item["FECHA RECEPCION"].ToString() + "." + item["HORA RECEPCION"].ToString();
                                }
                                objDetalle.TELEFONO = item["TELEFONO"].ToString();
                                objDetalle.MEDICO = item["MEDICO"].ToString();
                                objDetalle.PROCEDENCIA = item["PROCEDENCIA"].ToString();
                                objDetalle.PREVISION = item["PREVISION"].ToString();
                                objDetalle.GARANTIA = item["GARANTIA"].ToString();
                                objDetalle.PENDIENTE = item["PENDIENTE"].ToString();
                                objDetalle.PAGADO = item["PAGADO"].ToString();
                                objDetalle.TOTAL = item["TOTAL"].ToString();
                                objDetalle.RECEPCION = item["RECEPCION"].ToString();
                                objDetalle.EDAD = item["EDAD"].ToString();
                                objDetalle.RUT = item["RUT"].ToString();

                                objDetalle.ACTIVO = true;
                                objDetalle.CARGA_PRESTACIONES_DETALLE_ESTADO = objEstadoDetalle;
                                objDetalle.MENSAJE_ERROR = "";
                                objDetalle.FECHA_ACTUALIZACION = DateTime.Now;
                                objDetalle.CLIENTE = null;
                                objDetalle.VALOR_FICHA = null;
                                objDetalle.VALOR_FECHA_MUESTRA = null;
                                objDetalle.VALOR_FECHA_RECEPCION = null;
                                objDetalle.PREVISION1 = null;
                                objDetalle.GARANTIA1 = null;
                                objDetalle.VALOR_FECHA_ENTREGA_RESULTADOS = null;

                                AgregarExamenHumano(context, objDetalle, item, "EXAMEN 1", "VALOR 1");
                                AgregarExamenHumano(context, objDetalle, item, "EXAMEN 2", "VALOR 2");
                                AgregarExamenHumano(context, objDetalle, item, "EXAMEN 3", "VALOR 3");
                                AgregarExamenHumano(context, objDetalle, item, "EXAMEN 4", "VALOR 4");
                                AgregarExamenHumano(context, objDetalle, item, "EXAMEN 5", "VALOR 5");
                                AgregarExamenHumano(context, objDetalle, item, "EXAMEN 6", "VALOR 6");
                                AgregarExamenHumano(context, objDetalle, item, "EXAMEN 7", "VALOR 7");
                                AgregarExamenHumano(context, objDetalle, item, "EXAMEN 8", "VALOR 8");
                                AgregarExamenHumano(context, objDetalle, item, "EXAMEN 9", "VALOR 9");

                                ValidarPrestacionHumana(context, objDetalle);

                                context.AddToCARGA_PRESTACIONES_HUMANAS_DETALLE(objDetalle);
                            }
                        }
                    }
                    else if (IdTipoPrestacion == (int)ENUM_TIPO_PRESTACION.Veterinarias)
                    {
                        foreach (DataRow item in datos.Rows)
                        {
                            // Convertir fecha formato dd.mm.aa
                            DateTime? pasoFR = null;
                            if (!string.IsNullOrEmpty(item["FECHA RECEPCION"].ToString()))
                            {
                                string[] arrFechaRecepcion = item["FECHA RECEPCION"].ToString().Split('.');
                                if (arrFechaRecepcion.Count() == 3)
                                {
                                    int? dias = ISConvert.ToNullableInteger(arrFechaRecepcion[0]);
                                    int? mes = ISConvert.ToNullableInteger(arrFechaRecepcion[1]);
                                    int? año = ISConvert.ToNullableInteger(arrFechaRecepcion[2]);
                                    if (dias.HasValue && mes.HasValue && año.HasValue)
                                    {
                                        if (año < 100)
                                        {
                                            año = año + 2000;
                                        }
                                        string fr = dias.Value.ToString() + "-"
                                            + mes.Value.ToString() + "-"
                                            + año.Value.ToString();
                                        pasoFR = ISConvert.ToNullableDateTime(fr);
                                    }
                                }
                            }

                            CARGA_PRESTACIONES_VETERINARIAS_DETALLE objDetalle = new CARGA_PRESTACIONES_VETERINARIAS_DETALLE();
                            objDetalle.CARGA_PRESTACIONES_ENCABEZADO = objEncabezado;
                            objDetalle.FICHA = item["INGRESO"].ToString();
                            objDetalle.NOMBRE = item["NOMBRE"].ToString();
                            objDetalle.ESPECIE = item["ESPECIE"].ToString();
                            objDetalle.RAZA = item["RAZA"].ToString();
                            objDetalle.SEXO = item["SEXO"].ToString();
                            objDetalle.EDAD = item["EDAD"].ToString();
                            objDetalle.TELEFONO = item["TELEFONO"].ToString();
                            objDetalle.PROCEDENCIA = item["PROCEDENCIA"].ToString();
                            objDetalle.GARANTIA = item["GARANTIA"].ToString();
                            objDetalle.PENDIENTE = item["PENDIENTE"].ToString();
                            objDetalle.TOTAL = item["TOTAL"].ToString();
                            objDetalle.RECEPCION = item["RECEPCION"].ToString();
                            objDetalle.MEDICO = item["MEDICO"].ToString();
                            objDetalle.SOLICITA = item["SOLICITANTE"].ToString();
                            if (pasoFR.HasValue)
                            {
                                objDetalle.FECHA_RECEPCION = pasoFR.Value.ToString("dd-MM-yyyy") + " " + item["HORA RECEPCION"].ToString();
                            }
                            else
                            {
                                objDetalle.FECHA_RECEPCION = item["FECHA RECEPCION"].ToString() + "." + item["HORA RECEPCION"].ToString();
                            }
                            objDetalle.FICHA_CLINICA = item["FICHA"].ToString();
                            //objDetalle.FECHA_MUESTRA = item["FECHA MUESTRA"].ToString();
                            //objDetalle.FECHA_RESULTADOS = item["FECHA RESULTADOS"].ToString();
                            //objDetalle.PAGADO = item["PAGADO"].ToString();
                            objDetalle.ACTIVO = true;
                            objDetalle.CARGA_PRESTACIONES_DETALLE_ESTADO = objEstadoDetalle;
                            objDetalle.MENSAJE_ERROR = "";
                            objDetalle.FECHA_ACTUALIZACION = DateTime.Now;
                            objDetalle.VALOR_FICHA = null;
                            objDetalle.CLIENTE = null;
                            //objDetalle.VALOR_FECHA_MUESTRA = null;
                            objDetalle.VALOR_FECHA_RECEPCION = null;
                            objDetalle.PREVISION = null;
                            objDetalle.GARANTIA1 = null;
                            //objDetalle.VALOR_FECHA_ENTREGA_RESULTADOS = null;
                            objDetalle.ESPECIE1 = null;
                            objDetalle.RAZA1 = null;

                            AgregarExamenVeterinario(context, objDetalle, item, "EXAMEN 1", "VALOR 1");
                            AgregarExamenVeterinario(context, objDetalle, item, "EXAMEN 2", "VALOR 2");
                            AgregarExamenVeterinario(context, objDetalle, item, "EXAMEN 3", "VALOR 3");
                            AgregarExamenVeterinario(context, objDetalle, item, "EXAMEN 4", "VALOR 4");
                            AgregarExamenVeterinario(context, objDetalle, item, "EXAMEN 5", "VALOR 5");

                           ValidarPrestacionVeterinaria(context, objDetalle);

                            context.AddToCARGA_PRESTACIONES_VETERINARIAS_DETALLE(objDetalle);

                        }
                    }
                    else
                    {
                        throw new Exception("Tipo de prestación no válido");
                    }

                    context.SaveChanges();

                    return objEncabezado.ID;
                }
            }
            catch (Exception ex)
            {
                ISException.RegisterExcepcion(ex);
                Error = ex.Message;
                throw ex;
            }
        }
 private void AgregarExamenHumano(LQCEEntities context, CARGA_PRESTACIONES_HUMANAS_DETALLE objDetalle, DataRow item, string ColumnaExamen, string ColumnaValor)
 {
     if (!string.IsNullOrEmpty(item[ColumnaExamen].ToString()) || !string.IsNullOrEmpty(item[ColumnaValor].ToString()))
     {
         CARGA_PRESTACIONES_HUMANAS_EXAMEN objExamen = new CARGA_PRESTACIONES_HUMANAS_EXAMEN();
         objExamen.CARGA_PRESTACIONES_HUMANAS_DETALLE = objDetalle;
         objExamen.NOMBRE_EXAMEN = item[ColumnaExamen].ToString();
         objExamen.VALOR_EXAMEN = item[ColumnaValor].ToString();
         objExamen.ACTIVO = true;
         objExamen.FECHA_ACTUALIZACION = DateTime.Now;
         objExamen.EXAMEN = null;
         context.AddToCARGA_PRESTACIONES_HUMANAS_EXAMEN(objExamen);
     }
 }