using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Excel;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_Mythos._0_Modelos;
using Exferia_Mythos._1_Datos;
using Exferia_Mythos._3_Vistas.Listados;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
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_Mythos._3_Vistas.Controladoras
{
    public class P_GestionContratos_Controladora
    {
        #region Variables Generales
        private P_GestionContratos g_frm_P_GestionContratos = null;//Variable que enlaza con la pantalla asociada
        private PE_Esperando_BarraProgreso g_frm_PE_Esperando_BarraProgreso; //Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

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

        //Clases de Negocio
        private MYT_InstalacionesLineasContratos_Datos g_obj_MYT_InstalacionesLineasContratos_Datos = new MYT_InstalacionesLineasContratos_Datos();
        private MYT_PlanMantenimientosCabeceras_Datos g_obj_MYT_PlanMantenimientosCabeceras_Datos = new MYT_PlanMantenimientosCabeceras_Datos();
        private MYT_Previsiones_Datos g_obj_MYT_Previsiones_Datos = new MYT_Previsiones_Datos();

        //Listados
        public List<INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo> g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo = null;
        private List<INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo> g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_Filtradas = null;
        //Tarea Asincrona de Rellenar DataGridView
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_Contratos=null;
        private bool g_bol_CancelarTareaAsincrona_Rellenar_DataGrid_Contratos = false;

        //Tarea Asincrona de Renovar Contratos
        private BackgroundWorker g_obj_TareaAsincrona_RenovarContratos = null;

        //Filtros del listado
        public List<string> g_lst_ColumnasAMostrar_Contratos = new List<string>();

        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_Contratos_Columnas;
        public ABS_Listado_GestionContratos g_obj_ABS_Listado_GestionContratos = new ABS_Listado_GestionContratos();
        public Dictionary<string, object> g_dct_ListadoFiltros_Contratos = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Contratos = 0;
        private int g_int_TotalRegistros_Contratos = 0;
        #endregion

        #region Constructor
        public P_GestionContratos_Controladora(P_GestionContratos _frm_P_GestionContratos)
        {
            g_frm_P_GestionContratos = _frm_P_GestionContratos;
        }
        #endregion

        #region Rellenar DataGrid Contratos
        public void Rellenar_DataGrid_Contratos(bool _bol_BuscarBD)
        {
            try
            {
                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_Rellenar_DataGrid_Contratos != null)
                {
                    g_bol_CancelarTareaAsincrona_Rellenar_DataGrid_Contratos = true;

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

                    g_bol_CancelarTareaAsincrona_Rellenar_DataGrid_Contratos = false;

                }
                else
                {
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Contratos = new BackgroundWorker();
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Contratos.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Contratos_DoWork);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Contratos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Contratos_ProgressChanged);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Contratos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Contratos_Completed);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Contratos.WorkerReportsProgress = true;
                }

                //Vaciar el Listado
                g_frm_P_GestionContratos.Exferia_DataGridView_Contratos.Rows.Clear();
                g_int_TotalRegistrosInsertados_Contratos = 0;
                g_int_TotalRegistros_Contratos = 0;
                g_frm_P_GestionContratos.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Contratos;
                g_frm_P_GestionContratos.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Contratos;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_Rellenar_DataGrid_Contratos.RunWorkerAsync(_bol_BuscarBD);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(Rellenar_DataGrid_Contratos));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_Contratos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;

            try
            {
                //Argumentos 
                bool _bol_BuscarBD = (bool)e.Argument;
                g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_Filtradas = null;

                if (_bol_BuscarBD || 
                    g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo==null ||
                    g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.Count==0)
                {
                    // Validar Primero
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_VALIDACION = ValidarDatos();
                    if (mdl_INTERNO_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                    {
                        DateTime dtt_Fecha_Inicio = DateTime.ParseExact(g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaInicio.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                        DateTime dtt_Fecha_Fin = DateTime.ParseExact(g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaFin.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                        //Obtener 
                        g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo = g_obj_MYT_InstalacionesLineasContratos_Datos.Obtener_Para_GestionContratos(dtt_Fecha_Inicio, dtt_Fecha_Fin);
                    }
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = mdl_INTERNO_ValorDevuelto_Modelo_VALIDACION;
                    }
                }

                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_Filtradas = Filtrar_Contratos();

                    //Total
                    if (g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_Filtradas != null)
                    {
                        g_int_TotalRegistros_Contratos = g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_Filtradas.Count;

                        foreach (INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo in g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_Filtradas)
                        {
                            //Se Cancelo la tarea asincrona ---------------------------
                            if (g_bol_CancelarTareaAsincrona_Rellenar_DataGrid_Contratos)
                            {
                                return;
                            }

                            //Progreso
                            g_int_TotalRegistrosInsertados_Contratos += 1;


                            //Añadir al DataGridView
                            ((BackgroundWorker)sender).ReportProgress(2, Funciones_Listado.Transformar_Dynamic_A_Row(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, g_obj_ABS_Listado_GestionContratos));

                            //Esperar un poco
                            Thread.Sleep(1);
                        }
                    }
                }                
            }
            catch (ThreadAbortException ex)
            {
                g_bol_CancelarTareaAsincrona_Rellenar_DataGrid_Contratos = true;

                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Contratos_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                g_bol_CancelarTareaAsincrona_Rellenar_DataGrid_Contratos = true;

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_Rellenar_DataGrid_Contratos = true;

                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Contratos_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Contratos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_GestionContratos.IsDisposed)
                {
                    //Añadir Linea al DataGrid de Contratos
                    g_frm_P_GestionContratos.Exferia_DataGridView_Contratos.Rows.Add((object[])e.UserState);

                    //Barra de Progreso
                    g_frm_P_GestionContratos.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Contratos;
                    g_frm_P_GestionContratos.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Contratos;
                }

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Contratos_ProgressChanged));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Contratos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_INTERNO_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_Resultado.Mensaje);
                }
                else
                {
                    g_frm_P_GestionContratos.Ordenar_DataGridView_Contratos();
                    g_frm_P_GestionContratos.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Contratos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
            }
        }

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

            try
            {
                // La fecha Inicio  no puede estar vacia y debe ser correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaInicio.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

                    if (int_fechaAlta_Respuesta == 1)//Vacia
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaInicio.Exferia_FechaSeleccion_Descripcion);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaInicio;
                    }
                    else if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaInicio.Exferia_FechaSeleccion_Descripcion);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaInicio;
                    }
                }

                // La fecha Fin  no puede estar vacia y debe ser correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaFin.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

                    if (int_fechaAlta_Respuesta == 1)//Vacia
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaFin.Exferia_FechaSeleccion_Descripcion);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaFin;
                    }
                    else if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaFin.Exferia_FechaSeleccion_Descripcion);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_GestionContratos.Exferia_FechaSeleccion_FechaFin;
                    }
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(ValidarDatos));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Contratos(INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo _mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_GestionContratos.Exferia_DataGridView_Contratos.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_GestionContratos.Exferia_DataGridView_Contratos);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_Contratos_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_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_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_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_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_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_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_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_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                {
                    string str_Valor = (string)_mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                    long? lng_valor = long.Parse(str_Valor);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo> Filtrar_Contratos()
        {
            //Filtros Avanzados
            if (g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo != null)
            {
                if (g_dct_ListadoFiltros_Contratos != null && g_dct_ListadoFiltros_Contratos.Count > 0)
                {
                    return g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo>(g_dct_ListadoFiltros_Contratos, g_obj_ABS_Listado_GestionContratos)).ToList();
                }
                else
                {
                    return g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.AsQueryable().ToList();
                }
            }
            else
            {
                return null;
            }
        }
        #endregion

        public void Actualizar_Contratos_Seleccionados_Individual(long _lng_id, bool _bol_Valor)
        {
            try
            {
                //Busco registro listado en memoria
                dynamic dnm_Registro = g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo[g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.IndexOf(g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.Where(m => m.GetType().GetProperty(nameof(INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.id)).GetValue(m, null) != null && m.GetType().GetProperty(nameof(INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.id)).GetValue(m, null).Equals(_lng_id)).FirstOrDefault())];

                if (dnm_Registro != null)
                {
                    //Actualizar registro dinamico
                    dnm_Registro.GetType().GetProperty(nameof(INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.Seleccionar)).SetValue(dnm_Registro, _bol_Valor, null);


                    //Modificar listado en memoria
                    g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo[g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.IndexOf(g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.Where(m => m.GetType().GetProperty(nameof(INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.id)).GetValue(m, null) != null && m.GetType().GetProperty(nameof(INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.id)).GetValue(m, null).Equals(_lng_id)).FirstOrDefault())] = dnm_Registro;
                }
            }
            catch (Exception)
            { }
        }

        #region Renovar Contratos
        public void Renovar_Contratos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_GestionContratos.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando_BarraProgreso = new PE_Esperando_BarraProgreso();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_RenovarContratos != null)
                {
                    while (g_obj_TareaAsincrona_RenovarContratos.IsBusy)
                        Application.DoEvents();

                }
                else
                {
                    g_obj_TareaAsincrona_RenovarContratos = new BackgroundWorker();
                    g_obj_TareaAsincrona_RenovarContratos.DoWork += new DoWorkEventHandler(TareaAsincrona_RenovarContratos_DoWork);
                    g_obj_TareaAsincrona_RenovarContratos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_RenovarContratos_ProgressChanged);
                    g_obj_TareaAsincrona_RenovarContratos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_RenovarContratos_Completed);
                    g_obj_TareaAsincrona_RenovarContratos.WorkerReportsProgress = true;
                }

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

                g_frm_PE_Esperando_BarraProgreso.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_GestionContratos.Enabled = true;


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

                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(Renovar_Contratos));
            }
        }

        private void TareaAsincrona_RenovarContratos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;

            try
            {
                //Mensaje de recalculando ............................................................................................................
                ((BackgroundWorker)sender).ReportProgress(3, Mensajes.G_STR_ESPERANDO_GENERANDODATOS());
                //Vaciar el total cargado de lineas
                ((BackgroundWorker)sender).ReportProgress(2, 0);
                //Total de lineas
                ((BackgroundWorker)sender).ReportProgress(1, 0);
                //.....................................................................................................................................

                //Ver si hay algun Contrato Seleccionado
                if (g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo!=null &&
                    g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.Count>0)
                {
                    List<INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo> lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_SELECCIONADOS = g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.Where(m => m.Seleccionar).ToList();
                    if (lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_SELECCIONADOS!=null && 
                        lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_SELECCIONADOS.Count>0)
                    {
                        int int_CodigoContrato = int.Parse(Datos_Generales.Buscar_CodigoSiguiente(nameof(MYT_InstalacionesLineasContratos),
                                                                                            nameof(MYT_InstalacionesLineasContratos.numero),
                                                                                            "",
                                                                                            -1,
                                                                                            true,
                                                                                            50));

                        int int_CodigoPrevision = int.Parse(Datos_Generales.Buscar_CodigoSiguiente(nameof(MYT_Previsiones),
                                                                                            nameof(MYT_Previsiones.codigo),
                                                                                            "",
                                                                                            -1,
                                                                                            true,
                                                                                            10));


                        //Poner Total ............................................................................................................
                        ((BackgroundWorker)sender).ReportProgress(1, lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_SELECCIONADOS.Count);
                        //.....................................................................................................................................

                        int int_Contador_Lineas = 1;
                        long lng_idInstalacionLineaContrato=-1;
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_GRABAR_CONTRATO = null;
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_GRABAR_PREVISION = null;
                        foreach (INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo in lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_SELECCIONADOS)
                        {
                            //Descripcion del contrato ............................................................................................................
                            ((BackgroundWorker)sender).ReportProgress(3, mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.descripcion);
                            //total cargado de lineas
                            ((BackgroundWorker)sender).ReportProgress(2, int_Contador_Lineas);
                            //.....................................................................................................................................

                            //Calcular las fechas
                            DateTime dtt_FechaInicio = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.fechaFin.Value.AddDays(1);
                            DateTime? dtt_FechaFinal = null;
                            //Año
                            if (mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.duracionCalculo.Value.ToString() == Variables.G_MDL_TIPODURACION_ANYOS.Codigo)
                            {
                                dtt_FechaFinal = dtt_FechaInicio.AddYears(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.duracion.Value).AddDays(-1);
                            }
                            //Mes
                            else if (mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.duracionCalculo.Value.ToString() == Variables.G_MDL_TIPODURACION_MESES.Codigo)
                            {
                                dtt_FechaFinal = dtt_FechaInicio.AddMonths(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.duracion.Value).AddDays(-1);
                            }
                            //Dia
                            else if (mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.duracionCalculo.Value.ToString() == Variables.G_MDL_TIPODURACION_DIAS.Codigo)
                            {
                                dtt_FechaFinal = dtt_FechaInicio.AddDays(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.duracion.Value).AddDays(-1);
                            }
                            
                            //rellenar modelo
                            MYT_InstalacionesLineasContratos mdl_MYT_InstalacionesLineasContratos = new MYT_InstalacionesLineasContratos();
                            mdl_MYT_InstalacionesLineasContratos.id = -1;
                            mdl_MYT_InstalacionesLineasContratos.idInstalacionLinea = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.idInstalacionLinea;
                            mdl_MYT_InstalacionesLineasContratos.idTipoContrato = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.idTipoContrato;
                            mdl_MYT_InstalacionesLineasContratos.numero = int_CodigoContrato.ToString();
                            mdl_MYT_InstalacionesLineasContratos.descripcion = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.descripcion;
                            mdl_MYT_InstalacionesLineasContratos.fechaInicio = dtt_FechaInicio;
                            mdl_MYT_InstalacionesLineasContratos.fechaFin = dtt_FechaFinal;
                            mdl_MYT_InstalacionesLineasContratos.observaciones = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.observaciones;
                            mdl_MYT_InstalacionesLineasContratos.duracion = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.duracion;
                            mdl_MYT_InstalacionesLineasContratos.duracionCalculo = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.duracionCalculo;
                            mdl_MYT_InstalacionesLineasContratos.fechaBorrado = null;
                            mdl_MYT_InstalacionesLineasContratos.idInstalacionLineaContrato_Renovado = null;

                            //Iniciar la transacccion
                            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
                            {
                                try
                                {
                                    //Grabar Modelo
                                    mdl_INTERNO_ValorDevuelto_Modelo_GRABAR_CONTRATO = g_obj_MYT_InstalacionesLineasContratos_Datos.Grabar(mdl_MYT_InstalacionesLineasContratos);
                                    if (mdl_INTERNO_ValorDevuelto_Modelo_GRABAR_CONTRATO.TodoCorrecto)
                                    {
                                        lng_idInstalacionLineaContrato = mdl_INTERNO_ValorDevuelto_Modelo_GRABAR_CONTRATO.Id;

                                        #region PREVISIONES
                                        bool bol_TodoCorrecto = true;
                                        //Tiene que tener un PlanMantenimientoCabecera Seleccionado
                                        MYT_PlanMantenimientosCabeceras mdl_MYT_PlanMantenimientosCabeceras = g_obj_MYT_PlanMantenimientosCabeceras_Datos.Obtener_Modelo_Por_Id(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.InstalacionLinea_IdPlanMantenimientoCabecera!=null ? mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.InstalacionLinea_IdPlanMantenimientoCabecera.Value : -1, true);
                                        if (mdl_MYT_PlanMantenimientosCabeceras != null)
                                        {
                                            //El Tipo de Contrato se Asocia al PlanDeMantenimiento
                                            if (mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.TipoContrato_AsociaPlanMantenimiento != null &&
                                                mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.TipoContrato_AsociaPlanMantenimiento.Value)
                                            {
                                                if (mdl_MYT_PlanMantenimientosCabeceras.MYT_PlanMantenimientosLineas != null &&
                                                    mdl_MYT_PlanMantenimientosCabeceras.MYT_PlanMantenimientosLineas.Count > 0)
                                                {
                                                    foreach (MYT_PlanMantenimientosLineas mdl_MYT_PlanMantenimientosLineas in mdl_MYT_PlanMantenimientosCabeceras.MYT_PlanMantenimientosLineas)
                                                    {
                                                        int_CodigoPrevision += 1;

                                                        //Fechacalculada
                                                        DateTime dtt_FechaPrevista = dtt_FechaInicio;
                                                        //Año
                                                        if (mdl_MYT_PlanMantenimientosLineas.periodicidadCalculo.ToString() == Variables.G_MDL_TIPODURACION_ANYOS.Codigo)
                                                        {
                                                            dtt_FechaPrevista = dtt_FechaPrevista.AddYears(mdl_MYT_PlanMantenimientosLineas.periodicidad).AddDays(-1);
                                                        }
                                                        //Mes
                                                        else if (mdl_MYT_PlanMantenimientosLineas.periodicidadCalculo.ToString() == Variables.G_MDL_TIPODURACION_MESES.Codigo)
                                                        {
                                                            dtt_FechaPrevista = dtt_FechaPrevista.AddMonths(mdl_MYT_PlanMantenimientosLineas.periodicidad).AddDays(-1);
                                                        }
                                                        //Dia
                                                        else if (mdl_MYT_PlanMantenimientosLineas.periodicidadCalculo.ToString() == Variables.G_MDL_TIPODURACION_DIAS.Codigo)
                                                        {
                                                            dtt_FechaPrevista = dtt_FechaPrevista.AddDays(mdl_MYT_PlanMantenimientosLineas.periodicidad).AddDays(-1);
                                                        }

                                                        //Revisar FechaFin Contrato
                                                        if (dtt_FechaFinal != null && dtt_FechaFinal.Value >= dtt_FechaPrevista)
                                                        {
                                                            MYT_Previsiones mdl_MYT_Previsiones = new MYT_Previsiones();
                                                            mdl_MYT_Previsiones.id = -1;
                                                            mdl_MYT_Previsiones.codigo = int_CodigoPrevision.ToString();
                                                            mdl_MYT_Previsiones.descripcion = mdl_MYT_PlanMantenimientosLineas.descripcion;
                                                            mdl_MYT_Previsiones.idPlanMantenimientoLinea = mdl_MYT_PlanMantenimientosLineas.id;
                                                            mdl_MYT_Previsiones.idPrioridad = mdl_MYT_PlanMantenimientosLineas.idPrioridad.Value;
                                                            mdl_MYT_Previsiones.idParteTipo = mdl_MYT_PlanMantenimientosLineas.idParteTipo.Value;
                                                            mdl_MYT_Previsiones.idInstalacionLineaContrato = lng_idInstalacionLineaContrato;
                                                            mdl_MYT_Previsiones.idTecnico = null;
                                                            mdl_MYT_Previsiones.fechaPrevision = dtt_FechaPrevista;
                                                            mdl_MYT_Previsiones.fechaBorrado = null;

                                                            mdl_INTERNO_ValorDevuelto_Modelo_GRABAR_PREVISION = g_obj_MYT_Previsiones_Datos.Grabar(mdl_MYT_Previsiones);
                                                            if (!mdl_INTERNO_ValorDevuelto_Modelo_GRABAR_PREVISION.TodoCorrecto)
                                                            {
                                                                bol_TodoCorrecto = false;
                                                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje += Mensajes.G_STR_GESTIONCONTRATOS_ERROR_CREARPREVISION(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.numero, mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.Cliente_RazonSocial) + System.Environment.NewLine;
                                                            }
                                                        }

                                                    }
                                                }
                                            }
                                        }

                                        #endregion

                                        #region ACTUALIZAR CONTRATO SELECCIONADO
                                        if (bol_TodoCorrecto)
                                        {
                                            //Actualizo el Contrato Seleccionado
                                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZAR_CONTRATO = g_obj_MYT_InstalacionesLineasContratos_Datos.Actualizar_ContratoRenovado(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.id, lng_idInstalacionLineaContrato);
                                            if (mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZAR_CONTRATO.TodoCorrecto)
                                            {
                                                //Termino Transaccion
                                                transaccion_SQL.Complete();
                                            }
                                            else
                                            {
                                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje += Mensajes.G_STR_GESTIONCONTRATOS_ERROR_CREARRENOVACION(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.numero, mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.Cliente_RazonSocial) + System.Environment.NewLine;
                                            }
                                        }
                                        #endregion
                                    }
                                    else
                                    {
                                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje += Mensajes.G_STR_GESTIONCONTRATOS_ERROR_CREARRENOVACION(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.numero, mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.Cliente_RazonSocial) + System.Environment.NewLine;
                                    }

                                    transaccion_SQL.Dispose();
                                }
                                catch (Control_Errores)
                                {
                                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                                    transaccion_SQL.Dispose();
                                }
                                catch (Exception ex)
                                {
                                    Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(TareaAsincrona_RenovarContratos_DoWork));
                                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                                    transaccion_SQL.Dispose();
                                }
                            }

                            int_CodigoContrato += 1;
                            int_Contador_Lineas += 1;
                        }
                    }
                    //No hay registros seleccionados
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_VALIDACIONES_NOHAYREGISTROSSELECCIONADOS("Contrato");
                    }
                }
                //No hay ninugn registro
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_VALIDACIONES_NOHAYREGISTROSSELECCIONADOS("Contrato");
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(TareaAsincrona_RenovarContratos_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(TareaAsincrona_RenovarContratos_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_RenovarContratos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_GestionContratos.IsDisposed)
                {
                    if (e.ProgressPercentage.ToString().Equals("1"))
                    {
                        g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Total = int.Parse(e.UserState.ToString());
                    }
                    else if (e.ProgressPercentage.ToString().Equals("2"))
                    {
                        g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Actualizar = int.Parse(e.UserState.ToString());
                    }
                    else if (e.ProgressPercentage.ToString().Equals("3"))
                    {
                        g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Mensaje = e.UserState.ToString();
                    }
                }

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(TareaAsincrona_RenovarContratos_ProgressChanged));
            }
        }
        private void TareaAsincrona_RenovarContratos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando_BarraProgreso != null)
            {
                g_frm_PE_Esperando_BarraProgreso.Close();
                g_frm_PE_Esperando_BarraProgreso = null;
            }

            //Desbloquear el formulario
            g_frm_P_GestionContratos.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_INTERNO_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_Resultado.Mensaje);                   
                }

                Rellenar_DataGrid_Contratos(true);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(TareaAsincrona_RenovarContratos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        #endregion

        #region Exportar a Excel
        public void Exportar_Excel()
        {
            try
            {
                List<INTERNO_ExportarExcel_Hoja_Modelo> lst_INTERNO_ExportarExcel_Hoja_Modelo = new List<INTERNO_ExportarExcel_Hoja_Modelo>();

                INTERNO_ExportarExcel_Hoja_Modelo mdl_INTERNO_ExportarExcel_Hoja_Modelo = new INTERNO_ExportarExcel_Hoja_Modelo();
                //Hoja
                mdl_INTERNO_ExportarExcel_Hoja_Modelo.Hoja_Descripcion = "Contratos";


                //Crear las Cabeceras ...................................................................................................................................
                List<INTERNO_ExportarExcel_Cabecera_Modelo> lst_INTERNO_ExportarExcel_Cabecera_Modelo = new List<INTERNO_ExportarExcel_Cabecera_Modelo>();

                List<DataGridViewColumn> lst_ColumnasVisibles = g_frm_P_GestionContratos.Exferia_DataGridView_Contratos.Columns
                                                              .Cast<DataGridViewColumn>()
                                                              .Where(r => r.Visible)
                                                              .OrderBy(r => r.DisplayIndex)
                                                              .ToList();

                foreach (DataGridViewColumn dgvc_Columna in lst_ColumnasVisibles)
                {
                    lst_INTERNO_ExportarExcel_Cabecera_Modelo.Add(new INTERNO_ExportarExcel_Cabecera_Modelo(dgvc_Columna.HeaderText,
                                                                                                            Colores.G_COLOR_PRINCIPAL_BASE,
                                                                                                            Colores.G_COLOR_LISTADO_CABECERA_LETRA));
                }
                //Añadir Listado de Cabecera
                mdl_INTERNO_ExportarExcel_Hoja_Modelo.Cabecera = lst_INTERNO_ExportarExcel_Cabecera_Modelo;

                //Filas
                List<INTERNO_ExportarExcel_Filas_Modelo> lst_INTERNO_ExportarExcel_Filas_Modelo = new List<INTERNO_ExportarExcel_Filas_Modelo>();

                if (g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_Filtradas != null)
                {
                    //Recorrer las Filas
                    foreach (dynamic mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo in g_lst_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo_Filtradas)
                    {
                        //Celdas .........................................
                        List<INTERNO_ExportarExcel_Celdas_Modelo> lst_INTERNO_ExportarExcel_Celdas_Modelo = new List<INTERNO_ExportarExcel_Celdas_Modelo>();
                        foreach (DataGridViewColumn dgvc_Columna in lst_ColumnasVisibles)
                        {
                            string str_NombreColumna = dgvc_Columna.Name;

                            //Buscar el modelo para poder saber que tipo de columna es
                            INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_GestionContratos.LISTADO_COLUMNAS()[str_NombreColumna];

                            if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                            {
                                //Tipo fecha
                                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                                {
                                    DateTime? dtt_Valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(dtt_Valor, G_ENUM_TIPOSDATOS.DATETIME, Color.White, Color.Black));
                                }
                                //Tipo Hora Simple
                                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                                {
                                    TimeSpan? tms_Valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(tms_Valor, G_ENUM_TIPOSDATOS.HORASIMPLE, Color.White, Color.Black));
                                }
                                //Tipo Hora Completa
                                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.HORACOMPLETA))
                                {
                                    TimeSpan? tms_Valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(tms_Valor, G_ENUM_TIPOSDATOS.HORACOMPLETA, Color.White, Color.Black));
                                }
                                //Tipo booleano
                                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                                {
                                    bool? bol_Valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(bol_Valor, G_ENUM_TIPOSDATOS.BOOLEAN, Color.White, Color.Black));
                                }
                                //Tipo decimal
                                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                                {
                                    decimal? dcm_valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(dcm_valor, G_ENUM_TIPOSDATOS.DECIMAL, Color.White, Color.Black));
                                }
                                //Tipo int
                                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                                {
                                    int? int_valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(int_valor, G_ENUM_TIPOSDATOS.INT, Color.White, Color.Black));
                                }
                                //Tipo long
                                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                                {
                                    long? lng_valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(lng_valor, G_ENUM_TIPOSDATOS.LONG, Color.White, Color.Black));
                                }
                                //Tipo long_Text
                                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                                {
                                    long? lng_valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna + "_Long").GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);
                                    string str_Valor = lng_valor != null ? lng_valor.ToString() : "";

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(str_Valor, G_ENUM_TIPOSDATOS.TEXT, Color.White, Color.Black));
                                }
                                //Tipo Seleccionar
                                else if(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.SELECCIONAR))
                                {
                                    bool? bol_Valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(bol_Valor, G_ENUM_TIPOSDATOS.BOOLEAN, Color.White, Color.Black));
                                }
                                //Tipo texto
                                else
                                {
                                    string str_Valor = mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_InstalacionesLineasContratos_GestionContratos_Listado_Modelo, null);

                                    lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(str_Valor, G_ENUM_TIPOSDATOS.TEXT, Color.White, Color.Black));
                                }
                            }
                            else
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo("", G_ENUM_TIPOSDATOS.TEXT, Color.White, Color.Black));
                            }
                        }

                        INTERNO_ExportarExcel_Filas_Modelo mdl_INTERNO_ExportarExcel_Filas_Modelo = new INTERNO_ExportarExcel_Filas_Modelo();
                        mdl_INTERNO_ExportarExcel_Filas_Modelo.Celdas = lst_INTERNO_ExportarExcel_Celdas_Modelo;
                        //....................................................

                        //Añadir la Fila
                        lst_INTERNO_ExportarExcel_Filas_Modelo.Add(mdl_INTERNO_ExportarExcel_Filas_Modelo);

                    }
                }
                mdl_INTERNO_ExportarExcel_Hoja_Modelo.Filas = lst_INTERNO_ExportarExcel_Filas_Modelo;

                //Añadir al Listado la Hoja
                lst_INTERNO_ExportarExcel_Hoja_Modelo.Add(mdl_INTERNO_ExportarExcel_Hoja_Modelo);

                //Si tiene algo lo genero en Excel sino no
                if (lst_INTERNO_ExportarExcel_Hoja_Modelo != null && lst_INTERNO_ExportarExcel_Hoja_Modelo.Count > 0)
                {
                    //Ver si tiene una Ruta por Defecto ................................................................................................................
                    string str_RutaCompleta = "";

                    string str_NombreFichero =  "Contratos_" + DateTime.Now.ToString("yyyyMMdd");
                    string str_Ruta = @"C:";

                    //Ver si tiene una Ruta por Defecto ................................................................................................................
                    List<INTERNO_CodigoDescripcion_Modelo> lst_INTERNO_CodigoDescripcion_Modelo = new List<INTERNO_CodigoDescripcion_Modelo>();
                    str_RutaCompleta = Funciones.Transformar_Ruta(str_Ruta, str_NombreFichero, ".xlsx", lst_INTERNO_CodigoDescripcion_Modelo);
                    //...................................................................................................................................................

                    Funciones_FicherosExcel.Generar_DocumentoListado_Excel(lst_INTERNO_ExportarExcel_Hoja_Modelo, str_RutaCompleta);
                }
                else
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_EXPORTAREXCEL());
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_GestionContratos_Controladora) + "/" + nameof(Exportar_Excel));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_EXPORTAREXCEL());
            }
        }
        #endregion
    }
}
