using Exferia_Aplicacion.Herencia.Capas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Exferia_Aplicacion.General;
using Exferia_EntityFramework;
using System.Runtime.CompilerServices;
using static Exferia_Aplicacion.General.Enumerados;
using System.Data.SqlClient;
using System.Threading;

namespace Exferia_General._1_Datos
{
    public class GEN_Direcciones_Datos : ABS_Datos
    {
        #region Listado
        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)
        {
            return null;
        }
        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_id)
        {
            return null;
        }
        protected override void ConsultaRellenar_Listado(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionas, List<string> _lst_CamposConRelacionABuscar, long _lng_id, List<long> _lst_id, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        { }
        #endregion

        #region Listado Secundario
        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)
        {
            return null;
        }
        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)
        {
            return null;
        }
        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
        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)
        {
            return null;
        }
        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)
        {
            return null;
        }
        protected override void ConsultaRellenar_F3(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionadas, 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)
        { }
        #endregion

        #region Obtener
        public override dynamic Obtener(long _lng_id)
        {
            return null;
        }
        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 GEN_Direcciones g_mdl_GEN_Direcciones = null;
        public GEN_Direcciones Obtener_Modelo_Por_Id(long _lng_id)
        {
            try
            {

                string str_SQL = Obtener_Consulta_Modelo() +
                                  //WHERE
                                  " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.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,
                                        false,
                                        false,
                                        false,
                                        false,
                                        false);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GEN_Direcciones_Datos) + "/" + nameof(Obtener_Modelo_Por_Id), true);
            }

            return g_mdl_GEN_Direcciones;
        }

        public GEN_Direcciones Obtener_Modelo_Por_TipodireccionEmpresa(string _str_TipoDireccion,
                                                                       long _lng_idEmpresa)
        {
            try
            {

                string str_SQL = Obtener_Consulta_Modelo() +
                                  //WHERE
                                  " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idEmpresa) + "=@idEmpresa";

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

                //Ejecutar y rellenar el modelo
                Ejecutar_Consulta_Modelo(str_SQL,
                                        arr_Parametros,
                                        true,
                                        false,
                                        false,
                                        false,
                                        false);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GEN_Direcciones_Datos) + "/" + nameof(Obtener_Modelo_Por_TipodireccionEmpresa), true);
            }

            return g_mdl_GEN_Direcciones;
        }
        #region Ejecutar Consulta
      
        private static int g_int_TotalHilos_Modelo = 5;
        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_Paises,
                                              bool _bol_Cargar_Provincia, 
                                              bool _bol_Cargar_Municipio,
                                              bool _bol_Cargar_Poblacion,
                                              bool _bol_Cargar_TipoVia)
        {
            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_GEN_Direcciones = obj_Exferia_Entities.Database.SqlQuery<GEN_Direcciones>(_str_SQL, _arr_Parametros).FirstOrDefault();

                #region Rellenar tablas Relacionadas
                if (g_mdl_GEN_Direcciones != null)
                {
                    //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;
                    }

                    //PAISES ##########################################################################################
                    if (_bol_Cargar_Paises)
                    {
                        ThreadStart obj_ThreadStart_PAISES = new ThreadStart(Obtener_Pais_Modelo);
                        Thread obj_Thread_PAISES = new Thread(obj_ThreadStart_PAISES);
                        obj_Thread_PAISES.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo[0] = true;
                    }

                    //PROVINCIAS ##########################################################################################
                    if (_bol_Cargar_Provincia)
                    {
                        ThreadStart obj_ThreadStart_PROVINCIAS = new ThreadStart(Obtener_Provincia_Modelo);
                        Thread obj_Thread_PROVINCIAS = new Thread(obj_ThreadStart_PROVINCIAS);
                        obj_Thread_PROVINCIAS.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo[1] = true;
                    }

                    //MUNICIPIOS ##########################################################################################
                    if (_bol_Cargar_Municipio &&
                        g_mdl_GEN_Direcciones.idMunicipio!=null)
                    {
                        ThreadStart obj_ThreadStart_MUNICIPIOS = new ThreadStart(Obtener_Municipio_Modelo);
                        Thread obj_Thread_MUNICIPIOS = new Thread(obj_ThreadStart_MUNICIPIOS);
                        obj_Thread_MUNICIPIOS.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo[2] = true;
                    }

                    //POBLACIONES ##########################################################################################
                    if (_bol_Cargar_Poblacion &&
                        g_mdl_GEN_Direcciones.idPoblacion != null)
                    {
                        ThreadStart obj_ThreadStart_POBLACION = new ThreadStart(Obtener_Poblacion_Modelo);
                        Thread obj_Thread_POBLACION = new Thread(obj_ThreadStart_POBLACION);
                        obj_Thread_POBLACION.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo[3] = true;
                    }

                    //TIPOSVIAS ##########################################################################################
                    if (_bol_Cargar_TipoVia &&
                        g_mdl_GEN_Direcciones.idTipoVia != null)
                    {
                        ThreadStart obj_ThreadStart_TIPOVIA = new ThreadStart(Obtener_TipoVia_Modelo);
                        Thread obj_Thread_TIPOVIA = new Thread(obj_ThreadStart_TIPOVIA);
                        obj_Thread_TIPOVIA.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo[4] = 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(GEN_Direcciones_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }

        #region Tablas Relacionadas
        private void Obtener_Pais_Modelo()
        {
            try
            {
                GEN_Paises_Datos obj_GEN_Paises_Datos = new GEN_Paises_Datos();
                g_mdl_GEN_Direcciones.GEN_Paises = obj_GEN_Paises_Datos.Obtener_Modelo_Por_Id(g_mdl_GEN_Direcciones.idPais);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo[0] = true;
            }
        }
        private void Obtener_Provincia_Modelo()
        {
            try
            {
                GEN_Provincias_Datos obj_GEN_Provincias_Datos = new GEN_Provincias_Datos();
                g_mdl_GEN_Direcciones.GEN_Provincias = obj_GEN_Provincias_Datos.Obtener_Modelo_Por_Id(g_mdl_GEN_Direcciones.idProvincia);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo[1] = true;
            }
        }
        private void Obtener_Municipio_Modelo()
        {
            try
            {
                GEN_Municipios_Datos obj_GEN_Municipios_Datos = new GEN_Municipios_Datos();
                g_mdl_GEN_Direcciones.GEN_Municipios = obj_GEN_Municipios_Datos.Obtener_Modelo_Por_Id(g_mdl_GEN_Direcciones.idMunicipio.Value);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo[2] = true;
            }
        }
        private void Obtener_Poblacion_Modelo()
        {
            try
            {
                GEN_Poblaciones_Datos obj_GEN_Poblaciones_Datos = new GEN_Poblaciones_Datos();
                g_mdl_GEN_Direcciones.GEN_Poblaciones = obj_GEN_Poblaciones_Datos.Obtener_Modelo_Por_Id(g_mdl_GEN_Direcciones.idPoblacion.Value);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo[3] = true;
            }
        }
        private void Obtener_TipoVia_Modelo()
        {
            try
            {
                GEN_TiposVias_Datos obj_GEN_TiposVias_Datos = new GEN_TiposVias_Datos();
                g_mdl_GEN_Direcciones.GEN_TiposVias = obj_GEN_TiposVias_Datos.Obtener_Modelo_Por_Id(g_mdl_GEN_Direcciones.idTipoVia.Value);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo[4] = true;
            }
        }
        #endregion

        #endregion
        #endregion

        #region Modelo Listado
        private List<GEN_Direcciones> g_lst_GEN_Direcciones = null;

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsEmpresaTipoDireccion(List<long> _lst_ids, 
                                                                                       string _str_TipoDireccion,
                                                                                       bool _bol_Cargar_Paises,
                                                                                       bool _bol_Cargar_Provincia,
                                                                                       bool _bol_Cargar_Municipio,
                                                                                       bool _bol_Cargar_Poblacion,
                                                                                       bool _bol_Cargar_TipoVia)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                        nameof(GEN_Direcciones.idEmpresa),
                                                                                        G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                        _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    " ( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idEmpresa) + " is null ) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);
                

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsClienteTipoDireccion(List<long> _lst_ids,
                                                                                       string _str_TipoDireccion,
                                                                                       bool _bol_Cargar_Paises,
                                                                                       bool _bol_Cargar_Provincia,
                                                                                       bool _bol_Cargar_Municipio,
                                                                                       bool _bol_Cargar_Poblacion,
                                                                                       bool _bol_Cargar_TipoVia)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                        nameof(GEN_Direcciones.idCliente),
                                                                                        G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                        _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idCliente) + " is null ) " +
                                    str_Filtro_IDS;

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);
                
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GEN_Direcciones_Datos) + "/" + nameof(Obtener_ModeloListado_Por_IdsClienteTipoDireccion), true);
            }

            return g_lst_GEN_Direcciones;
        }


        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsProveedorTipoDireccion(List<long> _lst_ids,
                                                                                       string _str_TipoDireccion,
                                                                                         bool _bol_Cargar_Paises,
                                                                                         bool _bol_Cargar_Provincia,
                                                                                         bool _bol_Cargar_Municipio,
                                                                                         bool _bol_Cargar_Poblacion,
                                                                                         bool _bol_Cargar_TipoVia)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                       nameof(GEN_Direcciones.idProveedor),
                                                                                       G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                       _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idProveedor) + " is null ) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);
                
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GEN_Direcciones_Datos) + "/" + nameof(Obtener_ModeloListado_Por_IdsProveedorTipoDireccion), true);
            }

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsEmpleadoTipoDireccion(List<long> _lst_ids,
                                                                                       string _str_TipoDireccion,
                                                                                       bool _bol_Cargar_Paises,
                                                                                       bool _bol_Cargar_Provincia,
                                                                                       bool _bol_Cargar_Municipio,
                                                                                       bool _bol_Cargar_Poblacion,
                                                                                       bool _bol_Cargar_TipoVia)
        {
            try
            {
                
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                       nameof(GEN_Direcciones.idEmpleado),
                                                                                       G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                       _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idEmpleado) + " is null) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);
                
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GEN_Direcciones_Datos) + "/" + nameof(Obtener_ModeloListado_Por_IdsEmpleadoTipoDireccion), true);
            }

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsEmpresaInstaladoraTipoDireccion(List<long> _lst_ids,
                                                                                      string _str_TipoDireccion,
                                                                                      bool _bol_Cargar_Paises,
                                                                                      bool _bol_Cargar_Provincia,
                                                                                      bool _bol_Cargar_Municipio,
                                                                                      bool _bol_Cargar_Poblacion,
                                                                                      bool _bol_Cargar_TipoVia)
        {
            try
            {

                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                       nameof(GEN_Direcciones.idEmpresaInstaladora),
                                                                                       G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                       _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idEmpresaInstaladora) + " is null) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsClientes_HPVTipoDireccion(List<long> _lst_ids,
                                                                                       string _str_TipoDireccion,
                                                                                          bool _bol_Cargar_Paises,
                                                                                          bool _bol_Cargar_Provincia,
                                                                                          bool _bol_Cargar_Municipio,
                                                                                          bool _bol_Cargar_Poblacion,
                                                                                          bool _bol_Cargar_TipoVia)
            {
                try
                {
                   
                    List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                    //Agregar el parametro de tipoDireccion
                    lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                    string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                           nameof(GEN_Direcciones.idCliente_HPV),
                                                                                           G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                           _lst_ids);

                    //Consulta
                    string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " +
                                        nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                        "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idCliente_HPV) + " is null ) " +
                                        str_Filtro_IDS;


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

                    //Ejecutar y rellenar el listado
                    Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                        arr_Parametros,
                                                        _bol_Cargar_Paises,
                                                        _bol_Cargar_Provincia,
                                                        _bol_Cargar_Municipio,
                                                        _bol_Cargar_Poblacion,
                                                        _bol_Cargar_TipoVia);
                    
                }
                catch (Control_Errores)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    throw new Control_Errores("", ex, nameof(GEN_Direcciones_Datos) + "/" + nameof(Obtener_ModeloListado_Por_IdsClientes_HPVTipoDireccion), true);
                }

                return g_lst_GEN_Direcciones;
            }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsSociosTipoDireccion(List<long> _lst_ids,
                                                                                       string _str_TipoDireccion,
                                                                                      bool _bol_Cargar_Paises,
                                                                                      bool _bol_Cargar_Provincia,
                                                                                      bool _bol_Cargar_Municipio,
                                                                                      bool _bol_Cargar_Poblacion,
                                                                                      bool _bol_Cargar_TipoVia)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                           nameof(GEN_Direcciones.idSocio),
                                                                                           G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                           _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idSocio) + " is null ) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);
                
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GEN_Direcciones_Datos) + "/" + nameof(Obtener_ModeloListado_Por_IdsSociosTipoDireccion), true);
            }

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsOrganismoCertificadorTipoDireccion(List<long> _lst_ids,
                                                                                                    string _str_TipoDireccion,
                                                                                                    bool _bol_Cargar_Paises,
                                                                                                    bool _bol_Cargar_Provincia,
                                                                                                    bool _bol_Cargar_Municipio,
                                                                                                    bool _bol_Cargar_Poblacion,
                                                                                                    bool _bol_Cargar_TipoVia)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                           nameof(GEN_Direcciones.idOrganismoCertificador),
                                                                                           G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                           _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idOrganismoCertificador) + " is null ) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsInstalacionTipoDireccion(List<long> _lst_ids,
                                                                                                   string _str_TipoDireccion,
                                                                                                   bool _bol_Cargar_Paises,
                                                                                                   bool _bol_Cargar_Provincia,
                                                                                                   bool _bol_Cargar_Municipio,
                                                                                                   bool _bol_Cargar_Poblacion,
                                                                                                   bool _bol_Cargar_TipoVia)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                           nameof(GEN_Direcciones.idInstalacionCabecera),
                                                                                           G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                           _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idInstalacionCabecera) + " is null ) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsAdministradorTipoDireccion(List<long> _lst_ids,
                                                                                                  string _str_TipoDireccion,
                                                                                                  bool _bol_Cargar_Paises,
                                                                                                  bool _bol_Cargar_Provincia,
                                                                                                  bool _bol_Cargar_Municipio,
                                                                                                  bool _bol_Cargar_Poblacion,
                                                                                                  bool _bol_Cargar_TipoVia)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                           nameof(GEN_Direcciones.idAdministrador),
                                                                                           G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                           _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idAdministrador) + " is null ) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsJuzgadoTipoDireccion(List<long> _lst_ids,
                                                                                        string _str_TipoDireccion,
                                                                                        bool _bol_Cargar_Paises,
                                                                                        bool _bol_Cargar_Provincia,
                                                                                        bool _bol_Cargar_Municipio,
                                                                                        bool _bol_Cargar_Poblacion,
                                                                                        bool _bol_Cargar_TipoVia)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                           nameof(GEN_Direcciones.idJuzgado),
                                                                                           G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                           _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idJuzgado) + " is null ) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdsAgenciaHermesTipoDireccion(List<long> _lst_ids,
                                                                                       string _str_TipoDireccion,
                                                                                       bool _bol_Cargar_Paises,
                                                                                       bool _bol_Cargar_Provincia,
                                                                                       bool _bol_Cargar_Municipio,
                                                                                       bool _bol_Cargar_Poblacion,
                                                                                       bool _bol_Cargar_TipoVia)
        {
            try
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                //Agregar el parametro de tipoDireccion
                lst_Parametros.Add(new SqlParameter("@tipoDireccion", _str_TipoDireccion));

                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(GEN_Direcciones),
                                                                                           nameof(GEN_Direcciones.idAgenciaHermes),
                                                                                           G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_INICIO,
                                                                                           _lst_ids);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                //WHERE
                                " WHERE " +
                                    nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion and " +
                                    "( not " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idAgenciaHermes) + " is null ) " +
                                    str_Filtro_IDS;


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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Paises,
                                                    _bol_Cargar_Provincia,
                                                    _bol_Cargar_Municipio,
                                                    _bol_Cargar_Poblacion,
                                                    _bol_Cargar_TipoVia);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdEmpresa(long _lng_IdEmpresa)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idEmpresa) + "=@idEmpresa";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);
                
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GEN_Direcciones_Datos) + "/" + nameof(Obtener_ModeloListado_Por_IdEmpresa), true);
            }

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdCliente(long _lng_IdCliente)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idCliente) + "=@idCliente";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdProveedor(long _lng_IdProveedor)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idProveedor) + "=@idProveedor";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdEmpleado(long _lng_IdEmpleado)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idEmpleado) + "=@idEmpleado";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdEmpresaInstaladora(long _lng_IdEmpresaInstaladora)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idEmpresaInstaladora) + "=@idEmpresaInstaladora";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdClientes_HPV(long _lng_IdClientes_HPV)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idCliente_HPV) + "=@idCliente_HPV";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdSocio(long _lng_IdSocio)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idSocio) + "=@idSocio";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdOrganismoCertificador(long _lng_IdOrganismoCertificador)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idOrganismoCertificador) + "=@idOrganismoCertificador";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdInstalacion(long _lng_idInstalacionCabecera)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idInstalacionCabecera) + "=@idInstalacionCabecera";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdAdministrador(long _lng_idAdministrador)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idAdministrador) + "=@idAdministrador";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdJuzgado(long _lng_idJuzgado)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idJuzgado) + "=@idJuzgado";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        public List<GEN_Direcciones> Obtener_ModeloListado_Por_IdAgenciaHermes(long _lng_idAgenciaHermes)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(GEN_Direcciones) + "." + nameof(GEN_Direcciones.idAgenciaHermes) + "=@idAgenciaHermes";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 arr_Parametros,
                                                 true,
                                                 true,
                                                 true,
                                                 true,
                                                 true);

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

            return g_lst_GEN_Direcciones;
        }

        #region Ejecutar Consulta
        //Listado de modelos Relacionados
        private List<GEN_Paises> g_lst_GEN_Paises = null;
        private List<GEN_Provincias> g_lst_GEN_Provincias = null;
        private List<GEN_Municipios> g_lst_GEN_Municipios = null;
        private List<GEN_Poblaciones> g_lst_GEN_Poblaciones = null;
        private List<GEN_TiposVias> g_lst_GEN_TiposVias = null;

        //Hilos
        private static int g_int_TotalHilos_Modelo_Listado = 5;
        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_Paises,
                                                      bool _bol_Cargar_Provincia,
                                                      bool _bol_Cargar_Municipio,
                                                      bool _bol_Cargar_Poblacion,
                                                      bool _bol_Cargar_TipoVia)
        {
            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_GEN_Direcciones = obj_Exferia_Entities.Database.SqlQuery<GEN_Direcciones>(_str_SQL, _arr_Parametros).ToList();

                #region Rellenar tablas Relacionadas
                if (g_lst_GEN_Direcciones != null && g_lst_GEN_Direcciones.Count > 0)
                {
                    //Si tiene que buscar alguna tabla relacionada
                    if (_bol_Cargar_Paises ||
                        _bol_Cargar_Provincia ||
                        _bol_Cargar_Municipio ||
                        _bol_Cargar_Poblacion ||
                        _bol_Cargar_TipoVia)
                    {
                        #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;
                        }

                        //GEN_Paises #############################################
                        if (_bol_Cargar_Paises)
                        {
                            ThreadStart obj_ThreadStart_PAISES = new ThreadStart(Obtener_Paises_Modelo_Listado);
                            Thread obj_Thread_PAISES = new Thread(obj_ThreadStart_PAISES);
                            obj_Thread_PAISES.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[0] = true;
                        }

                        //GEN_Provincias #############################################
                        if (_bol_Cargar_Provincia)
                        {
                            ThreadStart obj_ThreadStart_PROVINCIAS = new ThreadStart(Obtener_Provincias_Modelo_Listado);
                            Thread obj_Thread_PROVINCIAS = new Thread(obj_ThreadStart_PROVINCIAS);
                            obj_Thread_PROVINCIAS.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[1] = true;
                        }

                        //GEN_Municipios #############################################
                        if (_bol_Cargar_Municipio)
                        {
                            ThreadStart obj_ThreadStart_MUNICIPIOS = new ThreadStart(Obtener_Municipios_Modelo_Listado);
                            Thread obj_Thread_MUNICIPIOS = new Thread(obj_ThreadStart_MUNICIPIOS);
                            obj_Thread_MUNICIPIOS.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[2] = true;
                        }

                        //GEN_Poblaciones #############################################
                        if (_bol_Cargar_Poblacion)
                        {
                            ThreadStart obj_ThreadStart_POBLACIONES = new ThreadStart(Obtener_Poblaciones_Modelo_Listado);
                            Thread obj_Thread_POBLACIONES = new Thread(obj_ThreadStart_POBLACIONES);
                            obj_Thread_POBLACIONES.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[3] = true;
                        }

                        //GEN_TiposVias #############################################
                        if (_bol_Cargar_TipoVia)
                        {
                            ThreadStart obj_ThreadStart_TIPOSVIAS = new ThreadStart(Obtener_TiposVias_Modelo_Listado);
                            Thread obj_Thread_TIPOSVIAS = new Thread(obj_ThreadStart_TIPOSVIAS);
                            obj_Thread_TIPOSVIAS.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[4] = 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 (GEN_Direcciones mdl_GEN_Direcciones in g_lst_GEN_Direcciones)
                        {

                            //GEN_Paises #############################################
                            if (_bol_Cargar_Paises &&
                                g_lst_GEN_Paises != null &&
                                g_lst_GEN_Paises.Count > 0)
                            {
                                mdl_GEN_Direcciones.GEN_Paises = g_lst_GEN_Paises.Where(m => m.id == mdl_GEN_Direcciones.idPais).FirstOrDefault();
                            }

                            //GEN_Provincias #############################################
                            if (_bol_Cargar_Provincia &&
                                g_lst_GEN_Provincias != null &&
                                g_lst_GEN_Provincias.Count > 0)
                            {
                                mdl_GEN_Direcciones.GEN_Provincias = g_lst_GEN_Provincias.Where(m => m.id == mdl_GEN_Direcciones.idProvincia).FirstOrDefault();
                            }

                            //GEN_Municipios #############################################
                            if (_bol_Cargar_Municipio &&
                                mdl_GEN_Direcciones.idMunicipio!=null &&
                                g_lst_GEN_Municipios != null &&
                                g_lst_GEN_Municipios.Count > 0)
                            {
                                mdl_GEN_Direcciones.GEN_Municipios = g_lst_GEN_Municipios.Where(m => m.id == mdl_GEN_Direcciones.idMunicipio.Value).FirstOrDefault();
                            }

                            //GEN_Poblaciones #############################################
                            if (_bol_Cargar_Poblacion &&
                                mdl_GEN_Direcciones.idPoblacion != null &&
                                g_lst_GEN_Poblaciones != null &&
                                g_lst_GEN_Poblaciones.Count > 0)
                            {
                                mdl_GEN_Direcciones.GEN_Poblaciones = g_lst_GEN_Poblaciones.Where(m => m.id == mdl_GEN_Direcciones.idPoblacion.Value).FirstOrDefault();
                            }

                            //GEN_TiposVias #############################################
                            if (_bol_Cargar_TipoVia &&
                                mdl_GEN_Direcciones.idTipoVia != null &&
                                g_lst_GEN_TiposVias != null &&
                                g_lst_GEN_TiposVias.Count > 0)
                            {
                                mdl_GEN_Direcciones.GEN_TiposVias = g_lst_GEN_TiposVias.Where(m => m.id == mdl_GEN_Direcciones.idTipoVia.Value).FirstOrDefault();
                            }


                        }
                        #endregion
                    }
                }
                #endregion

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

        #region Tablas Relacionadas
        private void Obtener_Paises_Modelo_Listado()
        {
            try
            {
                GEN_Paises_Datos obj_GEN_Paises_Datos = new GEN_Paises_Datos();
                g_lst_GEN_Paises = obj_GEN_Paises_Datos.Obtener_ModeloListado_Por_Ids(g_lst_GEN_Direcciones.Select(m => m.idPais).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[0] = true;
            }
        }

        private void Obtener_Provincias_Modelo_Listado()
        {
            try
            {
                GEN_Provincias_Datos obj_GEN_Provincias_Datos = new GEN_Provincias_Datos();
                g_lst_GEN_Provincias = obj_GEN_Provincias_Datos.Obtener_ModeloListado_Por_Ids(g_lst_GEN_Direcciones.Select(m => m.idProvincia).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[1] = true;
            }
        }

        private void Obtener_Municipios_Modelo_Listado()
        {
            try
            {
                GEN_Municipios_Datos obj_GEN_Municipios_Datos = new GEN_Municipios_Datos();
                g_lst_GEN_Municipios = obj_GEN_Municipios_Datos.Obtener_ModeloListado_Por_Ids(g_lst_GEN_Direcciones.Where(m=>m.idMunicipio!=null).Select(m => m.idMunicipio.Value).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[2] = true;
            }
        }

        private void Obtener_Poblaciones_Modelo_Listado()
        {
            try
            {
                GEN_Poblaciones_Datos obj_GEN_Poblaciones_Datos = new GEN_Poblaciones_Datos();
                g_lst_GEN_Poblaciones = obj_GEN_Poblaciones_Datos.Obtener_ModeloListado_Por_Ids(g_lst_GEN_Direcciones.Where(m=>m.idPoblacion!=null).Select(m => m.idPoblacion.Value).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[3] = true;
            }
        }

        private void Obtener_TiposVias_Modelo_Listado()
        {
            try
            {
                GEN_TiposVias_Datos obj_GEN_TiposVias_Datos = new GEN_TiposVias_Datos();
                g_lst_GEN_TiposVias = obj_GEN_TiposVias_Datos.Obtener_ModeloListado_Por_Ids(g_lst_GEN_Direcciones.Where(m=>m.idTipoVia!=null).Select(m => m.idTipoVia.Value).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[4] = true;
            }
        }

        #endregion

        #endregion


        #endregion

        private string Obtener_Consulta_Modelo()
        {
            return
                " SELECT " +
                    nameof(GEN_Direcciones.id) + " , " +
                    nameof(GEN_Direcciones.idCliente) + " , " +
                    nameof(GEN_Direcciones.idProveedor) + " , " +
                    nameof(GEN_Direcciones.idEmpleado) + " , " +
                    nameof(GEN_Direcciones.idSocio) + " , " +
                    nameof(GEN_Direcciones.idPais) + " , " +
                    nameof(GEN_Direcciones.idProvincia) + " , " +
                    nameof(GEN_Direcciones.idMunicipio) + " , " +
                    nameof(GEN_Direcciones.idPoblacion) + " , " +
                    nameof(GEN_Direcciones.idTipoVia) + " , " +
                    nameof(GEN_Direcciones.nombreVia) + " , " +
                    nameof(GEN_Direcciones.tipoNumeracion) + " , " +
                    nameof(GEN_Direcciones.numeroCasa) + " , " +
                    nameof(GEN_Direcciones.calificadorNumero) + " , " +
                    nameof(GEN_Direcciones.bloque) + " , " +
                    nameof(GEN_Direcciones.portal) + " , " +
                    nameof(GEN_Direcciones.escalera) + " , " +
                    nameof(GEN_Direcciones.planta) + " , " +
                    nameof(GEN_Direcciones.puerta) + " , " +
                    nameof(GEN_Direcciones.datosComplementariosDomicilio) + " , " +
                    nameof(GEN_Direcciones.codigoPostal) + " , " +
                    nameof(GEN_Direcciones.tipoDireccion) + " , " +
                    nameof(GEN_Direcciones.idEmpresa) + " , " +
                    nameof(GEN_Direcciones.idOrganismoCertificador) + " , " +
                    nameof(GEN_Direcciones.idEmpresaInstaladora) + " , " +
                    nameof(GEN_Direcciones.idCliente_HPV) + " , " +
                    nameof(GEN_Direcciones.idAdministrador) + " , " +
                    nameof(GEN_Direcciones.idInstalacionCabecera) + " , " +
                    nameof(GEN_Direcciones.idJuzgado) + " , " +
                    nameof(GEN_Direcciones.idAgenciaHermes) +
                " FROM " + nameof(GEN_Direcciones);
        }
        #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;

                GEN_Direcciones mdl_GEN_Direcciones_AGrabar = (GEN_Direcciones)_mdl_obj;
                GEN_Direcciones mdl_GEN_Direcciones_DatosViejos = new GEN_Direcciones();

                GEN_Direcciones mdl_GEN_Direcciones_Final = Obtener_Modelo_Por_Id(mdl_GEN_Direcciones_AGrabar.id);
              
                if (mdl_GEN_Direcciones_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_GEN_Direcciones_Final, mdl_GEN_Direcciones_DatosViejos, false, false);

                    // Cargar los Datos Nuevos del Modelo
                    Funciones.CopiarPropiedadesObjetos(mdl_GEN_Direcciones_AGrabar, mdl_GEN_Direcciones_Final, false, false);

                    #region Update
                    string str_SQL_Update = " UPDATE " + nameof(GEN_Direcciones) +
                                            " SET " +
                                                nameof(GEN_Direcciones.idCliente) + "=@idCliente, " +
                                                nameof(GEN_Direcciones.idProveedor) + "=@idProveedor, " +
                                                nameof(GEN_Direcciones.idEmpleado) + "=@idEmpleado, " +
                                                nameof(GEN_Direcciones.idSocio) + "=@idSocio, " +
                                                nameof(GEN_Direcciones.idPais) + "=@idPais, " +
                                                nameof(GEN_Direcciones.idProvincia) + "=@idProvincia, " +
                                                nameof(GEN_Direcciones.idMunicipio) + "=@idMunicipio, " +
                                                nameof(GEN_Direcciones.idPoblacion) + "=@idPoblacion, " +
                                                nameof(GEN_Direcciones.idTipoVia) + "=@idTipoVia, " +
                                                nameof(GEN_Direcciones.nombreVia) + "=@nombreVia, " +
                                                nameof(GEN_Direcciones.tipoNumeracion) + "=@tipoNumeracion, " +
                                                nameof(GEN_Direcciones.numeroCasa) + "=@numeroCasa, " +
                                                nameof(GEN_Direcciones.calificadorNumero) + "=@calificadorNumero, " +
                                                nameof(GEN_Direcciones.bloque) + "=@bloque, " +
                                                nameof(GEN_Direcciones.portal) + "=@portal, " +
                                                nameof(GEN_Direcciones.escalera) + "=@escalera, " +
                                                nameof(GEN_Direcciones.planta) + "=@planta, " +
                                                nameof(GEN_Direcciones.puerta) + "=@puerta, " +
                                                nameof(GEN_Direcciones.datosComplementariosDomicilio) + "=@datosComplementariosDomicilio, " +
                                                nameof(GEN_Direcciones.codigoPostal) + "=@codigoPostal, " +
                                                nameof(GEN_Direcciones.tipoDireccion) + "=@tipoDireccion, " +
                                                nameof(GEN_Direcciones.idEmpresa) + "=@idEmpresa, " +
                                                nameof(GEN_Direcciones.idOrganismoCertificador) + "=@idOrganismoCertificador, " +
                                                nameof(GEN_Direcciones.idEmpresaInstaladora) + "=@idEmpresaInstaladora, " +
                                                nameof(GEN_Direcciones.idCliente_HPV) + "=@idCliente_HPV, " +
                                                nameof(GEN_Direcciones.idAdministrador) + "=@idAdministrador, " +
                                                nameof(GEN_Direcciones.idInstalacionCabecera) + "=@idInstalacionCabecera, " +
                                                nameof(GEN_Direcciones.idJuzgado) + "=@idJuzgado, " +
                                                nameof(GEN_Direcciones.idAgenciaHermes) + "=@idAgenciaHermes " +
                                            " WHERE " +
                                                nameof(GEN_Direcciones.id) + "=@id";
                    //Parametros
                    object[] arr_Parametros_Update = new object[]
                    {
                        mdl_GEN_Direcciones_Final.idCliente!=null
                            ?   new SqlParameter("@idCliente", mdl_GEN_Direcciones_Final.idCliente.Value)
                            :   new SqlParameter("@idCliente",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idProveedor!=null
                            ?   new SqlParameter("@idProveedor", mdl_GEN_Direcciones_Final.idProveedor.Value)
                            :   new SqlParameter("@idProveedor",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idEmpleado!=null
                            ?   new SqlParameter("@idEmpleado", mdl_GEN_Direcciones_Final.idEmpleado.Value)
                            :   new SqlParameter("@idEmpleado",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idSocio!=null
                            ?   new SqlParameter("@idSocio", mdl_GEN_Direcciones_Final.idSocio.Value)
                            :   new SqlParameter("@idSocio",  DBNull.Value),
                        new SqlParameter("@idPais", mdl_GEN_Direcciones_Final.idPais),
                        new SqlParameter("@idProvincia", mdl_GEN_Direcciones_Final.idProvincia),
                        mdl_GEN_Direcciones_Final.idMunicipio!=null
                            ?   new SqlParameter("@idMunicipio", mdl_GEN_Direcciones_Final.idMunicipio.Value)
                            :   new SqlParameter("@idMunicipio",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idPoblacion!=null
                            ?   new SqlParameter("@idPoblacion", mdl_GEN_Direcciones_Final.idPoblacion.Value)
                            :   new SqlParameter("@idPoblacion",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idTipoVia!=null
                            ?   new SqlParameter("@idTipoVia", mdl_GEN_Direcciones_Final.idTipoVia.Value)
                            :   new SqlParameter("@idTipoVia",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.nombreVia!=null
                            ?   new SqlParameter("@nombreVia", mdl_GEN_Direcciones_Final.nombreVia)
                            :   new SqlParameter("@nombreVia",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.tipoNumeracion!=null
                            ?   new SqlParameter("@tipoNumeracion", mdl_GEN_Direcciones_Final.tipoNumeracion)
                            :   new SqlParameter("@tipoNumeracion",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.numeroCasa!=null
                            ?   new SqlParameter("@numeroCasa", mdl_GEN_Direcciones_Final.numeroCasa)
                            :   new SqlParameter("@numeroCasa",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.calificadorNumero!=null
                            ?   new SqlParameter("@calificadorNumero", mdl_GEN_Direcciones_Final.calificadorNumero)
                            :   new SqlParameter("@calificadorNumero",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.bloque!=null
                            ?   new SqlParameter("@bloque", mdl_GEN_Direcciones_Final.bloque)
                            :   new SqlParameter("@bloque",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.portal!=null
                            ?   new SqlParameter("@portal", mdl_GEN_Direcciones_Final.portal)
                            :   new SqlParameter("@portal",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.escalera!=null
                            ?   new SqlParameter("@escalera", mdl_GEN_Direcciones_Final.escalera)
                            :   new SqlParameter("@escalera",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.planta!=null
                            ?   new SqlParameter("@planta", mdl_GEN_Direcciones_Final.planta)
                            :   new SqlParameter("@planta",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.puerta!=null
                            ?   new SqlParameter("@puerta", mdl_GEN_Direcciones_Final.puerta)
                            :   new SqlParameter("@puerta",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.datosComplementariosDomicilio!=null
                            ?   new SqlParameter("@datosComplementariosDomicilio", mdl_GEN_Direcciones_Final.datosComplementariosDomicilio)
                            :   new SqlParameter("@datosComplementariosDomicilio",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.codigoPostal!=null
                            ?   new SqlParameter("@codigoPostal", mdl_GEN_Direcciones_Final.codigoPostal)
                            :   new SqlParameter("@codigoPostal",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.tipoDireccion!=null
                            ?   new SqlParameter("@tipoDireccion", mdl_GEN_Direcciones_Final.tipoDireccion)
                            :   new SqlParameter("@tipoDireccion",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idEmpresa!=null
                            ?   new SqlParameter("@idEmpresa", mdl_GEN_Direcciones_Final.idEmpresa.Value)
                            :   new SqlParameter("@idEmpresa",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idOrganismoCertificador!=null
                            ?   new SqlParameter("@idOrganismoCertificador", mdl_GEN_Direcciones_Final.idOrganismoCertificador.Value)
                            :   new SqlParameter("@idOrganismoCertificador",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idEmpresaInstaladora!=null
                            ?   new SqlParameter("@idEmpresaInstaladora", mdl_GEN_Direcciones_Final.idEmpresaInstaladora.Value)
                            :   new SqlParameter("@idEmpresaInstaladora",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idCliente_HPV!=null
                            ?   new SqlParameter("@idCliente_HPV", mdl_GEN_Direcciones_Final.idCliente_HPV.Value)
                            :   new SqlParameter("@idCliente_HPV",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idAdministrador!=null
                            ?   new SqlParameter("@idAdministrador", mdl_GEN_Direcciones_Final.idAdministrador.Value)
                            :   new SqlParameter("@idAdministrador",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idInstalacionCabecera!=null
                            ?   new SqlParameter("@idInstalacionCabecera", mdl_GEN_Direcciones_Final.idInstalacionCabecera.Value)
                            :   new SqlParameter("@idInstalacionCabecera",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idJuzgado!=null
                            ?   new SqlParameter("@idJuzgado", mdl_GEN_Direcciones_Final.idJuzgado.Value)
                            :   new SqlParameter("@idJuzgado",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idAgenciaHermes!=null
                            ?   new SqlParameter("@idAgenciaHermes", mdl_GEN_Direcciones_Final.idAgenciaHermes.Value)
                            :   new SqlParameter("@idAgenciaHermes",  DBNull.Value),
                        new SqlParameter("@id",  mdl_GEN_Direcciones_Final.id)
                    };
                    #endregion

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

                    //Id de la tabla
                    mdl_INTERNO_ValorDevuelto_Modelo.Id = mdl_GEN_Direcciones_Final.id;
                }
                else
                {
                    mdl_GEN_Direcciones_Final = new GEN_Direcciones();

                    //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_GEN_Direcciones_AGrabar, mdl_GEN_Direcciones_Final, false, false);

                    #region INSERT
                    string str_SQL_Insert = " INSERT INTO " + nameof(GEN_Direcciones) +
                                                " (" +
                                                         nameof(GEN_Direcciones.idCliente) + "," +
                                                         nameof(GEN_Direcciones.idProveedor) + "," +
                                                         nameof(GEN_Direcciones.idEmpleado) + "," +
                                                         nameof(GEN_Direcciones.idSocio) + "," +
                                                         nameof(GEN_Direcciones.idPais) + "," +
                                                         nameof(GEN_Direcciones.idProvincia) + "," +
                                                         nameof(GEN_Direcciones.idMunicipio) + "," +
                                                         nameof(GEN_Direcciones.idPoblacion) + "," +
                                                         nameof(GEN_Direcciones.idTipoVia) + "," +
                                                         nameof(GEN_Direcciones.nombreVia) + "," +
                                                         nameof(GEN_Direcciones.tipoNumeracion) + "," +
                                                         nameof(GEN_Direcciones.numeroCasa) + "," +
                                                         nameof(GEN_Direcciones.calificadorNumero) + "," +
                                                         nameof(GEN_Direcciones.bloque) + "," +
                                                         nameof(GEN_Direcciones.portal) + "," +
                                                         nameof(GEN_Direcciones.escalera) + "," +
                                                         nameof(GEN_Direcciones.planta) + "," +
                                                         nameof(GEN_Direcciones.puerta) + "," +
                                                         nameof(GEN_Direcciones.datosComplementariosDomicilio) + "," +
                                                         nameof(GEN_Direcciones.codigoPostal) + "," +
                                                         nameof(GEN_Direcciones.tipoDireccion) + "," +
                                                         nameof(GEN_Direcciones.idEmpresa) + "," +
                                                         nameof(GEN_Direcciones.idOrganismoCertificador) + "," +
                                                         nameof(GEN_Direcciones.idEmpresaInstaladora) + "," +
                                                         nameof(GEN_Direcciones.idCliente_HPV) + "," +
                                                         nameof(GEN_Direcciones.idAdministrador) + "," +
                                                         nameof(GEN_Direcciones.idInstalacionCabecera) + "," +
                                                         nameof(GEN_Direcciones.idJuzgado) + "," +
                                                         nameof(GEN_Direcciones.idAgenciaHermes) +
                                                " ) " +
                                                " OUTPUT INSERTED." + nameof(GEN_Direcciones.id) +
                                                " VALUES " +
                                                " ( " +
                                                    "@idCliente," +
                                                    "@idProveedor," +
                                                    "@idEmpleado," +
                                                    "@idSocio," +
                                                    "@idPais," +
                                                    "@idProvincia," +
                                                    "@idMunicipio," +
                                                    "@idPoblacion," +
                                                    "@idTipoVia," +
                                                    "@nombreVia," +
                                                    "@tipoNumeracion," +
                                                    "@numeroCasa," +
                                                    "@calificadorNumero," +
                                                    "@bloque," +
                                                    "@portal," +
                                                    "@escalera," +
                                                    "@planta," +
                                                    "@puerta," +
                                                    "@datosComplementariosDomicilio," +
                                                    "@codigoPostal," +
                                                    "@tipoDireccion," +
                                                    "@idEmpresa," +
                                                    "@idOrganismoCertificador," +
                                                    "@idEmpresaInstaladora," +
                                                    "@idCliente_HPV," +
                                                    "@idAdministrador," +
                                                    "@idInstalacionCabecera," +
                                                    "@idJuzgado," +
                                                    "@idAgenciaHermes" +
                                                " ) ";
                    //Parametros
                    object[] arr_Parametros_Insert = new object[]
                    {
                        mdl_GEN_Direcciones_Final.idCliente!=null
                            ?   new SqlParameter("@idCliente", mdl_GEN_Direcciones_Final.idCliente.Value)
                            :   new SqlParameter("@idCliente",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idProveedor!=null
                            ?   new SqlParameter("@idProveedor", mdl_GEN_Direcciones_Final.idProveedor.Value)
                            :   new SqlParameter("@idProveedor",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idEmpleado!=null
                            ?   new SqlParameter("@idEmpleado", mdl_GEN_Direcciones_Final.idEmpleado.Value)
                            :   new SqlParameter("@idEmpleado",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idSocio!=null
                            ?   new SqlParameter("@idSocio", mdl_GEN_Direcciones_Final.idSocio.Value)
                            :   new SqlParameter("@idSocio",  DBNull.Value),
                        new SqlParameter("@idPais", mdl_GEN_Direcciones_Final.idPais),
                        new SqlParameter("@idProvincia", mdl_GEN_Direcciones_Final.idProvincia),
                        mdl_GEN_Direcciones_Final.idMunicipio!=null
                            ?   new SqlParameter("@idMunicipio", mdl_GEN_Direcciones_Final.idMunicipio.Value)
                            :   new SqlParameter("@idMunicipio",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idPoblacion!=null
                            ?   new SqlParameter("@idPoblacion", mdl_GEN_Direcciones_Final.idPoblacion.Value)
                            :   new SqlParameter("@idPoblacion",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idTipoVia!=null
                            ?   new SqlParameter("@idTipoVia", mdl_GEN_Direcciones_Final.idTipoVia.Value)
                            :   new SqlParameter("@idTipoVia",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.nombreVia!=null
                            ?   new SqlParameter("@nombreVia", mdl_GEN_Direcciones_Final.nombreVia)
                            :   new SqlParameter("@nombreVia",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.tipoNumeracion!=null
                            ?   new SqlParameter("@tipoNumeracion", mdl_GEN_Direcciones_Final.tipoNumeracion)
                            :   new SqlParameter("@tipoNumeracion",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.numeroCasa!=null
                            ?   new SqlParameter("@numeroCasa", mdl_GEN_Direcciones_Final.numeroCasa)
                            :   new SqlParameter("@numeroCasa",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.calificadorNumero!=null
                            ?   new SqlParameter("@calificadorNumero", mdl_GEN_Direcciones_Final.calificadorNumero)
                            :   new SqlParameter("@calificadorNumero",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.bloque!=null
                            ?   new SqlParameter("@bloque", mdl_GEN_Direcciones_Final.bloque)
                            :   new SqlParameter("@bloque",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.portal!=null
                            ?   new SqlParameter("@portal", mdl_GEN_Direcciones_Final.portal)
                            :   new SqlParameter("@portal",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.escalera!=null
                            ?   new SqlParameter("@escalera", mdl_GEN_Direcciones_Final.escalera)
                            :   new SqlParameter("@escalera",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.planta!=null
                            ?   new SqlParameter("@planta", mdl_GEN_Direcciones_Final.planta)
                            :   new SqlParameter("@planta",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.puerta!=null
                            ?   new SqlParameter("@puerta", mdl_GEN_Direcciones_Final.puerta)
                            :   new SqlParameter("@puerta",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.datosComplementariosDomicilio!=null
                            ?   new SqlParameter("@datosComplementariosDomicilio", mdl_GEN_Direcciones_Final.datosComplementariosDomicilio)
                            :   new SqlParameter("@datosComplementariosDomicilio",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.codigoPostal!=null
                            ?   new SqlParameter("@codigoPostal", mdl_GEN_Direcciones_Final.codigoPostal)
                            :   new SqlParameter("@codigoPostal",  DBNull.Value),
                          mdl_GEN_Direcciones_Final.tipoDireccion!=null
                            ?   new SqlParameter("@tipoDireccion", mdl_GEN_Direcciones_Final.tipoDireccion)
                            :   new SqlParameter("@tipoDireccion",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idEmpresa!=null
                            ?   new SqlParameter("@idEmpresa", mdl_GEN_Direcciones_Final.idEmpresa.Value)
                            :   new SqlParameter("@idEmpresa",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idOrganismoCertificador!=null
                            ?   new SqlParameter("@idOrganismoCertificador", mdl_GEN_Direcciones_Final.idOrganismoCertificador.Value)
                            :   new SqlParameter("@idOrganismoCertificador",  DBNull.Value),
                         mdl_GEN_Direcciones_Final.idEmpresaInstaladora!=null
                            ?   new SqlParameter("@idEmpresaInstaladora", mdl_GEN_Direcciones_Final.idEmpresaInstaladora.Value)
                            :   new SqlParameter("@idEmpresaInstaladora",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idCliente_HPV!=null
                            ?   new SqlParameter("@idCliente_HPV", mdl_GEN_Direcciones_Final.idCliente_HPV.Value)
                            :   new SqlParameter("@idCliente_HPV",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idAdministrador!=null
                            ?   new SqlParameter("@idAdministrador", mdl_GEN_Direcciones_Final.idAdministrador.Value)
                            :   new SqlParameter("@idAdministrador",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idInstalacionCabecera!=null
                            ?   new SqlParameter("@idInstalacionCabecera", mdl_GEN_Direcciones_Final.idInstalacionCabecera.Value)
                            :   new SqlParameter("@idInstalacionCabecera",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idJuzgado!=null
                            ?   new SqlParameter("@idJuzgado", mdl_GEN_Direcciones_Final.idJuzgado.Value)
                            :   new SqlParameter("@idJuzgado",  DBNull.Value),
                        mdl_GEN_Direcciones_Final.idAgenciaHermes!=null
                            ?   new SqlParameter("@idAgenciaHermes", mdl_GEN_Direcciones_Final.idAgenciaHermes.Value)
                            :   new SqlParameter("@idAgenciaHermes",  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(GEN_Direcciones), mdl_GEN_Direcciones_DatosViejos, mdl_GEN_Direcciones_Final, mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion, obj_Exferia_Entities);

                // Devolver también el Objeto
                mdl_GEN_Direcciones_Final.id = mdl_INTERNO_ValorDevuelto_Modelo.Id;
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = mdl_GEN_Direcciones_Final;
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(GEN_Direcciones_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_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            //Tipo de Accion que se va a realizar
            mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = Enumerados.G_ENUM_TIPOACCION.INT_ELIMINAR;

            try
            {

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

                // Ver si existe ######################################################################
                GEN_Direcciones mdl_GEN_Direcciones_Final = Obtener_Modelo_Por_Id(_lng_id);
                //######################################################################################

                if (mdl_GEN_Direcciones_Final != null)
                {

                    #region Delete
                    string str_SQL_Delete = " DELETE FROM  " + nameof(GEN_Direcciones) +
                                            " WHERE " +
                                                nameof(GEN_Direcciones.id) + "=@id";
                    //Parametros
                    object[] arr_Parametros_Delete = new object[]
                    {
                        new SqlParameter("@id", _lng_id)
                    };
                    #endregion

                    //Delete
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Delete, arr_Parametros_Delete);

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

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

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(object _mdl_obj)
        {
            throw new NotImplementedException();
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(long _lng_id, long _lng_idAuxiliar)
        {
            throw new NotImplementedException();
        }
        #endregion
    }
}
