using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Generales;
using Exferia_Aplicacion.Sincronizacion;
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 Exferia_Mythos.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Reflection;
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_InstalacionLinea_Controladora
    {
        #region Variables Generales
        private P_InstalacionLinea g_frm_P_InstalacionLinea = 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, guardar, etc.

        //Clases de negocio necesarias para la carga de datos
        private MYT_InstalacionesLineas_Datos g_obj_MYT_InstalacionesLineas_Datos = new MYT_InstalacionesLineas_Datos();
        private MYT_InstalacionesLineasInfraestructuras_Datos g_obj_MYT_InstalacionesLineasInfraestructuras_Datos = new MYT_InstalacionesLineasInfraestructuras_Datos();
        private MYT_Infraestructuras_Datos g_obj_MYT_Infraestructuras_Datos = new MYT_Infraestructuras_Datos();
        private MYT_Inspecciones_Datos g_obj_MYT_Inspecciones_Datos = new MYT_Inspecciones_Datos();
        private MYT_InstalacionesLineasContratos_Datos g_obj_MYT_InstalacionesLineasContratos_Datos = new MYT_InstalacionesLineasContratos_Datos();
        private MYT_Partes_Datos g_obj_MYT_Partes_Datos = new MYT_Partes_Datos();
        private MYT_Previsiones_Datos g_obj_MYT_Previsiones_Datos = new MYT_Previsiones_Datos();
        private MYT_PlanMantenimientosCabeceras_Datos g_obj_MYT_PlanMantenimientosCabeceras_Datos = new MYT_PlanMantenimientosCabeceras_Datos();

        //Modelos
        private INTERNO_MYT_InstalacionesCabecera_Modelo g_mdl_INTERNO_MYT_InstalacionesCabecera_Modelo = null;
        public INTERNO_MYT_InstalacionesLineas_Modelo g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo = null;
        public MYT_Infraestructuras g_mdl_MYT_Infraestructuras = null;
        public List<MYT_InstalacionesLineasInfraestructuras> g_lst_MYT_InstalacionesLineasInfraestructuras = null;

        public bool g_bol_Termino_CargaDatosInicial = false; //Se utiliza para saber cuando se termina la carga de datos estaticos iniciales
        public bool g_bol_ModificacionDatosAfectaLineas = true; //Se utiliza para saber si se modificaron datos que afectan las lineas.

        //Tarea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;

        //Tarea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        private bool g_bol_GrabarDatos_TerminoCorrectamente = true;
        private bool g_bol_GrabarDatos_VaciarDatos = true;

        //Tarea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;

        #region Inspecciones 
        //Tarea Asincrona para la Rellenar DataGridView de Inspecciones
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Inspecciones;

        //Listado de InspeccionesRealacionadas
        public List<INTERNO_MYT_Inspecciones_Listado_Modelo> g_lst_INTERNO_MYT_Inspecciones_Listado_Modelo = null;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Inspecciones_Columnas;

        //Para el filtrado del listado de MYT_Inspecciones
        public List<string> g_lst_ColumnasAMostrar_MYT_Inspecciones = new List<string>();
        public ABS_Listado_MYT_Inspecciones_P_InstalacionLinea g_obj_ABS_Listado_MYT_Inspecciones_P_InstalacionLinea = new ABS_Listado_MYT_Inspecciones_P_InstalacionLinea();
        public Dictionary<string, object> g_dct_ListadoFiltros_MYT_Inspecciones = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Inspecciones = 0;
        private int g_int_TotalRegistros_Inspecciones = 0;
        #endregion

        #region InstalacionContratos
        //Tarea Asincrona para la Rellenar DataGridView de InstalacionLineaContrato
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato;

        //Tarea Asincrona para Borrar InstalacionContrato en base de datos
        private BackgroundWorker g_TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos;

        //Listado de InstalacionContratos
        public List<INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo> g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo = null;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_InstalacionLineasContratos_Columnas;

        //Para el filtrado del listado de MYT_InstalacionesLineasContratos
        public List<string> g_lst_ColumnasAMostrar_MYT_InstalacionesLineasContratos = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_MYT_InstalacionesLineasContratos = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_MYT_InstalacionesLineasContratos = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_InstalacionLineaContrato = 0;
        private int g_int_TotalRegistros_InstalacionLineaContrato = 0;

        #endregion

        #region Partes
        //Listado de Partes
        public List<INTERNO_MYT_Partes_Listado_Modelo> g_lst_INTERNO_MYT_Partes_Listado_Modelo = null;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Partes_Columnas = null;

        //Filtrado del listado de Partes
        public List<string> g_lst_ColumnasAMostrar_MYT_Partes = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_MYT_Partes_P_InstalacionLinea = null;
        public string g_str_Opcion_Partes = Variables.G_STR_OPCION_MYT_PARTES;
        public Dictionary<string, object> g_dct_ListadoFiltros_MYT_Partes = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Partes = 0;
        private int g_int_TotalRegistros_Partes = 0;

        //Tareea Asincrona de borrar de datos Partes
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_Partes = null;

        //Tarea Asincrona para la Rellenar DataGridView de Partes
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Partes = null;
        #endregion

        public bool g_bol_CampoCodigo_Numerico = false;
        #endregion

        #region Constructor
        public P_InstalacionLinea_Controladora(P_InstalacionLinea _frm_P_InstalacionLinea, INTERNO_MYT_InstalacionesCabecera_Modelo _mdl_INTERNO_MYT_InstalacionesCabecera_Modelo)
        {
            g_frm_P_InstalacionLinea = _frm_P_InstalacionLinea;

            g_mdl_INTERNO_MYT_InstalacionesCabecera_Modelo = _mdl_INTERNO_MYT_InstalacionesCabecera_Modelo;
            g_obj_ABS_Listado_MYT_InstalacionesLineasContratos = new ABS_Listado_MYT_InstalacionesLineasContratos();
            g_obj_ABS_Listado_MYT_Partes_P_InstalacionLinea = new ABS_Listado_MYT_Partes_P_InstalacionLinea();

            g_bol_Termino_CargaDatosInicial = true;
        }
        #endregion

        #region Vaciar Datos
        private void VaciarDatos()
        {

            //Codigo
            g_frm_P_InstalacionLinea.Exferia_TextBox_Codigo.Text = "";

            //Descripcion
            g_frm_P_InstalacionLinea.Exferia_TextBox_Descripcion.Text = "";

            //InstalacionEstado
            g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Id = -1;
            g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Codigo = "";
            g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Descripcion = "";
            g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_FechaBorrado = null;

            //InstalacionUso
            g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Id = -1;
            g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Codigo = "";
            g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Descripcion = "";
            g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_FechaBorrado = null;

            //PlanMantenimiento
            g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Id = -1;
            g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Codigo = "";
            g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Descripcion = "";
            g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_FechaBorrado = null;

            //FechaInstalacion
            g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaInstalacion.Exferia_FechaSeleccion_Fecha = "";

            //FechaGarantia
            g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaGarantia.Exferia_FechaSeleccion_Fecha = "";

            //Observaciones
            g_frm_P_InstalacionLinea.Exferia_TextBox_Observaciones.Text = "";

            //Ubicacion
            g_frm_P_InstalacionLinea.Exferia_TextBox_Ubicacion.Text = "";

            //Infraestructuras
            g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Id = -1;
            g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Codigo = "";
            g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Descripcion = "";
            g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_FechaBorrado = null;

            g_mdl_MYT_Infraestructuras = null;
            g_lst_MYT_InstalacionesLineasInfraestructuras = null;
            g_frm_P_InstalacionLinea.Exferia_TabControl_Infraestructura.TabPages.Clear();

            //Inspecciones ................................................................................................................................................
            g_lst_INTERNO_MYT_Inspecciones_Listado_Modelo = new List<INTERNO_MYT_Inspecciones_Listado_Modelo>();
            g_frm_P_InstalacionLinea.Exferia_DataGridView_Inspecciones.Rows.Clear();
            g_int_TotalRegistrosInsertados_Inspecciones = 0;
            g_int_TotalRegistros_Inspecciones = 0;
            g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Inspecciones_BarraProgreso.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Inspecciones;
            g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Inspecciones_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Inspecciones;

            //InstalacionContratos ................................................................................................................................................
            g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo = new List<INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo>();
            g_frm_P_InstalacionLinea.Exferia_DataGridView_Contratos.Rows.Clear();
            g_int_TotalRegistrosInsertados_InstalacionLineaContrato = 0;
            g_int_TotalRegistros_InstalacionLineaContrato = 0;
            g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InstalacionLineaContrato;
            g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InstalacionLineaContrato;

            //Partes ................................................................................................................................................
            g_lst_INTERNO_MYT_Partes_Listado_Modelo = new List<INTERNO_MYT_Partes_Listado_Modelo>();
            g_frm_P_InstalacionLinea.Exferia_DataGridView_Partes.Rows.Clear();
            g_int_TotalRegistrosInsertados_Partes = 0;
            g_int_TotalRegistros_Partes = 0;
            g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Partes.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Partes;
            g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Partes.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Partes;

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo:
            if (g_frm_P_InstalacionLinea.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_InstalacionLinea.P_Base_TituloPantalla = (g_frm_P_InstalacionLinea.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_InstalacionLinea.Tag.ToString());
            //#######################################################################################################

            g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo= null;
        }

        #endregion

        #region Buscar Codigo Siguiente
        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(MYT_InstalacionesLineas),
                                                                                    nameof(MYT_InstalacionesLineas.codigo),
                                                                                    "",
                                                                                    -1,
                                                                                    nameof(MYT_InstalacionesLineas.idInstalacionCabecera),
                                                                                    g_mdl_INTERNO_MYT_InstalacionesCabecera_Modelo.id,
                                                                                    true,
                                                                                    g_frm_P_InstalacionLinea.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);
                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    //Codigo
                    g_frm_P_InstalacionLinea.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_InstalacionLinea.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(P_InstalacionLinea_Controladora) + "/" + 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;
        }
        #endregion

        #region Comprobar Cambios
        public bool ComprobarCambios()
        {
            if (g_frm_P_InstalacionLinea.P_Base_SeModificoDatosPantalla)
            {
                GrabarDatos(false);
                //Te quedas esperando a que termine la tarea asincrona de grabar
                while (g_obj_TareaAsincrona_GrabarDatos.IsBusy)
                {
                    Application.DoEvents();
                }
                return g_bol_GrabarDatos_TerminoCorrectamente;
            }
            return true;
        }
        #endregion

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que se termine
                g_frm_P_InstalacionLinea.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)
                {
                    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 = false;
                }
                //Vaciar
                VaciarDatos();

                //Tarea Asincrona cargar datos###############################################################
                g_obj_TareaAsincrona_CargarDatos.RunWorkerAsync();
                //###########################################################################################

                g_frm_PE_Esperando.ShowDialog();
            }
            catch(Exception ex)
            {
                g_frm_P_InstalacionLinea.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_InstalacionLinea_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_InstalacionLinea.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch(ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_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_InstalacionLinea_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
            {}
            catch(Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_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_InstalacionLinea.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);
                        g_frm_P_InstalacionLinea.Salir_P_Base();
                    }
                }
                else
                {
                    if (g_mdl_MYT_Infraestructuras != null)
                    {
                        Infraestructura_Crear_Tabs(g_mdl_MYT_Infraestructuras.id);
                    }
                }

                g_frm_P_InstalacionLinea.P_Base_SeModificoDatosPantalla = false;

                Rellenar_DataGrid_Inspecciones(g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.id, true);
                Rellenar_DataGrid_InstalacionLineaContrato();
                Rellenar_DataGrid_Partes();
            }
            catch(Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_InstalacionLinea.Salir_P_Base();
            }
            finally
            {
                //g_frm_P_InstalacionLinea.Exferia_TextBox_Codigo.Exferia_TextBox_Foco();
            }
        }

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

            try
            {
                g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo = g_obj_MYT_InstalacionesLineas_Datos.Obtener(_lng_id);

                //Si no es Nulo Cargo los Datos
                if (g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo != null)
                {
                    //Paginador ................................................................................
                    if (g_frm_P_InstalacionLinea.P_Base_PantallaOrigen != null &&
                        g_frm_P_InstalacionLinea.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                        g_frm_P_InstalacionLinea.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.id;
                        int int_PaginaDelObjeto = g_frm_P_InstalacionLinea.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_InstalacionLinea.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

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

                    //codigo
                    g_frm_P_InstalacionLinea.Exferia_TextBox_Codigo.Text = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.codigo;

                    //descripcion
                    g_frm_P_InstalacionLinea.Exferia_TextBox_Descripcion.Text = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.descripcion;

                    //InstalacionEstado
                    g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Id = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesEstados.id;
                    g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Codigo = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesEstados.codigo;
                    g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Descripcion = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesEstados.descripcion;
                    g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_FechaBorrado = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesEstados.fechaBorrado;

                    //Uso
                    if (g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesUsos != null)
                    {
                        g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Id = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesUsos.id;
                        g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Codigo = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesUsos.codigo;
                        g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Descripcion = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesUsos.descripcion;
                        g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_FechaBorrado = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesUsos.fechaBorrado;
                    }

                    //PlanMantenimientosCabeceras
                    if (g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_PlanMantenimientosCabeceras != null)
                    {
                        g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Id = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_PlanMantenimientosCabeceras.id;
                        g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Codigo = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_PlanMantenimientosCabeceras.codigo;
                        g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Descripcion = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_PlanMantenimientosCabeceras.descripcion;
                        g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_FechaBorrado = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_PlanMantenimientosCabeceras.fechaBorrado;
                    }

                    //FechaInstalacion 
                    g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaInstalacion.Exferia_FechaSeleccion_Fecha = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.fechaInstalacion.ToString("dd/MM/yyyy");

                    //FechaGarantia 
                    g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaGarantia.Exferia_FechaSeleccion_Fecha = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.fechaGarantia != null ? g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.fechaGarantia.Value.ToString("dd/MM/yyyy") : "";

                    //ubicacion
                    g_frm_P_InstalacionLinea.Exferia_TextBox_Ubicacion.Text = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.ubicacion;

                    //observaciones
                    g_frm_P_InstalacionLinea.Exferia_TextBox_Observaciones.Text = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.observaciones;

                    //Infraestructuras
                    if (g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesLineasInfraestructuras != null &&
                        g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesLineasInfraestructuras.Count>0)
                    {
                        g_lst_MYT_InstalacionesLineasInfraestructuras = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesLineasInfraestructuras.ToList();
                        g_mdl_MYT_Infraestructuras = g_obj_MYT_Infraestructuras_Datos.Obtener_Modelo_Por_Id(g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesLineasInfraestructuras.FirstOrDefault().idInfraestructura, true);

                        g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Id = g_mdl_MYT_Infraestructuras.id;
                        g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Codigo = g_mdl_MYT_Infraestructuras.codigo;
                        g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Descripcion = g_mdl_MYT_Infraestructuras.descripcion;
                        g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_FechaBorrado = g_mdl_MYT_Infraestructuras.fechaBorrado;
                    }

                    //Cargar Listado InstalacionContratos ...........................................................
                    if (g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.Contratos != null)
                    {
                        g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.Contratos;
                    }

                    //Cargar Listado Partes ...........................................................
                    if (g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.Partes != null)
                    {
                        g_lst_INTERNO_MYT_Partes_Listado_Modelo = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.Partes;
                    }

                    // Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior_Codigo = "";
                    if (g_frm_P_InstalacionLinea.g_mdl_PRV_OpcionesDetalle != null &&
                        g_frm_P_InstalacionLinea.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                        g_frm_P_InstalacionLinea.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de Campos
                        string[] arr_Campos = g_frm_P_InstalacionLinea.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_InstalacionLinea.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_InstalacionLinea.P_Base_TituloPantalla = (g_frm_P_InstalacionLinea.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

                        dynamic dnm_Objeto = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo;
                        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;
                            }

                        }

                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_InstalacionLinea.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_InstalacionLinea.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

                    g_frm_P_InstalacionLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(CargarDatos));
            }
            return bol_ValorDevuelto;
        }
        #endregion

        #region InstalacionLineaContrato

        #region Rellenar DataGrid InstalacionLineaContrato
        public void Rellenar_DataGrid_InstalacionLineaContrato()
        {
            try
            {
                if (g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato != null)
                {
                    g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato.CancelAsync();
                    while (g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato_DoWork);
                    g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato_ProgressChanged);
                    g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato_Completed);
                    g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_InstalacionLinea.Exferia_DataGridView_Contratos.Rows.Clear();
                g_int_TotalRegistrosInsertados_InstalacionLineaContrato = 0;
                g_int_TotalRegistros_InstalacionLineaContrato = 0;
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InstalacionLineaContrato;
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InstalacionLineaContrato;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Rellenar_DataGrid_InstalacionLineaContrato));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo> lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_Filtradas = Filtrar_InstalacionLineasContrato();

                //Total
                if (lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_Filtradas != null)
                {
                    g_int_TotalRegistros_InstalacionLineaContrato = lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_Filtradas.Count;

                    //Recorrer 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_InstalacionLineasContratos_Columnas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_Filtradas.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_MYT_InstalacionesLineasContratos.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

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

                        //Progreso
                        g_int_TotalRegistrosInsertados_InstalacionLineaContrato += 1;


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

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Contrato al DataGrid de InstalacionContrato
                g_frm_P_InstalacionLinea.Exferia_DataGridView_Contratos.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InstalacionLineaContrato;
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InstalacionLineaContrato;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_InstalacionLineaContrato_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_InstalacionLinea.Ordenar_DataGridView_InstalacionContrato();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_InstalacionLineaContrato(INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo _mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {

                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_InstalacionLinea.Exferia_DataGridView_Contratos.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_InstalacionLinea.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_ColumnasDatos_Modelo_InstalacionLineasContratos_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_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_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_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_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_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_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_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_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_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_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_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_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_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo> Filtrar_InstalacionLineasContrato()
        {
            //Filtros Avanzados
            if (g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo != null)
            {
                if (g_dct_ListadoFiltros_MYT_InstalacionesLineasContratos != null && g_dct_ListadoFiltros_MYT_InstalacionesLineasContratos.Count > 0)
                {
                    return g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo>(g_dct_ListadoFiltros_MYT_InstalacionesLineasContratos, g_obj_ABS_Listado_MYT_InstalacionesLineasContratos)).ToList();
                }
                else
                {
                    return g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.AsQueryable().ToList();
                }
            }
            else
            {
                return null;
            }
        }
        #endregion

        public void Actualizar_Registro_InstalacionLineaContrato(long _lng_idInstalacionCabeceraContrato, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo = g_obj_MYT_InstalacionesLineasContratos_Datos.Obtener_Registro_Para_Listado_Por_Id(_lng_idInstalacionCabeceraContrato);

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

                        g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.Add(mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo);
                    }

                    //Poner los campos tipo Texto y long
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_InstalacionLineasContratos_Columnas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = g_lst_INTERNO_MYT_InstalacionesLineasContratos_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_MYT_InstalacionesLineasContratos.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

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

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_InstalacionLineaContrato(mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo, row);
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_InstalacionLinea.Exferia_DataGridView_Contratos.Rows.Add(Transformar_Modelo_A_Row_InstalacionLineaContrato(mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo, null));

                        //Sumar Cantidad de Contratos Insertadas
                        g_int_TotalRegistros_InstalacionLineaContrato += 1;
                        g_int_TotalRegistrosInsertados_InstalacionLineaContrato += 1;

                        g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InstalacionLineaContrato;
                        g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InstalacionLineaContrato;
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Actualizar_Registro_InstalacionLineaContrato));
            }

        }
        public void Borrar_Registro_InstalacionLineaContrato(List<long> _lst_idInstalacionCabeceraContrato)
        {
            try
            {
                //Borrar primero el List<> General 
                if (g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo != null && g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo> lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.Where(m => _lst_idInstalacionCabeceraContrato.Contains(m.id)).ToList();
                    if (lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo in lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.Remove(mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo);
                        }



                        //Borrar del DataGridView
                        List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_InstalacionLinea.Exferia_DataGridView_Contratos.Rows
                                        .Cast<DataGridViewRow>()
                                        .Where(r => _lst_idInstalacionCabeceraContrato.Contains(long.Parse(r.Cells[nameof(INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.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_InstalacionLinea.Exferia_DataGridView_Contratos.Rows.Remove(dgvr_Borrar);
                            }
                        }

                        //Restar Cantidad de Contratos Borradas
                        g_int_TotalRegistros_InstalacionLineaContrato -= lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_BUSQUEDA.Count();
                        g_int_TotalRegistrosInsertados_InstalacionLineaContrato = g_int_TotalRegistrosInsertados_InstalacionLineaContrato - lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo_BUSQUEDA.Count();

                        g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InstalacionLineaContrato;
                        g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InstalacionLineaContrato;
                    }
                }

                g_frm_P_InstalacionLinea.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Borrar_Registro_InstalacionLineaContrato));
            }
        }

        #region Borrar Datos en Base Datos InstalacionLineaContrato
        public void Borrar_Registro_InstalacionLineaContrato_EnBaseDatos(List<long> _lst_idInstalacionCabeceraContrato_ABorrar)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_InstalacionLinea.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_idInstalacionCabeceraContrato_ABorrar);

                    g_TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos = new BackgroundWorker();
                    g_TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_DoWork);
                    g_TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_Completed);
                    g_TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos.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_InstalacionLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Borrar_Registro_InstalacionLineaContrato_EnBaseDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }

        private void TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_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
                {
                    List<long> lst_idInstalacionContrato_BORRADAS = new List<long>();

                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idInstalacionContrato_ABorrar = (List<long>)lst_Argumentos[0];

                    // ## 1º BORRAR LAS Contrato #################################################################################################
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        if (lst_idInstalacionContrato_ABorrar != null)
                        {
                            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_BORRAR = Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_Final(lst_idInstalacionContrato_ABorrar);
                            if (mdl_ValorDevuelto_Modelo_BORRAR.TodoCorrecto == false)
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                            }
                            else
                            {
                                lst_idInstalacionContrato_BORRADAS.AddRange(lst_idInstalacionContrato_ABorrar);
                            }
                        }
                    }


                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idInstalacionContrato_BORRADAS;
                        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_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_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_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_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_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_InstalacionLinea.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
                    List<object> lst_obj = new List<object>();
                    //Opcion
                    lst_obj.Add(Variables.G_STR_OPCION_MYT_INSTALACIONESLINEASCONTRATOS);

                    //Listado Contrato
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_InstalacionLinea.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_ELIMINAR);

                    g_frm_P_InstalacionLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_Final(List<long> _lst_idInstalacionContrato_ABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_MYT_InstalacionesLineasContratos_Datos.Borrar(_lst_idInstalacionContrato_ABorrar);
            }
            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_InstalacionLinea_Controladora) + "/" + nameof(Borrar_Registro_InstalacionLineaContrato_EnBaseDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_GrabarDatos_VaciarDatos)
        {
            try
            {
                g_bol_GrabarDatos_VaciarDatos = _bol_GrabarDatos_VaciarDatos;

                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_InstalacionLinea.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_InstalacionLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_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_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Validar Primero
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo = GrabarDatos_Final();
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch(ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_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_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_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_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_InstalacionLinea.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 tuvo el problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_InstalacionLinea, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    #region SINCRONIZACION
                    INTERNO_Sincronizacion_ActualizarRegistro_Modelo mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo = new INTERNO_Sincronizacion_ActualizarRegistro_Modelo();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.tabla = nameof(MYT_InstalacionesLineas);
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.idClavePrimaria = mdl_ValorDevuelto_Modelo_Resultado.Id;

                    Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_RESTOTABLAS(mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo);
                    #endregion

                    // Devolver al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_InstalacionLinea.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Objeto);

                    g_frm_P_InstalacionLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_NADA);

                    if (g_bol_GrabarDatos_VaciarDatos)
                    {
                        VaciarDatos();
                    }

                    g_frm_P_InstalacionLinea.P_Base_SeModificoDatosPantalla = false;

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

        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_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
                //Codigo
                if (g_frm_P_InstalacionLinea.Exferia_TextBox_Codigo.Text.Trim().Length == 0)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_AUX = Buscar_CodigoSiguiente();

                    if (mdl_INTERNO_ValorDevuelto_Modelo_AUX.TodoCorrecto == false)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo_AUX.Mensaje;
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_TextBox_Codigo;
                    }
                }

                // El codigo no puede estar Repetido
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    //Codigo
                    string str_Codigo = g_frm_P_InstalacionLinea.Exferia_TextBox_Codigo.Text.Trim();
                    if (g_bol_CampoCodigo_Numerico)
                    {
                        int int_Codigo = int.Parse(str_Codigo);
                        str_Codigo = int_Codigo.ToString();
                    }

                    if (Datos_Generales.Buscar_CodigoRepetido(nameof(MYT_InstalacionesLineas), 
                                                            nameof(MYT_InstalacionesLineas.codigo), 
                                                            str_Codigo, 
                                                            nameof(MYT_InstalacionesLineas.id), 
                                                            (g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo != null ? g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.id : 0), 
                                                            "",
                                                            -1,
                                                            nameof(MYT_InstalacionesLineas.idInstalacionCabecera),
                                                            g_mdl_INTERNO_MYT_InstalacionesCabecera_Modelo.id,
                                                            true))
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_InstalacionLinea.Exferia_Label_Codigo.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_TextBox_Codigo;
                    }
                }

                // La Descripcion no puede estar vacía
                if ((mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_InstalacionLinea.Exferia_TextBox_Descripcion.Text.Trim().Length == 0))
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_InstalacionLinea.Exferia_Label_Descripcion.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_TextBox_Descripcion;
                }

                // El Estado no puede estar Vacio (Obligatorio)
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Estado validar que es Correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Id == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Uso validar que es Correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Id == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Plan de mantenimiento validar que es Correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Id == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // La fecha de instalacion no puede estar vacia y debe ser correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaInstalacion.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_InstalacionLinea.Exferia_FechaSeleccion_FechaInstalacion.Exferia_FechaSeleccion_Descripcion);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaInstalacion;
                    }
                    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_InstalacionLinea.Exferia_FechaSeleccion_FechaInstalacion.Exferia_FechaSeleccion_Descripcion);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaInstalacion;
                    }
                }


                // La fecha de garantia, si no esta vacio, debe ser correcta. (mensaje de vacio se queda vacio para que no controle el error)
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaGarantia.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));
                    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_InstalacionLinea.Exferia_FechaSeleccion_FechaGarantia.Exferia_FechaSeleccion_Descripcion);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaGarantia;
                    }
                }

                // Si hay Infraestructura validar que es Correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Id == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InstalacionLinea.Exferia_F3_Infraestructura.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //Validar los modelos dentro de la infraestructura
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (g_frm_P_InstalacionLinea.Exferia_TabControl_Infraestructura.TabCount > 0)
                    {
                        List<long> lst_idInfraestructurasSeccion_ConModelos = g_mdl_MYT_Infraestructuras.MYT_InfraestructurasSecciones.Where(m => m.relacionTablaModelos).Select(m => m.id).ToList();

                        if (lst_idInfraestructurasSeccion_ConModelos!=null && lst_idInfraestructurasSeccion_ConModelos.Count>0)
                        {
                            //Recorrer las Secciones
                            foreach (long lng_idInfraestructuraSeccion in lst_idInfraestructurasSeccion_ConModelos)
                            {
                                if (g_frm_P_InstalacionLinea.Exferia_TabControl_Infraestructura.TabPages.ContainsKey("TabPage_" + lng_idInfraestructuraSeccion))
                                {
                                    TabPage tbp_Seccion = g_frm_P_InstalacionLinea.Exferia_TabControl_Infraestructura.TabPages["TabPage_" + lng_idInfraestructuraSeccion];

                                    Exferia_F3 ex_usc_F3_Modelo = (Exferia_F3)tbp_Seccion.Controls.Find("usc_F3_Modelo_" + lng_idInfraestructuraSeccion, true).FirstOrDefault();
                                    if (ex_usc_F3_Modelo!=null)
                                    {
                                        if ((ex_usc_F3_Modelo.Exferia_F3_Codigo.Trim().Length != 0 ||
                                            ex_usc_F3_Modelo.Exferia_F3_Descripcion.Trim().Length != 0) && ex_usc_F3_Modelo.Exferia_F3_Id == -1)
                                        {
                                            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(ex_usc_F3_Modelo.Exferia_F3_Titulo);
                                            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_usc_F3_Modelo.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            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_InstalacionLinea_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;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            try
            {
                DateTime? dtt_fechaNula = null;

                long lng_idInstalacionLinea = -1;

                MYT_InstalacionesLineas mdl_MYT_InstalacionesLineas = new MYT_InstalacionesLineas();

                //id
                mdl_MYT_InstalacionesLineas.id = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo != null ? g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.id : -1;

                //codigo
                mdl_MYT_InstalacionesLineas.codigo = g_frm_P_InstalacionLinea.Exferia_TextBox_Codigo.Text.Trim();

                //descripcion
                mdl_MYT_InstalacionesLineas.descripcion = g_frm_P_InstalacionLinea.Exferia_TextBox_Descripcion.Text.Trim();

                //idInstalacionCabecera
                mdl_MYT_InstalacionesLineas.idInstalacionCabecera = g_mdl_INTERNO_MYT_InstalacionesCabecera_Modelo.id;

                //idInstalacionEstado
                mdl_MYT_InstalacionesLineas.idInstalacionEstado = g_frm_P_InstalacionLinea.Exferia_F3_InstalacionEstado.Exferia_F3_Id;

                //idPlanMantenimientoCabecera
                if (g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Id > -1)
                {
                    mdl_MYT_InstalacionesLineas.idPlanMantenimientoCabecera = g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Id;
                }
                else
                {
                    mdl_MYT_InstalacionesLineas.idPlanMantenimientoCabecera = null;
                }

                //idInstalacionUso
                if (g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Id>-1)
                {
                    mdl_MYT_InstalacionesLineas.idInstalacionUso = g_frm_P_InstalacionLinea.Exferia_F3_Uso.Exferia_F3_Id;
                }
                else
                {
                    mdl_MYT_InstalacionesLineas.idInstalacionUso = null;
                }
               
                //fechaInstalacion
                mdl_MYT_InstalacionesLineas.fechaInstalacion = DateTime.ParseExact(g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaInstalacion.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                //fechaGarantia
                mdl_MYT_InstalacionesLineas.fechaGarantia = g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaGarantia.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "" ? DateTime.ParseExact(g_frm_P_InstalacionLinea.Exferia_FechaSeleccion_FechaGarantia.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : dtt_fechaNula;

                //ubicacion
                mdl_MYT_InstalacionesLineas.ubicacion = g_frm_P_InstalacionLinea.Exferia_TextBox_Ubicacion.Text;

                //observaciones
                mdl_MYT_InstalacionesLineas.observaciones = g_frm_P_InstalacionLinea.Exferia_TextBox_Observaciones.Text;

                // Se graba el modelo ya relleno.
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_MYT_InstalacionesLineas_Datos.Grabar(mdl_MYT_InstalacionesLineas);

                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    lng_idInstalacionLinea = mdl_INTERNO_ValorDevuelto_Modelo.Id;

                    #region Infraestructuras
                    //OBTENER
                    List<MYT_InstalacionesLineasInfraestructuras> lst_MYT_InstalacionesLineasInfraestructuras = new List<MYT_InstalacionesLineasInfraestructuras>();
                    if (g_mdl_MYT_Infraestructuras!=null)
                    {
                        if (g_frm_P_InstalacionLinea.Exferia_TabControl_Infraestructura.TabCount > 0)
                        {
                            //Recorrer las Secciones
                            foreach (TabPage tbp_Seccion in g_frm_P_InstalacionLinea.Exferia_TabControl_Infraestructura.TabPages)
                            {
                                long lng_idInfraestructuraSeccion = long.Parse(tbp_Seccion.Tag.ToString());

                                #region Modelo
                                Exferia_F3 ex_usc_F3_Modelo = (Exferia_F3)tbp_Seccion.Controls.Find("usc_F3_Modelo_" + lng_idInfraestructuraSeccion, true).FirstOrDefault();
                                if (ex_usc_F3_Modelo != null && ex_usc_F3_Modelo.Exferia_F3_Id>-1)
                                {
                                    MYT_InstalacionesLineasInfraestructuras mdl_MYT_InstalacionesLineasInfraestructuras = new MYT_InstalacionesLineasInfraestructuras();

                                    mdl_MYT_InstalacionesLineasInfraestructuras.idInstalacionLinea = lng_idInstalacionLinea;
                                    mdl_MYT_InstalacionesLineasInfraestructuras.idInfraestructura = g_mdl_MYT_Infraestructuras.id;
                                    mdl_MYT_InstalacionesLineasInfraestructuras.idInfraestructuraSeccion = lng_idInfraestructuraSeccion;
                                    mdl_MYT_InstalacionesLineasInfraestructuras.idInfraestructuraElemento = null;
                                    mdl_MYT_InstalacionesLineasInfraestructuras.idModelo = ex_usc_F3_Modelo.Exferia_F3_Id;
                                    mdl_MYT_InstalacionesLineasInfraestructuras.texto = "";

                                    //Añadir al listado
                                    lst_MYT_InstalacionesLineasInfraestructuras.Add(mdl_MYT_InstalacionesLineasInfraestructuras);
                                }
                                #endregion

                                #region Elementos
                                foreach (MYT_InfraestructurasElementos mdl_MYT_InfraestructurasElementos in g_mdl_MYT_Infraestructuras.MYT_InfraestructurasSecciones.Where(m=>m.id==lng_idInfraestructuraSeccion).FirstOrDefault().MYT_InfraestructurasElementos )
                                {

                                    Exferia_TextBox ex_txt_Elemento = (Exferia_TextBox)tbp_Seccion.Controls.Find("ex_txt_Elemento_" + mdl_MYT_InfraestructurasElementos.id, true).FirstOrDefault();
                                    if (ex_txt_Elemento != null && ex_txt_Elemento.Text.Trim().Length>0)
                                    {
                                        MYT_InstalacionesLineasInfraestructuras mdl_MYT_InstalacionesLineasInfraestructuras = new MYT_InstalacionesLineasInfraestructuras();

                                        mdl_MYT_InstalacionesLineasInfraestructuras.idInstalacionLinea = lng_idInstalacionLinea;
                                        mdl_MYT_InstalacionesLineasInfraestructuras.idInfraestructura = g_mdl_MYT_Infraestructuras.id;
                                        mdl_MYT_InstalacionesLineasInfraestructuras.idInfraestructuraSeccion = lng_idInfraestructuraSeccion;
                                        mdl_MYT_InstalacionesLineasInfraestructuras.idInfraestructuraElemento = mdl_MYT_InfraestructurasElementos.id;
                                        mdl_MYT_InstalacionesLineasInfraestructuras.idModelo = null;
                                        mdl_MYT_InstalacionesLineasInfraestructuras.texto = ex_txt_Elemento.Text.Trim();

                                        //Añadir al listado
                                        lst_MYT_InstalacionesLineasInfraestructuras.Add(mdl_MYT_InstalacionesLineasInfraestructuras);
                                    }
                                }
                                #endregion
                            }
                        }
                    }

                    //BORRAR
                    if (g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo != null &&
                        g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesLineasInfraestructuras != null &&
                        g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesLineasInfraestructuras.Count > 0)
                    {
                        //Borrar los registros fuera del listado
                        var arr_Seccionesids = lst_MYT_InstalacionesLineasInfraestructuras.Select(m=> m.idInstalacionLinea + "_" + m.idInfraestructura + "_" + m.idInfraestructuraSeccion + "_" + (m.idInfraestructuraElemento != null ? m.idInfraestructuraElemento.Value : -1) + "_" + (m.idModelo != null ? m.idModelo.Value : -1)).ToArray();
                        var var_SeccionesABorrar = g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.MYT_InstalacionesLineasInfraestructuras.Where(m => !arr_Seccionesids.Contains(m.idInstalacionLinea + "_" + m.idInfraestructura + "_" + m.idInfraestructuraSeccion + "_" + (m.idInfraestructuraElemento!=null ? m.idInfraestructuraElemento.Value : -1) + "_" + (m.idModelo != null ? m.idModelo.Value : -1))).ToList();
                        if (var_SeccionesABorrar != null && var_SeccionesABorrar.Count() > 0)
                        {
                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Borrar = null;

                            foreach (MYT_InstalacionesLineasInfraestructuras mdl_MYT_InstalacionesLineasInfraestructuras in var_SeccionesABorrar.ToList())
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo_Borrar = g_obj_MYT_InstalacionesLineasInfraestructuras_Datos.Borrar(mdl_MYT_InstalacionesLineasInfraestructuras.id);
                                if (mdl_INTERNO_ValorDevuelto_Modelo_Borrar.TodoCorrecto == false)
                                {
                                    return mdl_INTERNO_ValorDevuelto_Modelo_Borrar;
                                }
                            }
                        }
                    }

                    //ACTUALIZAR
                    if (lst_MYT_InstalacionesLineasInfraestructuras != null && lst_MYT_InstalacionesLineasInfraestructuras.Count > 0)
                    {
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Grabar = null;
                        foreach (MYT_InstalacionesLineasInfraestructuras mdl_MYT_InstalacionesLineasInfraestructuras in lst_MYT_InstalacionesLineasInfraestructuras)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo_Grabar = g_obj_MYT_InstalacionesLineasInfraestructuras_Datos.Grabar(mdl_MYT_InstalacionesLineasInfraestructuras);
                            if (mdl_INTERNO_ValorDevuelto_Modelo_Grabar.TodoCorrecto == false)
                            {
                                return mdl_INTERNO_ValorDevuelto_Modelo_Grabar;
                            }
                        }
                    }
                    #endregion
                }

                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    //Obtener el modelo que se acaba de grabar
                    g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo = g_obj_MYT_InstalacionesLineas_Datos.Obtener(lng_idInstalacionLinea);

                    g_frm_P_InstalacionLinea.P_Base_id = lng_idInstalacionLinea;
                    //g_frm_P_InstalacionLinea.Exferia_Button_Borrar.Enabled = true;

                    #region ARGUMENTOS A DEVOLVER, PARA ACTUALIZAR LE LISTADO
                    List<object> lst_Argumentos = new List<object>();

                    //Principal
                    lst_Argumentos.Add(lng_idInstalacionLinea);
                    lst_Argumentos.Add(mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion);
                    //..........................................................................................................................

                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_Argumentos;
                    #endregion
                }
            }
            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_InstalacionLinea_Controladora) + "/" + nameof(GrabarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Datos
        public void BorrarDatos()
        {
            try
            {
                //Preguntar si está seguro de borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_InstalacionLinea.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_InstalacionLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_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_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

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

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

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_InstalacionLinea.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
                {
                    #region SINCRONIZACION
                    INTERNO_Sincronizacion_ActualizarRegistro_Modelo mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo = new INTERNO_Sincronizacion_ActualizarRegistro_Modelo();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.tabla = nameof(MYT_InstalacionesLineas);
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.idClavePrimaria = mdl_ValorDevuelto_Modelo_Resultado.Id;

                    Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_RESTOTABLAS(mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo);
                    #endregion

                    // Devolver al Listado el Row Borrar
                    List<object> lst_obj = new List<object>();

                    //opcion
                    lst_obj.Add(g_frm_P_InstalacionLinea.g_mdl_PRV_OpcionesDetalle.opcion);


                    //Ids a borrar
                    List<long> lst_id = new List<long>();
                    lst_id.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    lst_obj.Add(lst_id);

                    g_frm_P_InstalacionLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_ELIMINAR);

                    g_frm_P_InstalacionLinea.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_InstalacionLinea.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_MYT_InstalacionesLineas_Datos.Borrar(g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo!=null ? g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.id : -1);
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Infraestructuras
        public void Infraestructura_Crear_Tabs(long _lng_idInfraestructura)
        {
            try
            {
                if (_lng_idInfraestructura > -1 && g_mdl_MYT_Infraestructuras == null)
                {
                    g_mdl_MYT_Infraestructuras = g_obj_MYT_Infraestructuras_Datos.Obtener_Modelo_Por_Id(_lng_idInfraestructura, true);
                }

                if (g_mdl_MYT_Infraestructuras != null &&
                    g_mdl_MYT_Infraestructuras.MYT_InfraestructurasSecciones!=null &&
                    g_mdl_MYT_Infraestructuras.MYT_InfraestructurasSecciones.Count>0)
                {
                    //Recorrer las Secciones
                    int int_Posicion_Y = 5;
                    foreach (MYT_InfraestructurasSecciones mdl_MYT_InfraestructurasSecciones in g_mdl_MYT_Infraestructuras.MYT_InfraestructurasSecciones.OrderBy(m=>m.orden))
                    {
                        int_Posicion_Y = 5;

                        //AÑADIR TAB ############################################################################################
                        TabPage tbp_Aux = new TabPage();
                        tbp_Aux.Name = "TabPage_" + mdl_MYT_InfraestructurasSecciones.id;
                        tbp_Aux.Size = new Size(300, 300);
                        tbp_Aux.TabIndex = 0;
                        tbp_Aux.Text = mdl_MYT_InfraestructurasSecciones.descripcion;
                        tbp_Aux.UseVisualStyleBackColor = true;
                        tbp_Aux.Tag = mdl_MYT_InfraestructurasSecciones.id;

                        //Agregar el panel
                        Panel pnl_Secciones = new Panel();
                        pnl_Secciones.AutoScroll = true;
                        pnl_Secciones.Name = "pnl_Seccion_" + mdl_MYT_InfraestructurasSecciones.id;
                        pnl_Secciones.BackColor = Color.White;
                        pnl_Secciones.Location = new Point(0, 0);
                        pnl_Secciones.Tag = mdl_MYT_InfraestructurasSecciones.id;
                        pnl_Secciones.Size = new Size(300, 290);

                        //Si tiene que seleccionar Modelo
                        if (mdl_MYT_InfraestructurasSecciones.relacionTablaModelos)
                        {
                            Exferia_F3 usc_F3_Modelo = new Exferia_F3();
                            
                            usc_F3_Modelo.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
                            usc_F3_Modelo.Exferia_F3_PRINCIPAL_Obligatorio = false;
                            usc_F3_Modelo.Exferia_F3_PantallaContenedora = g_frm_P_InstalacionLinea;
                            usc_F3_Modelo.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos =Variables.G_STR_OPCION_MYT_MODELOS;
                            usc_F3_Modelo.Exferia_F3_PRINCIPAL_PermitirAdd = true;
                            usc_F3_Modelo.Exferia_F3_Ancho_Titulo = G_ENUM_F3_TITULO.Medio;
                            usc_F3_Modelo.Exferia_F3_Titulo = "Modelos";
                            usc_F3_Modelo.Location = new System.Drawing.Point(10, int_Posicion_Y);
                            usc_F3_Modelo.Name = "usc_F3_Modelo_" + mdl_MYT_InfraestructurasSecciones.id;
                            usc_F3_Modelo.Size = new System.Drawing.Size(210, 22);
                            usc_F3_Modelo.TabIndex = 108;
                            usc_F3_Modelo.Tag = "";

                            //Buscar de lo cargado ya e BD
                            if (g_lst_MYT_InstalacionesLineasInfraestructuras != null &&
                                g_lst_MYT_InstalacionesLineasInfraestructuras.Count > 0)
                            {
                                MYT_InstalacionesLineasInfraestructuras mdl_MYT_InstalacionesLineasInfraestructuras_MODELO = g_lst_MYT_InstalacionesLineasInfraestructuras.Where(m => m.idInfraestructuraSeccion == mdl_MYT_InfraestructurasSecciones.id && m.idModelo != null).FirstOrDefault();

                                if (mdl_MYT_InstalacionesLineasInfraestructuras_MODELO != null && mdl_MYT_InstalacionesLineasInfraestructuras_MODELO.MYT_Modelos!=null)
                                {
                                    usc_F3_Modelo.Exferia_F3_Id = mdl_MYT_InstalacionesLineasInfraestructuras_MODELO.MYT_Modelos.id;
                                    usc_F3_Modelo.Exferia_F3_Codigo = mdl_MYT_InstalacionesLineasInfraestructuras_MODELO.MYT_Modelos.codigo;
                                    usc_F3_Modelo.Exferia_F3_Descripcion = mdl_MYT_InstalacionesLineasInfraestructuras_MODELO.MYT_Modelos.descripcion;
                                    usc_F3_Modelo.Exferia_F3_FechaBorrado = mdl_MYT_InstalacionesLineasInfraestructuras_MODELO.MYT_Modelos.fechaBorrado;
                                }
                            }

                            pnl_Secciones.Controls.Add(usc_F3_Modelo);

                            int_Posicion_Y += (22 + 3);
                        }

                        foreach (MYT_InfraestructurasElementos mdl_MYT_InfraestructurasElementos in mdl_MYT_InfraestructurasSecciones.MYT_InfraestructurasElementos.OrderBy(m=>m.orden))
                        {
                            //Label Descripcion Elemento
                            Exferia_Label ex_lbl_DescripcionElemento = new Exferia_Label();
                            ex_lbl_DescripcionElemento.AutoSize = false;
                            ex_lbl_DescripcionElemento.BackColor = Color.Transparent;
                            ex_lbl_DescripcionElemento.Location = new Point(10, int_Posicion_Y+2);
                            ex_lbl_DescripcionElemento.Name = "ex_lbl_Elemento_" + mdl_MYT_InfraestructurasSecciones.id + "_" + mdl_MYT_InfraestructurasElementos.id;
                            ex_lbl_DescripcionElemento.Size = new Size(180, 13);
                            ex_lbl_DescripcionElemento.Text = mdl_MYT_InfraestructurasElementos.descripcion;
                            pnl_Secciones.Controls.Add(ex_lbl_DescripcionElemento);

                            //TextBox Descripcion Seccion
                            Exferia_TextBox ex_txt_DescripcionElemento = new Exferia_TextBox();
                            ex_txt_DescripcionElemento.Exferia_TextBox_Bloqueable = true;
                            ex_txt_DescripcionElemento.Exferia_TextBox_MaxLength = 100;
                            ex_txt_DescripcionElemento.Exferia_TextBox_Multiline = false;
                            ex_txt_DescripcionElemento.Exferia_TextBox_NoBloquear = true;
                            ex_txt_DescripcionElemento.Exferia_TextBox_Obligatorio = false;
                            ex_txt_DescripcionElemento.Exferia_TextBox_Permitir_CambioFuenteAutomatico = true;
                            ex_txt_DescripcionElemento.Exferia_TextBox_ReadOnly = false;
                            ex_txt_DescripcionElemento.Exferia_TextBox_TabStop_Txt = true;
                            ex_txt_DescripcionElemento.Exferia_TextBox_TextAlign = HorizontalAlignment.Left;
                            ex_txt_DescripcionElemento.Exferia_TextBox_Texto_Inicial = "";
                            ex_txt_DescripcionElemento.Exferia_TextBox_Tipo_Decimal_Decimales = 5;
                            ex_txt_DescripcionElemento.Exferia_TextBox_Tipo_Decimal_Enteros = 15;
                            if (mdl_MYT_InfraestructurasElementos.tipo==Variables_Mythos.G_INT_INFRAESTRUCTURAELEMENTO_TIPO_NUMERO)
                            {
                                ex_txt_DescripcionElemento.Exferia_TextBox_Tipos = G_ENUM_TEXTBOX_TIPODATO.Decimales;
                            }
                            else
                            {
                                ex_txt_DescripcionElemento.Exferia_TextBox_Tipos = G_ENUM_TEXTBOX_TIPODATO.Textos;
                            }
                            
                            ex_txt_DescripcionElemento.Exferia_TextBox_UseSystemPasswordChar = false;
                            ex_txt_DescripcionElemento.Location = new Point(191, int_Posicion_Y);
                            ex_txt_DescripcionElemento.Name = "ex_txt_Elemento_" +  mdl_MYT_InfraestructurasElementos.id;
                            ex_txt_DescripcionElemento.Size = new System.Drawing.Size(100, 22);
                            ex_txt_DescripcionElemento.TabIndex = 10;
                            ex_txt_DescripcionElemento.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;

                            //Buscar de lo cargado ya e BD
                            if (g_lst_MYT_InstalacionesLineasInfraestructuras != null &&
                                g_lst_MYT_InstalacionesLineasInfraestructuras.Count > 0)
                            {
                                MYT_InstalacionesLineasInfraestructuras mdl_MYT_InstalacionesLineasInfraestructuras_ELEMENTO= g_lst_MYT_InstalacionesLineasInfraestructuras.Where(m => m.idInfraestructuraSeccion == mdl_MYT_InfraestructurasSecciones.id && m.idModelo == null && m.idInfraestructuraElemento== mdl_MYT_InfraestructurasElementos.id).FirstOrDefault();

                                if (mdl_MYT_InstalacionesLineasInfraestructuras_ELEMENTO != null)
                                {
                                    ex_txt_DescripcionElemento.Exferia_TextBox_Texto_Inicial = mdl_MYT_InstalacionesLineasInfraestructuras_ELEMENTO.texto;
                                }
                            }

                            pnl_Secciones.Controls.Add(ex_txt_DescripcionElemento);

                            int_Posicion_Y += (22 + 3);
                        }

                        pnl_Secciones.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
                        tbp_Aux.Controls.Add(pnl_Secciones);

                        //Añadir el TabPage al TabControl
                        g_frm_P_InstalacionLinea.Exferia_TabControl_Infraestructura.TabPages.Add(tbp_Aux);
                        //#######################################################################################################

                        Repintar.Empezar(tbp_Aux);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Infraestructura_Crear_Tabs));
            }
        }
        #endregion

        #region Inspecciones 
        #region Rellenar DataGrid Inspecciones
        public void Rellenar_DataGrid_Inspecciones(long lng_idInstalacionLinea, bool _bol_Recargar_BD)
        {
            try
            {
                if (g_TareaAsincrona_Rellenar_DataGrid_Inspecciones != null)
                {
                    g_TareaAsincrona_Rellenar_DataGrid_Inspecciones.CancelAsync();
                    while (g_TareaAsincrona_Rellenar_DataGrid_Inspecciones.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_TareaAsincrona_Rellenar_DataGrid_Inspecciones = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_DataGrid_Inspecciones.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_InspeccionesRelacionadas_DoWork);
                    g_TareaAsincrona_Rellenar_DataGrid_Inspecciones.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Inspecciones_ProgressChanged);
                    g_TareaAsincrona_Rellenar_DataGrid_Inspecciones.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Inspecciones_Completed);
                    g_TareaAsincrona_Rellenar_DataGrid_Inspecciones.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_DataGrid_Inspecciones.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_InstalacionLinea.Exferia_DataGridView_Inspecciones.Rows.Clear();
                g_int_TotalRegistrosInsertados_Inspecciones = 0;
                g_int_TotalRegistros_Inspecciones = 0;
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Inspecciones_BarraProgreso.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Inspecciones;
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Inspecciones_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Inspecciones;

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


                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Inspecciones.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Rellenar_DataGrid_Inspecciones));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_InspeccionesRelacionadas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Argumento
                List<object> lst_Argumentos = (List<object>)e.Argument;
                long lng_idInstalacionLinea = (long)lst_Argumentos[0];
                bool bol_Recargar_BD = (bool)lst_Argumentos[1];


                //Buscar en BD
                if (bol_Recargar_BD)
                {
                    g_lst_INTERNO_MYT_Inspecciones_Listado_Modelo = g_obj_MYT_Inspecciones_Datos.Obtener_Registros_Para_Listado_Por_InstalacionLinea(lng_idInstalacionLinea);
                }

                List<INTERNO_MYT_Inspecciones_Listado_Modelo> lst_INTERNO_MYT_Inspecciones_Listado_Modelo_Filtradas = Filtrar_Inspecciones();

                //Total
                if (lst_INTERNO_MYT_Inspecciones_Listado_Modelo_Filtradas != null)
                {
                    g_int_TotalRegistros_Inspecciones = lst_INTERNO_MYT_Inspecciones_Listado_Modelo_Filtradas.Count;

                    //Recorrer 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_Inspecciones_Columnas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_MYT_Inspecciones_Listado_Modelo_Filtradas.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_MYT_Inspecciones_P_InstalacionLinea.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

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

                        //Progreso
                        g_int_TotalRegistrosInsertados_Inspecciones += 1;


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

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_InspeccionesRelacionadas_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_InspeccionesRelacionadas_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Inspecciones_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de Inspecciones
                g_frm_P_InstalacionLinea.Exferia_DataGridView_Inspecciones.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Inspecciones_BarraProgreso.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Inspecciones;
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Inspecciones_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Inspecciones;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Inspecciones_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_InstalacionLinea.Ordenar_DataGridView_Inspecciones();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Inspecciones(INTERNO_MYT_Inspecciones_Listado_Modelo _mdl_INTERNO_MYT_Inspecciones_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {

                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_InstalacionLinea.Exferia_DataGridView_Inspecciones.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_InstalacionLinea.Exferia_DataGridView_Inspecciones);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Inspecciones_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_MYT_Inspecciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Inspecciones_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_Inspecciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Inspecciones_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_Inspecciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Inspecciones_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_Inspecciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Inspecciones_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_Inspecciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Inspecciones_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_Inspecciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Inspecciones_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_Inspecciones_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Inspecciones_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_MYT_Inspecciones_Listado_Modelo> Filtrar_Inspecciones()
        {
            //Filtros Avanzados
            if (g_lst_INTERNO_MYT_Inspecciones_Listado_Modelo != null)
            {
                if (g_dct_ListadoFiltros_MYT_Inspecciones != null && g_dct_ListadoFiltros_MYT_Inspecciones.Count > 0)
                {
                    return g_lst_INTERNO_MYT_Inspecciones_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_MYT_Inspecciones_Listado_Modelo>(g_dct_ListadoFiltros_MYT_Inspecciones, g_obj_ABS_Listado_MYT_Inspecciones_P_InstalacionLinea)).ToList();
                }
                else
                {
                    return g_lst_INTERNO_MYT_Inspecciones_Listado_Modelo.AsQueryable().ToList();
                }
            }
            else
            {
                return null;
            }
        }
        #endregion
        #endregion

        #region Partes

        #region Rellenar DataGrid de Partes
        public void Rellenar_DataGrid_Partes()
        {
            try
            {
                if (g_TareaAsincrona_Rellenar_DataGrid_Partes != null)
                {
                    g_TareaAsincrona_Rellenar_DataGrid_Partes.CancelAsync();
                    while (g_TareaAsincrona_Rellenar_DataGrid_Partes.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_TareaAsincrona_Rellenar_DataGrid_Partes = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_DataGrid_Partes.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Partes_DoWork);
                    g_TareaAsincrona_Rellenar_DataGrid_Partes.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Partes_ProgressChanged);
                    g_TareaAsincrona_Rellenar_DataGrid_Partes.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Partes_Completed);
                    g_TareaAsincrona_Rellenar_DataGrid_Partes.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_DataGrid_Partes.WorkerSupportsCancellation = true;
                }



                //Vaciar el Listado
                g_frm_P_InstalacionLinea.Exferia_DataGridView_Partes.Rows.Clear();
                g_int_TotalRegistrosInsertados_Partes = 0;
                g_int_TotalRegistros_Partes = 0;
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Partes.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Partes;
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Partes.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Partes;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Partes.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Rellenar_DataGrid_Partes));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Partes_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_MYT_Partes_Listado_Modelo> lst_INTERNO_MYT_Partes_Listado_Modelo = Filtrar_Partes();

                if (lst_INTERNO_MYT_Partes_Listado_Modelo != null && lst_INTERNO_MYT_Partes_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_Partes = lst_INTERNO_MYT_Partes_Listado_Modelo.Count();

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

                        //Progreso
                        g_int_TotalRegistrosInsertados_Partes += 1;

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

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        public DataGridViewRow Transformar_Modelo_A_Row_Partes(INTERNO_MYT_Partes_Listado_Modelo _mdl_INTERNO_MYT_Partes_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_InstalacionLinea.Exferia_DataGridView_Partes.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_InstalacionLinea.Exferia_DataGridView_Partes);
            }

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

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }
        private void TareaAsincrona_Rellenar_DataGrid_Partes_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de Partes
                g_frm_P_InstalacionLinea.Exferia_DataGridView_Partes.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Partes.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Partes;
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Partes.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Partes;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Partes_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_InstalacionLinea.Partes_Ordenar_DataGridView();
            }
        }

        private List<INTERNO_MYT_Partes_Listado_Modelo> Filtrar_Partes()
        {
            //Filtros Avanzados
            if (g_dct_ListadoFiltros_MYT_Partes != null && g_dct_ListadoFiltros_MYT_Partes.Count > 0)
            {
                return g_lst_INTERNO_MYT_Partes_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_MYT_Partes_Listado_Modelo>(g_dct_ListadoFiltros_MYT_Partes, g_obj_ABS_Listado_MYT_Partes_P_InstalacionLinea)).ToList();
            }
            else
            {
                return g_lst_INTERNO_MYT_Partes_Listado_Modelo;
            }
        }
        #endregion

        public void Partes_Actualizar_Registro(long _lng_idParte, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_MYT_Partes_Listado_Modelo mdl_INTERNO_MYT_Partes_Listado_Modelo = g_obj_MYT_Partes_Datos.Obtener_Registro_Para_Listado_Por_Id(_lng_idParte);

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

                        g_lst_INTERNO_MYT_Partes_Listado_Modelo.Add(mdl_INTERNO_MYT_Partes_Listado_Modelo);
                    }

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

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_Partes(mdl_INTERNO_MYT_Partes_Listado_Modelo, row);

                            //Ordenar Listado
                            g_frm_P_InstalacionLinea.Partes_Ordenar_DataGridView();
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_InstalacionLinea.Exferia_DataGridView_Partes.Rows.Add(Transformar_Modelo_A_Row_Partes(mdl_INTERNO_MYT_Partes_Listado_Modelo, null));

                        //Ordenar Listado
                        g_frm_P_InstalacionLinea.Partes_Ordenar_DataGridView();
                    }
                }
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Partes_Actualizar_Registro));
            }
        }
        public void Partes_Borrar_Registro(List<long> _lst_idPartes)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_MYT_Partes_Listado_Modelo != null && g_lst_INTERNO_MYT_Partes_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_MYT_Partes_Listado_Modelo> lst_INTERNO_MYT_Partes_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_MYT_Partes_Listado_Modelo.Where(m => _lst_idPartes.Contains(m.id)).ToList();
                    if (lst_INTERNO_MYT_Partes_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_MYT_Partes_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_MYT_Partes_Listado_Modelo mdl_INTERNO_MYT_Partes_Listado_Modelo in lst_INTERNO_MYT_Partes_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_MYT_Partes_Listado_Modelo.Remove(mdl_INTERNO_MYT_Partes_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_InstalacionLinea.Exferia_DataGridView_Partes.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idPartes.Contains(long.Parse(r.Cells[nameof(INTERNO_MYT_Partes_Listado_Modelo.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_InstalacionLinea.Exferia_DataGridView_Partes.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Lineas Borradas
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Partes.Exferia_BarraProgreso_Total -= _lst_idPartes.Count();
                g_frm_P_InstalacionLinea.Exferia_BarraProgreso_Partes.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Partes - _lst_idPartes.Count();

                g_frm_P_InstalacionLinea.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Partes_Borrar_Registro));
            }
        }

        #region Borrar Datos Partes
        public void BorrarDatos_Partes(List<long> _lst_idPartes)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_InstalacionLinea.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_idPartes);

                    g_obj_TareaAsincrona_BorrarDatos_Partes = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_Partes.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_Partes_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_Partes.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Partes_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_Partes.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_InstalacionLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(BorrarDatos_Partes));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_Partes_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_idPartes = (List<long>)lst_Argumentos[0];

                    INTERNO_OpcionesDetalle_Modelo mdl_INTERNO_OpcionesDetalle_Modelo_PARTES = Datos_Generales.PRV_Opciones_Buscar_Detalles(Variables.G_STR_OPCION_MYT_PARTES);

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = Borrar_Registro_Partes_EnBaseDatos_Final(lst_idPartes);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idPartes;
                        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_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Partes_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_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Partes_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_Partes_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_InstalacionLinea.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
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(Variables.G_STR_OPCION_MYT_PARTES);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_InstalacionLinea.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_InstalacionLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Partes_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo Borrar_Registro_Partes_EnBaseDatos_Final(List<long> _lst_idParte_ABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_MYT_Partes_Datos.Borrar(_lst_idParte_ABorrar);
            }
            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_InstalacionLinea_Controladora) + "/" + nameof(Borrar_Registro_Partes_EnBaseDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion
        #endregion

        #region Previsiones
        public void Calcular_Previsiones()
        {
            try
            {
                g_frm_P_InstalacionLinea.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                BackgroundWorker obj_TareaAsincrona_CalcularPrevisiones = new BackgroundWorker();
                obj_TareaAsincrona_CalcularPrevisiones.DoWork += new DoWorkEventHandler(TareaAsincrona_CalcularPrevisiones_DoWork);
                obj_TareaAsincrona_CalcularPrevisiones.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CalcularPrevisiones_Completed);
                obj_TareaAsincrona_CalcularPrevisiones.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_InstalacionLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Calcular_Previsiones));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_CalcularPrevisiones_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                  
                mdl_ValorDevuelto_Modelo = Calcular_Previsiones_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_CalcularPrevisiones_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_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_CalcularPrevisiones_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_CalcularPrevisiones_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_InstalacionLinea.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
                {
                    RecargarDatos();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(TareaAsincrona_CalcularPrevisiones_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo Calcular_Previsiones_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            try
            {
                if (g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo != null && g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.Count > 0)
                {
                    int int_CodigoPrevision=int.Parse(Datos_Generales.Buscar_CodigoSiguiente(nameof(MYT_Previsiones),
                                                                                            nameof(MYT_Previsiones.codigo),
                                                                                            "",
                                                                                            -1,
                                                                                            true,
                                                                                            10));

                    foreach (INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo in g_lst_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo)
                    {
                        List<MYT_Previsiones> lst_MYT_Previsiones = new List<MYT_Previsiones>();
                        List<long> lst_idPlanMantenimientoLinea_Introducido = new List<long>();

                        //Poner las previsiones que tiene un Parte Relacionado
                        if (mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo != null &&
                            mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.MYT_Previsiones != null &&
                            mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.MYT_Previsiones.Count > 0)
                        {
                            foreach (MYT_Previsiones mdl_MYT_Previsiones in mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.MYT_Previsiones)
                            {
                                if (mdl_MYT_Previsiones.MYT_Partes != null && mdl_MYT_Previsiones.MYT_Partes.Count > 0)
                                {
                                    //Agregar al Listado Final
                                    lst_MYT_Previsiones.Add(mdl_MYT_Previsiones);

                                    //Agregar al listado que ya se ha utilizado
                                    lst_idPlanMantenimientoLinea_Introducido.Add(mdl_MYT_Previsiones.idPlanMantenimientoLinea);
                                }
                            }
                        }

                        //Tiene que tener un PlanMantenimientoCabecera Seleccionado
                        MYT_PlanMantenimientosCabeceras mdl_MYT_PlanMantenimientosCabeceras = g_obj_MYT_PlanMantenimientosCabeceras_Datos.Obtener_Modelo_Por_Id(g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Id, true);

                        if (mdl_MYT_PlanMantenimientosCabeceras != null)
                        {
                            //El Tipo de Contrato se Asocia al PlanDeMantenimiento
                            if (mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.MYT_TiposContratos.asociaPlanMantenimiento != null &&
                                mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.MYT_TiposContratos.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)
                                    {
                                        if (lst_idPlanMantenimientoLinea_Introducido.Count == 0 || !lst_idPlanMantenimientoLinea_Introducido.Contains(mdl_MYT_PlanMantenimientosLineas.id))
                                        {
                                            int_CodigoPrevision += 1;

                                             //Fechacalculada
                                             DateTime dtt_FechaPrevista = mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.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 (mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.fechaFin == null || (mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.fechaFin != null && mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.fechaFin.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 = mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.id;
                                                mdl_MYT_Previsiones.idTecnico = null;
                                                mdl_MYT_Previsiones.fechaPrevision = dtt_FechaPrevista;
                                                mdl_MYT_Previsiones.fechaBorrado = null;

                                                //Agregar al Listado Final
                                                lst_MYT_Previsiones.Add(mdl_MYT_Previsiones);
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        #region ACTUALIZAR
                        //Iniciar la transacccion
                        using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
                        {
                            try
                            {
                                //ACTUALIZAR EL idPlanMantenimientoCabecera
                                long? lng_idPlanMantenimientoCabecera = null;
                                if (g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Id>-1)
                                {
                                    lng_idPlanMantenimientoCabecera = g_frm_P_InstalacionLinea.Exferia_F3_PlanMantenimiento.Exferia_F3_Id;
                                }
                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Actualizar = g_obj_MYT_InstalacionesLineas_Datos.Actualizar_IdPlanMantenimientoCabecera(g_mdl_INTERNO_MYT_InstalacionesLineas_Modelo.id, lng_idPlanMantenimientoCabecera);
                                if (mdl_INTERNO_ValorDevuelto_Modelo_Actualizar.TodoCorrecto == false)
                                {
                                    transaccion_SQL.Dispose();
                                    return mdl_INTERNO_ValorDevuelto_Modelo_Actualizar;
                                }

                                //BORRAR
                                if (mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo != null &&
                                    mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.MYT_Previsiones != null &&
                                    mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.MYT_Previsiones.Count > 0)
                                {
                                    //Borrar las previsiones fuera del listado
                                    var arr_Previsionesids = lst_MYT_Previsiones.Select(x => x.id).ToArray();
                                    var var_PrevisionesABorrar = mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.MYT_Previsiones.Where(m => !arr_Previsionesids.Contains(m.id) && m.idInstalacionLineaContrato.Equals(mdl_INTERNO_MYT_InstalacionesLineasContratos_Listado_Modelo.id));
                                    if (var_PrevisionesABorrar != null && var_PrevisionesABorrar.Count() > 0)
                                    {
                                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_PrevisionesBorrar = null;
                                        foreach (MYT_Previsiones mdl_MYT_Previsiones in var_PrevisionesABorrar.ToList())
                                        {
                                            mdl_INTERNO_ValorDevuelto_Modelo_PrevisionesBorrar = g_obj_MYT_Previsiones_Datos.Borrar(mdl_MYT_Previsiones.id);
                                            if (mdl_INTERNO_ValorDevuelto_Modelo_PrevisionesBorrar.TodoCorrecto == false)
                                            {
                                                transaccion_SQL.Dispose();
                                                return mdl_INTERNO_ValorDevuelto_Modelo_PrevisionesBorrar;
                                            }
                                        }
                                    }
                                }

                                //ACTUALIZAR
                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Previsiones = null;
                                foreach (MYT_Previsiones mdl_MYT_Previsiones in lst_MYT_Previsiones)
                                {
                                    mdl_INTERNO_ValorDevuelto_Modelo_Previsiones = g_obj_MYT_Previsiones_Datos.Grabar(mdl_MYT_Previsiones);
                                    if (!mdl_INTERNO_ValorDevuelto_Modelo_Previsiones.TodoCorrecto)
                                    {
                                        transaccion_SQL.Dispose();
                                        return mdl_INTERNO_ValorDevuelto_Modelo_Previsiones;
                                    }
                                }

                                //Termino Transaccion
                                transaccion_SQL.Complete();
                                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_InstalacionLinea_Controladora) + "/" + nameof(Calcular_Previsiones_Final));
                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                                transaccion_SQL.Dispose();
                            }
                        }
                        #endregion
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InstalacionLinea_Controladora) + "/" + nameof(Calcular_Previsiones_Final));
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion
    }
}
