using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Formularios;
using Exferia_General;
using Exferia_KairosPRO._2_Datos;
using Exferia_KairosPRO._4_Vistas.ControlesPersonalizados_DentroPaneles;
using Exferia_KairosPRO.General;
using Exferia_KairosPRO_EF;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Transactions;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_KairosPRO._4_Vistas.Controladoras
{
    public class P_Jornada_Controladora
    {
        #region Variables Generales
        private P_Jornada g_frm_P_Jornada = null;//Variables 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 KRS_JornadasCabecera_Datos g_obj_KRS_JornadasCabecera_Datos = new KRS_JornadasCabecera_Datos();
        private KRS_JornadasLinea_Datos g_obj_KRS_JornadasLinea_Datos = new KRS_JornadasLinea_Datos();
        private KRS_JornadasPausas_Datos g_obj_KRS_JornadasPausas_Datos = new KRS_JornadasPausas_Datos();
        private KRS_PausasTipos_Datos g_obj_KRS_PausasTipos_Datos = new KRS_PausasTipos_Datos();

        private KRS_JornadasCabecera g_mdl_KRS_JornadasCabecera = null;//Modelo de los datos cargados

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

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

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

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

        //Variables para la Creacion de la Lineas ############
        private int g_int_NumeroLineas = 0;
        private int g_int_PosicionY_Lineas = 5;
        private List<int> g_Array_ListadoLineas = new List<int>();
        private List<INTERNO_ComboBox_Modelo> g_lst_Tipos_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();

        //Variables para la Creacion de la Pausas ############
        private int g_int_NumeroPausas = 0;
        private int g_int_PosicionY_Pausas = 5;
        private List<int> g_Array_ListadoPausas = new List<int>();
        private List<INTERNO_ComboBox_Modelo> g_lst_Pausas_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();
        #endregion

        #region Constructor
        public P_Jornada_Controladora(P_Jornada _frm_P_Jornadas)
        {
            g_frm_P_Jornada = _frm_P_Jornadas;

            //Cargar Listado para los Combos
            CargarCombos();

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Cargar datos de los comboBox
        private void CargarCombos()
        {
            try
            {
                //Tipojornada
                g_lst_Tipos_INTERNO_ComboBox_Modelo = ListadosEstaticos.Devolver_Tipos_JornadasLinea();

                //Tipopausa
                List<KRS_PausasTipos> lst_KRS_PausasTipos = g_obj_KRS_PausasTipos_Datos.Obtener_ModeloListado();
                if (lst_KRS_PausasTipos != null && lst_KRS_PausasTipos.Count > 0)
                {
                    foreach (KRS_PausasTipos mdl_KRS_PausasTipos in lst_KRS_PausasTipos)
                    {
                        g_lst_Pausas_INTERNO_ComboBox_Modelo.Add(new INTERNO_ComboBox_Modelo(mdl_KRS_PausasTipos.id.ToString(), mdl_KRS_PausasTipos.descripcion, null));
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Jornada_Controladora) + "/" + nameof(CargarCombos));
            }
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //Codigo
            g_frm_P_Jornada.Exferia_TextBox_Codigo.Text = "";

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

            //TiempoTeorico
            g_frm_P_Jornada.Exferia_TextBox_TiempoTeorico.Text = "";

            //HoraCambioDia
            g_frm_P_Jornada.Exferia_TextBox_HoraCambioDia.Text = "00:00";

            //Colores
            CambiarColores(Color.White,Color.Black);

            //JornadasLinea
            g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Controls.Clear();
            g_int_NumeroLineas = 0;
            g_int_PosicionY_Lineas = 5;
            g_Array_ListadoLineas.Clear();

            //Pausas
            g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Controls.Clear();
            g_int_NumeroPausas = 0;
            g_int_PosicionY_Pausas = 5;
            g_Array_ListadoPausas.Clear();

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

            g_mdl_KRS_JornadasCabecera = null;
        }
        #endregion

        #region Busar 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 = Compartidas_Datos_KairosPRO.Buscar_CodigoSiguiente(nameof(KRS_JornadasCabecera),
                                                                                    nameof(KRS_JornadasCabecera.codigo),
                                                                                    true,
                                                                                    g_frm_P_Jornada.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);
                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_Jornada.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_Jornada.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_Jornada_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 Comprobacion de cambios, para  grabar o no antes de salir o cambiar de registro
        public bool ComprobarCambios()
        {
            if (g_frm_P_Jornada.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(false);

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

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        #endregion

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

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

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

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

                    //Vaciar
                    VaciarDatos();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_ProgressChanged);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = true;
                }

                g_bol_Cancelar_TareaAsincrona_CargarDatos = false;

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Jornada.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_Jornada_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_Jornada.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
                else
                {
                    if (g_mdl_KRS_JornadasCabecera != null)
                    {
                        //Crear las Lineas
                        if (g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea != null && g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea.Count() > 0)
                        {
                            foreach (KRS_JornadasLinea mdl_KRS_JornadasLinea in g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea)
                            {
                                ((BackgroundWorker)sender).ReportProgress(1, mdl_KRS_JornadasLinea);
                            }
                        }

                        //Crear las Pausas
                        if (g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas != null && g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas.Count() > 0)
                        {
                            foreach (KRS_JornadasPausas mdl_KRS_JornadasPausas in g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas)
                            {
                                ((BackgroundWorker)sender).ReportProgress(2, mdl_KRS_JornadasPausas);
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Jornada_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_Jornada_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
            {
                if (e.ProgressPercentage == 1)
                {
                    Crear_Linea((KRS_JornadasLinea)e.UserState);
                }
                else if (e.ProgressPercentage == 2)
                {
                    Crear_Pausas((KRS_JornadasPausas)e.UserState);
                }
            }
            catch (Exception ex)
            {

                Control_Errores.Errores_Log("", ex, nameof(P_Jornada_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_Jornada.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)//Compruebo si el mensaje no esta vacio
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                        g_frm_P_Jornada.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Jornada_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Jornada.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                g_frm_P_Jornada.Exferia_TextBox_Codigo.Focus();
            }
        }

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

            try
            {
                g_mdl_KRS_JornadasCabecera = g_obj_KRS_JornadasCabecera_Datos.Obtener(_lng_id);

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

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

                    //codigo
                    g_frm_P_Jornada.Exferia_TextBox_Codigo.Text = g_mdl_KRS_JornadasCabecera.codigo;

                    //descripcion
                    g_frm_P_Jornada.Exferia_TextBox_Descripcion.Text = g_mdl_KRS_JornadasCabecera.descripcion;

                    //Colores
                    CambiarColores(ColorTranslator.FromHtml(g_mdl_KRS_JornadasCabecera.colorFondo), ColorTranslator.FromHtml(g_mdl_KRS_JornadasCabecera.colorLetra));

                    //tiempoTeorico
                    g_frm_P_Jornada.Exferia_TextBox_TiempoTeorico.Text = Funciones_KairosPRO.Convertir_TimeSpan_String(g_mdl_KRS_JornadasCabecera.tiempoTeorico);

                    //horaCambioDia
                    g_frm_P_Jornada.Exferia_TextBox_HoraCambioDia.Text = Funciones_KairosPRO.Convertir_TimeSpan_String(g_mdl_KRS_JornadasCabecera.horaCambioDia);

                    //Se Cancelo la carga.............................
                    if (g_bol_Cancelar_TareaAsincrona_CargarDatos)
                    {
                        return true;
                    }
                    //.................................................

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

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

                            // codigo
                            if (str_campo.Equals(nameof(g_mdl_KRS_JornadasCabecera.codigo)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_KRS_JornadasCabecera.codigo;
                            }
                            // descripcion
                            else if (str_campo.Equals(nameof(g_mdl_KRS_JornadasCabecera.descripcion)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_KRS_JornadasCabecera.descripcion;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Jornada.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_Jornada.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

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

            return bol_ValorDevuelto;
        }
        #endregion

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

                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_Jornada.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_Jornada.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Jornada_Controladora) + "/" + nameof(GrabarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_GrabarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Validar Primero
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo = GrabarDatos_Final();
                }
                else
                {
                    mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Jornada_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Jornada.Enabled = true;

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

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

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

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

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

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

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

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

                //La TiempoTeorico no puede estar vacia
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Jornada.Exferia_TextBox_TiempoTeorico.Text.Trim().Length < 2))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Jornada.Exferia_Label_TiempoTeorico.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Jornada.Exferia_TextBox_TiempoTeorico;
                }
                //TiempoTeorico Comprobamos que tiene el formato correcto
                else if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && ((int.Parse(g_frm_P_Jornada.Exferia_TextBox_TiempoTeorico.Text.Substring(0,2)) > 23) || (int.Parse(g_frm_P_Jornada.Exferia_TextBox_TiempoTeorico.Text.Substring(3, 2)) > 59)))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_INCORRECTO(g_frm_P_Jornada.Exferia_Label_TiempoTeorico.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Jornada.Exferia_TextBox_TiempoTeorico;
                }

                //La HoraCambioDia no puede estar vacia
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Jornada.Exferia_TextBox_HoraCambioDia.Text.Trim().Length < 2))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Jornada.Exferia_Label_HoraCambioDia.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Jornada.Exferia_TextBox_HoraCambioDia;
                }
                //HoraCambioDia Comprobamos que tiene el formato correcto
                else if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && ((int.Parse(g_frm_P_Jornada.Exferia_TextBox_HoraCambioDia.Text.Substring(0, 2)) > 23) || (int.Parse(g_frm_P_Jornada.Exferia_TextBox_HoraCambioDia.Text.Substring(3, 2)) > 59)))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_INCORRECTO(g_frm_P_Jornada.Exferia_Label_HoraCambioDia.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Jornada.Exferia_TextBox_HoraCambioDia;
                }

                //Validar los JornadasLinea
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    CTU_P_Jornada_Lineas obj_CTU_P_Jornada_Lineas = null;
                    int int_Contador_Lineas = 0;
                    foreach (int int_ValorLinea in g_Array_ListadoLineas)
                    {
                        obj_CTU_P_Jornada_Lineas = (CTU_P_Jornada_Lineas)g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Controls.Find("controlusuario_CTU_P_Jornada_Lineas" + int_ValorLinea, true).FirstOrDefault();

                        if (obj_CTU_P_Jornada_Lineas != null)
                        {
                            //La Hora no puede estar vacia
                            if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Hora.Trim().Length < 2))
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Hora_TITULO);
                                mdl_ValorDevuelto_Modelo.Objeto = obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Control_Hora;
                            }
                            //Hora Comprobamos que tiene el formato correcto
                            else if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && ((int.Parse(obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Hora.Substring(0, 2)) > 23) || (int.Parse(obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Hora.Substring(3, 2)) > 59)))
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_INCORRECTO(obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Hora_TITULO);
                                mdl_ValorDevuelto_Modelo.Objeto = obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Control_Hora;
                            }

                            //Tiene que tener un Tipo seleccionado
                            if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                            {
                                if (obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Tipo == -1)
                                {
                                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_NOSELECCIONADO(obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Tipo_TITULO);
                                    mdl_ValorDevuelto_Modelo.Objeto = obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Control_Tipo;
                                    break;
                                }
                            }


                            int_Contador_Lineas += 1;
                            //....................................................................................................................................
                        }
                    }
                }

                //Validar los Pausas
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    CTU_P_Jornada_Pausas obj_CTU_P_Jornada_Pausas = null;
                    int int_Contador_Lineas = 0;
                    List<long> lst_PausasTipos = new List<long>();
                    foreach (int int_ValorLinea in g_Array_ListadoLineas)
                    {
                        obj_CTU_P_Jornada_Pausas = (CTU_P_Jornada_Pausas)g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Controls.Find("controlusuario_CTU_P_Jornada_Pausas" + int_ValorLinea, true).FirstOrDefault();

                        if (obj_CTU_P_Jornada_Pausas != null)
                        {
                            //Tiene que tener un Tipo seleccionado
                            if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                            {
                                if (obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_NumeroPausas == -1)
                                {
                                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_NOSELECCIONADO(obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_NumeroPausas_TITULO);
                                    mdl_ValorDevuelto_Modelo.Objeto = obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Tipo_OBJETO;
                                    break;
                                }
                            }

                            //La Duracion tiene que ser mayor q 0
                            if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Duracion==0))
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CERO(obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Duracion_TITULO);
                                mdl_ValorDevuelto_Modelo.Objeto = obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Duracion_OBJETO;
                                break;
                            }

                            //El numero de pausas tiene que ser mayor q 0
                            if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_NumeroPausas==0))
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CERO(obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_NumeroPausas_TITULO);
                                mdl_ValorDevuelto_Modelo.Objeto = obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_NumeroPausas_OBJETO;
                                break;
                            }

                            //Ver que no exista ya el tipo de pausa
                            if (lst_PausasTipos.Count>0 && lst_PausasTipos.Exists(m=>m.Equals(obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Tipo)))
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_YAEXISTE(obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Tipo_Texto);
                                mdl_ValorDevuelto_Modelo.Objeto = obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Tipo_OBJETO;
                                break;
                            }

                            lst_PausasTipos.Add(obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Tipo);

                            int_Contador_Lineas += 1;
                            //....................................................................................................................................
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Jornada_Controladora) + "/" + nameof(ValidarDatos));

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

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

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    KRS_JornadasCabecera mdl_KRS_JornadasCabecera = new KRS_JornadasCabecera();
                    mdl_KRS_JornadasCabecera.id = g_mdl_KRS_JornadasCabecera != null ? g_mdl_KRS_JornadasCabecera.id : -1;

                    //codigo
                    mdl_KRS_JornadasCabecera.codigo = g_frm_P_Jornada.Exferia_TextBox_Codigo.Text.Trim();

                    //descripcion
                    mdl_KRS_JornadasCabecera.descripcion = g_frm_P_Jornada.Exferia_TextBox_Descripcion.Text.Trim();

                    //tiempoTeorico
                    mdl_KRS_JornadasCabecera.tiempoTeorico = TimeSpan.ParseExact(g_frm_P_Jornada.Exferia_TextBox_TiempoTeorico.Text, "hh\\:mm", CultureInfo.InvariantCulture);

                    //horaCambioDia
                    mdl_KRS_JornadasCabecera.horaCambioDia = TimeSpan.ParseExact(g_frm_P_Jornada.Exferia_TextBox_HoraCambioDia.Text, "hh\\:mm", CultureInfo.InvariantCulture);

                    //colorFondo
                    mdl_KRS_JornadasCabecera.colorFondo = Funciones.Convertir_Color_Hexadecimal(g_frm_P_Jornada.Label_Ejemplo.BackColor);

                    //colorLetra
                    mdl_KRS_JornadasCabecera.colorLetra = Funciones.Convertir_Color_Hexadecimal(g_frm_P_Jornada.Label_Ejemplo.ForeColor);

                    //Se graba el modelo ya relleno
                    mdl_ValorDevuelto_Modelo = g_obj_KRS_JornadasCabecera_Datos.Grabar(mdl_KRS_JornadasCabecera);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        long lng_idJornadaCabecera = mdl_ValorDevuelto_Modelo.Id;

                        #region KRS_JornadasLinea
                        List<KRS_JornadasLinea> lst_KRS_JornadasLinea = Obtener_Lineas_Panel(lng_idJornadaCabecera);

                        //Borrar las jornadaslineas que estan Fuera del listado
                        if (g_mdl_KRS_JornadasCabecera != null && g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea != null && g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea.Count() > 0)
                        {
                            var arr_Lineasids = lst_KRS_JornadasLinea.Select(x => x.id).ToArray();
                            var var_LineasBorrar = g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea.Where(m => !arr_Lineasids.Contains(m.id) && m.idJornadaCabecera.Equals(lng_idJornadaCabecera));
                            if (var_LineasBorrar != null && var_LineasBorrar.Count() > 0)
                            {
                                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_LineasBorrar = null;
                                foreach (KRS_JornadasLinea mdl_KRS_JornadasLinea in var_LineasBorrar.ToList())
                                {
                                    mdl_ValorDevuelto_Modelo_LineasBorrar = g_obj_KRS_JornadasLinea_Datos.Borrar(mdl_KRS_JornadasLinea.id);
                                    if (mdl_ValorDevuelto_Modelo_LineasBorrar.TodoCorrecto == false)
                                    {
                                        transaccion_SQL.Dispose();
                                        return mdl_ValorDevuelto_Modelo_LineasBorrar;
                                    }
                                }
                            }
                        }

                        //Actualizar Lineas
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Lineas = null;
                        foreach (KRS_JornadasLinea mdl_KRS_JornadasLinea in lst_KRS_JornadasLinea)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo_Lineas = g_obj_KRS_JornadasLinea_Datos.Grabar(mdl_KRS_JornadasLinea);
                            if (!mdl_INTERNO_ValorDevuelto_Modelo_Lineas.TodoCorrecto)
                            {
                                transaccion_SQL.Dispose();
                                return mdl_INTERNO_ValorDevuelto_Modelo_Lineas;
                            }
                        }
                        #endregion

                        #region KRS_JornadasPausas
                        List<KRS_JornadasPausas> lst_KRS_JornadasPausas = Obtener_Pausas_Panel(lng_idJornadaCabecera);

                        //Borrar las jornadaspausas que estan Fuera del listado
                        if (g_mdl_KRS_JornadasCabecera != null && g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas != null && g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas.Count() > 0)
                        {
                            var arr_Pausasids = lst_KRS_JornadasPausas.Select(x => x.id).ToArray();
                            var var_PausasBorrar = g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas.Where(m => !arr_Pausasids.Contains(m.id) && m.idJornadaCabecera.Equals(lng_idJornadaCabecera));
                            if (var_PausasBorrar != null && var_PausasBorrar.Count() > 0)
                            {
                                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_PausasBorrar = null;
                                foreach (KRS_JornadasPausas mdl_KRS_JornadasPausas in var_PausasBorrar.ToList())
                                {
                                    mdl_ValorDevuelto_Modelo_PausasBorrar = g_obj_KRS_JornadasPausas_Datos.Borrar(mdl_KRS_JornadasPausas.id);
                                    if (mdl_ValorDevuelto_Modelo_PausasBorrar.TodoCorrecto == false)
                                    {
                                        transaccion_SQL.Dispose();
                                        return mdl_ValorDevuelto_Modelo_PausasBorrar;
                                    }
                                }
                            }
                        }

                        //Actualizar Pausas
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Pausas = null;
                        foreach (KRS_JornadasPausas mdl_KRS_JornadasPausas in lst_KRS_JornadasPausas)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo_Pausas = g_obj_KRS_JornadasPausas_Datos.Grabar(mdl_KRS_JornadasPausas);
                            if (!mdl_INTERNO_ValorDevuelto_Modelo_Pausas.TodoCorrecto)
                            {
                                transaccion_SQL.Dispose();
                                return mdl_INTERNO_ValorDevuelto_Modelo_Pausas;
                            }
                        }
                        #endregion


                        //termino Transaccion
                        transaccion_SQL.Complete();
                    }

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

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Datos
        public void BorrarDatos(bool _bol_VolverAlListado)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_bol_BorrarDatos_VolverListado = _bol_VolverAlListado;
                    g_frm_P_Jornada.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_Jornada.Enabled = true;

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

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

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

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

            try
            {


                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

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

                    if (g_bol_BorrarDatos_VolverListado)
                    {
                        g_frm_P_Jornada.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_Jornada.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Jornada_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_KRS_JornadasCabecera_Datos.Borrar(g_mdl_KRS_JornadasCabecera != null ? g_mdl_KRS_JornadasCabecera.id : -1);

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

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Lineas
        public void Crear_Linea(KRS_JornadasLinea _mdl_KRS_JornadasLinea)
        {
            //Añadir control creado en subproceso en el hilo principal ...............................................
            if (g_frm_P_Jornada.InvokeRequired) // Line #1
            {
                g_frm_P_Jornada.Invoke((MethodInvoker)delegate
                {
                    Crear_Linea(_mdl_KRS_JornadasLinea);
                });
                return;
            }

            g_int_NumeroLineas += 1;

            //Calcular tamaño el panel #######################
            int int_AnchoPanelprincipal = 545;
            if (g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Controls != null && g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Controls.Count > 0 && g_Array_ListadoLineas.Count > 0)
            {
                int_AnchoPanelprincipal = g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Controls.Find("controlusuario_CTU_P_Jornada_Lineas" + g_Array_ListadoLineas[0], false).FirstOrDefault().Width;
            }

            //Clonar el listado
            List<INTERNO_ComboBox_Modelo> lst_Tipos_INTERNO_ComboBox_Modelo = Funciones.Clonar(g_lst_Tipos_INTERNO_ComboBox_Modelo);

            //Objeto Personalizado
            CTU_P_Jornada_Lineas controlusuario_CTU_P_Jornada_Lineas = new CTU_P_Jornada_Lineas(g_frm_P_Jornada, g_int_NumeroLineas, lst_Tipos_INTERNO_ComboBox_Modelo, _mdl_KRS_JornadasLinea);
            controlusuario_CTU_P_Jornada_Lineas.Name = "controlusuario_CTU_P_Jornada_Lineas" + g_int_NumeroLineas;
            controlusuario_CTU_P_Jornada_Lineas.Size = new Size(int_AnchoPanelprincipal, 23);
            controlusuario_CTU_P_Jornada_Lineas.Location = new Point(5, g_int_PosicionY_Lineas);
            controlusuario_CTU_P_Jornada_Lineas.Anchor = (AnchorStyles.Top | AnchorStyles.Left);
            controlusuario_CTU_P_Jornada_Lineas.Boton_CTU_P_Jornada_Lineas_Delete_Click += new System.EventHandler<INTERNO_EventArgs>(Boton_P_Jornada_Lineas_Delete_Click);

            //Scroll Al Inicio
            g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.AutoScrollPosition = new Point(Math.Abs(g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.AutoScrollPosition.X), 0);

            //Añadir al panel Principal
            g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Controls.Add(controlusuario_CTU_P_Jornada_Lineas);
            g_Array_ListadoLineas.Add(g_int_NumeroLineas);

            //Scroll Al Final
            g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.AutoScrollPosition = new Point(Math.Abs(g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.AutoScrollPosition.X), Math.Abs(g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.DisplayRectangle.Height - g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Height));

            //Sumar Posicion
            g_int_PosicionY_Lineas += controlusuario_CTU_P_Jornada_Lineas.Height + 5;

            if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_KRS_JORNADASLINEA, g_frm_P_Jornada.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, false)) == false)
            {
                //Bloqueo los Controles
                SoloLectura.Empezar(controlusuario_CTU_P_Jornada_Lineas, true);
            }

        }

        private void Boton_P_Jornada_Lineas_Delete_Click(object sender, INTERNO_EventArgs e)
        {
            if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_KRS_JORNADASLINEA, g_frm_P_Jornada.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Borrar, true)))
            {
                g_frm_P_Jornada.P_Base_SeModificoDatosPantalla = true;

                CTU_P_Jornada_Lineas obj_CTU_P_Jornada_Lineas_Borrar = (CTU_P_Jornada_Lineas)g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Controls.Find("controlusuario_CTU_P_Jornada_Lineas" + e.NumeroObjeto, false).FirstOrDefault();
                if (obj_CTU_P_Jornada_Lineas_Borrar != null)
                {
                    obj_CTU_P_Jornada_Lineas_Borrar.Dispose();

                    g_Array_ListadoLineas.Remove(e.NumeroObjeto);

                    CTU_P_Jornada_Lineas obj_aCambiar;
                    foreach (int valoresaModificarposicion in g_Array_ListadoLineas.Where(m => m > e.NumeroObjeto).ToList())
                    {
                        obj_aCambiar = (CTU_P_Jornada_Lineas)g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Controls.Find("controlusuario_CTU_P_Jornada_Lineas" + valoresaModificarposicion, false).FirstOrDefault();

                        if (obj_aCambiar != null)
                        {
                            obj_aCambiar.Location = new Point(obj_aCambiar.Location.X, obj_aCambiar.Location.Y - (23 + 5));
                        }
                    }

                    g_int_PosicionY_Lineas -= (23 + 5);
                }
            }
        }

        private List<KRS_JornadasLinea> Obtener_Lineas_Panel(long _lng_idJornadaCabecera)
        {
            List<KRS_JornadasLinea> lst_KRS_JornadasLinea = new List<KRS_JornadasLinea>();
            CTU_P_Jornada_Lineas obj_CTU_P_Jornada_Lineas = null;

            int int_Orden = 1;

            foreach (int int_ValorLinea in g_Array_ListadoLineas)
            {
                KRS_JornadasLinea mdl_KRS_JornadasLinea = new KRS_JornadasLinea();

                obj_CTU_P_Jornada_Lineas = (CTU_P_Jornada_Lineas)g_frm_P_Jornada.Exferia_Panel_Degradado_Lineas.Controls.Find("controlusuario_CTU_P_Jornada_Lineas" + int_ValorLinea, true).FirstOrDefault();

                if (obj_CTU_P_Jornada_Lineas != null)
                {
                    // id
                    mdl_KRS_JornadasLinea.id = obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_id;

                    // idJornadaCabecera
                    mdl_KRS_JornadasLinea.idJornadaCabecera = _lng_idJornadaCabecera;

                    // codigoCliente
                    mdl_KRS_JornadasLinea.codigoCliente = Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO;

                    // hora
                    mdl_KRS_JornadasLinea.hora = TimeSpan.ParseExact(obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Hora, "hh\\:mm", CultureInfo.InvariantCulture); 

                    // tipo
                    mdl_KRS_JornadasLinea.tipo = obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_Tipo;

                    // SumaTiempo
                    mdl_KRS_JornadasLinea.sumaTiempo = obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_SumaTiempo;

                    // Salta Dia
                    mdl_KRS_JornadasLinea.saltaDia = obj_CTU_P_Jornada_Lineas.CTU_P_Jornada_Lineas_SaltaDia;

                    //Orden 
                    mdl_KRS_JornadasLinea.orden = int_Orden;

                    //Añadir al Listado
                    lst_KRS_JornadasLinea.Add(mdl_KRS_JornadasLinea);

                    int_Orden += 1;
                }
            }

            return lst_KRS_JornadasLinea;
        }

        #endregion

        #region Pausas
        public void Crear_Pausas(KRS_JornadasPausas _mdl_KRS_JornadasPausas)
        {
            //Añadir control creado en subproceso en el hilo principal ...............................................
            if (g_frm_P_Jornada.InvokeRequired) // Line #1
            {
                g_frm_P_Jornada.Invoke((MethodInvoker)delegate
                {
                    Crear_Pausas(_mdl_KRS_JornadasPausas);
                });
                return;
            }

            g_int_NumeroPausas += 1;

            //Calcular tamaño el panel #######################
            int int_AnchoPanelprincipal = 570;
            if (g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Controls != null && g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Controls.Count > 0 && g_Array_ListadoPausas.Count > 0)
            {
                int_AnchoPanelprincipal = g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Controls.Find("controlusuario_CTU_P_Jornada_Pausas" + g_Array_ListadoPausas[0], false).FirstOrDefault().Width;
            }

            //Clonar el listado
            List<INTERNO_ComboBox_Modelo> lst_Pausas_INTERNO_ComboBox_Modelo = Funciones.Clonar(g_lst_Pausas_INTERNO_ComboBox_Modelo);

            //Objeto Personalizado
            CTU_P_Jornada_Pausas controlusuario_CTU_P_Jornada_Pausas = new CTU_P_Jornada_Pausas(g_frm_P_Jornada, g_int_NumeroPausas, lst_Pausas_INTERNO_ComboBox_Modelo, _mdl_KRS_JornadasPausas);
            controlusuario_CTU_P_Jornada_Pausas.Name = "controlusuario_CTU_P_Jornada_Pausas" + g_int_NumeroPausas;
            controlusuario_CTU_P_Jornada_Pausas.Size = new Size(int_AnchoPanelprincipal, 23);
            controlusuario_CTU_P_Jornada_Pausas.Location = new Point(5, g_int_PosicionY_Pausas);
            controlusuario_CTU_P_Jornada_Pausas.Anchor = (AnchorStyles.Top | AnchorStyles.Left);
            controlusuario_CTU_P_Jornada_Pausas.Boton_CTU_P_Jornada_Pausas_Delete_Click += new System.EventHandler<INTERNO_EventArgs>(Boton_P_Jornada_Pausas_Delete_Click);

            //Scroll Al Inicio
            g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.AutoScrollPosition = new Point(Math.Abs(g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.AutoScrollPosition.X), 0);

            //Añadir al panel Principal
            g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Controls.Add(controlusuario_CTU_P_Jornada_Pausas);
            g_Array_ListadoPausas.Add(g_int_NumeroPausas);

            //Scroll Al Final
            g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.AutoScrollPosition = new Point(Math.Abs(g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.AutoScrollPosition.X), Math.Abs(g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.DisplayRectangle.Height - g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Height));

            //Sumar Posicion
            g_int_PosicionY_Pausas += controlusuario_CTU_P_Jornada_Pausas.Height + 5;

        }

        private void Boton_P_Jornada_Pausas_Delete_Click(object sender, INTERNO_EventArgs e)
        {
            g_frm_P_Jornada.P_Base_SeModificoDatosPantalla = true;

            CTU_P_Jornada_Pausas obj_CTU_P_Jornada_Pausas_Borrar = (CTU_P_Jornada_Pausas)g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Controls.Find("controlusuario_CTU_P_Jornada_Pausas" + e.NumeroObjeto, false).FirstOrDefault();
            if (obj_CTU_P_Jornada_Pausas_Borrar != null)
            {
                obj_CTU_P_Jornada_Pausas_Borrar.Dispose();

                g_Array_ListadoPausas.Remove(e.NumeroObjeto);

                CTU_P_Jornada_Pausas obj_aCambiar;
                foreach (int valoresaModificarposicion in g_Array_ListadoPausas.Where(m => m > e.NumeroObjeto).ToList())
                {
                    obj_aCambiar = (CTU_P_Jornada_Pausas)g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Controls.Find("controlusuario_CTU_P_Jornada_Pausas" + valoresaModificarposicion, false).FirstOrDefault();

                    if (obj_aCambiar != null)
                    {
                        obj_aCambiar.Location = new Point(obj_aCambiar.Location.X, obj_aCambiar.Location.Y - (23 + 5));
                    }
                }

                g_int_PosicionY_Pausas -= (23 + 5);
            }
        }

        private List<KRS_JornadasPausas> Obtener_Pausas_Panel(long _lng_idJornadaCabecera)
        {
            List<KRS_JornadasPausas> lst_KRS_JornadasPausas = new List<KRS_JornadasPausas>();
            CTU_P_Jornada_Pausas obj_CTU_P_Jornada_Pausas = null;

            foreach (int int_ValorPausas in g_Array_ListadoPausas)
            {
                KRS_JornadasPausas mdl_KRS_JornadasPausas = new KRS_JornadasPausas();

                obj_CTU_P_Jornada_Pausas = (CTU_P_Jornada_Pausas)g_frm_P_Jornada.Exferia_Panel_Degradado_Pausas.Controls.Find("controlusuario_CTU_P_Jornada_Pausas" + int_ValorPausas, true).FirstOrDefault();

                if (obj_CTU_P_Jornada_Pausas != null)
                {
                    
                    // id
                    mdl_KRS_JornadasPausas.id = obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_id;

                    // idJornadaCabecera
                    mdl_KRS_JornadasPausas.idJornadaCabecera = _lng_idJornadaCabecera;

                    // codigoCliente
                    mdl_KRS_JornadasPausas.codigoCliente = Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO;

                    // idPausaTipo
                    mdl_KRS_JornadasPausas.idPausaTipo = obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Tipo;

                    // duracionMinutos
                    mdl_KRS_JornadasPausas.duracionMinutos = obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_Duracion;

                    // numeroPausas
                    mdl_KRS_JornadasPausas.numeroPausas = obj_CTU_P_Jornada_Pausas.CTU_P_Jornada_Pausas_NumeroPausas;

                    //Añadir al Listado
                    lst_KRS_JornadasPausas.Add(mdl_KRS_JornadasPausas);
                }
            }

            return lst_KRS_JornadasPausas;
        }

        #endregion

        public void CambiarColores(Color _clr_Fondo, Color _clr_Letra)
        {
            g_frm_P_Jornada.Button_ColorFondo.BackColor = _clr_Fondo;
            g_frm_P_Jornada.Button_ColorLetra.BackColor = _clr_Letra;

            g_frm_P_Jornada.Label_Ejemplo.BackColor = _clr_Fondo;
            g_frm_P_Jornada.Label_Ejemplo.ForeColor = _clr_Letra;
        }
    }
}
