using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Generales;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Formularios;
using Exferia_KairosPRO._1_Modelos;
using Exferia_KairosPRO._2_Datos;
using Exferia_KairosPRO._4_Vistas.ControlesPersonalizados_DentroPaneles;
using Exferia_KairosPRO.General;
using Exferia_KairosPRO_EF;
using GMap.NET;
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;

namespace Exferia_KairosPRO._4_Vistas.Controladoras
{
    public class P_Pausas_Detalle_Controladora
    {
        #region Variables Generales
        private P_Pausas_Detalle g_frm_P_Pausas_Detalle;
        private PE_Esperando g_frm_PE_Esperando;

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

        //Modelos necesarios
        public KRSS_Pausas g_mdl_KRSS_Pausas;
        KRSS_Pausas g_mdl_KRSS_Pausas_Final = new KRSS_Pausas();
        private KRSS_PausasFotos g_mdl_KRSS_PausasFotos;
        public KRS_JornadasCabecera g_mdl_KRS_JornadasCabecera;

        //Clases de negocio necesarias
        private KRSS_PausasFotos_Datos g_obj_KRSS_PausasFotos_Datos = new KRSS_PausasFotos_Datos();
        private KRSS_Pausas_Datos g_obj_KRSS_Pausas_Datos = new KRSS_Pausas_Datos();
        private KRS_Empleados_Datos g_obj_KRS_Empleados_Datos = new KRS_Empleados_Datos();
        private KRS_PausasTipos_Datos g_obj_KRS_PausasTipos_Datos = new KRS_PausasTipos_Datos();

        //Array de imagen
        public byte[] g_arr_Foto_Pausa;
        public Image g_img_Foto_Pausa;

        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;
        public DateTime g_dtt_Dia_De_Hoy;

        //Tarea Asincrona de carga del mapa
        private BackgroundWorker g_obj_TareaAsincrona_CargarMapa;

        //Variables para la creacion de las lineas de la jornada
        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>();

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        private bool g_bol_GrabarDatos_TerminoCorrectamente = true;
        public long g_lng_IdEmpleado;
        private KRS_Empleados g_mdl_KRS_Empleados = null;

        //Listados Estaticos para cargar y buscar en los combos
        private List<INTERNO_ComboBox_Modelo> g_lst_InicioFin_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();
        private List<INTERNO_ComboBox_Modelo> g_lst_TipoDispositivo_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();

        private DateTime g_dtt_FechaActual;

        #endregion

        #region Constructor
        public P_Pausas_Detalle_Controladora(P_Pausas_Detalle _frm_P_Pausas_Detalle,DateTime _dtt_FechaActual, KRS_JornadasCabecera _mdl_KRS_JornadasCabecera,long _lng_IdEmpleado)
        {
            g_frm_P_Pausas_Detalle = _frm_P_Pausas_Detalle;

            g_mdl_KRS_JornadasCabecera = _mdl_KRS_JornadasCabecera;
            g_lng_IdEmpleado = _lng_IdEmpleado;
            g_dtt_Dia_De_Hoy = _dtt_FechaActual;

            g_mdl_KRS_Empleados = g_obj_KRS_Empleados_Datos.Obtener_Modelo_Por_Id(g_lng_IdEmpleado,Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO,false,false);

            //Si la fecha Actual coincide con la fecha del registro se pone datetime.now
            if (_dtt_FechaActual.ToString("dd/MM/yyyy").Equals(DateTime.Now.ToString("dd/MM/yyyy")))
            {
                g_dtt_FechaActual = DateTime.Now;
            }
            //Sino se pone la fecha del registro y la hora 23:59:59
            else
            {
                if (g_mdl_KRS_JornadasCabecera!=null)
                {
                    if (g_mdl_KRS_JornadasCabecera.horaCambioDia.Hours==0 &&
                        g_mdl_KRS_JornadasCabecera.horaCambioDia.Minutes==0)
                    {
                        g_dtt_FechaActual = new DateTime(_dtt_FechaActual.Year,
                                                         _dtt_FechaActual.Month,
                                                         _dtt_FechaActual.Day,
                                                         23,
                                                         59,
                                                         59);
                    }
                    else
                    {
                        g_dtt_FechaActual = new DateTime(_dtt_FechaActual.Year,
                                                        _dtt_FechaActual.Month,
                                                        _dtt_FechaActual.Day,
                                                        g_mdl_KRS_JornadasCabecera.horaCambioDia.Hours,
                                                        g_mdl_KRS_JornadasCabecera.horaCambioDia.Minutes,
                                                        0);
                    }


                    //Si tiene lineas con salto de dias, sumarlos
                    if (g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea!=null &&
                        g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea.Count>0)
                    {
                        int int_SaltosdeDias = g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea.Where(m=>m.saltaDia!=null && m.saltaDia.Value).Count();

                        g_dtt_FechaActual=g_dtt_FechaActual.AddDays(int_SaltosdeDias);
                    }

                    
                }
                else
                {
                    g_dtt_FechaActual = new DateTime(_dtt_FechaActual.Year,
                                                     _dtt_FechaActual.Month,
                                                     _dtt_FechaActual.Day,
                                                     23, 
                                                     59, 
                                                     59);
                }
            }

            DateTime dtt = DateTime.SpecifyKind(g_dtt_FechaActual, DateTimeKind.Unspecified);
            g_dtt_FechaActual = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dtt, g_mdl_KRS_Empleados.usoHorario, TimeZoneInfo.Utc.Id);

            
            //Cargar Listado para los Combos
            CargarCombos();

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Cargar datos de los comboBox
        private void CargarCombos()
        {
            //Inicio/Fin
            g_lst_InicioFin_INTERNO_ComboBox_Modelo = ListadosEstaticos.Devolver_InicioFin();
            if (g_lst_InicioFin_INTERNO_ComboBox_Modelo != null)
            {
                g_frm_P_Pausas_Detalle.Exferia_comboBox_InicioFin.Items.Clear();
                g_frm_P_Pausas_Detalle.Exferia_comboBox_InicioFin.DataSource = g_lst_InicioFin_INTERNO_ComboBox_Modelo;
                g_frm_P_Pausas_Detalle.Exferia_comboBox_InicioFin.SelectedIndex = 0;
            }

            //Tipo de pausa
            g_lst_Pausas_INTERNO_ComboBox_Modelo.Add(new INTERNO_ComboBox_Modelo("-1", "", null));
            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));
                }
            }
            g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo.Items.Clear();
            g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo.DataSource = g_lst_Pausas_INTERNO_ComboBox_Modelo;
            g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo.SelectedIndex = 0;

            //Tipo de Dispositivo
            g_lst_TipoDispositivo_INTERNO_ComboBox_Modelo = ListadosEstaticos.Devolver_TipoDispositivo();
            g_frm_P_Pausas_Detalle.Exferia_comboBox_TipoDispositivo.Items.Clear();
            g_frm_P_Pausas_Detalle.Exferia_comboBox_TipoDispositivo.DataSource = g_lst_TipoDispositivo_INTERNO_ComboBox_Modelo;
            g_frm_P_Pausas_Detalle.Exferia_comboBox_TipoDispositivo.SelectedIndex = 0;

        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //Observaciones
            g_frm_P_Pausas_Detalle.Exferia_TextBox_Observaciones.Text = "";

            //Hora
            g_frm_P_Pausas_Detalle.Exferia_TextBox_Hora.Text = "";

            //Panel
            g_frm_P_Pausas_Detalle.Exferia_Panel_Degradado_Pausas.Controls.Clear();

            //Tipo
            g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo.SelectedIndex = 0;

            //TipoDispositivo
            g_frm_P_Pausas_Detalle.Exferia_comboBox_TipoDispositivo.SelectedIndex = 0;

            //JornadasPausas
            g_int_NumeroPausas = 0;
            g_int_PosicionY_Pausas = 5;
            g_Array_ListadoPausas.Clear();

            //Anulado
            g_frm_P_Pausas_Detalle.Exferia_checkBox_Anulado.Checked = false;

            //Terminal
            g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Id = -1;
            g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Codigo = "";
            g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Descripcion = "";
            g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_FechaBorrado = null;

            //DispositivoModelo
            g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_FechaBorrado = null;

            //Foto
            g_arr_Foto_Pausa = null;
            g_img_Foto_Pausa = null;
            g_frm_P_Pausas_Detalle.PictureBox_FotoPausa.Image = null;
            g_frm_P_Pausas_Detalle.PictureBox_FotoPausa.Tag = "";

            //Fecha
            g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa.Exferia_FechaSeleccion_Fecha = "";

        }
        #endregion

        #region Comprobacion de cambios, para  grabar o no antes de salir o cambiar de registro
        public bool ComprobarCambios()
        {
            if (g_frm_P_Pausas_Detalle.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(true);

                    //Te quedas esperando a qu etermine 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(long _lng_id)
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nad ahasta que termine
                g_frm_P_Pausas_Detalle.Enabled = false;

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

                //Si la tarea asincrona esata 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 = true;
                }

                //Vaciar
                VaciarDatos();
                g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa.Exferia_FechaSeleccion_Fecha = g_dtt_Dia_De_Hoy.ToString("dd/MM/yyyy");

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Pausas_Detalle.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_Pausas_Detalle_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
            {
                long lng_id = (long)e.Argument;

                //Cargar Valores
                if (CargarDatos(lng_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)
                    {
                        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(1, mdl_KRS_JornadasPausas);
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_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_Incidencias_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_Pausas((KRS_JornadasPausas)e.UserState);
                }
            }
            catch (Exception ex)
            {

                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_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_Pausas_Detalle.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_Pausas_Detalle.Salir_P_Base();
                    }
                }
                else
                {
                    //TipoDispositivo
                    if (g_mdl_KRSS_Pausas!=null && g_mdl_KRSS_Pausas.tipoDispositivo != null)
                    {
                        g_frm_P_Pausas_Detalle.Exferia_comboBox_TipoDispositivo.SelectedItem = g_lst_TipoDispositivo_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_KRSS_Pausas.tipoDispositivo.Value.ToString())).FirstOrDefault();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Pausas_Detalle.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa.Focus();
            }
        }

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

            try
            {
                g_mdl_KRSS_Pausas = (KRSS_Pausas)g_obj_KRSS_Pausas_Datos.Obtener(_lng_id);

                if (g_mdl_KRSS_Pausas != null)
                {
                    //Foto
                    g_mdl_KRSS_PausasFotos = g_obj_KRSS_PausasFotos_Datos.Obtener(_lng_id);

                    //observaciones
                    g_frm_P_Pausas_Detalle.Exferia_TextBox_Observaciones.Text = g_mdl_KRSS_Pausas.observaciones;

                    //fechaHora
                    g_frm_P_Pausas_Detalle.Exferia_TextBox_Hora.Text = g_mdl_KRSS_Pausas.fechaHora.ToString("HH:mm");

                    //anulado
                    if (g_mdl_KRSS_Pausas.anulado != null)
                    {
                        g_frm_P_Pausas_Detalle.Exferia_checkBox_Anulado.Checked = true;
                    }

                    //EntradaSalida
                    g_frm_P_Pausas_Detalle.Exferia_comboBox_InicioFin.SelectedItem = g_lst_InicioFin_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_KRSS_Pausas.entradaSalida)).FirstOrDefault();

                    //Fecha_Seleccion
                    g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa.Exferia_FechaSeleccion_Fecha = g_mdl_KRSS_Pausas.fechaHora.ToString("dd/MM/yyyy");

                    //DispositivoModelo
                    g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Id = g_mdl_KRSS_Pausas.KRSS_DispositivosModelo.id;
                    g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Codigo = g_mdl_KRSS_Pausas.KRSS_DispositivosModelo.marca;
                    g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_KRSS_Pausas.KRSS_DispositivosModelo.modelo;
                    g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_KRSS_Pausas.KRSS_DispositivosModelo.fechaBorrado;

                    //Terminal
                    if (g_mdl_KRSS_Pausas.KRS_Terminales !=null)
                    {
                        g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Id = g_mdl_KRSS_Pausas.KRS_Terminales.id;
                        g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Codigo = g_mdl_KRSS_Pausas.KRS_Terminales.codigo;
                        g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Descripcion = g_mdl_KRSS_Pausas.KRS_Terminales.descripcion;
                        g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_FechaBorrado = g_mdl_KRSS_Pausas.KRS_Terminales.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Id = -1;
                        g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_FechaBorrado = null;
                    }

                    //PausasTipo
                    g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo.SelectedItem = g_lst_Pausas_INTERNO_ComboBox_Modelo.Where(m=>m.Identificador.Equals(g_mdl_KRSS_Pausas.idPausaTipo.ToString())).FirstOrDefault();

                    //KRSS_PausasFotos
                    if (g_mdl_KRSS_PausasFotos != null && g_mdl_KRSS_PausasFotos.foto != null && g_mdl_KRSS_PausasFotos.foto.Count() > 2)
                    {
                        g_arr_Foto_Pausa = g_mdl_KRSS_PausasFotos.foto;
                        g_img_Foto_Pausa = Funciones.Convertir_Arraybytes_Image(g_mdl_KRSS_PausasFotos.foto);

                        if (g_img_Foto_Pausa != null)
                        {
                            Funciones.PictureBox_RedimencionarImagen(g_frm_P_Pausas_Detalle.PictureBox_FotoPausa, g_img_Foto_Pausa);
                        }
                    }

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region CargarMapa
        public void RecargarMapa()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Pausas_Detalle.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_CargarMapa != null)
                {

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

                    //Vaciar
                    VaciarDatos();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarMapa = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarMapa.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarMapa_DoWork);
                    g_obj_TareaAsincrona_CargarMapa.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarMapa_ProgressChanged);
                    g_obj_TareaAsincrona_CargarMapa.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarMapa_Completed);
                    g_obj_TareaAsincrona_CargarMapa.WorkerReportsProgress = true;
                }


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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Pausas_Detalle.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_Pausas_Detalle_Controladora) + "/" + nameof(RecargarMapa), true);
            }
        }
        private void TareaAsincrona_CargarMapa_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                if (CargarMapa() == 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_Pausas_Detalle_Controladora) + "/" + nameof(TareaAsincrona_CargarMapa_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_Pausas_Detalle_Controladora) + "/" + nameof(TareaAsincrona_CargarMapa_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_CargarMapa_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_Controladora) + "/" + nameof(TareaAsincrona_CargarMapa_ProgressChanged));
            }
        }
        private void TareaAsincrona_CargarMapa_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_Pausas_Detalle.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)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_Pausas_Detalle.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_Controladora) + "/" + nameof(TareaAsincrona_CargarMapa_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Pausas_Detalle.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa.Focus();
            }
        }

        public bool CargarMapa()
        {
            bool bol_ValorDevuelto = true;

            try
            {
                if (g_mdl_KRSS_Pausas != null)
                {
                    //Carga del Mapa
                    INTERNO_DatosMapa_Modelo mdl_INTERNO_DatosMapa_Modelo = new INTERNO_DatosMapa_Modelo();

                    if (g_mdl_KRSS_Pausas.gps_Proveedor != null && g_mdl_KRSS_Pausas.gps_Proveedor.Trim().Length > 0)
                    {
                        mdl_INTERNO_DatosMapa_Modelo.TipoProveedor = Convert.ToInt32(g_mdl_KRSS_Pausas.gps_Proveedor);
                    }

                    if (g_mdl_KRSS_Pausas.gps_Posicion_Latitud != null && g_mdl_KRSS_Pausas.gps_Posicion_Latitud.Trim().Length > 0 &&
                        g_mdl_KRSS_Pausas.gps_Posicion_Longitud != null && g_mdl_KRSS_Pausas.gps_Posicion_Longitud.Trim().Length > 0)
                    {
                        mdl_INTERNO_DatosMapa_Modelo.Posicion_Punto = new PointLatLng(double.Parse(g_mdl_KRSS_Pausas.gps_Posicion_Latitud.Replace(".", ",")), double.Parse(g_mdl_KRSS_Pausas.gps_Posicion_Longitud.Replace(".", ",")));
                    }

                    mdl_INTERNO_DatosMapa_Modelo.TextoToolTip = Variables_KairosPRO.G_STR_PAUSAS_DETALLE_TOOLTIP_MAPA;
                    mdl_INTERNO_DatosMapa_Modelo.Zoom = Variables_KairosPRO.G_INT_FICHAJEPAUSA_DETALLE_ZOOM_MAPA;

                    List<INTERNO_DatosMapa_Modelo> lst_INTERNO_DatosMapa_Modelo = new List<INTERNO_DatosMapa_Modelo>();
                    lst_INTERNO_DatosMapa_Modelo.Add(mdl_INTERNO_DatosMapa_Modelo);

                    g_frm_P_Pausas_Detalle.CTU_Mapa.ActualizarMapa(lst_INTERNO_DatosMapa_Modelo);
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_Controladora) + "/" + nameof(CargarMapa));
                bol_ValorDevuelto = false;
            }

            return bol_ValorDevuelto;
        }
        #endregion

        #region Jornada pausas
        public void Crear_Pausas(KRS_JornadasPausas _mdl_KRS_JornadasPausas)
        {
            //añadir control Creadp del subproceso en el hilo principal...........
            if (g_frm_P_Pausas_Detalle.InvokeRequired)
            {
                g_frm_P_Pausas_Detalle.Invoke((MethodInvoker)delegate
                {
                    Crear_Pausas(_mdl_KRS_JornadasPausas);
                });
                return;
            }

            g_int_NumeroPausas += 1;

            //Calcular el tamaño del panel ###########
            int int_AnchoPanelprincipal = 545;
            if (g_frm_P_Pausas_Detalle.Exferia_Panel_Degradado_Pausas.Controls != null && g_frm_P_Pausas_Detalle.Exferia_Panel_Degradado_Pausas.Controls.Count > 0 && g_Array_ListadoPausas.Count > 0)
            {
                int_AnchoPanelprincipal = g_frm_P_Pausas_Detalle.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_Tipos_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_Pausas_Detalle, g_int_NumeroPausas, lst_Tipos_INTERNO_ComboBox_Modelo, _mdl_KRS_JornadasPausas,false);
            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);

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

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

            SoloLectura.Empezar(controlusuario_CTU_P_Jornada_Pausas,true);
        }
        #endregion

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

                g_frm_P_Pausas_Detalle.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_Pausas_Detalle.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_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();

                    //Verificaion de las pausas del dia
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        Verificacion_Pausas obj_Verificacion_Pausas = new Verificacion_Pausas();

                        if (g_mdl_KRS_Empleados != null)
                        {
                            obj_Verificacion_Pausas.Proceso(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO, g_dtt_FechaActual, g_mdl_KRS_Empleados, true,g_frm_P_Pausas_Detalle.P_Base_ValoresGenerales.lng_idEmpresa);
                        }
                    }
                }
                else
                {
                    mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_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_Pausas_Detalle_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_Pausas_Detalle.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_Pausas_Detalle, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    if (g_frm_P_Pausas_Detalle.P_Base_PantallaOrigen != null)
                    {
                        g_mdl_KRSS_Pausas_Final.id = mdl_ValorDevuelto_Modelo_Resultado.Id;
                        g_frm_P_Pausas_Detalle.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(Variables.G_STR_OPCION_KRSS_PAUSAS, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                        g_frm_P_Pausas_Detalle.Close();
                    }
                }

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Pausas_Detalle.Salir_P_Base();
            }
        }

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

            try
            { 
                //La Fecha no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_FechaHora_Respuesta = Funciones.Fecha_Validacion(g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa.Exferia_FechaSeleccion_Fecha.Trim(' ','/'));

                    if (int_FechaHora_Respuesta==1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa;
                    }
                    else if (int_FechaHora_Respuesta == 2)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa;
                    }
                }

                //La hora no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_FechaHora_Respuesta = Funciones.Hora_Validacion(g_frm_P_Pausas_Detalle.Exferia_TextBox_Hora.Text);

                    if (int_FechaHora_Respuesta == 1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Pausas_Detalle.Exferia_Label_Hora.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pausas_Detalle.Exferia_TextBox_Hora;
                    }
                    else if (int_FechaHora_Respuesta == 2)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_Pausas_Detalle.Exferia_Label_Hora.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pausas_Detalle.Exferia_TextBox_Hora;
                    }
                }

                //Tipo de pausa no puede ser vacio
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    (
                        g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo.SelectedItem==null ||
                        (
                            g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo.SelectedItem != null &&
                            ((INTERNO_ComboBox_Modelo)g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo.SelectedItem).Identificador=="-1"
                        )
                     )
                    )
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Pausas_Detalle.Exferia_Label_Tipo.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo;
                }

                //DispositivoModelo no puede ser nulo
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                    g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                //DisPositivoModelo validar que es correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                //Terminal validar que es correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pausas_Detalle_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
                {
                    g_mdl_KRSS_Pausas_Final = new KRSS_Pausas();

                    //id
                    g_mdl_KRSS_Pausas_Final.id = g_mdl_KRSS_Pausas != null ? g_mdl_KRSS_Pausas.id : -1;

                    //observaciones
                    g_mdl_KRSS_Pausas_Final.observaciones = g_frm_P_Pausas_Detalle.Exferia_TextBox_Observaciones.Text.Trim();

                    //idPausaTipo
                    g_mdl_KRSS_Pausas_Final.idPausaTipo = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_Pausas_Detalle.Exferia_ComboBox_Tipo.SelectedItem).Identificador);

                    //anulado
                    if (g_frm_P_Pausas_Detalle.Exferia_checkBox_Anulado.Checked)
                    {
                        g_mdl_KRSS_Pausas_Final.anulado = DateTime.Now;
                    }
                    else
                    {
                        g_mdl_KRSS_Pausas_Final.anulado = null;
                    }

                    //fechaHora
                    DateTime fechaHora = DateTime.ParseExact(g_frm_P_Pausas_Detalle.Exferia_FechaSeleccion_Pausa.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                    TimeSpan obj_TimeSpan = TimeSpan.ParseExact(g_frm_P_Pausas_Detalle.Exferia_TextBox_Hora.Text, "hh\\:mm", CultureInfo.InvariantCulture);
                    g_mdl_KRSS_Pausas_Final.fechaHora = new DateTime(fechaHora.Year, fechaHora.Month, fechaHora.Day, obj_TimeSpan.Hours, obj_TimeSpan.Minutes, 0);

                    //entradaSalida
                    g_mdl_KRSS_Pausas_Final.entradaSalida = ((INTERNO_ComboBox_Modelo)g_frm_P_Pausas_Detalle.Exferia_comboBox_InicioFin.SelectedItem).Identificador;

                    //DispositivoModelo
                    g_mdl_KRSS_Pausas_Final.idDispositivoModelo = g_frm_P_Pausas_Detalle.Exferia_F3_DispositivoModelo.Exferia_F3_SoloSeleccion_Id;

                    //tipoDispositivo
                    string str_TipoDispositivo = ((INTERNO_ComboBox_Modelo)g_frm_P_Pausas_Detalle.Exferia_comboBox_TipoDispositivo.SelectedItem).Identificador;
                    if (str_TipoDispositivo == "-1")
                    {
                        g_mdl_KRSS_Pausas_Final.tipoDispositivo = null;
                    }
                    else
                    {
                        g_mdl_KRSS_Pausas_Final.tipoDispositivo = int.Parse(str_TipoDispositivo);

                        //Terminal
                        if (g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Visible)
                        {
                            if (g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Id != -1)
                            {
                                g_mdl_KRSS_Pausas_Final.idTerminal = g_frm_P_Pausas_Detalle.Exferia_F3_Terminal.Exferia_F3_Id;
                            }
                            else
                            {
                                g_mdl_KRSS_Pausas_Final.idTerminal = null;
                            }
                        }
                    }

                    //Si el usuario no ha cargado el tab del mapa y guarda, lo cargamos para poder obtener los puntos
                    if (g_frm_P_Pausas_Detalle.CTU_Mapa.DatosMapa_Puntos().Count == 0)
                    {
                        CargarMapa(); 
                    }

                    if (g_frm_P_Pausas_Detalle.CTU_Mapa.DatosMapa_Puntos().Count > 0 && !g_frm_P_Pausas_Detalle.CTU_Mapa.DatosMapa_Puntos()[0].Posicion_Punto.IsEmpty)
                    {
                        g_mdl_KRSS_Pausas_Final.gps_Posicion_Latitud = g_frm_P_Pausas_Detalle.CTU_Mapa.DatosMapa_Puntos()[0].Posicion_Punto.Lat.ToString();
                        g_mdl_KRSS_Pausas_Final.gps_Posicion_Longitud = g_frm_P_Pausas_Detalle.CTU_Mapa.DatosMapa_Puntos()[0].Posicion_Punto.Lng.ToString();
                    }
                    else
                    {
                        g_mdl_KRSS_Pausas_Final.gps_Posicion_Latitud = "";
                        g_mdl_KRSS_Pausas_Final.gps_Posicion_Longitud = "";
                    }

                    //gps_Proveedor
                    int int_Tipoproveedor = g_frm_P_Pausas_Detalle.CTU_Mapa.g_int_gps_TipoproveedorSeleccionado;
                    g_mdl_KRSS_Pausas_Final.gps_Proveedor = int_Tipoproveedor.ToString();
                
                    //gps_Altitud
                    g_mdl_KRSS_Pausas_Final.gps_Altitud = "0.0";

                    //gps_FechaHora
                    g_mdl_KRSS_Pausas_Final.gps_FechaHora = DateTime.Now;
                    
                    //modificado
                    g_mdl_KRSS_Pausas_Final.modificado = DateTime.Now;

                    //codigoCliente
                    g_mdl_KRSS_Pausas_Final.codigoCliente = Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO;

                    //idEmpleado
                    g_mdl_KRSS_Pausas_Final.idEmpleado = g_lng_IdEmpleado;

                    //idEmpresa
                    g_mdl_KRSS_Pausas_Final.idEmpresa = g_frm_P_Pausas_Detalle.P_Base_ValoresGenerales.lng_idEmpresa;

                    //validado
                    g_mdl_KRSS_Pausas_Final.validado = 0;

                    //Grabamos el modelo ya relleno
                    mdl_ValorDevuelto_Modelo = g_obj_KRSS_Pausas_Datos.Grabar(g_mdl_KRSS_Pausas_Final);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        #region Foto
                        INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Pausa_Foto = new INTERNO_ValorDevuelto_Modelo();
                        mdl_ValorDevuelto_Modelo_Pausa_Foto.TodoCorrecto = true;
                        
                        if (g_img_Foto_Pausa != null)
                        {
                            KRSS_PausasFotos mdl_KRSS_PausasFotos = new KRSS_PausasFotos();
                            mdl_KRSS_PausasFotos.id = g_mdl_KRSS_PausasFotos != null ? g_mdl_KRSS_PausasFotos.id : -1;
                            mdl_KRSS_PausasFotos.idPausa = mdl_ValorDevuelto_Modelo.Id;
                            mdl_KRSS_PausasFotos.foto = Funciones.Convertir_Image_Arraybytes(g_img_Foto_Pausa);

                            //Grabamos el modelo ya relleno
                            mdl_ValorDevuelto_Modelo_Pausa_Foto = g_obj_KRSS_PausasFotos_Datos.Grabar(mdl_KRSS_PausasFotos);
                        }
                        //Si no hubiera imagen y anteriormente tuviera imagen, hay que borrar el registro
                        else if (g_mdl_KRSS_PausasFotos != null)
                        {
                            mdl_ValorDevuelto_Modelo_Pausa_Foto = g_obj_KRSS_PausasFotos_Datos.Borrar(g_mdl_KRSS_PausasFotos.id);
                        }

                        if (mdl_ValorDevuelto_Modelo_Pausa_Foto.TodoCorrecto == false)
                        {
                            //Termini transaccion
                            transaccion_SQL.Dispose();
                            return mdl_ValorDevuelto_Modelo_Pausa_Foto;
                        }
                        #endregion

                        //Termmio Transaccion
                        transaccion_SQL.Complete();
                    }
                }
                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_Pausas_Detalle_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

    }
}
