using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Herencia.Capas;
using Exferia_Aplicacion.Modelos_Agenda;
using Exferia_EntityFramework;
using Exferia_Expedientes._0_Modelos;
using Exferia_General;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Expedientes._1_Datos
{
    public class EPD_Citaciones_Datos : ABS_Datos
    {
        #region Listado
        private List<INTERNO_EPD_Citaciones_Listado_Modelo> g_lst_INTERNO_EPD_Citaciones_Listado_Modelo = null;

        public override List<dynamic> Obtener_Listado(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            List<dynamic> lst_MAE = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                // Consulta .....................................................
                ConsultaRellenar_Listado(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(EPD_Citaciones).Name), _lst_CamposConRelacionABuscar, -1, null, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if ((g_lst_INTERNO_EPD_Citaciones_Listado_Modelo != null) && (g_lst_INTERNO_EPD_Citaciones_Listado_Modelo.Count() > 0))
                {
                    lst_MAE = g_lst_INTERNO_EPD_Citaciones_Listado_Modelo.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_Listado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return lst_MAE;
        }
        public override dynamic Obtener_RegistroListado(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo, long _lng_id, List<long> _lst_ids)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            dynamic dnm_MAE = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                // Consulta .....................................................
                ConsultaRellenar_Listado(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(EPD_Citaciones).Name), _lst_CamposConRelacionABuscar, _lng_id, _lst_ids, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if ((g_lst_INTERNO_EPD_Citaciones_Listado_Modelo != null) && (g_lst_INTERNO_EPD_Citaciones_Listado_Modelo.Count() > 0))
                {
                    dnm_MAE = g_lst_INTERNO_EPD_Citaciones_Listado_Modelo.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_RegistroListado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return dnm_MAE;
        }
        protected override void ConsultaRellenar_Listado(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionadas, List<string> _lst_CamposConRelacionABuscar, long _lng_id, List<long> _lst_ids, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                string str_Filtros_Empresas = Funciones.Formar_ContenidoIN_ParaConsultaWhere(_lst_idEmpresasRelacionadas);

                //Filtros de Opciones
                long lng_Padre_idProcedimento = -1;
                string str_Padre_Opcion_Procedimento = "";

                if (_lst_INTERNO_Filtro_OpcionPadre_Modelo != null && _lst_INTERNO_Filtro_OpcionPadre_Modelo.Count > 0)
                {
                    foreach (INTERNO_Filtro_OpcionPadre_Modelo mdl_INTERNO_Filtro_OpcionPadre_Modelo in _lst_INTERNO_Filtro_OpcionPadre_Modelo)
                    {
                        //Procedimento
                        if (mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO.Equals(Variables.G_STR_OPCION_EPD_PROCEDIMIENTOS))
                        {
                            lng_Padre_idProcedimento = mdl_INTERNO_Filtro_OpcionPadre_Modelo.VALOR;
                            str_Padre_Opcion_Procedimento = mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO;
                        }
                    }                       
                }


                string str_SQL =
                      " SELECT " +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.id) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.id) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.codigo) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.codigo) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.descripcion) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.descripcion) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.fechaHora) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaHora) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.duracion) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.duracion) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.observaciones) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.observaciones) + "," +
                          //ids
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.idProcedimiento) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.idAsesor) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idAsesor) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.idEmpresa) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_Id) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.id) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_Id) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.id) + "," +
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_Id) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.id) + "," +
                          //Asesor
                          (
                              (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor)))
                                ?
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor_Codigo) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.codigo) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor_Descripcion) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.nombre) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor_FechaBorrado) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.fechaBorrado) + ","
                                    )
                                :
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor_Codigo) + " = ''," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor_Descripcion) + "= '', " +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor_FechaBorrado) + " = NULL ,"
                                    )
                          ) +
                          //Procedimiento_Numero
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Procedimiento_Numero) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.numero) + "," +
                          //Expediente_Codigo
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Expediente_Codigo) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.codigo) + "," +
                          //Juzgado
                          (
                              (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado)))
                                ?
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_Codigo) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.codigo) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_Descripcion) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.descripcion) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_FechaBorrado) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.fechaBorrado) + ","
                                    )
                                :
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_Codigo) + " = ''," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_Descripcion) + "= '', " +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_FechaBorrado) + " = NULL ,"
                                    )
                          ) +
                          //Materia
                          (
                              (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia)))
                                ?
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_Codigo) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.codigo) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_Descripcion) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.descripcion) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_FechaBorrado) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.fechaBorrado) + ","
                                    )
                                :
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_Codigo) + " = ''," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_Descripcion) + "= '', " +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_FechaBorrado) + " = NULL ,"
                                    )
                          ) +
                          //Demandado
                          (
                              (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado)))
                                ?
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_Codigo) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.codigo) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_Descripcion) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.nombre) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_FechaBorrado) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.fechaBorrado) + ","
                                    )
                                :
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_Codigo) + " = ''," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_Descripcion) + "= '', " +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_FechaBorrado) + " = NULL ,"
                                    )
                          ) +
                          //Actores
                          nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Actores) + " = Actores.Actores," +
                          //Empresa
                          (
                              (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa)))
                                ?
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa_Codigo) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.codigo) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa_Descripcion) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.descripcion) + "," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa_FechaBorrado) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.fechaBorrado)
                                    )
                                :
                                    (
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa_Codigo) + " = ''," +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa_Descripcion) + "= '', " +
                                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa_FechaBorrado) + " = NULL "
                                    )
                          ) +
                          " FROM " + nameof(EPD_Citaciones) +
                          //Procedimientos
                          " INNER JOIN " + nameof(EPD_Procedimientos) + " ON " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) +
                          //Materias
                          " INNER JOIN " + nameof(EPD_Materias) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idMateria) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.id) +
                          //Juzgados
                          " INNER JOIN " + nameof(EPD_Juzgados) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idJuzgado) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.id) +
                          //Expedientes
                          " INNER JOIN " + nameof(EPD_Expedientes) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idExpediente) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.id) +
                          //Demandados
                          " INNER JOIN " + nameof(EPD_Demandados) + " ON " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.idDemandado) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.id) +
                          //Actores
                          " LEFT JOIN (" +
                                      " SELECT " +
                                        nameof(EPD_Procedimientos_Actores.idProcedimiento) + "," +
                                        " STUFF( " +
                                        " ( " +
                                            " SELECT DISTINCT ',' + " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.nombre) +
                                            " FROM " + nameof(EPD_Procedimientos_Actores) +
                                            " INNER JOIN " + nameof(EPD_Actores) + " ON " + nameof(EPD_Procedimientos_Actores) + "." + nameof(EPD_Procedimientos_Actores.idActor) + " = " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.id) +
                                            " WHERE " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.fechaBorrado) + " IS NUll AND " + nameof(EPD_Procedimientos_Actores.idProcedimiento) + " = a." + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                                            " FOR XML PATH(''))" +
                                        " , 1, 1, ''" +
                                        " )  AS Actores " +
                                      " FROM  " + nameof(EPD_Procedimientos_Actores) + " AS a " +
                                      " GROUP BY " + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                          ") as Actores ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) + " = Actores." + nameof(EPD_Procedimientos_Actores.idProcedimiento) +      
                          //Asesor
                          (
                             (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor)))
                                ?
                                    (
                                         " LEFT JOIN " + nameof(EPD_Asesores) + " ON " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idAsesor) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.id)
                                    )
                                : ("")
                          ) +
                          //Empresa
                          (
                             (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa)))
                                ?
                                    (
                                         " LEFT JOIN " + nameof(GEN_Empresas) + " ON " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.id)
                                    )
                                : ("")
                          ) +
                          " WHERE " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaBorrado) + " IS null AND " +
                              " ( " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + "=@idEmpresa " +
                                  (
                                      (_lst_idEmpresasRelacionadas != null && _lst_idEmpresasRelacionadas.Count > 0)
                                          ? (" OR " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + " in (" + str_Filtros_Empresas + ") ")
                                          : " "
                                  ) +
                              " ) AND " +
                              (_lng_id > -1 ? nameof(EPD_Citaciones) + "." + (nameof(EPD_Citaciones.id) + "=@id") : "1 = 1") + " AND " +
                              //Filtro por datos del padre relacionado
                              (
                                  !str_Padre_Opcion_Procedimento.Equals("")
                                      ? (nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + "=@idProcedimiento")
                                      : ("1 = 1")
                              );

                //Parametros
                lst_Parametros.Add(new SqlParameter("@idEmpresa", _lng_idEmpresaSeleccionada));
                lst_Parametros.Add(new SqlParameter("@id", _lng_id));
                lst_Parametros.Add(new SqlParameter("@idProcedimiento", lng_Padre_idProcedimento));

                object[] arr_Parametros = lst_Parametros.ToArray();

                //Rellenar el Modelo
                g_lst_INTERNO_EPD_Citaciones_Listado_Modelo = _obj_Exferia_Entities.Database.SqlQuery<INTERNO_EPD_Citaciones_Listado_Modelo>(str_SQL, arr_Parametros).ToList();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(ConsultaRellenar_Listado), true);
            }
        }
        #endregion

        #region Listado Secundario
        private List<INTERNO_EPD_Citaciones_Listado_Modelo> g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_SECUNDARIO = null;

        public override List<dynamic> Obtener_Listado_Secundario(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            List<dynamic> lst_MAE = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                // Consulta .....................................................
                ConsultaRellenar_Listado_Secundario(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(EPD_Citaciones).Name), _lst_CamposConRelacionABuscar, -1, null, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if ((g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_SECUNDARIO != null) && (g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_SECUNDARIO.Count() > 0))
                {
                    lst_MAE = g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_SECUNDARIO.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_Listado_Secundario), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return lst_MAE;
        }
        public override dynamic Obtener_RegistroListado_Secundario(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo, long _lng_id, List<long> _lst_ids)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            dynamic dnm_MAE = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                // Consulta .....................................................
                ConsultaRellenar_Listado_Secundario(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(EPD_Citaciones).Name), _lst_CamposConRelacionABuscar, _lng_id, _lst_ids, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if ((g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_SECUNDARIO != null) && (g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_SECUNDARIO.Count() > 0))
                {
                    dnm_MAE = g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_SECUNDARIO.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_RegistroListado_Secundario), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return dnm_MAE;
        }
        protected override void ConsultaRellenar_Listado_Secundario(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionadas, List<string> _lst_CamposConRelacionABuscar, long _lng_id, List<long> _lst_ids, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
        }
        #endregion

        #region F3
        private INTERNO_EPD_Citaciones_Listado_Modelo g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo = null;

        public override dynamic Obtener_F3(string _str_filtro, string _str_CampoBusqueda, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            dynamic dnm_MAE = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Consulta ......................................................
                ConsultaRellenar_F3(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(EPD_Citaciones).Name), _str_CampoBusqueda, _str_filtro, -1, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if (g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo != null)
                {
                    dnm_MAE = g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo;
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_F3), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return dnm_MAE;
        }
        public override dynamic Obtener_F3_PorId(long _lng_id, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            dynamic dnm_MAE = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Consulta ......................................................
                ConsultaRellenar_F3(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(EPD_Citaciones).Name), "", "", _lng_id, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if (g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo != null)
                {
                    dnm_MAE = g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo;
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_F3_PorId), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return dnm_MAE;
        }
        protected override void ConsultaRellenar_F3(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionas, string _str_CampoBusqueda, string _str_Filtro, long _lng_id, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                string str_Filtros_Empresas = Funciones.Formar_ContenidoIN_ParaConsultaWhere(_lst_idEmpresasRelacionas);

                //Filtros de Opciones
                long lng_Padre_idProcedimiento = -1;
                string str_Padre_Opcion_Procedimiento = "";

                if (_lst_INTERNO_Filtro_OpcionPadre_Modelo != null && _lst_INTERNO_Filtro_OpcionPadre_Modelo.Count > 0)
                {
                    foreach (INTERNO_Filtro_OpcionPadre_Modelo mdl_INTERNO_Filtro_OpcionPadre_Modelo in _lst_INTERNO_Filtro_OpcionPadre_Modelo)
                    {
                        //Procedimiento
                        if (mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO.Equals(Variables.G_STR_OPCION_EPD_PROCEDIMIENTOS))
                        {
                            lng_Padre_idProcedimiento = mdl_INTERNO_Filtro_OpcionPadre_Modelo.VALOR;
                            str_Padre_Opcion_Procedimiento = mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO;
                        }
                    }
                }


                string str_SQL =
                     " SELECT distinct " +
                         nameof(INTERNO_EPD_Citaciones_Listado_Modelo.id) + " = " + nameof(EPD_Citaciones.id) + "," +
                         nameof(INTERNO_EPD_Citaciones_Listado_Modelo.codigo) + " = " + nameof(EPD_Citaciones.codigo) + "," +
                         nameof(INTERNO_EPD_Citaciones_Listado_Modelo.descripcion) + " = " + nameof(EPD_Citaciones.descripcion) +
                     " FROM " + nameof(EPD_Citaciones) +
                     " WHERE " + nameof(EPD_Citaciones.fechaBorrado) + " IS null AND " +
                           " ( " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + "=@idEmpresa " +
                                (
                                    (_lst_idEmpresasRelacionas != null && _lst_idEmpresasRelacionas.Count > 0)
                                        ? (" OR " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + " in (" + str_Filtros_Empresas + ") ")
                                        : " "
                                ) +
                            " ) AND " +
                          (
                           (_lng_id > -1)
                             ? (nameof(EPD_Citaciones.id) + " = " + _lng_id)
                             : (
                                  //Filtrar por Codigo
                                  (_str_CampoBusqueda.Equals(nameof(EPD_Citaciones.codigo)))
                                      ? (nameof(EPD_Citaciones.codigo) + "=@Filtro")
                                      //Filtrar por descripcion
                                      : (nameof(EPD_Citaciones.descripcion) + "=@Filtro")
                               )
                          )
                          + " AND " +
                          //Filtro por datos del padre relacionado
                          (
                              !str_Padre_Opcion_Procedimiento.Equals("")
                                  ? (nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + "=@idProcedimiento")
                                  : ("1 = 1")
                          );

                //Parametros
                lst_Parametros.Add(new SqlParameter("@idEmpresa", _lng_idEmpresaSeleccionada));
                lst_Parametros.Add(new SqlParameter("@Filtro", _str_Filtro));
                lst_Parametros.Add(new SqlParameter("@idProcedimiento", lng_Padre_idProcedimiento));

                object[] arr_Parametros = lst_Parametros.ToArray();

                //Rellenar el Modelo
                g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo = _obj_Exferia_Entities.Database.SqlQuery<INTERNO_EPD_Citaciones_Listado_Modelo>(str_SQL, arr_Parametros).FirstOrDefault();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(ConsultaRellenar_F3), true);
            }
        }
        #endregion

        #region Obtener

        #region Obtener Simple
        private dynamic g_dnm_Modelo_Obtener = null;

        private static int g_int_TotalHilos_Obtener = 2;
        private bool[] g_bol_Hilos_Terminados_Obtener = new bool[g_int_TotalHilos_Obtener];

        public override dynamic Obtener(long _lng_id)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                string str_SQL =
                           " SELECT " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.id) + " , " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.codigo) + " , " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.descripcion) + " , " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaHora) + " , " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.duracion) + " , " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + " , " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idAsesor) + " , " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + " , " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.observaciones) + " , " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaBorrado) + 
                           " FROM " + nameof(EPD_Citaciones) +
                         " WHERE  " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaBorrado) + " IS null AND " +
                                      nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.id) + "=@id ";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Rellenar el Modelo
                g_dnm_Modelo_Obtener = obj_Exferia_Entities.Database.SqlQuery<EPD_Citaciones>(str_SQL, arr_Parametros).FirstOrDefault();

                #region Rellenar tablas Relacionadas
                if (g_dnm_Modelo_Obtener != null)
                {
                    //reiniciar Valores de los hilos
                    for (int int_Contador = 0; int_Contador < g_int_TotalHilos_Obtener; int_Contador++)
                    {
                        g_bol_Hilos_Terminados_Obtener[int_Contador] = false;
                    }

                    //EPD_Procedimientos ##########################################################################################
                    ThreadStart obj_ThreadStart_PROCEDIMIENTO = new ThreadStart(Obtener_Procedimiento_Modelo_Obtener);
                    Thread obj_Thread_PROCEDIMIENTO = new Thread(obj_ThreadStart_PROCEDIMIENTO);
                    obj_Thread_PROCEDIMIENTO.Start();

                    //EPD_Asesores ##########################################################################################
                    ThreadStart obj_ThreadStart_ASESOR= new ThreadStart(Obtener_Asesor_Modelo_Obtener);
                    Thread obj_Thread_ASESOR = new Thread(obj_ThreadStart_ASESOR);
                    obj_Thread_ASESOR.Start();

                    //Esperando a que terminen todos los hilos .........................................
                    bool bol_Termino = false;
                    while (bol_Termino == false)
                    {
                        bol_Termino = true;
                        foreach (bool bol_Termino_Hilo in g_bol_Hilos_Terminados_Obtener)
                        {
                            if (bol_Termino_Hilo == false)
                            {
                                bol_Termino = false;
                                break;
                            }
                        }

                        Thread.Sleep(10);
                    }
                    //.................................................................................
                }
                #endregion
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return g_dnm_Modelo_Obtener;
        }
        #region Tablas Relacionadas
        private void Obtener_Procedimiento_Modelo_Obtener()
        {
            try
            {
                EPD_Procedimientos_Datos obj_EPD_Procedimientos_Datos = new EPD_Procedimientos_Datos();
                g_dnm_Modelo_Obtener.EPD_Procedimientos = obj_EPD_Procedimientos_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idProcedimiento,true,false,false);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[0] = true;
            }
        }
        private void Obtener_Asesor_Modelo_Obtener()
        {
            try
            {
                EPD_Asesores_Datos obj_EPD_Asesores_Datos = new EPD_Asesores_Datos();
                g_dnm_Modelo_Obtener.EPD_Asesores = obj_EPD_Asesores_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idAsesor,false);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[1] = true;
            }
        }
        #endregion

        #endregion

        #region Para Listado

        #region Simple
        private INTERNO_EPD_Citaciones_Listado_Modelo g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo_PARALISTADO = null;

        public INTERNO_EPD_Citaciones_Listado_Modelo Obtener_Registro_Para_Listado_Por_Id(long _lng_id)
        {
            g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo_PARALISTADO = null;

            try
            {
                string str_SQL = Obtener_Consulta_Para_Listado() +
                                " WHERE " +
                                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaBorrado) + "  is null AND " +
                                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.id) + " =@id ";
                //where
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();
                lst_Parametros.Add(new SqlParameter("@id", _lng_id));

                //Parametros
                object[] arr_Parametros = lst_Parametros.ToArray();

                //Ejecutar
                Ejecutar_Consulta_Modelo_ParaListado(str_SQL, arr_Parametros);

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_Registro_Para_Listado_Por_Id), true);
            }

            return g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo_PARALISTADO;
        }

        #region Ejecutar Consulta Modelo Para Listado

        private void Ejecutar_Consulta_Modelo_ParaListado(string _str_SQL,
                                                            object[] _arr_Parametros)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                //Conexion
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Rellenar el Modelo
                g_mdl_INTERNO_EPD_Citaciones_Listado_Modelo_PARALISTADO = obj_Exferia_Entities.Database.SqlQuery<INTERNO_EPD_Citaciones_Listado_Modelo>(_str_SQL, _arr_Parametros).FirstOrDefault();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo_ParaListado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }


        #endregion
        #endregion

        #region Listado
        private List<INTERNO_EPD_Citaciones_Listado_Modelo> g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_PARALISTADO = null;

        public List<INTERNO_EPD_Citaciones_Listado_Modelo> Obtener_Registros_Para_Listado_Por_Procedimiento(long _lng_idProcedimiento)
        {
            try
            {
                string str_SQL = Obtener_Consulta_Para_Listado() +
                                    " WHERE " +
                                        nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaBorrado) + " is null and " +
                                        nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + "=@idProcedimiento ";
                //Parametros
                object[] arr_Parametros = new object[]
                {
                    new SqlParameter("@idProcedimiento",  _lng_idProcedimiento)
                };

                Ejecutar_Consulta_Modelo_Listado_PARALISTADO(str_SQL,
                                                            arr_Parametros);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_Registros_Para_Listado_Por_Procedimiento), true);
            }

            return g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_PARALISTADO;
        }

        public List<INTERNO_EPD_Citaciones_Listado_Modelo> Obtener_Registros_Para_Listado_Por_Actor(long _lng_idActor)
        {
            try
            {
                string str_SQL = Obtener_Consulta_Para_Listado() +
                                    //Actor
                                    " INNER JOIN " + nameof(EPD_Procedimientos_Actores) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) + " = " + nameof(EPD_Procedimientos_Actores) + "." + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                                    " INNER JOIN " + nameof(EPD_Actores) + " ON " + nameof(EPD_Procedimientos_Actores) + "." + nameof(EPD_Procedimientos_Actores.idActor) + " = " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.id) +
                                    " WHERE " +
                                        nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaBorrado) + " is null and " +
                                        nameof(EPD_Actores) + "." + nameof(EPD_Actores.fechaBorrado) + " is null and " +
                                        nameof(EPD_Procedimientos_Actores) + "." + nameof(EPD_Procedimientos_Actores.idActor) + "=@idActor ";
                //Parametros
                object[] arr_Parametros = new object[]
                {
                    new SqlParameter("@idActor",  _lng_idActor)
                };

                Ejecutar_Consulta_Modelo_Listado_PARALISTADO(str_SQL,
                                                            arr_Parametros);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_Registros_Para_Listado_Por_Actor), true);
            }

            return g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_PARALISTADO;
        }

        public List<INTERNO_EPD_Citaciones_Listado_Modelo> Obtener_Registros_Para_Listado_Por_Demandado(long _lng_idDemandado)
        {
            try
            {
                string str_SQL = Obtener_Consulta_Para_Listado() +
                                    " WHERE " +
                                        nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaBorrado) + " is null and " +
                                        nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.idDemandado) + "=@idDemandado ";
                //Parametros
                object[] arr_Parametros = new object[]
                {
                    new SqlParameter("@idDemandado",  _lng_idDemandado)
                };

                Ejecutar_Consulta_Modelo_Listado_PARALISTADO(str_SQL,
                                                            arr_Parametros);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_Registros_Para_Listado_Por_Demandado), true);
            }

            return g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_PARALISTADO;
        }

        #region Ejecutar Consulta
        private void Ejecutar_Consulta_Modelo_Listado_PARALISTADO(string _str_SQL,
                                                                  object[] _arr_Parametros)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                //Conexion
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Rellenar el Modelo
                g_lst_INTERNO_EPD_Citaciones_Listado_Modelo_PARALISTADO = obj_Exferia_Entities.Database.SqlQuery<INTERNO_EPD_Citaciones_Listado_Modelo>(_str_SQL, _arr_Parametros).ToList();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo_Listado_PARALISTADO), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }
        #endregion

        #endregion

        private string Obtener_Consulta_Para_Listado()
        {
            return
                  " SELECT distinct " +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.id) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.id) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.codigo) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.codigo) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.descripcion) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.descripcion) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.fechaHora) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaHora) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.duracion) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.duracion) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.observaciones) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.observaciones) + "," +
                        //ids
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.idProcedimiento) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.idAsesor) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idAsesor) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.idEmpresa) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + "," +
                        //Procedimiento_Numero
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Procedimiento_Numero) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.numero) + "," +
                        //Expediente_Codigo
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Expediente_Codigo) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.codigo) + "," +
                        //Juzgado
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_Id) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.id) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_Codigo) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.codigo) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_Descripcion) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.descripcion) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Juzgado_FechaBorrado) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.fechaBorrado) + "," +
                         //Materia
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_Id) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.id) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_Codigo) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.codigo) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_Descripcion) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.descripcion) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Materia_FechaBorrado) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.fechaBorrado) + "," +
                         //Demandado
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_Id) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.id) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_Codigo) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.codigo) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_Descripcion) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.nombre) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Demandado_FechaBorrado) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.fechaBorrado) + "," +
                        //Actores
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Actores) + " = Actores.Actores," +
                        //Asesor
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor_Codigo) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.codigo) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor_Descripcion) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.nombre) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Asesor_FechaBorrado) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.fechaBorrado) + "," +
                        //Empresa
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa_Codigo) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.codigo) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa_Descripcion) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.descripcion) + "," +
                        nameof(INTERNO_EPD_Citaciones_Listado_Modelo.Empresa_FechaBorrado) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.fechaBorrado) +
                    " FROM " + nameof(EPD_Citaciones) +
                    //Procedimientos
                    " INNER JOIN " + nameof(EPD_Procedimientos) + " ON " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) +
                    //Materias
                    " INNER JOIN " + nameof(EPD_Materias) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idMateria) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.id) +
                    //Juzgados
                    " INNER JOIN " + nameof(EPD_Juzgados) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idJuzgado) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.id) +
                    //Expedientes
                    " INNER JOIN " + nameof(EPD_Expedientes) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idExpediente) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.id) +
                    //Demandados
                    " INNER JOIN " + nameof(EPD_Demandados) + " ON " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.idDemandado) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.id) +
                    //Actores
                    " LEFT JOIN (" +
                                " SELECT " +
                                nameof(EPD_Procedimientos_Actores.idProcedimiento) + "," +
                                " STUFF( " +
                                " ( " +
                                    " SELECT DISTINCT ',' + " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.nombre) +
                                    " FROM " + nameof(EPD_Procedimientos_Actores) +
                                    " INNER JOIN " + nameof(EPD_Actores) + " ON " + nameof(EPD_Procedimientos_Actores) + "." + nameof(EPD_Procedimientos_Actores.idActor) + " = " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.id) +
                                    " WHERE " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.fechaBorrado) + " IS NUll AND " + nameof(EPD_Procedimientos_Actores.idProcedimiento) + " = a." + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                                    " FOR XML PATH(''))" +
                                " , 1, 1, ''" +
                                " )  AS Actores " +
                                " FROM  " + nameof(EPD_Procedimientos_Actores) + " AS a " +
                                " GROUP BY " + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                    ") as Actores ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) + " = Actores." + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                    //Asesor
                    " LEFT JOIN " + nameof(EPD_Asesores) + " ON " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idAsesor) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.id) +
                    //Empresa
                    " LEFT JOIN " + nameof(GEN_Empresas) + " ON " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.id);
        }
        #endregion

        #region Para Informes
        public List<INTERNO_Informe_Citaciones_Modelo> Obtener_Informe_Citaciones(DateTime _dtt_FechaInicio,DateTime _dtt_FechaFin, List<long> _lst_idAsesores, List<long> _lst_idJuzgados)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            List<INTERNO_Informe_Citaciones_Modelo> lst_INTERNO_Informe_Citaciones_Modelo = null;
            try
            {
                //Conexion
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                string str_Filtro_IDS_Asesores = "";
                if (_lst_idAsesores!=null && _lst_idAsesores.Count>0)
                {
                    str_Filtro_IDS_Asesores = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(EPD_Citaciones),
                                                                                                nameof(EPD_Citaciones.idAsesor),
                                                                                                G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                                _lst_idAsesores);
                }

                string str_Filtro_IDS_Juzgados = "";
                if (_lst_idJuzgados != null && _lst_idJuzgados.Count > 0)
                {
                    str_Filtro_IDS_Juzgados = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(EPD_Procedimientos),
                                                                                                nameof(EPD_Procedimientos.idJuzgado),
                                                                                                G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                                _lst_idJuzgados);
                }


                string str_SQL=
                    " SELECT DISTINCT " +
                       //Citaciones
                       nameof(INTERNO_Informe_Citaciones_Modelo.Citacion_FechaHora) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaHora) + "," +
                       nameof(INTERNO_Informe_Citaciones_Modelo.Citacion_Observaciones) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.observaciones) + "," +
                       //Procedimiento
                       nameof(INTERNO_Informe_Citaciones_Modelo.Procedimiento_Numero) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.numero) + "," +
                       nameof(INTERNO_Informe_Citaciones_Modelo.Procedimiento_NumeroEjecucion) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.numeroEjecucion) + "," +
                       //Juzgado
                       nameof(INTERNO_Informe_Citaciones_Modelo.Juzgado_Id) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.id) + "," +
                       nameof(INTERNO_Informe_Citaciones_Modelo.Juzgado_Descripcion) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.descripcion) + "," +
                       //Actores
                       nameof(INTERNO_Informe_Citaciones_Modelo.Actores) + " = Actores.Actores," +
                       //Demandado
                       nameof(INTERNO_Informe_Citaciones_Modelo.Demandado) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.nombre) + "," +
                       //Materia
                       nameof(INTERNO_Informe_Citaciones_Modelo.Materia) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.descripcion) + "," +
                       //Asesor
                       nameof(INTERNO_Informe_Citaciones_Modelo.Asesor_Id) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.id) + "," +
                       nameof(INTERNO_Informe_Citaciones_Modelo.Asesor_Nombre) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.nombre) + "," +
                       //Expediente
                       nameof(INTERNO_Informe_Citaciones_Modelo.Expediente_Codigo) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.codigo) + 
                   " FROM " + nameof(EPD_Citaciones) +
                   //Procedimiento
                   " INNER JOIN " + nameof(EPD_Procedimientos) + " ON " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) +
                   //Juzgado
                   " LEFT JOIN " + nameof(EPD_Juzgados) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idJuzgado) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.id) +
                   //Expediente
                   " LEFT JOIN " + nameof(EPD_Expedientes) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idExpediente) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.id) +
                   //Demandado
                   " LEFT JOIN " + nameof(EPD_Demandados) + " ON " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.idDemandado) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.id) +
                   //Asesor
                   " LEFT JOIN " + nameof(EPD_Asesores) + " ON " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idAsesor) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.id) +
                   //Materia
                   " LEFT JOIN " + nameof(EPD_Materias) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idMateria) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.id) +
                   //Actores
                   " LEFT JOIN (" +
                        " SELECT " +
                            nameof(EPD_Procedimientos_Actores.idProcedimiento) + "," +
                            " STUFF( " +
                            " ( " +
                                " SELECT DISTINCT ',' + " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.nombre) + 
                                " FROM " + nameof(EPD_Procedimientos_Actores) +
                                " INNER JOIN " + nameof(EPD_Actores) + " ON " + nameof(EPD_Procedimientos_Actores) + "." + nameof(EPD_Procedimientos_Actores.idActor) + " = " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.id) +
                                " WHERE " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.fechaBorrado) + " IS NUll AND " + nameof(EPD_Procedimientos_Actores.idProcedimiento) + " = a." + nameof(EPD_Procedimientos_Actores.idProcedimiento) + 
                                " FOR XML PATH(''))" +
                            " , 1, 1, ''" +
                            " )  AS Actores " +
                        " FROM  " + nameof(EPD_Procedimientos_Actores) + " AS a " +
                        " GROUP BY " + nameof(EPD_Procedimientos_Actores.idProcedimiento) + 
                   ") as Actores ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) + " = Actores." + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                   //WHERE
                   " WHERE " +
                        nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaBorrado) + " is null and " +
                        nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.fechaBorrado) + " is null and " +
                        nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.fechaBorrado) + " is null and " +
                        nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.fechaBorrado) + " is null and " +
                        nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.fechaBorrado) + " is null and " +
                        nameof(EPD_Materias) + "." + nameof(EPD_Materias.fechaBorrado) + " is null and " +
                        nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaHora) + ">=@fechaHoraInicio and " +
                        nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaHora) + "<=@fechaHoraFin " +
                        str_Filtro_IDS_Asesores +
                        str_Filtro_IDS_Juzgados;


                //Parametros
                object[] arr_Parametros = new object[]
                {
                    new SqlParameter("@fechaHoraInicio",  _dtt_FechaInicio),
                    new SqlParameter("@fechaHoraFin",  _dtt_FechaFin)
                };

                //Rellenar el Modelo
                lst_INTERNO_Informe_Citaciones_Modelo= obj_Exferia_Entities.Database.SqlQuery<INTERNO_Informe_Citaciones_Modelo>(str_SQL, arr_Parametros).ToList();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_Informe_Citaciones), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return lst_INTERNO_Informe_Citaciones_Modelo;
        }

        public List<INTERNO_Informe_CitacionesPorExpediente_Modelo> Obtener_Informe_CitacionesPorExpediente(long _lng_idEmpediente)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            List<INTERNO_Informe_CitacionesPorExpediente_Modelo> lst_INTERNO_Informe_CitacionesPorExpediente_Modelo = null;
            try
            {
                //Conexion
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                string str_SQL =
                            " SELECT distinct " +
                                //EXPDIENTE.........................................................................
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_id) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.id) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_codigo) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.codigo) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_descripcion) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.descripcion) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_fechaAlta) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.fechaAlta) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_fechaBaja) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.fechaBaja) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_colectivo) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.colectivo) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_demandanteDemandado) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.demandanteDemandado) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_observaciones) + " = " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.observaciones) + "," +
                                //Asesor
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_Asesor_codigo) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.codigo) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_Asesor_nombre) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.nombre) + "," +
                                //Demandado
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_Demandado_codigo) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.codigo) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_Demandado_nombre) + " = " + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.nombre) + "," +
                                //Empresa
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_Empresa_codigo) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.codigo) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_Empresa_descripcion) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.descripcion) + "," +
                                //Actores
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Expediente_Actores) + " = Expediente_Actores.Expediente_Actores, " +
                                //PROCEDIMIENTOS.....................................................................
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Procedimientos_id) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Procedimientos_numero) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.numero) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Procedimientos_numeroEjecucion) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.numeroEjecucion) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Procedimientos_observaciones) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.observaciones) + "," +
                                //Materia
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Procedimientos_Materia_codigo) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.codigo) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Procedimientos_Materia_descripcion) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.descripcion) + "," +
                                //Juzgado
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Procedimientos_Juzgado_codigo) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.codigo) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Procedimientos_Juzgado_descripcion) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.descripcion) + "," +
                                //Actores
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Procedimientos_Actores) + " = Actores.Actores, " +
                                //CITACIONES.........................................................
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Citaciones_id) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.id) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Citaciones_codigo) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.codigo) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Citaciones_descripcion) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.descripcion) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Citaciones_fechaHora) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaHora) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Citaciones_duracion) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.duracion) + "," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Citaciones_observaciones) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.observaciones) + "," +
                                //Asesor
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Citaciones_Asesor_codigo) + " = Citaciones_Asesor.codigo," +
                                nameof(INTERNO_Informe_CitacionesPorExpediente_Modelo.Citaciones_Asesor_nombre) + " = Citaciones_Asesor.nombre" +
                            " FROM " + nameof(EPD_Expedientes) +
                            //Asesor
                            " LEFT JOIN " + nameof(EPD_Asesores) + " ON " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.idAsesor) + " = " + nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.id) +
                            //Demandado
                            " LEFT JOIN " + nameof(EPD_Demandados) + " ON " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.idDemandado) + " =" + nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.id) + 
                            //Empresa
                            " LEFT JOIN " + nameof(GEN_Empresas) + " ON " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.idEmpresa) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.id) +
                            //Expediente_Actores
                            " LEFT JOIN (" +
                                            " SELECT " +
                                            nameof(EPD_Expedientes_Actores.idExpediente) + "," +
                                            " STUFF( " +
                                            " ( " +
                                                " SELECT DISTINCT ',' + " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.nombre) +
                                                " FROM " + nameof(EPD_Expedientes_Actores) +
                                                " INNER JOIN " + nameof(EPD_Actores) + " ON " + nameof(EPD_Expedientes_Actores) + "." + nameof(EPD_Expedientes_Actores.idActor) + " = " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.id) +
                                                " WHERE " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.fechaBorrado) + " IS NUll AND " + nameof(EPD_Expedientes_Actores.idExpediente) + " = a." + nameof(EPD_Expedientes_Actores.idExpediente) +
                                                " FOR XML PATH(''))" +
                                            " , 1, 1, ''" +
                                            " )  AS Expediente_Actores " +
                                            " FROM  " + nameof(EPD_Expedientes_Actores) + " AS a " +
                                            " GROUP BY " + nameof(EPD_Expedientes_Actores.idExpediente) +
                            ") as Expediente_Actores ON " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.id) + " = Expediente_Actores." + nameof(EPD_Expedientes_Actores.idExpediente) +
                            //Procedimientos
                            " LEFT JOIN " + nameof(EPD_Procedimientos) + " ON " + nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.id) + " = " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idExpediente) + 
                            //Materia
                            " LEFT JOIN " + nameof(EPD_Materias) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idMateria) + " = " + nameof(EPD_Materias) + "." + nameof(EPD_Materias.id) + 
                            //Juzgado
                            " LEFT JOIN " + nameof(EPD_Juzgados) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.idJuzgado) + " = " + nameof(EPD_Juzgados) + "." + nameof(EPD_Juzgados.id) +
                            //Procedimientos_Actores
                            " LEFT JOIN (" +
                                    " SELECT " +
                                    nameof(EPD_Procedimientos_Actores.idProcedimiento) + "," +
                                    " STUFF( " +
                                    " ( " +
                                        " SELECT DISTINCT ',' + " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.nombre) +
                                        " FROM " + nameof(EPD_Procedimientos_Actores) +
                                        " INNER JOIN " + nameof(EPD_Actores) + " ON " + nameof(EPD_Procedimientos_Actores) + "." + nameof(EPD_Procedimientos_Actores.idActor) + " = " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.id) +
                                        " WHERE " + nameof(EPD_Actores) + "." + nameof(EPD_Actores.fechaBorrado) + " IS NUll AND " + nameof(EPD_Procedimientos_Actores.idProcedimiento) + " = a." + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                                        " FOR XML PATH(''))" +
                                    " , 1, 1, ''" +
                                    " )  AS Actores " +
                                    " FROM  " + nameof(EPD_Procedimientos_Actores) + " AS a " +
                                    " GROUP BY " + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                            ") as Actores ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) + " = Actores." + nameof(EPD_Procedimientos_Actores.idProcedimiento) +
                            //Citaciones
                            " LEFT JOIN " + nameof(EPD_Citaciones) + " ON " + nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.id) + " = " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + 
                            //Citaciones_Asesor
                            " LEFT JOIN " + nameof(EPD_Asesores) + " as Citaciones_Asesor ON " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idAsesor) + " = Citaciones_Asesor." +  nameof(EPD_Asesores.id) + 
                            //WHERE 
                            " WHERE " +
                                nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.id) + " = @idExpediente AND " +
                                nameof(EPD_Asesores) + "." + nameof(EPD_Asesores.fechaBorrado) + " IS NULL AND " +
                                nameof(EPD_Demandados) + "." + nameof(EPD_Demandados.fechaBorrado) + " IS NULL AND " +
                                nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.fechaBorrado) + " IS NULL AND " +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Asesores.fechaBorrado) + " IS NULL AND " +
                                " Citaciones_Asesor.fechaBorrado IS NULL " +
                            " ORDER BY " +
                                nameof(EPD_Expedientes) + "." + nameof(EPD_Expedientes.fechaAlta) + " ASC," +
                                nameof(EPD_Procedimientos) + "." + nameof(EPD_Procedimientos.numero) + " ASC," +
                                nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaHora) + " ASC";
                     
                //Parametros
                object[] arr_Parametros = new object[]
                {
                    new SqlParameter("@idExpediente",  _lng_idEmpediente),
                };

                //Rellenar el Modelo
                lst_INTERNO_Informe_CitacionesPorExpediente_Modelo = obj_Exferia_Entities.Database.SqlQuery<INTERNO_Informe_CitacionesPorExpediente_Modelo>(str_SQL, arr_Parametros).ToList();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_Informe_CitacionesPorExpediente), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return lst_INTERNO_Informe_CitacionesPorExpediente_Modelo;
        }

        #endregion

        public override dynamic Obtener_Registro_PorCampo(string _str_Filtro, string _str_CampoBusqueda, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual)
        {
            throw new NotImplementedException();
        }
        #endregion

        #region MODELOS

        #region Modelo Simple
        private EPD_Citaciones g_mdl_EPD_Citaciones = null;
        public EPD_Citaciones Obtener_Modelo_Por_Id(long _lng_id,
                                                    bool _bol_Cargar_Asesor,
                                                    bool _bol_Cargar_Procedimiento)
        {
            try
            {
                string str_SQL = Obtener_Consulta_Modelo() +
                                  //WHERE
                                  " WHERE " + nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.id) + "=@id";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Ejecutar y rellenar el modelo
                Ejecutar_Consulta_Modelo(str_SQL,
                                         arr_Parametros,
                                         _bol_Cargar_Asesor,
                                         _bol_Cargar_Procedimiento);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_Modelo_Por_Id), true);
            }

            return g_mdl_EPD_Citaciones;
        }

        #region Ejecutar Consulta
        private static int g_int_TotalHilos_Modelo = 2;
        private bool[] g_bol_Hilos_Terminados_Modelo = new bool[g_int_TotalHilos_Modelo];

        private void Ejecutar_Consulta_Modelo(string _str_SQL,
                                            object[] _arr_Parametros,
                                            bool _bol_Cargar_Asesor,
                                            bool _bol_Cargar_Procedimiento)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                //Conexion
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Rellenar el Modelo
                g_mdl_EPD_Citaciones = obj_Exferia_Entities.Database.SqlQuery<EPD_Citaciones>(_str_SQL, _arr_Parametros).FirstOrDefault();

                #region Rellenar tablas Relacionadas
                if (g_mdl_EPD_Citaciones != null &&
                    (   _bol_Cargar_Asesor ||
                        _bol_Cargar_Procedimiento))
                {
                    //reiniciar Valores de los hilos
                    for (int int_Contador = 0; int_Contador < g_int_TotalHilos_Modelo; int_Contador++)
                    {
                        g_bol_Hilos_Terminados_Modelo[int_Contador] = false;
                    }

                    //EPD_Asesores ##########################################################################################
                    if (_bol_Cargar_Asesor)
                    {
                        ThreadStart obj_ThreadStart_ASESOR = new ThreadStart(Obtener_Asesor_Modelo);
                        Thread obj_Thread_ASESOR = new Thread(obj_ThreadStart_ASESOR);
                        obj_Thread_ASESOR.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo[0] = true;
                    }

                    //EPD_Procedimientos ##########################################################################################
                    if (_bol_Cargar_Procedimiento)
                    {
                        ThreadStart obj_ThreadStart_PROCEDIMIENTO = new ThreadStart(Obtener_Procedimiento_Modelo);
                        Thread obj_Thread_PROCEDIMIENTO = new Thread(obj_ThreadStart_PROCEDIMIENTO);
                        obj_Thread_PROCEDIMIENTO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo[1] = true;
                    }

                    //Esperando a que terminen todos los hilos .........................................
                    bool bol_Termino = false;
                    while (bol_Termino == false)
                    {
                        bol_Termino = true;
                        foreach (bool bol_Termino_Hilo in g_bol_Hilos_Terminados_Modelo)
                        {
                            if (bol_Termino_Hilo == false)
                            {
                                bol_Termino = false;
                                break;
                            }
                        }

                        Thread.Sleep(10);
                    }
                    //.................................................................................
                }
                #endregion
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones) + "/" + nameof(Ejecutar_Consulta_Modelo), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }

        #region Tablas Relacionadas
        private void Obtener_Asesor_Modelo()
        {
            try
            {
                EPD_Asesores_Datos obj_EPD_Asesores_Datos = new EPD_Asesores_Datos();
                g_mdl_EPD_Citaciones.EPD_Asesores = obj_EPD_Asesores_Datos.Obtener_Modelo_Por_Id(g_mdl_EPD_Citaciones.idAsesor,false);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo[0] = true;
            }
        }
        private void Obtener_Procedimiento_Modelo()
        {
            try
            {
                EPD_Procedimientos_Datos obj_EPD_Procedimientos_Datos = new EPD_Procedimientos_Datos();
                g_mdl_EPD_Citaciones.EPD_Procedimientos = obj_EPD_Procedimientos_Datos.Obtener_Modelo_Por_Id(g_mdl_EPD_Citaciones.idProcedimiento,true,false,false);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo[1] = true;
            }
        }
        #endregion

        #endregion

        #endregion

        #region Modelo Listado
        private List<EPD_Citaciones> g_lst_EPD_Citaciones = null;

        public List<EPD_Citaciones> Obtener_ModeloListado_Por_Ids(List<long> _lst_Ids,
                                                                bool _bol_Cargar_Asesor,
                                                                bool _bol_Cargar_Procedimiento)
        {
            try
            {
                if (_lst_Ids != null && _lst_Ids.Count > 0)
                {
                    string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(EPD_Citaciones),
                                                                                            nameof(EPD_Citaciones.id),
                                                                                            G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.NADA,
                                                                                            _lst_Ids);

                    //Consulta
                    string str_SQL = Obtener_Consulta_Modelo() +
                                                " WHERE " +
                                                    str_Filtro_IDS;

                    //Ejecutar y rellenar el listado
                    Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                     new object[] { },
                                                     _bol_Cargar_Asesor,
                                                     _bol_Cargar_Procedimiento);
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Obtener_ModeloListado_Por_Ids), true);
            }

            return g_lst_EPD_Citaciones;
        }

        #region Ejecutar Consulta
        //Listado de modelos Relacionados
        private List<EPD_Asesores> g_lst_EPD_Asesores = null;
        private List<EPD_Procedimientos> g_lst_EPD_Procedimientos = null;

        //Hilos
        private static int g_int_TotalHilos_Modelo_Listado = 2;
        private bool[] g_bol_Hilos_Terminados_Modelo_Listado = new bool[g_int_TotalHilos_Modelo_Listado];

        private void Ejecutar_Consulta_Modelo_Listado(string _str_SQL,
                                                    object[] _arr_Parametros,
                                                    bool _bol_Cargar_Asesor,
                                                    bool _bol_Cargar_Procedimiento)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                //Conexion
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;


                //Rellenar el modelo
                g_lst_EPD_Citaciones = obj_Exferia_Entities.Database.SqlQuery<EPD_Citaciones>(_str_SQL, _arr_Parametros).ToList();

                #region Rellenar Tablas RElacionadas
                if (g_lst_EPD_Citaciones != null && g_lst_EPD_Citaciones.Count > 0)
                {

                    //Si tiene que buscar alguna tabla relacionada
                    if ( _bol_Cargar_Asesor ||
                         _bol_Cargar_Procedimiento)
                    {
                        #region PRIMERO BUSCO LOS DATOS DE LAS TABLAS RELACIONADAS
                        //reiniciar Valores de los hilos
                        for (int int_Contador = 0; int_Contador < g_int_TotalHilos_Modelo_Listado; int_Contador++)
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[int_Contador] = false;
                        }

                        //EPD_Asesores #############################################
                        if (_bol_Cargar_Asesor)
                        {
                            ThreadStart obj_ThreadStart_ASESOR = new ThreadStart(Obtener_Asesor_Modelo_Listado);
                            Thread obj_Thread_ASESOR = new Thread(obj_ThreadStart_ASESOR);
                            obj_Thread_ASESOR.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[0] = true;
                        }

                        //EPD_Procedimientos #############################################
                        if (_bol_Cargar_Procedimiento)
                        {
                            ThreadStart obj_ThreadStart_PROCEDIMIENTO = new ThreadStart(Obtener_Procedimientos_Modelo_Listado);
                            Thread obj_Thread_PROCEDIMIENTO = new Thread(obj_ThreadStart_PROCEDIMIENTO);
                            obj_Thread_PROCEDIMIENTO.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[1] = true;
                        }

                        //Esperando a que terminen todos los hilos .........................................
                        bool bol_Termino = false;
                        while (bol_Termino == false)
                        {
                            bol_Termino = true;
                            foreach (bool bol_Termino_Hilo in g_bol_Hilos_Terminados_Modelo_Listado)
                            {
                                if (bol_Termino_Hilo == false)
                                {
                                    bol_Termino = false;
                                    break;
                                }
                            }

                            Thread.Sleep(10);
                        }
                        //.................................................................................
                        #endregion

                        #region DESPUES SE LO VOY ASIGNANDO A LOS REGISTRO UNO A UNO
                        foreach (EPD_Citaciones mdl_EPD_Citaciones in g_lst_EPD_Citaciones)
                        {
                            //EPD_Asesores #############################################
                            if (_bol_Cargar_Asesor &&
                                g_lst_EPD_Asesores != null &&
                                g_lst_EPD_Asesores.Count > 0)
                            {
                                mdl_EPD_Citaciones.EPD_Asesores = g_lst_EPD_Asesores.Where(m => m.id == mdl_EPD_Citaciones.idAsesor).FirstOrDefault();
                            }

                            //EPD_Procedimientos #############################################
                            if (_bol_Cargar_Procedimiento &&
                                g_lst_EPD_Procedimientos != null &&
                                g_lst_EPD_Procedimientos.Count > 0)
                            {
                                mdl_EPD_Citaciones.EPD_Procedimientos = g_lst_EPD_Procedimientos.Where(m => m.id == mdl_EPD_Citaciones.idProcedimiento).FirstOrDefault();
                            }
                        }
                        #endregion
                    }

                }
                #endregion


            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo_Listado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }

        #region Tablas Relacionadas
        private void Obtener_Asesor_Modelo_Listado()
        {
            try
            {
                EPD_Asesores_Datos obj_EPD_Asesores_Datos = new EPD_Asesores_Datos();
                g_lst_EPD_Asesores = obj_EPD_Asesores_Datos.Obtener_ModeloListado_Por_Ids(g_lst_EPD_Citaciones.Select(m => m.idAsesor).ToList(),false);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[0] = true;
            }
        }
        private void Obtener_Procedimientos_Modelo_Listado()
        {
            try
            {
                EPD_Procedimientos_Datos obj_EPD_Procedimientos_Datos = new EPD_Procedimientos_Datos();
                g_lst_EPD_Procedimientos = obj_EPD_Procedimientos_Datos.Obtener_ModeloListado_Por_Ids(g_lst_EPD_Citaciones.Select(m => m.idProcedimiento).ToList(),true,false,false);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[1] = true;
            }
        }
        #endregion

        #endregion

        #endregion

        private string Obtener_Consulta_Modelo()
        {
            return
               " SELECT " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.id) + " , " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.codigo) + " , " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.descripcion) + " , " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaHora) + " , " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.duracion) + " , " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idProcedimiento) + " , " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idAsesor) + " , " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.idEmpresa) + " , " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.observaciones) + " , " +
                    nameof(EPD_Citaciones) + "." + nameof(EPD_Citaciones.fechaBorrado) + 
               " FROM " + nameof(EPD_Citaciones);
        }
        #endregion

        #region Grabar
        public override INTERNO_ValorDevuelto_Modelo Grabar(object _mdl_obj)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                EPD_Citaciones mdl_EPD_Citaciones_AGrabar = (EPD_Citaciones)_mdl_obj;
                EPD_Citaciones mdl_EPD_Citaciones_DatosViejos = new EPD_Citaciones();

                // Ver si existe ######################################################################
                EPD_Citaciones mdl_EPD_Citaciones_Final = Obtener_Modelo_Por_Id(mdl_EPD_Citaciones_AGrabar.id, false,false);
                //###################################################################################### 

                //UPDATE
                if (mdl_EPD_Citaciones_Final != null)
                {
                    //Tipo de Accion que se va a realizar
                    mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_MODIFICAR;

                    //Datos viejos para la trazabilidad
                    Funciones.CopiarPropiedadesObjetos(mdl_EPD_Citaciones_Final, mdl_EPD_Citaciones_DatosViejos, false, false);

                    // Cargar los Datos Nuevos del Modelo
                    Funciones.CopiarPropiedadesObjetos(mdl_EPD_Citaciones_AGrabar, mdl_EPD_Citaciones_Final, false, false);

                    #region UPDATE
                    string str_SQL_Update = " UPDATE " + nameof(EPD_Citaciones) +
                                           " SET " +
                                                nameof(EPD_Citaciones.codigo) + "=@codigo," +
                                                 nameof(EPD_Citaciones.descripcion) + "=@descripcion," +
                                                 nameof(EPD_Citaciones.fechaHora) + "=@fechaHora," +
                                                 nameof(EPD_Citaciones.duracion) + "=@duracion," +
                                                 nameof(EPD_Citaciones.idProcedimiento) + "=@idProcedimiento," +
                                                 nameof(EPD_Citaciones.idAsesor) + "=@idAsesor," +
                                                 nameof(EPD_Citaciones.idEmpresa) + "=@idEmpresa," +
                                                 nameof(EPD_Citaciones.observaciones) + "=@observaciones," +
                                                nameof(EPD_Citaciones.fechaBorrado) + "=@fechaBorrado" +
                                           " WHERE " +
                                               nameof(EPD_Citaciones.id) + "=@id";

                    //Parametros
                    object[] arr_Parametros_Update = new object[]
                    {
                        new SqlParameter("@codigo",  mdl_EPD_Citaciones_AGrabar.codigo),
                        new SqlParameter("@descripcion",  mdl_EPD_Citaciones_AGrabar.descripcion),
                        new SqlParameter("@fechaHora",  mdl_EPD_Citaciones_AGrabar.fechaHora),
                        new SqlParameter("@duracion",  mdl_EPD_Citaciones_AGrabar.duracion),
                        new SqlParameter("@idProcedimiento",  mdl_EPD_Citaciones_AGrabar.idProcedimiento),
                        new SqlParameter("@idAsesor",  mdl_EPD_Citaciones_AGrabar.idAsesor),
                        new SqlParameter("@idEmpresa",  mdl_EPD_Citaciones_AGrabar.idEmpresa),
                        mdl_EPD_Citaciones_AGrabar.observaciones!=null
                            ?   new SqlParameter("@observaciones", mdl_EPD_Citaciones_AGrabar.observaciones)
                            :   new SqlParameter("@observaciones",  DBNull.Value),
                        mdl_EPD_Citaciones_AGrabar.fechaBorrado!=null
                            ?   new SqlParameter("@fechaBorrado", mdl_EPD_Citaciones_AGrabar.fechaBorrado.Value)
                            :   new SqlParameter("@fechaBorrado",  DBNull.Value),
                        new SqlParameter("@id",  mdl_EPD_Citaciones_AGrabar.id)
                    };

                    #endregion

                    //Update
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Update, arr_Parametros_Update);

                    //Id de la tabla
                    mdl_INTERNO_ValorDevuelto_Modelo.Id = mdl_EPD_Citaciones_AGrabar.id;
                }
                //INSERT
                else
                {
                    mdl_EPD_Citaciones_Final = new EPD_Citaciones();

                    //Tipo de Accion que se va a realizar
                    mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_INSERTAR;

                    // Cargar los Datos del Modelo
                    Funciones.CopiarPropiedadesObjetos(mdl_EPD_Citaciones_AGrabar, mdl_EPD_Citaciones_Final, false, false);

                    #region INSERT
                    string str_SQL_Insert = " INSERT INTO " + nameof(EPD_Citaciones) +
                                               " (" +
                                                        nameof(EPD_Citaciones.codigo) + "," +
                                                        nameof(EPD_Citaciones.descripcion) + "," +
                                                        nameof(EPD_Citaciones.fechaHora) + "," +
                                                        nameof(EPD_Citaciones.duracion) + "," +
                                                        nameof(EPD_Citaciones.idProcedimiento) + "," +
                                                        nameof(EPD_Citaciones.idAsesor) + "," +
                                                        nameof(EPD_Citaciones.idEmpresa) + "," +
                                                        nameof(EPD_Citaciones.observaciones) + "," +
                                                        nameof(EPD_Citaciones.fechaBorrado) + 
                                               " ) " +
                                               " OUTPUT INSERTED." + nameof(EPD_Citaciones.id) +
                                               " VALUES " +
                                               " ( " +
                                                    "@codigo," +
                                                    "@descripcion," +
                                                    "@fechaHora," +
                                                    "@duracion," +
                                                    "@idProcedimiento," +
                                                    "@idAsesor," +
                                                    "@idEmpresa," +
                                                    "@observaciones," +
                                                    "@fechaBorrado" +
                                               " ) ";

                    //Parametros
                    object[] arr_Parametros_Insert = new object[]
                    {
                         new SqlParameter("@codigo",  mdl_EPD_Citaciones_AGrabar.codigo),
                        new SqlParameter("@descripcion",  mdl_EPD_Citaciones_AGrabar.descripcion),
                        new SqlParameter("@fechaHora",  mdl_EPD_Citaciones_AGrabar.fechaHora),
                        new SqlParameter("@duracion",  mdl_EPD_Citaciones_AGrabar.duracion),
                        new SqlParameter("@idProcedimiento",  mdl_EPD_Citaciones_AGrabar.idProcedimiento),
                        new SqlParameter("@idAsesor",  mdl_EPD_Citaciones_AGrabar.idAsesor),
                        new SqlParameter("@idEmpresa",  mdl_EPD_Citaciones_AGrabar.idEmpresa),
                        mdl_EPD_Citaciones_AGrabar.observaciones!=null
                            ?   new SqlParameter("@observaciones", mdl_EPD_Citaciones_AGrabar.observaciones)
                            :   new SqlParameter("@observaciones",  DBNull.Value),
                        mdl_EPD_Citaciones_AGrabar.fechaBorrado!=null
                            ?   new SqlParameter("@fechaBorrado", mdl_EPD_Citaciones_AGrabar.fechaBorrado.Value)
                            :   new SqlParameter("@fechaBorrado",  DBNull.Value)
                    };
                    #endregion

                    //Id de la tabla
                    mdl_INTERNO_ValorDevuelto_Modelo.Id = obj_Exferia_Entities.Database.SqlQuery<long>(str_SQL_Insert, arr_Parametros_Insert).Single();
                }

                // Grabar un registro de trazabilidad con los datos de la transaccion realizada.
                Datos_Generales.USR_Trazabilidad_Grabar(typeof(EPD_Citaciones), mdl_EPD_Citaciones_DatosViejos, mdl_EPD_Citaciones_Final, mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion, obj_Exferia_Entities);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Grabar), true);
            }
            finally
            {

                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar
        public override INTERNO_ValorDevuelto_Modelo Borrar(long _lng_id)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Tipo de Accion que se va a realizar
            mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                // Ver si existe ######################################################################
                EPD_Citaciones mdl_EPD_Citaciones_Final = Obtener_Modelo_Por_Id(_lng_id, false,false);
                //######################################################################################

                if (mdl_EPD_Citaciones_Final != null)
                {
                    #region UPDATE
                    string str_SQL_Update = " UPDATE " + nameof(EPD_Citaciones) +
                                               " SET " +
                                               nameof(EPD_Citaciones.fechaBorrado) + "=@fechaBorrado " +
                                           " WHERE " +
                                               nameof(EPD_Citaciones.id) + "=@id";
                    //Parametros
                    object[] arr_Parametros_Update = new object[]
                    {
                        new SqlParameter("@fechaBorrado",  DateTime.Now),
                        new SqlParameter("@id", _lng_id)
                    };
                    #endregion

                    //Update
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Update, arr_Parametros_Update);

                    // Grabar un registro de trazabilidad con los datos de la transaccion realizada.
                    Datos_Generales.USR_Trazabilidad_Grabar(typeof(EPD_Citaciones), null, mdl_EPD_Citaciones_Final, G_ENUM_TIPOACCION.INT_ELIMINAR, obj_Exferia_Entities);
                }

                // Devolver también el Objeto
                mdl_ValorDevuelto_Modelo.Id = _lng_id;

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Borrar), true);
            }
            finally
            {

                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(long _lng_id, long _lng_idAuxiliar)
        {
            throw new NotImplementedException();
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(object _mdl_obj)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                List<long> lst_idCitaciones = (List<long>)_mdl_obj;

                if (lst_idCitaciones != null & lst_idCitaciones.Count > 0)
                {
                    string str_Filtro_Citaciones = Funciones.Formar_ContenidoIN_ParaConsultaWhere(lst_idCitaciones);

                    //Lineas
                    string str_SQL = " UPDATE " + nameof(EPD_Citaciones) +
                                     " SET " +
                                               nameof(EPD_Citaciones.fechaBorrado) + "=@fechaBorrado " +
                                     " WHERE " + nameof(EPD_Citaciones.id) + " in (" + str_Filtro_Citaciones + ")";

                    //Parametros
                    object[] arr_Parametros_Update = new object[]
                    {
                        new SqlParameter("@fechaBorrado",  DateTime.Now)
                    };

                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL, arr_Parametros_Update);
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(EPD_Citaciones_Datos) + "/" + nameof(Borrar), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion
    }
}
