using Exferia_Aplicacion.General;
using Exferia_CRM._0_Modelos;
using Exferia_CRM._1_Datos;
using Exferia_CRM._3_Vistas.Listados;
using Exferia_CRM.General;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_General._0_Modelos;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_CRM._3_Vistas.Controladoras
{
    public class P_Terminales_Controladora
    {
        #region Variables Generales
        private P_Terminales g_frm_P_Terminales = null; //Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera para cuando se ejecutan tareas pesadas como cargar, grabar...

        //Clases de Negocio Necesarias para la carga de datos
        private CRM_Terminales_Datos g_obj_CRM_Terminales_Datos = new CRM_Terminales_Datos();
        private CRM_Terminales_ClavesTemporales_Datos g_obj_CRM_Terminales_ClavesTemporales_Datos = new CRM_Terminales_ClavesTemporales_Datos();
        private CRM_Encuestas_Datos g_obj_CRM_Encuestas_Datos = new CRM_Encuestas_Datos();
        private CRM_ClientesPotenciales_Datos g_obj_CRM_ClientesPotenciales_Datos = new CRM_ClientesPotenciales_Datos();
        private CRMS_TrabajosRealizados_Datos g_obj_CRMS_TrabajosRealizados_Datos = new CRMS_TrabajosRealizados_Datos();
        private CRMS_Liquidaciones_Datos g_obj_CRMS_Liquidaciones_Datos = new CRMS_Liquidaciones_Datos();
        private CRMS_Gastos_Datos g_obj_CRMS_Gastos_Datos = new CRMS_Gastos_Datos();
        private CRMS_Encuestas_Datos g_obj_CRMS_Encuestas_Datos = new CRMS_Encuestas_Datos();
        private CRMB_RegistrosSincronizacion_Datos g_obj_CRMB_RegistrosSincronizacion_Datos = new CRMB_RegistrosSincronizacion_Datos();

        public CRM_Terminales g_mdl_CRM_Terminales = null;//Modelo de los datos del terminales potencial, cargados

        public bool g_bol_Termino_CargaDatos_Inicial = false;//Se utiliza para saber cuando se termina la carga de datos estaticos inciales

        private List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Comunicacion_TiposEventos = null;
        private List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_GPS_TiposEventos = null;

        //Listado de ids, para poder filtrar el DGV Asociados sin perder las filas que se acaban de añadir
        private List<long> g_lst_id_Provincias_Asociadas = new List<long>();
        private List<long> g_lst_id_Encuestas_Asociadas = new List<long>();
        private List<long> g_lst_id_ClientesPotenciales_Asociadas = new List<long>();

        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;
        private bool g_bol_Cancelar_TareaAsincrona_CargarDatos = false;

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        private bool g_bol_GrabarDatos_TerminoCorrectamente = true;
        private bool g_bol_GrabarDatos_VolverListado = true;

        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;
        private bool g_bol_BorrarDatos_VolverListado = true;

        //Claves_Temporales
        private BackgroundWorker g_TareaAsincrona_Rellenar_Listado_ClavesTemporales;
        private List<CRM_Terminales_ClavesTemporales> g_lst_CRM_Terminales_ClavesTemporales = null;
        //Tarea Asincrona para Rellenar DataGridView de Clave Temporales
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales;


        //Encuestas
        public List<INTERNO_CRM_Encuestas_Listado_Modelo> g_lst_INTERNO_CRM_Encuestas_Listado_Modelo_Completo = null;
        //Tarea Asincrona para Rellenar DataGridView de Encuestas con los filtros
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Encuestas;
        //Tarea Asincrona para Rellenar DataGridView de Encuestas Asocaidas con los filtros
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas;

        //Provincias
        public List<INTERNO_GEN_Provincias_Listado_Modelo> g_lst_INTERNO_GEN_Provincias_Listado_Modelo_Completo = null;
        //Tarea Asincrona para Rellenar DataGridView de Provincias con los filtros
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Provincias;
        //Tarea Asincrona para Rellenar DataGridView de Provincias Asociados con los filtros
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas;

        //ClientePotencial Asociados
        public List<INTERNO_CRM_ClientesPotenciales_Listado_Modelo> g_lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo_Completo = null;
        //Tarea Asincrona para Rellenar DataGridView de ClientePotencial con los filtros
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales;
        //Tarea Asincrona para Rellenar DataGridView de ClientePotencial Asociado con los filtros
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados;


        //TrabajosRealizados
        public List<INTERNO_CRMS_TrabajosRealizados_Listado_Modelo> g_lst_INTERNO_CRMS_TrabajosRealizados_Descargas_Listado_Modelo_Completo = null;
        //Tarea Asincrona para Rellenar DataGridView de TrabajosRealizados con los filtros
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas;

        //Liquidaciones
        public List<INTERNO_CRMS_Liquidaciones_Listado_Modelo> g_lst_INTERNO_CRMS_Liquidaciones_Descargas_Listado_Modelo_Completo;
        //Tarea Asincrona para Rellenar DataGridView de Liquidaciones
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas;

        //Gastos
        public List<INTERNO_CRMS_Gastos_Listado_Modelo> g_lst_INTERNO_CRMS_Gastos_Descargas_Listado_Modelo_Completo;
        //Tarea Asincrona para Rellenar DataGridView de Gastos
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas;

        //Encuestas
        public List<INTERNO_CRMS_Encuestas_Listado_Modelo> g_lst_INTERNO_CRMS_Encuestas_Descargas_Listado_Modelo_Completo;
        //Tarea Asincrona para Rellenar DatagridView de Encuestas
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas;

        //RegistrosSincronizacion
        public List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo> g_lst_INTERNO_CRMB_RegistrosSincronizacion_PROVINCIAS_Cargas_Listado_Modelo_Completo;
        public List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo> g_lst_INTERNO_CRMB_RegistrosSincronizacion_ENCUESTAS_Cargas_Listado_Modelo_Completo;
        public List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo> g_lst_INTERNO_CRMB_RegistrosSincronizacion_CLIENTESPOTENCIALES_Cargas_Listado_Modelo_Completo;
        //Tarea Asincrona para Rellenar DataGridView de RegistrosSincronizacion
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Provincias;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ClientesPotenciales;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Encuestas;

        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_TrabajosRealizados_Descargas;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Liquidaciones_Descargas;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Gastos_Descargas;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Encuestas_Descargas;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_RegistrosSincronizacion_Cargas;

        //Filtado del Listado de Encuestas
        public List<string> g_lst_ColumnasAMostrar_CRM_Encuestas = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Encuestas = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_CRM_Encuestas = new Dictionary<string, object>();

        //Filtrado del Listado de Provincias
        public List<string> g_lst_ColumnasAMostrar_GEN_Provincias = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Provincias = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_GEN_Provincias = new Dictionary<string, object>();

        //Filtrado del Listado de Clientes
        public List<string> g_lst_ColumnasAMostrar_CRM_ClientesPotenciales = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_ClientesPotenciales = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_CRM_ClientesPotenciales = new Dictionary<string, object>();

        
        //Filtrado del Listado de TrabajosRealizados
        public List<string> g_lst_ColumnasAMostrar_CRMS_TrabajosRealizados_Descargas = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_TrabajosRealizados_Descargas = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_CRMS_TrabajosRealizados_Descargas = new Dictionary<string, object>();

        //Filtrado del Listado de Liquidaciones
        public List<string> g_lst_ColumnasAMostrar_CRMS_Liquidaciones_Descargas = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Liquidacion_Descargas = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_CRMS_Liquidaciones_Descargas = new Dictionary<string, object>();

        //Filtrado del Listado de Gastos
        public List<string> g_lst_ColumnasAMostrar_CRMS_Gastos_Descargas = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Gastos_Descargas = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_CRMS_Gastos_Descargas = new Dictionary<string, object>();

        //Filtrado del Listado de Encuestas
        public List<string> g_lst_ColumnasAMostrar_CRMS_Encuestas_Descargas = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Encuestas_Descargas = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_CRMS_Encuestas_Descargas = new Dictionary<string, object>();

        //Filtrado del Listado de CARGAS
        public List<string> g_lst_ColumnasAMostrar_CRMB_RegistrosSincronizacion_Cargas = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_RegistrosSincronizacion_Cargas = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_CRMB_RegistrosSincronizacion_Cargas = new Dictionary<string, object>();
        #endregion

        public P_Terminales_Controladora(P_Terminales _frm_P_Terminales)
        {
            g_frm_P_Terminales = _frm_P_Terminales;

            g_bol_Termino_CargaDatos_Inicial = true;

            g_obj_ABS_Listado_Provincias = new ABS_Listado_GEN_Provincias_Filtros_Internos(g_frm_P_Terminales.P_Base_ValoresGenerales);
            g_obj_ABS_Listado_ClientesPotenciales = new ABS_Listado_CRM_ClientesPotenciales_Filtros_Internos(g_frm_P_Terminales.P_Base_ValoresGenerales);
            g_obj_ABS_Listado_Encuestas = new ABS_Listado_CRM_Encuestas_Filtros_Internos(g_frm_P_Terminales.P_Base_ValoresGenerales);

            g_obj_ABS_Listado_TrabajosRealizados_Descargas = new ABS_Listado_CRMS_TrabajosRealizados_Filtros_Internos(g_frm_P_Terminales.P_Base_ValoresGenerales);
            g_obj_ABS_Listado_Liquidacion_Descargas = new ABS_Listado_CRMS_Liquidaciones_Filtros_Internos(g_frm_P_Terminales.P_Base_ValoresGenerales);
            g_obj_ABS_Listado_Gastos_Descargas = new ABS_Listado_CRMS_Gastos_Filtros_Internos(g_frm_P_Terminales.P_Base_ValoresGenerales);
            g_obj_ABS_Listado_Encuestas_Descargas = new ABS_Listado_CRMS_Encuestas_Filtros_Internos(g_frm_P_Terminales.P_Base_ValoresGenerales);
            g_obj_ABS_Listado_RegistrosSincronizacion_Cargas = new ABS_Listado_CRMB_RegistrosSincronizacion_Filtros_Internos(g_frm_P_Terminales.P_Base_ValoresGenerales);

            //(Tarea Asincrona) Cargar Listado de las Claves temporales ###########################################
            g_TareaAsincrona_Rellenar_Listado_ClavesTemporales = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_Listado_ClavesTemporales_DoWork);
            g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_Listado_ClavesTemporales_ProgressChanged);
            g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_Listado_ClavesTemporales_Completed);
            g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Provincias ######################################################
            g_TareaAsincrona_Rellenar_DataGrid_Provincias = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Provincias.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ProvinciasSinAsociar_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Provincias.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ProvinciasSinAsociar_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Provincias.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ProvinciasSinAsociar_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Provincias.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Provincias.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Provincias ######################################################
            g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ProvinciasAsociadas_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ProvinciasAsociadas_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ProvinciasAsociadas_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de ClientesPotenciales #############################################
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de ClientesPotenciales #############################################
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Encuestas #######################################################
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Encuestas_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Encuestas_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Encuestas_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Encuestas #######################################################
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de TrabajosRealizados ##############################################
            g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Liquidaciones ###################################################
            g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Liquidaciones_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Liquidaciones_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Gastos ##########################################################
            g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Gastos_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Gastos_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Gastos_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Gastos ##########################################################
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Gastos ##########################################################
            g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_RegistrosSincronizacion_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_RegistrosSincronizacion_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_RegistrosSincronizacion_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas.WorkerSupportsCancellation = true;
            //#####################################################################################################

            ValoresIniciales();

            Cargar_Encuestas_Completo();
            Cargar_Provincias_Completo();
            Cargar_ClientesPotenciales_Completo();
        }

        public void ValoresIniciales()
        {
            //Comunicacion......................................................................
            g_lst_INTERNO_ComboBox_Modelo_Comunicacion_TiposEventos = ListadosEstaticos.Devolver_Tipos_Eventos();
            //Vaciamos primero
            g_frm_P_Terminales.Exferia_CheckListBox_Comunicacion_TiposEventos.DataSource = null;
            //Cargamos despues comunicacion ....................................................
            g_frm_P_Terminales.Exferia_CheckListBox_Comunicacion_TiposEventos.DataSource = g_lst_INTERNO_ComboBox_Modelo_Comunicacion_TiposEventos;

            //GPS...............................................................................
            g_lst_INTERNO_ComboBox_Modelo_GPS_TiposEventos = ListadosEstaticos.Devolver_Tipos_Eventos();
            //Vaciamos primero
            g_frm_P_Terminales.Exferia_CheckListBox_GPS_TiposEventos.DataSource = null;
            //Cargamos despues comunicacion
            g_frm_P_Terminales.Exferia_CheckListBox_GPS_TiposEventos.DataSource = g_lst_INTERNO_ComboBox_Modelo_GPS_TiposEventos;
        }

        public void VaciarDatos()
        {
            g_frm_P_Terminales.Exferia_TextBox_ClaveAdministracion.Text = "";
            g_frm_P_Terminales.Exferia_TextBox_Codigo.Text = "";
            g_frm_P_Terminales.Exferia_TextBox_Comunicacion_Carencia.Text = "";
            g_frm_P_Terminales.Exferia_TextBox_Descripcion.Text = "";
            g_frm_P_Terminales.Exferia_TextBox_GPS_Carencia.Text = "";
            g_frm_P_Terminales.Exferia_TextBox_Puerto.Text = "";
            g_frm_P_Terminales.Exferia_TextBox_Ip.Text = "";

            g_frm_P_Terminales.Exferia_CheckBox_Permitir_Crear_Clientes.Checked = false;
            g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_Automatica.Checked = false;
            g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_BotonPantalla.Checked = false;
            g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_Eventos.Checked = false;
            g_frm_P_Terminales.Exferia_CheckBox_GPS_Automatica.Checked = false;
            g_frm_P_Terminales.Exferia_CheckBox_GPS_BotonPantalla.Checked = false;
            g_frm_P_Terminales.Exferia_CheckBox_GPS_Eventos.Checked = false;

            g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Id = -1;
            g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Codigo = "";
            g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Descripcion = "";
            g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_FechaBorrado = null;

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_Terminales.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_Terminales.P_Base_TituloPantalla = (g_frm_P_Terminales.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
            }

            //Actualizar el Boton de Seleccion de pantalla ####################################################
            Variables.G_EMS_CONTROL_MENUSUPERIOR.Update_Texto_NombrePantalla(g_frm_P_Terminales.Tag.ToString());
            //#################################################################################################

            g_mdl_CRM_Terminales = null;
        }

        public INTERNO_ValorDevuelto_Modelo Buscar_CodigoSiguiente()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {

                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente(nameof(CRM_Terminales),
                                                                                                        nameof(CRM_Terminales.codigo),
                                                                                                        "",
                                                                                                        Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Terminales.P_Base_ValoresGenerales.lng_idEmpresa, nameof(CRM_Terminales)),
                                                                                                        true,
                                                                                                        g_frm_P_Terminales.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);
                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_Terminales.Exferia_TextBox_Codigo.Text = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO(g_frm_P_Terminales.Exferia_Label_Codigo.Text);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CRM_Terminales) + "/" + nameof(Buscar_CodigoSiguiente));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        
        public bool ComprobarCambios()
        {
            if (g_frm_P_Terminales.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(false);

                    //Te quedas espernado a que termine la tarea asincrona de grabar
                    while (g_obj_TareaAsincrona_GrabarDatos.IsBusy)
                        Application.DoEvents();

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Terminales.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos != null)
                {
                    g_bol_Cancelar_TareaAsincrona_CargarDatos = true;

                    while (g_obj_TareaAsincrona_CargarDatos.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_ProgressChanged);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = true;
                }

                //Vaciar
                VaciarDatos();

                g_bol_Cancelar_TareaAsincrona_CargarDatos = false;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_CargarDatos.RunWorkerAsync();
                //#################################################################################################

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Terminales.Enabled = true;

                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Terminales_Controladora) + "/" + nameof(RecargarDatos), true);
            }
        }
        private void TareaAsincrona_CargarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Cargar Valores
                if (CargarDatos(g_frm_P_Terminales.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
                else
                {
                    if (g_mdl_CRM_Terminales != null)
                    {
                        //Claves
                        if (g_mdl_CRM_Terminales.CRM_Terminales_ClavesTemporales != null && g_mdl_CRM_Terminales.CRM_Terminales_ClavesTemporales.Count > 0)
                        {
                            g_lst_CRM_Terminales_ClavesTemporales = g_mdl_CRM_Terminales.CRM_Terminales_ClavesTemporales.ToList();

                            DataGridViewRow obj_DataGridViewRow;
                            foreach (CRM_Terminales_ClavesTemporales mdl_CRM_Terminales_ClavesTemporales in g_lst_CRM_Terminales_ClavesTemporales)
                            {
                                //Se cancelo la tarea asincrona #######################
                                if (g_bol_Cancelar_TareaAsincrona_CargarDatos)
                                {
                                    e.Cancel = true;
                                    return;
                                }

                                //Añadir File con Columnas ...............................
                                obj_DataGridViewRow = Transformar_Modelo_A_Row_ClavesTemporales(mdl_CRM_Terminales_ClavesTemporales, null);

                                ((BackgroundWorker)sender).ReportProgress(1, obj_DataGridViewRow);

                                //Application.DoEvents();
                                Thread.Sleep(5);
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Claves
                if (e.ProgressPercentage == 1)
                {
                    DataGridViewRow dgvr_Fila = (DataGridViewRow)e.UserState;

                    g_frm_P_Terminales.Exferia_DataGridView_Claves.Rows.Add(dgvr_Fila);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_ProgressChanged));
            }
        }
        private void TareaAsincrona_CargarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

            //Desbloquear el Formulario
            g_frm_P_Terminales.Enabled = true;

            try
            {
                if (!e.Cancelled)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                    //Mostrar si tuviera algun mensaje
                    if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                    {
                        if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                        {
                            Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                            g_frm_P_Terminales.Salir_P_Base();
                        }
                    }
                    else
                    {
                        Rellenar_DataGrid_EncuestasAsociados();
                        Rellenar_DataGrid_Encuestas();

                        Rellenar_DataGrid_Provincias_Filtros();
                        Rellenar_DataGrid_ProvinciasAsociadas();

                        Rellenar_DataGrid_ClientesPotencialesAsociadas();
                        Rellenar_DataGrid_ClientesPotenciales();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Terminales.Salir_P_Base();
            }
            finally
            {   
                //Hacemos foco en el primer control
                g_frm_P_Terminales.Exferia_TextBox_Codigo.Exferia_TextBox_Foco();
            }
        }

        public bool CargarDatos(long _lng_id)
        {
            bool bol_ValorDevuelto = true;

            g_mdl_CRM_Terminales = g_obj_CRM_Terminales_Datos.Obtener(_lng_id);

            try
            {
                if (g_mdl_CRM_Terminales != null)
                {
                    //Paginador ................................................................................
                    if (g_frm_P_Terminales.P_Base_PantallaOrigen != null &&
                        g_frm_P_Terminales.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                        g_frm_P_Terminales.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_CRM_Terminales.id;
                        int int_PaginaDelObjeto = g_frm_P_Terminales.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_Terminales.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

                        g_frm_P_Terminales.g_obj_Funciones_Paginador.SetPaginaActual(int_PaginaDelObjeto);
                        // Asignando al paginador la pagina actual.
                        g_frm_P_Terminales.Exferia_Paginador_Terminales.PaginaActual = g_frm_P_Terminales.g_obj_Funciones_Paginador.GetPaginaActual();
                    }
                    //...........................................................................................

                    //TextBox
                    g_frm_P_Terminales.Exferia_TextBox_Codigo.Text = g_mdl_CRM_Terminales.codigo;
                    g_frm_P_Terminales.Exferia_TextBox_Descripcion.Text = g_mdl_CRM_Terminales.descripcion;
                    g_frm_P_Terminales.Exferia_TextBox_ClaveAdministracion.Text = g_mdl_CRM_Terminales.claveAdministracion;
                    g_frm_P_Terminales.Exferia_TextBox_Ip.Text = g_mdl_CRM_Terminales.ip;
                    g_frm_P_Terminales.Exferia_TextBox_Puerto.Text = g_mdl_CRM_Terminales.puerto;

                    //Exferia_CheckBox
                    g_frm_P_Terminales.Exferia_CheckBox_Permitir_Crear_Clientes.Checked = g_mdl_CRM_Terminales.permitirCrearClientes;

                    //COMUNICACION ##################################################################################################
                    if (g_mdl_CRM_Terminales.comunicacion_Tipo != null && g_mdl_CRM_Terminales.comunicacion_Tipo.Trim().Length > 0)
                    {
                        //Automatica
                        if (g_mdl_CRM_Terminales.comunicacion_Tipo.Trim().Length > 0)
                        {
                            if (g_mdl_CRM_Terminales.comunicacion_Tipo.Trim().Substring(0, 1) == "1")
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_Automatica.Checked = true;
                                g_frm_P_Terminales.Exferia_TextBox_Comunicacion_Carencia.Text = g_mdl_CRM_Terminales.comunicacion_Carencia != null ? g_mdl_CRM_Terminales.comunicacion_Carencia.Value.ToString() : "0";
                            }
                            else
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_Automatica.Checked = false;
                                g_frm_P_Terminales.Exferia_TextBox_Comunicacion_Carencia.Text = "0";
                            }
                        }

                        //Boton en Pantalla
                        if (g_mdl_CRM_Terminales.comunicacion_Tipo.Trim().Length > 1)
                        {
                            if (g_mdl_CRM_Terminales.comunicacion_Tipo.Trim().Substring(1, 1) == "1")
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_BotonPantalla.Checked = true;
                            }
                            else
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_BotonPantalla.Checked = false;
                            }
                        }

                        //Eventos
                        if (g_mdl_CRM_Terminales.comunicacion_Tipo.Trim().Length > 2)
                        {
                            if (g_mdl_CRM_Terminales.comunicacion_Tipo.Trim().Substring(2, 1) == "1")
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_Eventos.Checked = true;
                                g_frm_P_Terminales.Exferia_Button_Comunicacion_SeleccionarTodo.Enabled = true;
                                g_frm_P_Terminales.Exferia_Button_Comunicacion_DeseleccionarTodo.Enabled = true;

                                Seleccionar_TiposEventos_Comunicacion(g_mdl_CRM_Terminales.comunicacion_TiposEventos);
                            }
                            else
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_Eventos.Checked = false;
                                g_frm_P_Terminales.Exferia_Button_Comunicacion_SeleccionarTodo.Enabled = false;
                                g_frm_P_Terminales.Exferia_Button_Comunicacion_DeseleccionarTodo.Enabled = false;
                            }
                        }
                    }
                    else
                    {
                        g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_Automatica.Checked = false;
                        g_frm_P_Terminales.Exferia_TextBox_Comunicacion_Carencia.Text = "0";
                    }
                    //##################################################################################################

                    //GPS ##############################################################################################
                    if (g_mdl_CRM_Terminales.gps_Tipo != null && g_mdl_CRM_Terminales.gps_Tipo.Trim().Length > 0)
                    {
                        //Automatica
                        if (g_mdl_CRM_Terminales.gps_Tipo.Trim().Length > 0)
                        {
                            if (g_mdl_CRM_Terminales.gps_Tipo.Trim().Substring(0, 1) == "1")
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_GPS_Automatica.Checked = true;
                                g_frm_P_Terminales.Exferia_TextBox_GPS_Carencia.Text = g_mdl_CRM_Terminales.gps_Carencia != null ? g_mdl_CRM_Terminales.gps_Carencia.Value.ToString() : "0";
                            }
                            else
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_GPS_Automatica.Checked = false;
                                g_frm_P_Terminales.Exferia_TextBox_GPS_Carencia.Text = "0";
                            }
                        }

                        //Boton en Pantalla
                        if (g_mdl_CRM_Terminales.gps_Tipo.Trim().Length > 1)
                        {
                            if (g_mdl_CRM_Terminales.gps_Tipo.Trim().Substring(1, 1) == "1")
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_GPS_BotonPantalla.Checked = true;
                            }
                            else
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_GPS_BotonPantalla.Checked = false;
                            }
                        }

                        //Eventos
                        if (g_mdl_CRM_Terminales.gps_Tipo.Trim().Length > 2)
                        {
                            if (g_mdl_CRM_Terminales.gps_Tipo.Trim().Substring(2, 1) == "1")
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_GPS_Eventos.Checked = true;
                                g_frm_P_Terminales.Exferia_Button_GPS_SeleccionarTodo.Enabled = true;
                                g_frm_P_Terminales.Exferia_Button_GPS_DeseleccionarTodo.Enabled = true;

                                Seleccionar_TiposEventos_GPS(g_mdl_CRM_Terminales.gps_TiposEventos);
                            }
                            else
                            {
                                g_frm_P_Terminales.Exferia_CheckBox_GPS_Eventos.Checked = false;
                                g_frm_P_Terminales.Exferia_Button_GPS_SeleccionarTodo.Enabled = false;
                                g_frm_P_Terminales.Exferia_Button_GPS_DeseleccionarTodo.Enabled = false;
                            }
                        }
                    }
                    else
                    {
                        g_frm_P_Terminales.Exferia_CheckBox_GPS_Automatica.Checked = false;
                        g_frm_P_Terminales.Exferia_TextBox_GPS_Carencia.Text = "0";
                    }

                    //Guardamos en memoria los valores de las relaciones para el terminal dado
                    Cargar_TrabajosRealizados_Descargas_Completo();
                    Cargar_Liquidaciones_Descargas_Completo();
                    Cargar_Gastos_Descargas_Completo();
                    Cargar_Encuestas_Descargas_Completo();
                    
                    Cargar_RegistrosSincronizacion_PROVINCIAS_Cargas_Completo();
                    Cargar_RegistrosSincronizacion_CLIENTESPOTENCIALES_Cargas_Completo();
                    Cargar_RegistrosSincronizacion_ENCUESTAS_Cargas_Completo();

                    //Rellenamos el listado con los ids de la relacion para usarlos mas adelante, en la carga y en los filtros
                    foreach(GEN_Provincias mdl_GEN_Provincias in g_mdl_CRM_Terminales.GEN_Provincias)
                    {
                        g_lst_id_Provincias_Asociadas.Add(mdl_GEN_Provincias.id);
                    }

                    foreach(CRM_Encuestas mdl_CRM_Encuestas in g_mdl_CRM_Terminales.CRM_Encuestas)
                    {
                        g_lst_id_Encuestas_Asociadas.Add(mdl_CRM_Encuestas.id);
                    }

                    foreach(CRM_ClientesPotenciales mdl_CRM_ClientesPotenciales in g_mdl_CRM_Terminales.CRM_ClientesPotenciales)
                    {
                        g_lst_id_ClientesPotenciales_Asociadas.Add(mdl_CRM_ClientesPotenciales.id);
                    }

                    //Exferia_F3_Empleado no podrá ser nulo
                    g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Id = g_mdl_CRM_Terminales.MAE_Empleados.id;
                    g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Codigo = g_mdl_CRM_Terminales.MAE_Empleados.codigo;
                    g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Descripcion = g_mdl_CRM_Terminales.MAE_Empleados.nombre;
                    g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_FechaBorrado = g_mdl_CRM_Terminales.MAE_Empleados.fechaBorrado;
                    
                    //Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior_Codigo = "";
                    if (g_frm_P_Terminales.g_mdl_PRV_OpcionesDetalle != null &&
                       g_frm_P_Terminales.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                       g_frm_P_Terminales.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de campos
                        string[] arr_Campos = g_frm_P_Terminales.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Split(new Char[] { ',' });
                        string str_ValorAMostrarFinal = "";

                        string[] str_Separador = new string[] { " [" };
                        //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
                        if (g_frm_P_Terminales.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_Terminales.P_Base_TituloPantalla = (g_frm_P_Terminales.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

                        dynamic dnm_Objeto = g_mdl_CRM_Terminales;
                        foreach (string str_campo in arr_Campos)
                        {
                            var Valor = dnm_Objeto.GetType().GetProperty(str_campo).GetValue(dnm_Objeto, null);
                            if (Valor != null)
                            {
                                str_ValorAMostrarFinal += " " + Valor;
                            }

                            //Codigo
                            if (str_campo.Equals(nameof(g_mdl_CRM_Terminales.codigo)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_CRM_Terminales.codigo;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Terminales.P_Base_TituloPantalla += " [" + str_ValorAMostrarFinal + "] - Modificar";
                        }
                    }

                    //Actualizar el Boton de Seleccion de pantalla ####################################################
                    Variables.G_EMS_CONTROL_MENUSUPERIOR.Add_Texto_NombrePantalla_Descripciones(g_frm_P_Terminales.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

                    g_frm_P_Terminales.P_Base_SeModificoDatosPantalla = false;

                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(CargarDatos));
            }

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_VolverAlListado)
        {
            try
            {
                g_bol_GrabarDatos_VolverListado = _bol_VolverAlListado;

                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_Terminales.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                g_obj_TareaAsincrona_GrabarDatos = new BackgroundWorker();
                g_obj_TareaAsincrona_GrabarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_GrabarDatos_DoWork);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_GrabarDatos_Completed);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerAsync();

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_bol_GrabarDatos_TerminoCorrectamente = false;
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Terminales.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(GrabarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_GrabarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            
            try
            {
                //Validar Primero
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo = GrabarDatos_Final();
                }
                else
                {
                    mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear Formulario
            g_frm_P_Terminales.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);

                        //Poner el Foco en el objeto que tuvoel problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_Terminales, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    //Devolver al Listado el Row Añadido/ Modificado
                    if (g_frm_P_Terminales.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Terminales.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Terminales.P_Base_F3Origen != null)
                    {
                        g_frm_P_Terminales.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    if (g_bol_GrabarDatos_VolverListado)
                    {
                        g_frm_P_Terminales.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_Terminales.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }
        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Si el codigo esta vacio y se intenta buscar el ultimo numerico y llego al limite de base de datos
                if (g_frm_P_Terminales.Exferia_TextBox_Codigo.Text.Trim().Length == 0)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = Buscar_CodigoSiguiente();

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo.Mensaje;
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminales.Exferia_TextBox_Codigo;
                    }
                }

                //El codigo no puede estar Repetido
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Codigo = g_frm_P_Terminales.Exferia_TextBox_Codigo.Text.Trim();

                    if (Datos_Generales.Buscar_CodigoRepetido(nameof(CRM_Terminales), nameof(CRM_Terminales.codigo), str_Codigo, nameof(CRM_Terminales.id), (g_mdl_CRM_Terminales != null ? g_mdl_CRM_Terminales.id : -1), "", g_frm_P_Terminales.P_Base_ValoresGenerales.lng_idEmpresa, true))
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_Terminales.Exferia_TextBox_Codigo.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminales.Exferia_TextBox_Codigo;
                    }
                }

                //La Descripccion no puede estar vacia
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Terminales.Exferia_TextBox_Descripcion.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Terminales.Exferia_Label_Descripcion.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminales.Exferia_TextBox_Descripcion;
                }

                //El empleado no puede estar vacio (obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Codigo.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //Si hay Empleado Validar que es correcto{
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(ValidarDatos));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    CRM_Terminales mdl_CRM_Terminales = new CRM_Terminales();
                    mdl_CRM_Terminales.id = g_mdl_CRM_Terminales != null ? g_mdl_CRM_Terminales.id : -1;

                    //Asignar el idEmpresa...........................................................................................
                    if (((g_mdl_CRM_Terminales != null && g_mdl_CRM_Terminales.idEmpresa!=null) ? g_mdl_CRM_Terminales.idEmpresa.Value : -1) != -1)
                    {
                        mdl_CRM_Terminales.idEmpresa = g_mdl_CRM_Terminales.idEmpresa.Value;
                    }
                    else
                    {
                        //Buscar el idEmpresa que Corresponda
                        mdl_CRM_Terminales.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Terminales.P_Base_ValoresGenerales.lng_idEmpresa, nameof(CRM_Terminales));
                    }

                    //Exferia_TexBox
                    mdl_CRM_Terminales.codigo = g_frm_P_Terminales.Exferia_TextBox_Codigo.Text;
                    mdl_CRM_Terminales.descripcion = g_frm_P_Terminales.Exferia_TextBox_Descripcion.Text;
                    mdl_CRM_Terminales.claveAdministracion = g_frm_P_Terminales.Exferia_TextBox_ClaveAdministracion.Text;
                    mdl_CRM_Terminales.ip = g_frm_P_Terminales.Exferia_TextBox_Ip.Text;
                    mdl_CRM_Terminales.puerto = g_frm_P_Terminales.Exferia_TextBox_Puerto.Text;

                    //Exferia_Checkbox
                    mdl_CRM_Terminales.permitirCrearClientes = g_frm_P_Terminales.Exferia_CheckBox_Permitir_Crear_Clientes.Checked;

                    //Exferia_F3
                    mdl_CRM_Terminales.idEmpleado = g_frm_P_Terminales.Exferia_F3_Empleado.Exferia_F3_Id;

                    //Comunicacion ##############################################################################################
                    string str_Comunicacion_Tipo = "";
                    string str_Comunicacion_Eventos = "";

                    //Automatica
                    if (g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_Automatica.Checked)
                    {
                        str_Comunicacion_Tipo = "1";
                        mdl_CRM_Terminales.comunicacion_Carencia = g_frm_P_Terminales.Exferia_TextBox_Comunicacion_Carencia.Text.Trim().Length == 0 ? 0 : int.Parse(g_frm_P_Terminales.Exferia_TextBox_Comunicacion_Carencia.Text.Trim());
                    }
                    else
                    {
                        str_Comunicacion_Tipo = "0";
                        mdl_CRM_Terminales.comunicacion_Carencia = 0;
                    }

                    //Boton en Pantalla
                    if (g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_BotonPantalla.Checked)
                    {
                        str_Comunicacion_Tipo += "1";
                    }
                    else
                    {
                        str_Comunicacion_Tipo += "0";
                    }

                    //Eventos
                    if (g_frm_P_Terminales.Exferia_CheckBox_Comunicacion_Eventos.Checked)
                    {
                        str_Comunicacion_Tipo += "1";

                        for (int int_Contador = 0; int_Contador < g_frm_P_Terminales.Exferia_CheckListBox_Comunicacion_TiposEventos.Items.Count; int_Contador++)
                        {
                            if (g_frm_P_Terminales.Exferia_CheckListBox_Comunicacion_TiposEventos.GetItemChecked(int_Contador))
                            {
                                str_Comunicacion_Eventos += "1";
                            }
                            else
                            {
                                str_Comunicacion_Eventos += "0";
                            }
                        }
                    }
                    else
                    {
                        str_Comunicacion_Tipo += "0";
                    }
                    mdl_CRM_Terminales.comunicacion_Tipo = str_Comunicacion_Tipo;
                    mdl_CRM_Terminales.comunicacion_TiposEventos = str_Comunicacion_Eventos;
                    //###############################################################################################

                    //GPS ###########################################################################################
                    string str_GPS_Tipo = "";
                    string str_GPS_Eventos = "";

                    //Automatica
                    if (g_frm_P_Terminales.Exferia_CheckBox_GPS_Automatica.Checked)
                    {
                        str_GPS_Tipo = "1";
                        mdl_CRM_Terminales.gps_Carencia = g_frm_P_Terminales.Exferia_TextBox_GPS_Carencia.Text.Trim().Length == 0 ? 0 : int.Parse(g_frm_P_Terminales.Exferia_TextBox_GPS_Carencia.Text.Trim());
                    }
                    else
                    {
                        str_GPS_Tipo = "0";
                        mdl_CRM_Terminales.gps_Carencia = 0;
                    }

                    //Boton en Pantalla
                    if (g_frm_P_Terminales.Exferia_CheckBox_GPS_BotonPantalla.Checked)
                    {
                        str_GPS_Tipo += "1";
                    }
                    else
                    {
                        str_GPS_Tipo += "0";
                    }

                    //Eventos
                    if (g_frm_P_Terminales.Exferia_CheckBox_GPS_Eventos.Checked)
                    {
                        str_GPS_Tipo += "1";

                        for (int int_Contador = 0; int_Contador < g_frm_P_Terminales.Exferia_CheckListBox_GPS_TiposEventos.Items.Count; int_Contador++)
                        {
                            if (g_frm_P_Terminales.Exferia_CheckListBox_GPS_TiposEventos.GetItemChecked(int_Contador))
                            {
                                str_GPS_Eventos += "1";
                            }
                            else
                            {
                                str_GPS_Eventos += "0";
                            }
                        }
                    }
                    else
                    {
                        str_GPS_Tipo += "0";
                    }
                    mdl_CRM_Terminales.gps_Tipo = str_GPS_Tipo;
                    mdl_CRM_Terminales.gps_TiposEventos = str_GPS_Eventos;
                    //##################################################################################################

                    //ENCUESTAS RELACIONADAS ###########################################################################
                    mdl_CRM_Terminales.CRM_Encuestas = null;
                    List<CRM_Encuestas> lst_CRM_Encuestas_AGrabar = new List<CRM_Encuestas>();
                    if (g_frm_P_Terminales.Exferia_DataGridView_Encuestas_Asociadas.RowCount > 0)
                    {
                        List<long> lst_idEncuestas_Asociados = new List<long>();
                        foreach (DataGridViewRow dgvr in g_frm_P_Terminales.Exferia_DataGridView_Encuestas_Asociadas.Rows)
                        {
                            lst_idEncuestas_Asociados.Add(long.Parse(dgvr.Cells[0].Value.ToString()));
                        }

                        List<INTERNO_CRM_Encuestas_Listado_Modelo> lst_INTERNO_CRM_Encuestas_Listado_Modelo_AGrabar= g_lst_INTERNO_CRM_Encuestas_Listado_Modelo_Completo.Where(m => lst_idEncuestas_Asociados.Contains(m.id)).ToList();

                        if (lst_INTERNO_CRM_Encuestas_Listado_Modelo_AGrabar!=null && lst_INTERNO_CRM_Encuestas_Listado_Modelo_AGrabar.Count > 0)
                        {
                            foreach (INTERNO_CRM_Encuestas_Listado_Modelo mdl_INTERNO_CRM_Encuestas_Listado_Modelo in lst_INTERNO_CRM_Encuestas_Listado_Modelo_AGrabar)
                            {
                                CRM_Encuestas mdl_CRM_Encuestas = new CRM_Encuestas();
                                mdl_CRM_Encuestas.id = mdl_INTERNO_CRM_Encuestas_Listado_Modelo.id;
                                mdl_CRM_Encuestas.codigo = mdl_INTERNO_CRM_Encuestas_Listado_Modelo.codigo;
                                mdl_CRM_Encuestas.descripcion = mdl_INTERNO_CRM_Encuestas_Listado_Modelo.descripcion;
                                mdl_CRM_Encuestas.fechaBorrado = null;

                                lst_CRM_Encuestas_AGrabar.Add(mdl_CRM_Encuestas);
                            }
                        }
                    }
                    mdl_CRM_Terminales.CRM_Encuestas = lst_CRM_Encuestas_AGrabar;
                    //#####################################################################################################

                    //PROVINCIAS RELACIONADAS #############################################################################
                    mdl_CRM_Terminales.GEN_Provincias = null;
                    List<INTERNO_GEN_Provincias_Listado_Modelo> lst_INTERNO_GEN_Provincias_Listado_Modelo = new List<INTERNO_GEN_Provincias_Listado_Modelo>();
                    List<GEN_Provincias> lst_GEN_Provincias_AGrabar = new List<GEN_Provincias>();
                    if (g_frm_P_Terminales.Exferia_DataGridView_Provincias_Asociadas.RowCount > 0)
                    {
                        List<long> lst_idProvincias_Asociados = new List<long>();
                        foreach (DataGridViewRow dgvr in g_frm_P_Terminales.Exferia_DataGridView_Provincias_Asociadas.Rows)
                        {
                            lst_idProvincias_Asociados.Add(long.Parse(dgvr.Cells[0].Value.ToString()));
                        }

                        lst_INTERNO_GEN_Provincias_Listado_Modelo = g_lst_INTERNO_GEN_Provincias_Listado_Modelo_Completo.Where(m => lst_idProvincias_Asociados.Contains(m.id)).ToList();

                        //Como no se puede asignar un modelo al Entity, lo convertimos en el objeto entity
                        foreach (INTERNO_GEN_Provincias_Listado_Modelo mdl_GEN_Provincias_Listado_Modelo in lst_INTERNO_GEN_Provincias_Listado_Modelo)
                        {
                            GEN_Provincias mdl_GEN_Provincias = new GEN_Provincias();
                            mdl_GEN_Provincias = mdl_GEN_Provincias_Listado_Modelo;

                            lst_GEN_Provincias_AGrabar.Add(mdl_GEN_Provincias);
                        }
                    }
                    mdl_CRM_Terminales.GEN_Provincias = lst_GEN_Provincias_AGrabar;
                    //######################################################################################################

                    //CLIENTES POTENCIALES #################################################################################
                    mdl_CRM_Terminales.CRM_ClientesPotenciales = null;
                    List<INTERNO_CRM_ClientesPotenciales_Listado_Modelo> lst_CRM_INTERNO_ClientesPotenciales = new List<INTERNO_CRM_ClientesPotenciales_Listado_Modelo>();
                    List<CRM_ClientesPotenciales> lst_CRM_Clientes_Potenciales_AGRABAR = new List<CRM_ClientesPotenciales>();
                    if (g_frm_P_Terminales.Exferia_DataGridView_ClientesPotenciales_Asociados.RowCount > 0)
                    {
                        List<long> lst_idClientesPotenciales_Asociados = new List<long>();
                        foreach (DataGridViewRow dgvr in g_frm_P_Terminales.Exferia_DataGridView_ClientesPotenciales_Asociados.Rows)
                        {
                            lst_idClientesPotenciales_Asociados.Add(long.Parse(dgvr.Cells[0].Value.ToString()));
                        }

                        lst_CRM_INTERNO_ClientesPotenciales = g_lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo_Completo.Where(m => lst_idClientesPotenciales_Asociados.Contains(m.id)).ToList();

                        //Como no se puede asignar un modelo al Entity, lo convertimos en el objeto del entity
                        foreach (INTERNO_CRM_ClientesPotenciales_Listado_Modelo mdl_INTERNO_CRM_ClientesPotenciales in lst_CRM_INTERNO_ClientesPotenciales)
                        {
                            CRM_ClientesPotenciales mdl_CRM_ClientesPotenciales = new CRM_ClientesPotenciales();
                            mdl_CRM_ClientesPotenciales.id = mdl_INTERNO_CRM_ClientesPotenciales.id;
                            mdl_CRM_ClientesPotenciales.razonSocial = mdl_INTERNO_CRM_ClientesPotenciales.razonSocial;
                            mdl_CRM_ClientesPotenciales.nombreComercial = mdl_CRM_ClientesPotenciales.nombreComercial;

                            lst_CRM_Clientes_Potenciales_AGRABAR.Add(mdl_CRM_ClientesPotenciales);
                        }
                    }
                    mdl_CRM_Terminales.CRM_ClientesPotenciales = lst_CRM_Clientes_Potenciales_AGRABAR;
                    //######################################################################################################

                    //Grabamos el modelo ya relleno
                    mdl_ValorDevuelto_Modelo = g_obj_CRM_Terminales_Datos.Grabar(mdl_CRM_Terminales);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Datos
        public void BorrarDatos(bool _bol_VolverAlListado)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_bol_BorrarDatos_VolverListado = _bol_VolverAlListado;
                    g_frm_P_Terminales.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());


                    g_obj_TareaAsincrona_BorrarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Completed);
                    g_obj_TareaAsincrona_BorrarDatos.RunWorkerAsync();

                    g_frm_PE_Esperando.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                g_frm_P_Terminales.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(BorrarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Borrar 
                mdl_ValorDevuelto_Modelo = BorrarDatos_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();     
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();                
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear Formulario
            g_frm_P_Terminales.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    // Devolver al Listado el Row Borrar
                    if (g_frm_P_Terminales.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Terminales.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Terminales.P_Base_F3Origen != null)
                    {
                        g_frm_P_Terminales.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    if (g_bol_BorrarDatos_VolverListado)
                    {
                        g_frm_P_Terminales.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_Terminales.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(BorrarDatos_Final));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_CRM_Terminales_Datos.Borrar(g_mdl_CRM_Terminales != null ? g_mdl_CRM_Terminales.id : -1);

                return mdl_ValorDevuelto_Modelo;
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Claves Temporales
        public INTERNO_ValorDevuelto_Modelo Cargar_Listado_ClavesTemporales()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.CancelAsync();

                while (g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.IsBusy)
                    Application.DoEvents();

                //Vaciar el Listado
                g_frm_P_Terminales.Exferia_DataGridView_Claves.Rows.Clear();

                g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.RunWorkerAsync();

                mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_Listado_ClavesTemporales));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_Listado_ClavesTemporales));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }

            return mdl_ValorDevuelto_Modelo;
        }
        private void TareaAsincrona_Rellenar_Listado_ClavesTemporales_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                DataGridViewRow obj_DataGridViewRow;
                foreach (CRM_Terminales_ClavesTemporales mdl_CRM_Terminales_ClavesTemporales in g_lst_CRM_Terminales_ClavesTemporales)
                {
                    //Se Cancelo la tarea asincrona ##########################
                    if (((BackgroundWorker)sender).CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }

                    //Añadir Fila con Columnas .............................
                    obj_DataGridViewRow = Transformar_Modelo_A_Row_ClavesTemporales(mdl_CRM_Terminales_ClavesTemporales, null);

                    ((BackgroundWorker)sender).ReportProgress(1, obj_DataGridViewRow);

                    //Application.DoEvents();
                    Thread.Sleep(1);
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
                Thread.ResetAbort();
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_Listado_ClavesTemporales_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_Terminales.Exferia_DataGridView_Claves.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_Listado_ClavesTemporales_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        public DataGridViewRow Transformar_Modelo_A_Row_ClavesTemporales(CRM_Terminales_ClavesTemporales _mdl_CRM_Terminales_ClavesTemporales, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_Claves.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_Claves);
            }

            obj_DataGridViewRow.Cells[0].Value = _mdl_CRM_Terminales_ClavesTemporales.id;
            obj_DataGridViewRow.Cells[1].Value = _mdl_CRM_Terminales_ClavesTemporales.clave;
            obj_DataGridViewRow.Cells[2].Value = _mdl_CRM_Terminales_ClavesTemporales.fechaCreacion;
            obj_DataGridViewRow.Cells[3].Value = _mdl_CRM_Terminales_ClavesTemporales.tiempoCaducidad_Minutos;

            return obj_DataGridViewRow;
        }

        public void ClavesTemporales_Actualizar_Registro(long _lng_idClaveTemporal, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                CRM_Terminales_ClavesTemporales mdl_CRM_Terminales_ClavesTemporales = g_obj_CRM_Terminales_ClavesTemporales_Datos.Obtener(_lng_idClaveTemporal);

                if (mdl_CRM_Terminales_ClavesTemporales != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_CRM_Terminales_ClavesTemporales != null && g_lst_CRM_Terminales_ClavesTemporales.Count > 0)
                    {
                        CRM_Terminales_ClavesTemporales mdl_CRM_Terminales_ClavesTemporales_BUSQUEDA = g_lst_CRM_Terminales_ClavesTemporales.Where(m => m.id.Equals(mdl_CRM_Terminales_ClavesTemporales.id)).FirstOrDefault();
                        if (mdl_CRM_Terminales_ClavesTemporales_BUSQUEDA != null)
                        {
                            g_lst_CRM_Terminales_ClavesTemporales[g_lst_CRM_Terminales_ClavesTemporales.FindIndex(m => m.id.Equals(mdl_CRM_Terminales_ClavesTemporales.id))] = mdl_CRM_Terminales_ClavesTemporales;
                        }
                        else
                        {
                            g_lst_CRM_Terminales_ClavesTemporales.Add(mdl_CRM_Terminales_ClavesTemporales);
                        }
                    }
                    else
                    {
                        if (g_lst_CRM_Terminales_ClavesTemporales == null)
                        {
                            g_lst_CRM_Terminales_ClavesTemporales = new List<CRM_Terminales_ClavesTemporales>();
                        }

                        g_lst_CRM_Terminales_ClavesTemporales.Add(mdl_CRM_Terminales_ClavesTemporales);
                    }

                    //Actualizar el DataGridView #####################################################################################
                    //Modificar
                    if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                    {
                        DataGridViewRow row = g_frm_P_Terminales.Exferia_DataGridView_Claves.Rows
                                   .Cast<DataGridViewRow>()
                                   .Where(r => r.Cells[nameof(CRM_Terminales_ClavesTemporales.id)].Value.Equals(_lng_idClaveTemporal)).FirstOrDefault();

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_ClavesTemporales(mdl_CRM_Terminales_ClavesTemporales, row);
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_Terminales.Exferia_DataGridView_Claves.Rows.Insert(0, Transformar_Modelo_A_Row_ClavesTemporales(mdl_CRM_Terminales_ClavesTemporales, null));

                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(ClavesTemporales_Actualizar_Registro));
            }
        }
        public void ClavesTemporales_Borrar_Registro(List<long> _lst_idClavesTemporales)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_CRM_Terminales_ClavesTemporales != null && g_lst_CRM_Terminales_ClavesTemporales.Count > 0)
                {
                    List<CRM_Terminales_ClavesTemporales> lst_CRM_Terminales_ClavesTemporales_BUSQUEDA = g_lst_CRM_Terminales_ClavesTemporales.Where(m => _lst_idClavesTemporales.Contains(m.id)).ToList();
                    if (lst_CRM_Terminales_ClavesTemporales_BUSQUEDA != null && lst_CRM_Terminales_ClavesTemporales_BUSQUEDA.Count > 0)
                    {
                        foreach (CRM_Terminales_ClavesTemporales mdl_CRM_Terminales_ClavesTemporales in lst_CRM_Terminales_ClavesTemporales_BUSQUEDA)
                        {
                            g_lst_CRM_Terminales_ClavesTemporales.Remove(mdl_CRM_Terminales_ClavesTemporales);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Terminales.Exferia_DataGridView_Claves.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idClavesTemporales.Contains(long.Parse(r.Cells[nameof(CRM_Terminales_ClavesTemporales.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_Terminales.Exferia_DataGridView_Claves.Rows.Remove(dgvr_Borrar);
                    }
                }

                g_frm_P_Terminales.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(ClavesTemporales_Borrar_Registro));
            }
        }

        #region Borrar Datos Empleados
        public void BorrarDatos_ClavesTemporales(List<long> _lst_idClavesTemporales)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Terminales.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idClavesTemporales);

                    g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_ClavesTemporales_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_ClavesTemporales_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales.RunWorkerAsync(lst_Argumentos);

                    g_frm_PE_Esperando.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                g_frm_P_Terminales.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(BorrarDatos_ClavesTemporales));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_ClavesTemporales_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idClaveTemporal = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = g_obj_CRM_Terminales_ClavesTemporales_Datos.Borrar(lst_idClaveTemporal.FirstOrDefault());

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idClaveTemporal;
                        mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_ClavesTemporales_DoWork));

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Control_Errores)
                {
                    transaccion_SQL.Dispose();

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_ClavesTemporales_DoWork));

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                    
                    transaccion_SQL.Dispose();
                }
                finally
                {
                    e.Result = mdl_ValorDevuelto_Modelo;
                }
            }
        }
        private void TareaAsincrona_BorrarDatos_ClavesTemporales_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Terminales.Enabled = true;

            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

            //Mostrar si tuviera algun mensaje
            if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
            {
                if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                }
            }
            else
            {
                // Devolver al Listado el Row Borrar
                List<object> lst_obj = new List<object>();
                lst_obj.Add(Variables.G_STR_OPCION_CRM_TERMINAL);
                lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                g_frm_P_Terminales.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                g_frm_P_Terminales.P_Base_SeModificoDatosPantalla = false;
            }
        }
        #endregion

        public int Generar_ClaveTemporal()
        {
            int int_NuevaClave = 0;
            Random de = new Random();
            int_NuevaClave = de.Next(0, 999999999);

            return int_NuevaClave;
        }
        public INTERNO_ValorDevuelto_Modelo Grabar_Nueva_ClaveTemporal(int? _int_TiempoCaducidad)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Creamos el objeto a grabar
            CRM_Terminales_ClavesTemporales mdl_CRM_Terminales_ClavesTemporales = new CRM_Terminales_ClavesTemporales();

            mdl_CRM_Terminales_ClavesTemporales.idTerminal = g_frm_P_Terminales.P_Base_id;
            mdl_CRM_Terminales_ClavesTemporales.clave = Convert.ToString(Generar_ClaveTemporal());

            //Fecha Creacion segun
            mdl_CRM_Terminales_ClavesTemporales.fechaCreacion = DateTime.Now;

            mdl_CRM_Terminales_ClavesTemporales.utilizada = false;
            mdl_CRM_Terminales_ClavesTemporales.tiempoCaducidad_Minutos = _int_TiempoCaducidad;

            //Grabamos el modelo ya relleno
            mdl_ValorDevuelto_Modelo = g_obj_CRM_Terminales_ClavesTemporales_Datos.Grabar(mdl_CRM_Terminales_ClavesTemporales);

            return mdl_ValorDevuelto_Modelo;
        }
        public void Rellenar_Listado_ClavesTemporales()
        {
            //Rellenamos el listado general de las claves temporales con todos los registros para ese empleado en base de datos
            g_lst_CRM_Terminales_ClavesTemporales = g_obj_CRM_Terminales_ClavesTemporales_Datos.Obtener_Listado_PorTerminal(g_frm_P_Terminales.P_Base_id, true);

            if (g_lst_CRM_Terminales_ClavesTemporales != null && g_lst_CRM_Terminales_ClavesTemporales.Count > 5)
            {
                Cargar_Listado_ClavesTemporales();
            }
        }
        public void Vaciar_Listado_ClavesTemporales()
        {
            //Borramos todos menos los 5 primeros registros y los mostramos en el DGV
            if (g_lst_CRM_Terminales_ClavesTemporales != null && g_lst_CRM_Terminales_ClavesTemporales.Count > 5)
            {
                g_lst_CRM_Terminales_ClavesTemporales = g_lst_CRM_Terminales_ClavesTemporales.OrderByDescending(m => m.fechaCreacion).ToList();
                g_lst_CRM_Terminales_ClavesTemporales.RemoveRange(5, (g_lst_CRM_Terminales_ClavesTemporales.Count - 5));

                Cargar_Listado_ClavesTemporales();
            }
        }
        #endregion

        #region Comunicacion, GPS
        private void Seleccionar_TiposEventos_Comunicacion(string _str_Comunicacion_Eventos)
        {
            try
            {
                string str_EventosSeleccionados_Comunicacion = "0";

                for (int int_Contador = 0; int_Contador < g_lst_INTERNO_ComboBox_Modelo_Comunicacion_TiposEventos.Count; int_Contador++)
                {
                    //Comunicacion
                    if (_str_Comunicacion_Eventos != null && _str_Comunicacion_Eventos.Trim().Length > 0)
                    {
                        str_EventosSeleccionados_Comunicacion = _str_Comunicacion_Eventos.Substring(int_Contador, 1);
                        if (str_EventosSeleccionados_Comunicacion == "1")
                        {
                            g_frm_P_Terminales.Exferia_CheckListBox_Comunicacion_TiposEventos.SetItemChecked(int_Contador, true);
                        }
                    }
                }
            }
            catch (Control_Errores)
            {

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Seleccionar_TiposEventos_Comunicacion));
            }
        }

        private void Seleccionar_TiposEventos_GPS(string _str_GPS_Eventos)
        {
            try
            {
                string str_EventosSeleccionados_GPS = "0";
                for (int int_Contador = 0; int_Contador < g_lst_INTERNO_ComboBox_Modelo_GPS_TiposEventos.Count; int_Contador++)
                {
                    //GPS
                    if (_str_GPS_Eventos != null && _str_GPS_Eventos.Trim().Length > 0)
                    {
                        str_EventosSeleccionados_GPS = _str_GPS_Eventos.Substring(int_Contador, 1);
                        if (str_EventosSeleccionados_GPS == "1")
                        {
                            g_frm_P_Terminales.Exferia_CheckListBox_GPS_TiposEventos.SetItemChecked(int_Contador, true);
                        }
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Seleccionar_TiposEventos_GPS));
            }
        }
        #endregion

        #region Encuestas
        public void Cargar_Encuestas_Completo()
        {
            try
            {
                g_lst_INTERNO_CRM_Encuestas_Listado_Modelo_Completo = g_obj_CRM_Encuestas_Datos.Obtener_Listado();
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_Encuestas_Completo), true);
            }
        }

        public void Rellenar_DataGrid_EncuestasAsociados()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas.IsBusy)
                {
                    Application.DoEvents();
                }

                
                //TareaAsincrona Cargar Datos ##############################################################
                g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas.RunWorkerAsync();
                //##########################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGrid_EncuestasAsociados));
            }

        }
        private void TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                if (g_mdl_CRM_Terminales != null)
                {
                    //Antes de limpiar el DGV obtenemos los ids de las filas que hay en el momento
                    //Ya que al filtrar me quita los rows que no estan en la relacion entonces al filtrar desaparece el registro
                    foreach (DataGridViewRow obj_dgv in g_frm_P_Terminales.Exferia_DataGridView_Encuestas_Asociadas.Rows)
                    {
                        g_lst_id_Encuestas_Asociadas.Add(long.Parse(obj_dgv.Cells[nameof(CRM_Encuestas.id)].Value.ToString()));
                    }

                    //Vaciar el Listado
                    g_frm_P_Terminales.Exferia_DataGridView_Encuestas_Asociadas.Rows.Clear();

                    foreach (long lng_id_Encuesta in g_lst_id_Encuestas_Asociadas)
                    {
                        INTERNO_CRM_Encuestas_Listado_Modelo mdl_INTERNO_CRM_Encuestas_Listado_Modelo = g_lst_INTERNO_CRM_Encuestas_Listado_Modelo_Completo.Where(m => m.id.Equals(lng_id_Encuesta)).FirstOrDefault();

                        //Se Cancelo la tarea asincrona ################################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        if (mdl_INTERNO_CRM_Encuestas_Listado_Modelo != null)
                        {
                            //Añadir al DataGridView
                            ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Encuestas(mdl_INTERNO_CRM_Encuestas_Listado_Modelo, null));

                            //Esperar un poco
                            Thread.Sleep(1);
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGridView de Encuestas
                g_frm_P_Terminales.Exferia_DataGridView_Encuestas_Asociadas.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            {

            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Encuestas_Asociadas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Terminales.Encuestas_Ordenar_DataGridView_Asociados();
            }
        }

        #region Filtros Encuestas (Sin Asociar)
        public void Rellenar_DataGrid_Encuestas()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Encuestas.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Encuestas.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Terminales.Exferia_DataGridView_Encuestas_SinAsociar.Rows.Clear();

                //TareaAsincrona Cargar Datos ##############################################################
                g_TareaAsincrona_Rellenar_DataGrid_Encuestas.RunWorkerAsync();
                //##########################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGrid_Encuestas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Encuestas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                if(g_mdl_CRM_Terminales != null)
                {
                    List<INTERNO_CRM_Encuestas_Listado_Modelo> lst_INTERNO_CRM_Encuestas_Listado_Modelo = Filtrar_Encuestas();

                    //Quitar los que estan asociados al propio terminal
                    if(g_mdl_CRM_Terminales != null && g_mdl_CRM_Terminales.CRM_Encuestas != null && g_mdl_CRM_Terminales.CRM_Encuestas.Count > 0)
                    {
                        lst_INTERNO_CRM_Encuestas_Listado_Modelo = lst_INTERNO_CRM_Encuestas_Listado_Modelo.Where(m => !g_mdl_CRM_Terminales.CRM_Encuestas.Select(x => x.id).Contains(m.id)).ToList();
                    }

                    //Recorrer los campos Long_Text para saber si lo pongo tipo text o tipo long
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Encuestas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_CRM_Encuestas_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if(int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_Encuestas.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach(INTERNO_CRM_Encuestas_Listado_Modelo mdl_INTERNO_CRM_Encuestas_Listado_Modelo in lst_INTERNO_CRM_Encuestas_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona ################################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Encuestas(mdl_INTERNO_CRM_Encuestas_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores )
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Encuestas_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGridView de Encuestas
                g_frm_P_Terminales.Exferia_DataGridView_Encuestas_SinAsociar.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            {

            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Encuestas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Terminales.Encuestas_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Encuestas(INTERNO_CRM_Encuestas_Listado_Modelo _mdl_INTERNO_CRM_Encuestas_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_Encuestas_SinAsociar.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_Encuestas_SinAsociar);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Encuestas)
            {
                //Seguno el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CRM_Encuestas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_Encuestas_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CRM_Encuestas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_Encuestas_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_Valor = (decimal?)_mdl_INTERNO_CRM_Encuestas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_Encuestas_Listado_Modelo, null);
                    if (dcm_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_Valor = (long?)_mdl_INTERNO_CRM_Encuestas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_Encuestas_Listado_Modelo, null);
                    if (lng_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_Valor = (int?)_mdl_INTERNO_CRM_Encuestas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_Encuestas_Listado_Modelo, null);
                    if (int_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_Valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CRM_Encuestas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_Encuestas_Listado_Modelo, null);
                }

                int_ContadorFila++;
            }

            return obj_DataGridViewRow;
        }
        public List<INTERNO_CRM_Encuestas_Listado_Modelo> Filtrar_Encuestas()
        {
            List<INTERNO_CRM_Encuestas_Listado_Modelo> lst_Devolver = g_lst_INTERNO_CRM_Encuestas_Listado_Modelo_Completo;

            //Filtros Avanzados
            if(g_dct_ListadoFiltros_CRM_Encuestas != null && g_dct_ListadoFiltros_CRM_Encuestas.Count > 0)
            {
                lst_Devolver = lst_Devolver.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CRM_Encuestas_Listado_Modelo>(g_dct_ListadoFiltros_CRM_Encuestas, g_obj_ABS_Listado_Encuestas)).ToList();
            }

            return lst_Devolver;
        }
        #endregion
        
        #endregion

        #region Provincias
        public void Cargar_Provincias_Completo()
        {
            try
            {
                g_lst_INTERNO_GEN_Provincias_Listado_Modelo_Completo = Datos_Generales.GEN_Provincias_Obtener_Listado(g_frm_P_Terminales.P_Base_ValoresGenerales,g_lst_ColumnasAMostrar_GEN_Provincias);
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_Provincias_Completo), true);
            }
        }

        public void Rellenar_DataGrid_ProvinciasAsociadas()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas.IsBusy)
                {
                    Application.DoEvents();
                }

                //(Tarea Asincrona) Cargar Datos ####################################################
                g_TareaAsincrona_Rellenar_DataGrid_Provincias_Asociadas.RunWorkerAsync();
                //###################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGrid_ProvinciasAsociadas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ProvinciasAsociadas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                if (g_mdl_CRM_Terminales != null)
                {
                    //Antes de limpiar el DGV obtenemos los ids de las filas que hay en el momento
                    //Ya que al filtrar me quita los rows que no estan en la relacion entonces al filtrar desaparece el registro
                    foreach (DataGridViewRow obj_dgv in g_frm_P_Terminales.Exferia_DataGridView_Provincias_Asociadas.Rows)
                    {
                        g_lst_id_Provincias_Asociadas.Add(long.Parse(obj_dgv.Cells[nameof(GEN_Provincias.id)].Value.ToString()));
                    }

                    //Vaciar el Listado
                    g_frm_P_Terminales.Exferia_DataGridView_Provincias_Asociadas.Rows.Clear();


                    foreach (long lng_id_Provincia in g_lst_id_Provincias_Asociadas)
                    {
                        INTERNO_GEN_Provincias_Listado_Modelo mdl_INTERNO_GEN_Provincias_Listado_Modelo = g_lst_INTERNO_GEN_Provincias_Listado_Modelo_Completo.Where(m => m.id.Equals(lng_id_Provincia)).FirstOrDefault();

                        //Se cancelo la Tarea Asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        if (mdl_INTERNO_GEN_Provincias_Listado_Modelo != null)
                        {
                            //Añadir al DataGridView
                            ((BackgroundWorker)sender).ReportProgress(1, Transformar_Modelo_A_Row_ProvinciasSinAsociar(mdl_INTERNO_GEN_Provincias_Listado_Modelo, null));

                            //Esperar un poco
                            Thread.Sleep(1);
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ProvinciasAsociadas_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de Provincias sin Asignar
                g_frm_P_Terminales.Exferia_DataGridView_Provincias_Asociadas.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ProvinciasAsociadas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Terminales.Provincias_Ordenar_DataGridViewAsociados();
            }

            g_lst_id_Provincias_Asociadas = new List<long>();
        }

        private void Transformar_Modelo_A_Row_ProvinciasAsociados(GEN_Provincias _mdl_GEN_Provincias, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_Provincias_Asociadas.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_Provincias_Asociadas);
            }

            obj_DataGridViewRow.Cells[0].Value = _mdl_GEN_Provincias.id;
            obj_DataGridViewRow.Cells[1].Value = _mdl_GEN_Provincias.codigo;
            obj_DataGridViewRow.Cells[2].Value = _mdl_GEN_Provincias.descripcion;

            //Añadir Linea al DataGridView
            g_frm_P_Terminales.Exferia_DataGridView_Provincias_Asociadas.Rows.Add(obj_DataGridViewRow);
        }

        #region Filtros Provincias (Sin Asociar)
        public void Rellenar_DataGrid_Provincias_Filtros()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Provincias.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Provincias.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Terminales.Exferia_DataGridView_Provincias_SinAsociar.Rows.Clear();

                //(Tarea Asincrona) Cargar Datos ####################################################
                g_TareaAsincrona_Rellenar_DataGrid_Provincias.RunWorkerAsync();
                //###################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("",ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGrid_Provincias_Filtros));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ProvinciasSinAsociar_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                if (g_mdl_CRM_Terminales != null)
                {
                    List<INTERNO_GEN_Provincias_Listado_Modelo> lst_INTERNO_GEN_Provincias_Listado_Modelo = Filtrar_Provincias();

                    //Quitar los que estan asociados al propio terminal
                    if(g_mdl_CRM_Terminales != null && g_mdl_CRM_Terminales.GEN_Provincias != null && g_mdl_CRM_Terminales.GEN_Provincias.Count > 0)
                    {
                        lst_INTERNO_GEN_Provincias_Listado_Modelo = lst_INTERNO_GEN_Provincias_Listado_Modelo.Where(m => !g_mdl_CRM_Terminales.GEN_Provincias.Select(x => x.id).Contains(m.id)).ToList();
                    }

                    //Recorrer campos Long_Text para saber si pongo tipo text o tipo long
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Provincias.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_GEN_Provincias_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_Provincias.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach (INTERNO_GEN_Provincias_Listado_Modelo mdl_INTERNO_GEN_Provincias_Listado_Modelo in lst_INTERNO_GEN_Provincias_Listado_Modelo)
                    {
                        //Se cancelo la Tarea Asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(1, Transformar_Modelo_A_Row_ProvinciasSinAsociar(mdl_INTERNO_GEN_Provincias_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException) 
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ProvinciasSinAsociar_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de Provincias sin Asignar
                g_frm_P_Terminales.Exferia_DataGridView_Provincias_SinAsociar.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ProvinciasSinAsociar_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Terminales.Provincias_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_ProvinciasSinAsociar(INTERNO_GEN_Provincias_Listado_Modelo _mdl_INTERNO_GEN_Provincias_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_Provincias_SinAsociar.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_Provincias_SinAsociar);
            }

            try
            {
                int int_ContadorFila = 0;
                foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Provincias)
                {
                    //Seguno el Tipo
                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                    {
                        DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_GEN_Provincias_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_GEN_Provincias_Listado_Modelo, null);
                        if (dtt_Valor != null)
                        {
                            obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                        }
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                    {
                        bool? bol_Valor = (bool?)_mdl_INTERNO_GEN_Provincias_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_GEN_Provincias_Listado_Modelo, null);
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                    {
                        decimal? dcm_Valor = (decimal?)_mdl_INTERNO_GEN_Provincias_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_GEN_Provincias_Listado_Modelo, null);
                        if (dcm_Valor != null)
                        {
                            obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_Valor;
                        }
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                    {
                        long? lng_Valor = (long?)_mdl_INTERNO_GEN_Provincias_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_GEN_Provincias_Listado_Modelo, null);
                        if (lng_Valor != null)
                        {
                            obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_Valor;
                        }
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                    {
                        int? int_Valor = (int?)_mdl_INTERNO_GEN_Provincias_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_GEN_Provincias_Listado_Modelo, null);
                        if (int_Valor != null)
                        {
                            obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_Valor;
                        }
                    }
                    else
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_GEN_Provincias_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_GEN_Provincias_Listado_Modelo, null);
                    }

                    int_ContadorFila++;
                }
            }
            catch (Exception)
            {}

            return obj_DataGridViewRow;
        }
        public List<INTERNO_GEN_Provincias_Listado_Modelo> Filtrar_Provincias()
        {
            List<INTERNO_GEN_Provincias_Listado_Modelo> lst_A_Devolver = g_lst_INTERNO_GEN_Provincias_Listado_Modelo_Completo;

            //Filtros Avanzados
            if(g_dct_ListadoFiltros_GEN_Provincias != null && g_dct_ListadoFiltros_GEN_Provincias.Count > 0)
            {
                lst_A_Devolver = lst_A_Devolver.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_GEN_Provincias_Listado_Modelo>(g_dct_ListadoFiltros_GEN_Provincias, g_obj_ABS_Listado_Provincias)).ToList();
            }

            return lst_A_Devolver;
        }
        #endregion

        #endregion

        #region ClientesPotenciales
        public void Cargar_ClientesPotenciales_Completo()
        {
            try
            {
                List<dynamic> lst_Auxiliar = g_obj_CRM_ClientesPotenciales_Datos.Obtener_Listado(g_frm_P_Terminales.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_Terminales.P_Base_ValoresGenerales.EjercicioActivo.id, g_lst_ColumnasAMostrar_CRM_ClientesPotenciales, null, null);

                if (lst_Auxiliar != null && lst_Auxiliar.Count > 0)
                {
                    g_lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo_Completo = lst_Auxiliar.Cast<INTERNO_CRM_ClientesPotenciales_Listado_Modelo>().ToList();
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_ClientesPotenciales_Completo), true);
            }
        }

        #region Filtros Clientes (Asociadas)
        public void Rellenar_DataGrid_ClientesPotencialesAsociadas()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados.IsBusy)
                {
                    Application.DoEvents();
                }

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGrid_ClientesPotenciales));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                if (g_mdl_CRM_Terminales != null)
                {
                    //NO HAY CAMPOS LONG_TEXT, PERO LO DEJO POR SI HICIERA FALTA MAS ADELANTE
                    //Recorrer los campos Long_Text para saber si lo pongo tipo text o tipo long
                    //foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ClientesPotenciales.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    //{
                    //    int int_HayTextos = lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                    //    if (int_HayTextos > 0)
                    //    {
                    //        mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                    //        g_obj_ABS_Listado_ClientesPotenciales.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                    //    }
                    //}

                    //Antes de limpiar el DGV obtenemos los ids de las filas que hay en el momento
                    //Ya que al filtrar me quita los rows que no estan en la relacion entonces al filtrar desaparece el registro
                    foreach (DataGridViewRow obj_dgv in g_frm_P_Terminales.Exferia_DataGridView_Encuestas_Asociadas.Rows)
                    {
                        g_lst_id_Provincias_Asociadas.Add(long.Parse(obj_dgv.Cells[nameof(CRM_ClientesPotenciales.id)].Value.ToString()));
                    }

                    //Vaciar el Listado
                    g_frm_P_Terminales.Exferia_DataGridView_ClientesPotenciales_Asociados.Rows.Clear();


                    foreach (CRM_ClientesPotenciales mdl_CRM_ClientesPotenciales in g_mdl_CRM_Terminales.CRM_ClientesPotenciales)
                    {
                        INTERNO_CRM_ClientesPotenciales_Listado_Modelo mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo = g_lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo_Completo.Where(m => m.id.Equals(mdl_CRM_ClientesPotenciales.id)).FirstOrDefault();

                        //Se Cancelo la tarea asincrona ##############################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        if (mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo != null)
                        {
                            //Añadir al DataGridView
                            ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_ClientesPotenciales(mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo, null));

                            //Esperar un poco
                            Thread.Sleep(1);
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGridView de ClientesPotenciales
                g_frm_P_Terminales.Exferia_DataGridView_ClientesPotenciales_Asociados.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            {

            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Asociados_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Terminales.ClientesPotenciales_Ordenar_DataGridView_Asociados();
            }
        }
        #endregion

        #region Filtros Clientes (Sin Asociar)
        public void Rellenar_DataGrid_ClientesPotenciales()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Terminales.Exferia_DataGridView_ClientesPotenciales_SinAsociar.Rows.Clear();

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGrid_ClientesPotenciales));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                if (g_mdl_CRM_Terminales != null)
                {
                    List<INTERNO_CRM_ClientesPotenciales_Listado_Modelo> lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo = Filtrar_ClientesPotenciales();

                    //Quitar los que estan asociados al propio terminal
                    if (g_mdl_CRM_Terminales != null && g_mdl_CRM_Terminales.CRM_ClientesPotenciales != null && g_mdl_CRM_Terminales.CRM_ClientesPotenciales.Count > 0)
                    {
                        lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo = lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo.Where(m => !g_mdl_CRM_Terminales.CRM_ClientesPotenciales.Select(x => x.id).Contains(m.id)).ToList();
                    }

                    //Recorrer los campos Long_Text para saber si lo pongo tipo text o tipo long
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ClientesPotenciales.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_ClientesPotenciales.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach (INTERNO_CRM_ClientesPotenciales_Listado_Modelo mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo in lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona ##############################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_ClientesPotenciales(mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGridView de ClientesPotenciales
                g_frm_P_Terminales.Exferia_DataGridView_ClientesPotenciales_SinAsociar.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            {

            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesPotenciales_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Terminales.ClientesPotenciales_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_ClientesPotenciales(INTERNO_CRM_ClientesPotenciales_Listado_Modelo _mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if(obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_ClientesPotenciales_SinAsociar.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_ClientesPotenciales_SinAsociar);
            }

            int int_ContadorFila = 0;
            foreach(INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ClientesPotenciales)
            {
                //Seguno el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_Valor = (decimal?)_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo, null);
                    if (dcm_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_Valor = (long?)_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo, null);
                    if(lng_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_Valor = (int?)_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo, null);
                    if(int_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_Valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_ClientesPotenciales_Listado_Modelo, null);
                }

                int_ContadorFila++;
            }

            return obj_DataGridViewRow;
        }
        public List<INTERNO_CRM_ClientesPotenciales_Listado_Modelo> Filtrar_ClientesPotenciales()
        {
            List<INTERNO_CRM_ClientesPotenciales_Listado_Modelo> lst_Devolver = g_lst_INTERNO_CRM_ClientesPotenciales_Listado_Modelo_Completo;

            //Filtros Avanzados
            if(g_dct_ListadoFiltros_CRM_ClientesPotenciales != null && g_dct_ListadoFiltros_CRM_ClientesPotenciales.Count > 0)
            {
                lst_Devolver = lst_Devolver.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CRM_ClientesPotenciales_Listado_Modelo>(g_dct_ListadoFiltros_CRM_ClientesPotenciales, g_obj_ABS_Listado_ClientesPotenciales)).ToList();
            }

            return lst_Devolver;
        }
        #endregion

        #endregion

        #region Sincronizacion

        #region Trabajos Realizados
        public void Cargar_TrabajosRealizados_Descargas_Completo()
        {
            try
            {
                g_lst_INTERNO_CRMS_TrabajosRealizados_Descargas_Listado_Modelo_Completo = g_obj_CRMS_TrabajosRealizados_Datos.Obtener_Listado_PorTerminal(g_mdl_CRM_Terminales.id);
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_TrabajosRealizados_Descargas_Completo), true);
            }
        }
       
        public void Rellenar_DataGridView_TrabajosRealizados_Descargas()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Clear();

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Descargas.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGridView_TrabajosRealizados_Descargas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CRMS_TrabajosRealizados_Listado_Modelo> lst_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo = Filtrar_TrabajosRealizados_Descargas();

                //Recorrer los campos long_Text para saber si lo pongo tipo text o tipo long
                if (lst_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo != null && lst_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo.Count > 0)
                {
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_TrabajosRealizados_Descargas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_TrabajosRealizados_Descargas.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach (INTERNO_CRMS_TrabajosRealizados_Listado_Modelo mdl_INTERNO_CRM_TrabajosRealizados_Listado_Modelo in lst_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #################################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_TrabajosRealizados_Descargas(mdl_INTERNO_CRM_TrabajosRealizados_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGridView de TrabajosRealizados
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_TrabajosRealizados_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_frm_P_Terminales.TrabajosRealizados_Descargas_Ordenar_DataGridView();
        }

        public DataGridViewRow Transformar_Modelo_A_Row_TrabajosRealizados_Descargas(INTERNO_CRMS_TrabajosRealizados_Listado_Modelo _mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_TrabajosRealizados_Descargas)
            {
                //Seguno el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_Valor = (decimal?)_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo, null);
                    if (dcm_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_Valor = (long?)_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo, null);
                    if (lng_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_Valor = (int?)_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo, null);
                    if (int_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_Valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_TrabajosRealizados_Listado_Modelo, null);
                }

                int_ContadorFila++;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CRMS_TrabajosRealizados_Listado_Modelo> Filtrar_TrabajosRealizados_Descargas()
        {
            List<INTERNO_CRMS_TrabajosRealizados_Listado_Modelo> lst_Devolver = g_lst_INTERNO_CRMS_TrabajosRealizados_Descargas_Listado_Modelo_Completo;

            //Filtros Avanzados
            if (g_dct_ListadoFiltros_CRMS_TrabajosRealizados_Descargas != null && g_dct_ListadoFiltros_CRMS_TrabajosRealizados_Descargas.Count > 0)
            {
                lst_Devolver = lst_Devolver.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CRMS_TrabajosRealizados_Listado_Modelo>(g_dct_ListadoFiltros_CRMS_TrabajosRealizados_Descargas, g_obj_ABS_Listado_TrabajosRealizados_Descargas)).ToList();
            }

            return lst_Devolver;
        }
        #endregion

        #region Liquidaciones
        public void Cargar_Liquidaciones_Descargas_Completo()
        {
            try
            {
                g_lst_INTERNO_CRMS_Liquidaciones_Descargas_Listado_Modelo_Completo = g_obj_CRMS_Liquidaciones_Datos.Obtener_Listado_PorTerminal(g_mdl_CRM_Terminales.id);
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_Liquidaciones_Descargas_Completo), true);
            }
        }

        public void Rellenar_DataGridView_Liquidaciones_Descargas()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Clear();

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Descargas.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGridView_Liquidaciones_Descargas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Liquidaciones_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CRMS_Liquidaciones_Listado_Modelo> lst_INTERNO_CRMS_Liquidaciones_Listado_Modelo = Filtrar_Liquidaciones_Descargas();

                //Recorrer los campos long_Text para saber si lo pongo tipo text o tipo long
                if (lst_INTERNO_CRMS_Liquidaciones_Listado_Modelo != null && lst_INTERNO_CRMS_Liquidaciones_Listado_Modelo.Count > 0)
                {
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Liquidaciones_Descargas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_CRMS_Liquidaciones_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_Liquidacion_Descargas.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach (INTERNO_CRMS_Liquidaciones_Listado_Modelo mdl_INTERNO_CRM_Liquidaciones_Listado_Modelo in lst_INTERNO_CRMS_Liquidaciones_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #################################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Liquidaciones_Descargas(mdl_INTERNO_CRM_Liquidaciones_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Liquidaciones_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGridView de Sincronizacion
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Liquidaciones_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_frm_P_Terminales.Liquidaciones_Descargas_Ordenar_DataGridView();
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Liquidaciones_Descargas(INTERNO_CRMS_Liquidaciones_Listado_Modelo _mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Liquidaciones_Descargas)
            {
                //Seguno el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_Valor = (decimal?)_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo, null);
                    if (dcm_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_Valor = (long?)_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo, null);
                    if (lng_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_Valor = (int?)_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo, null);
                    if (int_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_Valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Liquidaciones_Listado_Modelo, null);
                }

                int_ContadorFila++;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CRMS_Liquidaciones_Listado_Modelo> Filtrar_Liquidaciones_Descargas()
        {
            List<INTERNO_CRMS_Liquidaciones_Listado_Modelo> lst_Devolver = g_lst_INTERNO_CRMS_Liquidaciones_Descargas_Listado_Modelo_Completo;

            //Filtros Avanzados
            if(g_dct_ListadoFiltros_CRMS_Liquidaciones_Descargas != null && g_dct_ListadoFiltros_CRMS_Liquidaciones_Descargas.Count > 0)
            {
                lst_Devolver = lst_Devolver.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CRMS_Liquidaciones_Listado_Modelo>(g_dct_ListadoFiltros_CRMS_Liquidaciones_Descargas, g_obj_ABS_Listado_Liquidacion_Descargas)).ToList();
            }

            return lst_Devolver;
        }
        #endregion

        #region Gastos
        public void Cargar_Gastos_Descargas_Completo()
        {
            try
            {
                g_lst_INTERNO_CRMS_Gastos_Descargas_Listado_Modelo_Completo = g_obj_CRMS_Gastos_Datos.Obtener_Listado_PorTerminal(g_mdl_CRM_Terminales.id);
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_Gastos_Descargas_Completo), true);
            }
        }

        public void Rellenar_DataGridView_Gastos_Descargas()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Clear();

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Gastos_Descargas.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGridView_Gastos_Descargas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Gastos_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CRMS_Gastos_Listado_Modelo> lst_INTERNO_CRMS_Gastos_Listado_Modelo = Filtrar_Gastos_Descargas();

                //Recorrer los campos long_Text para saber si lo pongo tipo text o tipo long
                if (lst_INTERNO_CRMS_Gastos_Listado_Modelo != null && lst_INTERNO_CRMS_Gastos_Listado_Modelo.Count > 0)
                {
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Gastos_Descargas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_CRMS_Gastos_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_Gastos_Descargas.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach (INTERNO_CRMS_Gastos_Listado_Modelo mdl_INTERNO_CRM_Gastos_Listado_Modelo in lst_INTERNO_CRMS_Gastos_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #################################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Gastos_Descargas(mdl_INTERNO_CRM_Gastos_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Gastos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGridView de Gastos
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Gastos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_frm_P_Terminales.Gastos_Descargas_Ordenar_DataGridView();
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Gastos_Descargas(INTERNO_CRMS_Gastos_Listado_Modelo _mdl_INTERNO_CRMS_Gastos_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Gastos_Descargas)
            {
                //Seguno el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CRMS_Gastos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Gastos_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CRMS_Gastos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Gastos_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_Valor = (decimal?)_mdl_INTERNO_CRMS_Gastos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Gastos_Listado_Modelo, null);
                    if (dcm_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_Valor = (long?)_mdl_INTERNO_CRMS_Gastos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Gastos_Listado_Modelo, null);
                    if (lng_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_Valor = (int?)_mdl_INTERNO_CRMS_Gastos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Gastos_Listado_Modelo, null);
                    if (int_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_Valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CRMS_Gastos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Gastos_Listado_Modelo, null);
                }

                int_ContadorFila++;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CRMS_Gastos_Listado_Modelo> Filtrar_Gastos_Descargas()
        {
            List<INTERNO_CRMS_Gastos_Listado_Modelo> lst_Devolver = g_lst_INTERNO_CRMS_Gastos_Descargas_Listado_Modelo_Completo;

            //Filtros Avanzados
            if (g_dct_ListadoFiltros_CRMS_Gastos_Descargas != null && g_dct_ListadoFiltros_CRMS_Gastos_Descargas.Count > 0)
            {
                lst_Devolver = lst_Devolver.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CRMS_Gastos_Listado_Modelo>(g_dct_ListadoFiltros_CRMS_Gastos_Descargas, g_obj_ABS_Listado_Gastos_Descargas)).ToList();
            }

            return lst_Devolver;
        }
        #endregion

        #region Encuestas
        public void Cargar_Encuestas_Descargas_Completo()
        {
            try
            {
                g_lst_INTERNO_CRMS_Encuestas_Descargas_Listado_Modelo_Completo = g_obj_CRMS_Encuestas_Datos.Obtener_Listado_PorTerminal(g_mdl_CRM_Terminales.id);
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_Encuestas_Descargas_Completo), true);
            }
        }

        public void Rellenar_DataGridView_Encuestas_Descargas()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Clear();

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGridView_Encuestas_Descargas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CRMS_Encuestas_Listado_Modelo> lst_INTERNO_CRMS_Encuestas_Listado_Modelo = Filtrar_Encuestas_Descargas();

                //Recorrer los campos long_Text para saber si lo pongo tipo text o tipo long
                if (lst_INTERNO_CRMS_Encuestas_Listado_Modelo != null && lst_INTERNO_CRMS_Encuestas_Listado_Modelo.Count > 0)
                {
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Encuestas_Descargas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_CRMS_Encuestas_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_Encuestas_Descargas.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach (INTERNO_CRMS_Encuestas_Listado_Modelo mdl_INTERNO_CRM_Encuestas_Listado_Modelo in lst_INTERNO_CRMS_Encuestas_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #################################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Encuestas_Descargas(mdl_INTERNO_CRM_Encuestas_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGridView de Encuestas
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Encuestas_Descargas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_frm_P_Terminales.Encuestas_Descargas_Ordenar_DataGridView();
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Encuestas_Descargas(INTERNO_CRMS_Encuestas_Listado_Modelo _mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Encuestas_Descargas)
            {
                //Seguno el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_Valor = (decimal?)_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo, null);
                    if (dcm_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_Valor = (long?)_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo, null);
                    if (lng_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_Valor = (int?)_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo, null);
                    if (int_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_Valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMS_Encuesta_Descargas_Listado_Modelo, null);
                }

                int_ContadorFila++;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CRMS_Encuestas_Listado_Modelo> Filtrar_Encuestas_Descargas()
        {
            List<INTERNO_CRMS_Encuestas_Listado_Modelo> lst_Devolver = g_lst_INTERNO_CRMS_Encuestas_Descargas_Listado_Modelo_Completo;

            //Filtros Avanzados
            if (g_dct_ListadoFiltros_CRMS_Encuestas_Descargas != null && g_dct_ListadoFiltros_CRMS_Encuestas_Descargas.Count > 0)
            {
                lst_Devolver = lst_Devolver.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CRMS_Encuestas_Listado_Modelo>(g_dct_ListadoFiltros_CRMS_Encuestas_Descargas, g_obj_ABS_Listado_Encuestas_Descargas)).ToList();
            }

            return lst_Devolver;
        }
        #endregion


        #region RegistrosSincronizacion Cargas
        public void Cargar_RegistrosSincronizacion_PROVINCIAS_Cargas_Completo()
        {
            try
            {
                List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo> lst_Auxiliar = null;
                lst_Auxiliar = g_obj_CRMB_RegistrosSincronizacion_Datos.Obtener_Listado_PorTerminal(Variables.G_STR_OPCION_GEN_PROVINCIA, g_mdl_CRM_Terminales.id);

                //Una vez que hemos obtenido el listado CRMB, hay un id registro que hace alusion al id de la tabla dada
                //asi que volvemos a BD a buscar el objeto, para no mostar el numero (sin sentido aparente)
                g_lst_INTERNO_CRMB_RegistrosSincronizacion_PROVINCIAS_Cargas_Listado_Modelo_Completo = new List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo>();

                if(lst_Auxiliar != null && lst_Auxiliar.Count() > 0)
                {
                    foreach (INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo mdl_INTERNO_CRMB_RegistroSincronizacion in lst_Auxiliar)
                    {
                        mdl_INTERNO_CRMB_RegistroSincronizacion.NombreRegistro = g_obj_CRMB_RegistrosSincronizacion_Datos.Obtener_Nombre_Provincia(mdl_INTERNO_CRMB_RegistroSincronizacion.idRegistro.Value);
                        g_lst_INTERNO_CRMB_RegistrosSincronizacion_PROVINCIAS_Cargas_Listado_Modelo_Completo.Add(mdl_INTERNO_CRMB_RegistroSincronizacion);
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_RegistrosSincronizacion_PROVINCIAS_Cargas_Completo), true);
            }
        }

        public void Cargar_RegistrosSincronizacion_ENCUESTAS_Cargas_Completo()
        {
            try
            {
                List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo> lst_Auxiliar = null;
                lst_Auxiliar = g_obj_CRMB_RegistrosSincronizacion_Datos.Obtener_Listado_PorTerminal(Variables.G_STR_OPCION_CRM_TERMINALES_ENCUESTAS, g_mdl_CRM_Terminales.id);

                //Una vez que hemos obtenido el listado CRMB, hay un id registro que hace alusion al id de la tabla dada
                //asi que volvemos a BD a buscar el objeto, para no mostar el numero (sin sentido aparente)
                g_lst_INTERNO_CRMB_RegistrosSincronizacion_ENCUESTAS_Cargas_Listado_Modelo_Completo = new List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo>();

                if(lst_Auxiliar != null && lst_Auxiliar.Count() > 0)
                {
                    foreach (INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo mdl_INTERNO_CRMB_RegistroSincronizacion in lst_Auxiliar)
                    {
                        mdl_INTERNO_CRMB_RegistroSincronizacion.NombreRegistro = g_obj_CRMB_RegistrosSincronizacion_Datos.Obtener_Nombre_Encuesta(mdl_INTERNO_CRMB_RegistroSincronizacion.idRegistro_Aux_Long1.Value);
                        g_lst_INTERNO_CRMB_RegistrosSincronizacion_ENCUESTAS_Cargas_Listado_Modelo_Completo.Add(mdl_INTERNO_CRMB_RegistroSincronizacion);
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_RegistrosSincronizacion_ENCUESTAS_Cargas_Completo), true);
            }
        }

        public void Cargar_RegistrosSincronizacion_CLIENTESPOTENCIALES_Cargas_Completo()
        {
            try
            {
                List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo> lst_Auxiliar = null;
                lst_Auxiliar = g_obj_CRMB_RegistrosSincronizacion_Datos.Obtener_Listado_PorTerminal(Variables.G_STR_OPCION_CRM_CLIENTESPOTENCIALES_TERMINALES, g_mdl_CRM_Terminales.id);

                //Una vez que hemos obtenido el listado CRMB, hay un id registro que hace alusion al id de la tabla dada
                //asi que volvemos a BD a buscar el objeto, para no mostar el numero (sin sentido aparente)
                g_lst_INTERNO_CRMB_RegistrosSincronizacion_CLIENTESPOTENCIALES_Cargas_Listado_Modelo_Completo = new List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo>();

                if (lst_Auxiliar != null && lst_Auxiliar.Count() > 0)
                {
                    foreach (INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo mdl_INTERNO_CRMB_RegistroSincronizacion in lst_Auxiliar)
                    {
                        mdl_INTERNO_CRMB_RegistroSincronizacion.NombreRegistro = g_obj_CRMB_RegistrosSincronizacion_Datos.Obtener_Nombre_ClientePotencial(mdl_INTERNO_CRMB_RegistroSincronizacion.idRegistro.Value);
                        g_lst_INTERNO_CRMB_RegistrosSincronizacion_CLIENTESPOTENCIALES_Cargas_Listado_Modelo_Completo.Add(mdl_INTERNO_CRMB_RegistroSincronizacion);
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Cargar_RegistrosSincronizacion_CLIENTESPOTENCIALES_Cargas_Completo), true);
            }
        }

        public void Rellenar_DataGridView_RegistrosSincronizacion_Cargas()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Clear();

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Registros_Sincronizacion_Cargas.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminales_Controladora) + "/" + nameof(Rellenar_DataGridView_RegistrosSincronizacion_Cargas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_RegistrosSincronizacion_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo> lst_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo = Filtrar_RegistrosSincronizacion_Cargas();

                //Recorrer los campos long_Text para saber si lo pongo tipo text o tipo long
                if (lst_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo != null && lst_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo.Count > 0)
                {
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_RegistrosSincronizacion_Cargas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_RegistrosSincronizacion_Cargas.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach (INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo in lst_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #################################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_RegistrosSincronizacion_Cargas(mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_RegistrosSincronizacion_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGridView de RegistrosSincronizacion
                g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_RegistrosSincronizacion_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_frm_P_Terminales.RegistrosSincronizacion_Cargas_Ordenar_DataGridView();
        }

        public DataGridViewRow Transformar_Modelo_A_Row_RegistrosSincronizacion_Cargas(INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo _mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminales.Exferia_DataGridView_Sincronizacion);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_RegistrosSincronizacion_Cargas)
            {
                //Seguno el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_Valor = (decimal?)_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo, null);
                    if (dcm_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_Valor = (long?)_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo, null);
                    if (lng_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_Valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_Valor = (int?)_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo, null);
                    if (int_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_Valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo, null);
                }

                int_ContadorFila++;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo> Filtrar_RegistrosSincronizacion_Cargas()
        {
            List<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo> lst_Devolver = null;

            if (g_frm_P_Terminales.g_str_NombreBoton_Seleccionado.Equals(g_frm_P_Terminales.Exferia_Button_Provincias_Cargas.Name))
            {
                lst_Devolver = g_lst_INTERNO_CRMB_RegistrosSincronizacion_PROVINCIAS_Cargas_Listado_Modelo_Completo;
            }
            else if (g_frm_P_Terminales.g_str_NombreBoton_Seleccionado.Equals(g_frm_P_Terminales.Exferia_Button_Encuestas_Cargas.Name))
            {
                lst_Devolver = g_lst_INTERNO_CRMB_RegistrosSincronizacion_ENCUESTAS_Cargas_Listado_Modelo_Completo;
            }
            else if (g_frm_P_Terminales.g_str_NombreBoton_Seleccionado.Equals(g_frm_P_Terminales.Exferia_Button_ClientesPotenciales_Cargas.Name))
            {
                lst_Devolver = g_lst_INTERNO_CRMB_RegistrosSincronizacion_CLIENTESPOTENCIALES_Cargas_Listado_Modelo_Completo;
            }

            //Filtros Avanzados
            if(g_dct_ListadoFiltros_CRMB_RegistrosSincronizacion_Cargas != null && g_dct_ListadoFiltros_CRMB_RegistrosSincronizacion_Cargas.Count() > 0)
            {
                lst_Devolver = lst_Devolver.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CRMB_RegistrosSincronizacion_Listado_Modelo>(g_dct_ListadoFiltros_CRMB_RegistrosSincronizacion_Cargas, g_obj_ABS_Listado_RegistrosSincronizacion_Cargas)).ToList();
            }

            return lst_Devolver;
        }
        #endregion

        #endregion
    }
}
