using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_General;
using Exferia_KairosPRO._4_Vistas.Controladoras;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;
using System.Linq;
using Exferia_Formularios;
using System.Globalization;
using Exferia_KairosPRO._1_Modelos;
using Exferia_KairosPRO_EF;
using System.Reflection;

namespace Exferia_KairosPRO._4_Vistas
{
    public partial class P_SolicitudesAusenciasProgramadas_Supervisor : Exferia_Formularios.P_Base_Mantenimientos
    {
        #region Variables General
        private P_SolicitudesAusenciasProgramadas_Supervisor_Controladora g_obj_Controladora;

        private bool g_bol_ConstructorPantalla_Terminado_Correctamente = true;
        public PRV_OpcionesDetalle g_mdl_PRV_OpcionesDetalle = null;

        internal List<INTERNO_Permisos_Modelo> g_lst_INTERNO_Permisos_Modelo = null;

        private INTERNO_ConfiguracionPantalla_Modelo g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES = null;
        #endregion

        #region Objetos en pantalla
        //Exferia_Button
        internal Exferia_Button Exferia_Button_Solicitudes_Filtros { get { return ex_btn_P_SolicitudesAusencias_Solicitudes_Filtros; } }

        //Exferia_DataGridView
        internal Exferia_DataGridView Exferia_DataGridView_Calendario { get { return ex_dgv_P_SolicitudesAusencias_Calendario; } }
        internal Exferia_DataGridView Exferia_DataGridView_Departamentos { get { return ex_dgv_P_SolicitudesAusencias_Departamentos; } }
        internal Exferia_DataGridView Exferia_DataGridView_Solicitudes { get { return ex_dgv_P_SolicitudesAusencias_Solicitudes; } }

        //Exferia_FechaSeleccion
        internal Exferia_FechaSeleccion Exferia_FechaSeleccion_Desde { get { return ex_usc_P_SolicitudesAusencias_Desde; } }
        internal Exferia_FechaSeleccion Exferia_FechaSeleccion_Hasta { get { return ex_usc_P_SolicitudesAusencias_Hasta; } }

        //Panel
        internal Panel Panel_Calendario_Leyenda { get { return pnl_P_SolicitudesAusencias_Calendario_Leyenda; } }

        #endregion

        #region Constructor
        public P_SolicitudesAusenciasProgramadas_Supervisor(INTERNO_ValoresGenerales_Modelo _mdl_INTERNO_ValoresGenerales_Modelo, DateTime _dtt_FechaTrabajo, PRV_OpcionesDetalle _mdl_PRV_OpcionesDetalle)
        {
            InitializeComponent();

            Repintar.Empezar(this);

            CheckForIllegalCrossThreadCalls = false;

            //Comprobamos que el codigo cliente exista y este bien
            if (Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO.Equals(-1))
            {
                //Tendriamos que avisar y no dejar abrir la pantalla
                Mensajes.MostrarMensaje(Mensajes.G_STR_LICENCIA_VALIDACIONES_LICENCIANOESTAACTIVA);
                Salir_P_Base();
            }

            //Empresa seleccionada y fecha de trabajo ....................................................
            P_Base_ValoresGenerales = _mdl_INTERNO_ValoresGenerales_Modelo;
            P_Base_FechaTrabajo = _dtt_FechaTrabajo;

            //Instanciar Controladora
            g_obj_Controladora = new P_SolicitudesAusenciasProgramadas_Supervisor_Controladora(this);

            //Datos de Opciones detalle
            g_mdl_PRV_OpcionesDetalle = _mdl_PRV_OpcionesDetalle;

            //Buscar los Permisos
            g_lst_INTERNO_Permisos_Modelo = Datos_Generales.Permisos_Buscar(g_mdl_PRV_OpcionesDetalle.opcion);

            //Titulo de la Pantalla ............................................................................
            P_Base_TituloPantalla = _mdl_PRV_OpcionesDetalle.descripcion_TituloMantenimiento;

            if (Variables.G_DCT_CONFIGURACIONPANTALLA != null && Variables.G_DCT_CONFIGURACIONPANTALLA.Count > 0)
            {
                //Solicitudes
                if (Variables.G_DCT_CONFIGURACIONPANTALLA.ContainsKey(g_obj_Controladora.g_obj_ABS_Listado_SOLICITUDES.NOMBRELISTADO_ALMACENARCONFIGURACION()))
                {
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES = Variables.G_DCT_CONFIGURACIONPANTALLA[g_obj_Controladora.g_obj_ABS_Listado_SOLICITUDES.NOMBRELISTADO_ALMACENARCONFIGURACION()];
                }
            }

            try
            {
                //Label con Empresa Seleccionada
                if (P_Base_ValoresGenerales != null)
                {
                    try
                    {
                        P_Base_Mantenimientos_InformacionEmpresaSeleccionada = P_Base_ValoresGenerales.str_Empresa_Descripcion + " - " +
                                                                "(" + P_Base_FechaTrabajo.ToString("dd/MM/yyyy") + ")";
                    }
                    catch (Exception ex)
                    {
                        //No se muestra mensaje pero se guarda en el log
                        Control_Errores.Errores_Log("", ex, nameof(P_SolicitudesAusenciasProgramadas_Supervisor) + "/" + nameof(P_SolicitudesAusenciasProgramadas_Supervisor));
                    }
                }
                //..................................................................................................................................

                //Bloquear pantalla hasta que termine la carga por defecto.....
                Enabled = false;
                //.............................................................
            }
            catch (Control_Errores)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
            catch (Exception ex)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;

                Control_Errores.Errores_Log("", ex, nameof(P_SolicitudesAusenciasProgramadas_Supervisor) + "/" + nameof(P_SolicitudesAusenciasProgramadas_Supervisor));
            }
            finally
            {
                //Bloquear pantalla hasta que termine la carga por defecto .....
                Enabled = true;
                //.............................................................
            }

        }
        #endregion

        #region Inicio de pantalla
        private void P_SolicitudesAusenciasProgramadas_Supervisor_Load(object sender, EventArgs e)
        {
            try
            {
                #region SOLICITUDES

                //Crear Columnas Listado
                CrearColumnas_Listado_Solicitudes();
                #endregion
            }
            catch (Exception ex)
            {
                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log("", ex, nameof(P_SolicitudesAusenciasProgramadas_Supervisor) + "/" + nameof(P_SolicitudesAusenciasProgramadas_Supervisor_Load));

                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
        }

        private void P_SolicitudesAusencias_Shown(object sender, EventArgs e)
        {
            try
            {
                if (g_bol_ConstructorPantalla_Terminado_Correctamente)
                {
                    g_obj_Controladora.Datos_PorDefecto();

                    g_obj_Controladora.CargaInicial();

                    Exferia_Button_Solicitudes_Filtros.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_FILTROS_TIENE;
                    Imagenes.Asignar_Imagen(Exferia_Button_Solicitudes_Filtros);

                }
                else
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                    Salir_P_Base();
                }
            }
            catch (Control_Errores)
            {
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                Salir_P_Base();
            }
            catch (Exception ex)
            {
                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log("", ex, nameof(P_SolicitudesAusenciasProgramadas_Supervisor) + "/" + nameof(P_SolicitudesAusencias_Shown));

                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                Salir_P_Base();
            }
        }

        #endregion

        #region Procedimientos heredados de la clase P_Base
        //Se utiliza para actualizar los listados dentro de la pantalla, sin tener que guardar
        public override void P_Base_ActualizarRegistro_ConObjeto(object _obj, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                if (_obj != null)
                {
                    if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR) ||
                        _enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                    {
                        List<object> lst_obj = (List<object>)_obj;
                        string obj_Opcion = (string)lst_obj[0];

                        //Solicitudes actualizadas
                        if (obj_Opcion.Equals(Variables.G_STR_OPCION_KRS_SOLICITUDESAUSENCIASPROGRAMADAS))
                        {
                            g_obj_Controladora.Solicitudes_Actualizar_Registro(null, (long)lst_obj[1]);
                        }
                    }
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_ELIMINAR))
                    {
                        List<object> lst_obj = (List<object>)_obj;
                        string obj_Opcion = (string)lst_obj[0];

                    }
                }
            }
            catch (Exception)
            {}
        }
        #endregion

        #region Fechas Desde y Hasta
        private string g_str_FechaDesde_Inicial = "";
        private void ex_usc_P_SolicitudesAusencias_Desde_Exferia_FechaSeleccion_GotFocus(object sender, EventArgs e)
        {
            g_str_FechaDesde_Inicial = ex_usc_P_SolicitudesAusencias_Desde.Exferia_FechaSeleccion_Fecha;
        }
        private void ex_usc_P_SolicitudesAusencias_Desde_Exferia_FechaSeleccion_LostFocus(object sender, EventArgs e)
        {
            string str_FechaDesde_Final = ex_usc_P_SolicitudesAusencias_Desde.Exferia_FechaSeleccion_Fecha;

            if (g_str_FechaDesde_Inicial != str_FechaDesde_Final)
            {
                g_obj_Controladora.Calendario_CargaInicial ();
            }
        }

        private string g_str_FechaHasta_Inicial = "";
        private void ex_usc_P_SolicitudesAusencias_Hasta_Exferia_FechaSeleccion_GotFocus(object sender, EventArgs e)
        {
            g_str_FechaHasta_Inicial = ex_usc_P_SolicitudesAusencias_Hasta.Exferia_FechaSeleccion_Fecha;
        }
        private void ex_usc_P_SolicitudesAusencias_Hasta_Exferia_FechaSeleccion_LostFocus(object sender, EventArgs e)
        {
            string str_FechaHasta_Final = ex_usc_P_SolicitudesAusencias_Hasta.Exferia_FechaSeleccion_Fecha;

            if (g_str_FechaHasta_Inicial != str_FechaHasta_Final)
            {
                g_obj_Controladora.Calendario_CargaInicial();
            }
        }

        #endregion

        #region Departamentos
        private void ex_dgv_P_SolicitudesAusencias_Departamentos_SelectionChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora != null && g_obj_Controladora.g_bol_Cargando_Departamentos == false)
            {
                try
                {
                    g_obj_Controladora.g_lng_idDepartamento_Seleccionado = null;
                    if (ex_dgv_P_SolicitudesAusencias_Departamentos.Rows.Count>0 && 
                        ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows!=null &&
                        ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows.Count>0)
                    {
                        g_obj_Controladora.g_lng_idDepartamento_Seleccionado =   long.Parse(ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows[0].Cells[0].Value.ToString().Trim());
                    }

                    
                    g_obj_Controladora.Calendario_RecargarValores();
                }
                catch(Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_SolicitudesAusenciasProgramadas_Supervisor) + "/" + nameof(ex_dgv_P_SolicitudesAusencias_Departamentos_SelectionChanged));

                }

               
            }
        }
        #endregion

        #region Empresa
        private void ex_chk_P_SolicitudesAusencias_Empresa_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (g_obj_Controladora != null &&
                    g_obj_Controladora.g_bol_Cargando_Departamentos == false)
                {
                    if (ex_chk_P_SolicitudesAusencias_Empresa.Checked)
                    {
                        g_obj_Controladora.g_lng_idDepartamento_Seleccionado = null;

                        //Bloquear DataGridView Departamentos
                        ex_dgv_P_SolicitudesAusencias_Departamentos.Visible = false;
                    }
                    else
                    {
                        //Desbloquear DataGridView Departamentos
                        ex_dgv_P_SolicitudesAusencias_Departamentos.Visible = true;

                        //Seleccionar Departamento
                        g_obj_Controladora.g_lng_idDepartamento_Seleccionado = null;
                        if (ex_dgv_P_SolicitudesAusencias_Departamentos.Rows.Count > 0 &&
                            ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows != null &&
                            ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows.Count > 0)
                        {
                            g_obj_Controladora.g_lng_idDepartamento_Seleccionado = long.Parse(ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows[0].Cells[0].Value.ToString().Trim());
                        }
                    }

                    g_obj_Controladora.Calendario_RecargarValores();

                    while (g_obj_Controladora.g_obj_TareaAsincrona_CalendarioRecargar.IsBusy)
                        Application.DoEvents();

                    ex_dgv_P_SolicitudesAusencias_Calendario.Visible=false;
                    ex_dgv_P_SolicitudesAusencias_Calendario.Visible = true;
                }                    
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_SolicitudesAusenciasProgramadas_Supervisor) + "/" + nameof(ex_chk_P_SolicitudesAusencias_Empresa_CheckedChanged));
            }
        }
        #endregion

        #region Calendario
        private void ex_dgv_P_SolicitudesAusencias_Calendario_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.ColumnIndex > -1 & e.RowIndex > -1)
            {
                if (ex_dgv_P_SolicitudesAusencias_Calendario[e.ColumnIndex, e.RowIndex].Tag != null &&
                    ex_dgv_P_SolicitudesAusencias_Calendario[e.ColumnIndex, e.RowIndex].Tag.ToString().Equals("1"))
                {
                    Rectangle rct_marco = new Rectangle(e.CellBounds.X + 1,
                                                  e.CellBounds.Y + 1,
                                                  e.CellBounds.Width - 2,
                                                  e.CellBounds.Height - 2);

                    e.Graphics.FillRectangle(new SolidBrush(e.CellStyle.BackColor), e.CellBounds);

                    //Pintar rectangulo
                    e.Graphics.DrawRectangle(new Pen(Colores.G_COLOR_FONDO_SOLICITUDESPENDIENTES, 2), rct_marco);

                    if (e.Value != null)
                    {
                        e.Graphics.DrawString((String)e.Value, 
                                                e.CellStyle.Font,
                                                 new SolidBrush(e.CellStyle.ForeColor), 
                                                e.CellBounds.X + 2,
                                                e.CellBounds.Y + 2, 
                                                StringFormat.GenericDefault);
                    }

                    e.Handled = true;
                }
            }
        }

        private void ex_dgv_P_SolicitudesAusencias_Calendario_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                //Dia
                if (ex_dgv_P_SolicitudesAusencias_Calendario[e.ColumnIndex,e.RowIndex].Value !=null &&
                    ex_dgv_P_SolicitudesAusencias_Calendario[e.ColumnIndex, e.RowIndex].Value.ToString().Length>0)
                {
                    if (Funciones.IsNumeric(ex_dgv_P_SolicitudesAusencias_Calendario[e.ColumnIndex, e.RowIndex].Value.ToString()))
                    {
                        DateTime dtt_FechaSeleccionada = new DateTime(int.Parse(ex_dgv_P_SolicitudesAusencias_Calendario[0, e.RowIndex].Value.ToString()),int.Parse(ex_dgv_P_SolicitudesAusencias_Calendario[1, e.RowIndex].Value.ToString()),int.Parse(ex_dgv_P_SolicitudesAusencias_Calendario[e.ColumnIndex, e.RowIndex].Value.ToString()));

                        string str_Empresa = "";
                        string str_Departamento = "";
                        long? lng_idDepartamento= null;
                        if (ex_chk_P_SolicitudesAusencias_Empresa.Checked)
                        {
                            str_Empresa = P_Base_ValoresGenerales.str_Empresa_Descripcion;
                        }
                        else
                        {
                            if (ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows!=null &&
                                ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows.Count>0)
                            {
                                lng_idDepartamento = long.Parse(ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows[0].Cells[nameof(KRS_Departamentos.id)].Value.ToString());
                                str_Departamento = ex_dgv_P_SolicitudesAusencias_Departamentos.SelectedRows[0].Cells[nameof(KRS_Departamentos.descripcion)].Value.ToString();
                            }
                        }

                        //Mostrar pantalla emergente
                        PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia frm_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia = new PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia(dtt_FechaSeleccionada, 
                                                                                                                                                                                                                        str_Empresa, 
                                                                                                                                                                                                                        str_Departamento,
                                                                                                                                                                                                                        lng_idDepartamento,
                                                                                                                                                                                                                        g_obj_Controladora.g_lst_KRS_DiasFestivos,
                                                                                                                                                                                                                        g_obj_Controladora.g_lst_INTERNO_KRS_Empleados_Modelo,
                                                                                                                                                                                                                        g_obj_Controladora.g_lst_KRS_AusenciasProgramadas,
                                                                                                                                                                                                                        g_obj_Controladora.g_lst_KRS_PresenciasProgramadas,
                                                                                                                                                                                                                        g_obj_Controladora.g_lst_INTERNO_AUX_PerfilesLineaSolicitudesAsucencias_Modelo);
                        frm_PE_SolicitudesAusenciasProgramadas_Supervisor_InformacionDia.ShowDialog();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_SolicitudesAusenciasProgramadas_Supervisor) + "/" + nameof(ex_dgv_P_SolicitudesAusencias_Calendario));
            }
        }
        #endregion

        #region Solicitudes
        private void CrearColumnas_Listado_Solicitudes()
        {
            ex_dgv_P_SolicitudesAusencias_Solicitudes.AutoGenerateColumns = false;

            List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> lst_ListadoCampos = g_obj_Controladora.g_obj_ABS_Listado_SOLICITUDES.LISTADO_COLUMNAS().Values.ToList();

            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in lst_ListadoCampos)
            {
                dynamic dgv_Columna = null;

                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOTON) ||
                   mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.EsBoton == 1)
                {
                    dgv_Columna = new DataGridViewButtonColumn();
                }
                else
                {
                    dgv_Columna = new DataGridViewTextBoxColumn();
                }
                dgv_Columna.DataPropertyName = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                dgv_Columna.Name = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                dgv_Columna.HeaderText = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_AMostrar;

                //Poner visible o no .........................................................................
                bool bol_Visible = true;
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Oculto)
                {
                    bol_Visible = false;
                }
                else if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES != null &&
                        g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNASAMOSTRAR != null &&
                        g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNASAMOSTRAR.Count > 0)
                {
                    if (!g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNASAMOSTRAR.Contains(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna))
                    {
                        bol_Visible = false;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Mostrado_PorDefecto == false)
                {
                    bol_Visible = false;
                }
                dgv_Columna.Visible = bol_Visible;

                if (bol_Visible)
                {
                    g_obj_Controladora.g_lst_ColumnasAMostrar_SOLICITUDES.Add(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna);
                }
                //.....................................................................................................

                //Tipo de Formateo si fuera Fecha
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    dgv_Columna.DefaultCellStyle.Format = "g";
                }

                //Poner Ancho Columna ................................................................................
                if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNAS_ANCHO != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNAS_ANCHO.Count > 0 &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNAS_ANCHO.ContainsKey(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna))
                {
                    dgv_Columna.Width = g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNAS_ANCHO[mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna];
                }
                else
                {
                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Ancho > 0)
                    {
                        dgv_Columna.Width = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Ancho;
                    }
                }
                //................................................................................................................

                dgv_Columna.ReadOnly = true;

                //Poner alineado segun tipo de datos ......................................................................................
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL) ||
                    mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG) ||
                    mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    dgv_Columna.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                }
                else
                {
                    dgv_Columna.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                }
                //..............................................................................................................................

                ex_dgv_P_SolicitudesAusencias_Solicitudes.Columns.Add(dgv_Columna);
            }

            //Cambiar el orden de las columnas ........
            if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES != null && g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNAS_ORDEN != null && g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNAS_ORDEN.Count > 0)
            {
                foreach (KeyValuePair<string, int> kvp_Valores in g_mdl_INTERNO_ConfiguracionPantalla_Modelo_SOLICITUDES.LISTADO_COLUMNAS_ORDEN)
                {
                    ex_dgv_P_SolicitudesAusencias_Solicitudes.Columns[kvp_Valores.Key].DisplayIndex = kvp_Valores.Value;
                }
            }
            //.........................................
        }

        #region Botones
        private void ex_btn_P_SolicitudesAusencias_Solicitudes_Filtros_Click(object sender, EventArgs e)
        {
            MostrarOcultar_Columnas_Y_Fitros_Solicitudes(ex_btn_P_SolicitudesAusencias_Solicitudes_Filtros.Location.X, 0);
        }
        private void MostrarOcultar_Columnas_Y_Fitros_Solicitudes(int _int_PosicionX, int _int_PosicionY)
        {
            PE_Listados_Filtros frm_PE_Listados_Filtros = new PE_Listados_Filtros(g_obj_Controladora.g_obj_ABS_Listado_SOLICITUDES, ex_dgv_P_SolicitudesAusencias_Solicitudes.Columns, g_obj_Controladora.g_dct_ListadoFiltros_SOLICITUDES);

            frm_PE_Listados_Filtros.ShowDialog();

            if (frm_PE_Listados_Filtros.g_bol_BotonAceptar)
            {
                //Mostrar/Ocultar las Columnas que no esten en el Listado
                g_obj_Controladora.g_lst_ColumnasAMostrar_SOLICITUDES = frm_PE_Listados_Filtros.g_lst_ColumnasAMostrar;

                foreach (DataGridViewColumn dgvc_ColumnasActuales in ex_dgv_P_SolicitudesAusencias_Solicitudes.Columns)
                {
                    //Mostrar
                    if (g_obj_Controladora.g_lst_ColumnasAMostrar_SOLICITUDES.Contains(dgvc_ColumnasActuales.Name))
                    {
                        dgvc_ColumnasActuales.Visible = true;
                    }
                    //Ocultar
                    else
                    {
                        dgvc_ColumnasActuales.Visible = false;
                    }
                }
                //Rellenar los nuevos filtros
                g_obj_Controladora.g_dct_ListadoFiltros_SOLICITUDES = frm_PE_Listados_Filtros.g_dct_ListadoFiltros.ToDictionary(entry => entry.Key, entry => entry.Value);

                //Cambiar Imagen de Filtros , si tiene o no
                if (g_obj_Controladora.g_dct_ListadoFiltros_SOLICITUDES != null && g_obj_Controladora.g_dct_ListadoFiltros_SOLICITUDES.Count > 0)
                {
                    ex_btn_P_SolicitudesAusencias_Solicitudes_Filtros.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_FILTROS_TIENE;
                }
                else
                {
                    ex_btn_P_SolicitudesAusencias_Solicitudes_Filtros.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_FILTROS;
                }
                Imagenes.Asignar_Imagen(ex_btn_P_SolicitudesAusencias_Solicitudes_Filtros);

                //Recargar el Listado
                g_obj_Controladora.Rellenar_DataGrid_SOLICITUDES();
            }
        }

        #endregion

        private void ex_dgv_P_SolicitudesAusencias_Solicitudes_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                //Adjunto
                if (ex_dgv_P_SolicitudesAusencias_Solicitudes.Columns[e.ColumnIndex].Name == nameof(INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.Boton_Adjunto))
                {
                    if (ex_dgv_P_SolicitudesAusencias_Solicitudes[e.ColumnIndex,e.RowIndex].Value.ToString().Trim().Length>0)
                    {
                        g_obj_Controladora.Adjuntos_Obtener(long.Parse(ex_dgv_P_SolicitudesAusencias_Solicitudes[0, e.RowIndex].Value.ToString()));
                    }
                }
                //Cancelar
                else if (ex_dgv_P_SolicitudesAusencias_Solicitudes.Columns[e.ColumnIndex].Name == nameof(INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.Boton_Cancelar))
                {
                    if (ex_dgv_P_SolicitudesAusencias_Solicitudes[e.ColumnIndex, e.RowIndex].Value.ToString().Trim().Length > 0)
                    {
                        g_obj_Controladora.Solicitud_Cancelar(long.Parse(ex_dgv_P_SolicitudesAusencias_Solicitudes[0, e.RowIndex].Value.ToString()));
                    }
                }
                //Aceptar
                else if (ex_dgv_P_SolicitudesAusencias_Solicitudes.Columns[e.ColumnIndex].Name == nameof(INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.Boton_Aceptar))
                {
                    if (ex_dgv_P_SolicitudesAusencias_Solicitudes[e.ColumnIndex, e.RowIndex].Value.ToString().Trim().Length > 0)
                    {
                        g_obj_Controladora.Solicitud_Aceptar(long.Parse(ex_dgv_P_SolicitudesAusencias_Solicitudes[0, e.RowIndex].Value.ToString()));
                    }
                }
                //Ver Solicitud
                else if (ex_dgv_P_SolicitudesAusencias_Solicitudes.Columns[e.ColumnIndex].Name == nameof(INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.Boton_VerSolicitud))
                {
                    if (ex_dgv_P_SolicitudesAusencias_Solicitudes[e.ColumnIndex, e.RowIndex].Value.ToString().Trim().Length > 0)
                    {
                        long lng_idSolicitud=long.Parse(ex_dgv_P_SolicitudesAusencias_Solicitudes[0, e.RowIndex].Value.ToString());

                        INTERNO_OpcionesDetalle_Modelo mdl_INTERNO_OpcionesDetalle_Modelo = Datos_Generales.PRV_Opciones_Buscar_Detalles(Variables.G_STR_OPCION_KRS_SOLICITUDESAUSENCIASPROGRAMADAS);

                        //Cargamos el ensamblado
                        Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_KAIROSPRO + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_KAIROSPRO + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                        //creamos la instancia
                        var obj_Clase = Activator.CreateInstance(m_type);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_MOSTRAR_EN_MANTENIMIENTO, BindingFlags.Instance | BindingFlags.NonPublic);

                        object[] arr_Parametros = { Variables.G_STR_OPCION_KRS_SOLICITUDESAUSENCIASPROGRAMADAS,
                                        this,
                                        null,
                                        P_Base_ValoresGenerales,
                                        P_Base_FechaTrabajo,
                                        mdl_INTERNO_OpcionesDetalle_Modelo,
                                        lng_idSolicitud,
                                        "",
                                        "",
                                        null,
                                        null};
                        //Pasamos los parametros al metodo y lo ejecutamos
                        obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

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

        private void ex_dgv_P_SolicitudesAusencias_Solicitudes_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                //Desmarcar si tuvier algon antes
                if (ex_dgv_P_SolicitudesAusencias_Calendario.Rows.Count > 0)
                {
                    for (int int_Filas = 0; int_Filas < ex_dgv_P_SolicitudesAusencias_Calendario.Rows.Count; int_Filas++)
                    {
                        for (int int_Columnas = 0; int_Columnas < ex_dgv_P_SolicitudesAusencias_Calendario.Columns.Count; int_Columnas++)
                        {
                            ex_dgv_P_SolicitudesAusencias_Calendario[int_Columnas, int_Filas].Tag = "";
                        }
                    }
                }

                //Marcar lo nuevo
                if (ex_dgv_P_SolicitudesAusencias_Solicitudes.SelectedRows!=null &&
                    ex_dgv_P_SolicitudesAusencias_Solicitudes.SelectedRows.Count>0)
                {
                    //buscar en el listado de Solicitudes
                    INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo mdl_INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo=g_obj_Controladora.g_lst_INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.Where(m => m.id == long.Parse(ex_dgv_P_SolicitudesAusencias_Solicitudes.SelectedRows[0].Cells[nameof(INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.id)].Value.ToString())).FirstOrDefault();

                    //Fechas
                    DateTime dtt_FechaDesde = mdl_INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.fechaDesde.Date;
                    DateTime dtt_FechaHasta = mdl_INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.fechaHasta.Date;

                    //Dias Festivos
                    List<KRS_DiasFestivos> lst_KRS_DiasFestivos =g_obj_Controladora.g_obj_KRS_DiasFestivos_Datos.Obtener_ModeloListado_Por_Fechas(dtt_FechaDesde, dtt_FechaHasta);

                    while (dtt_FechaDesde<= dtt_FechaHasta)
                    {
                        if (g_obj_Controladora.Grabar_Dia(lst_KRS_DiasFestivos, dtt_FechaDesde, mdl_INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.idEmpleado, mdl_INTERNO_KRS_SolicitudesAusenciasProgramadas_Listado_Modelo.idAusenciaProgramadaTipo))
                        {

                            //Buscar Fila
                            DataGridViewRow dgvr_MesAnyo = ex_dgv_P_SolicitudesAusencias_Calendario.Rows
                                                    .Cast<DataGridViewRow>()
                                                    .Where(r => r.Cells[0].Value.ToString().Equals(dtt_FechaDesde.Year.ToString()) &&
                                                                r.Cells[1].Value.ToString().Equals(dtt_FechaDesde.Month.ToString())
                                                          )
                                                    .FirstOrDefault();

                            if (dgvr_MesAnyo != null)
                            {
                                //Buscar celda
                                DataGridViewCell dgvc_Dia = dgvr_MesAnyo.Cells
                                                            .Cast<DataGridViewCell>()
                                                            .Where(r => r.Value.ToString().Equals(dtt_FechaDesde.Day.ToString()) &&
                                                                        r.ColumnIndex > 2
                                                                  )
                                                            .FirstOrDefault();

                                if (dgvc_Dia != null)
                                {
                                    ex_dgv_P_SolicitudesAusencias_Calendario[dgvc_Dia.ColumnIndex, dgvr_MesAnyo.Index].Tag = "1";
                                }
                            }
                        }


                        //Sumar un dia
                        dtt_FechaDesde = dtt_FechaDesde.AddDays(1);
                    }
                }

                ex_dgv_P_SolicitudesAusencias_Calendario.Refresh();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_SolicitudesAusenciasProgramadas_Supervisor) + "/" + nameof(ex_dgv_P_SolicitudesAusencias_Solicitudes_SelectionChanged));
            }
        }

        #endregion

        #region Leyenda
        private void ex_btn_P_SolicitudesAusencias_Calendario_Leyenda_Click(object sender, EventArgs e)
        {
            if (pnl_P_SolicitudesAusencias_Calendario_Leyenda.Visible)
            {
                pnl_P_SolicitudesAusencias_Calendario_Leyenda.Visible = false;
            }
            else
            {
                pnl_P_SolicitudesAusencias_Calendario_Leyenda.Visible = true;
            }
        }
        #endregion
    }
}
