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_KairosPRO._1_Modelos;
using Exferia_KairosPRO._4_Vistas.ListadosSeleccion;
using Exferia_Formularios;
using System.Threading;

namespace Exferia_KairosPRO._4_Vistas
{
    public partial class P_ArbolJerarquico : Exferia_Formularios.P_Base_Mantenimientos
    {
        #region Variables General
        private P_ArbolJerarquico_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;

        public bool g_bol_BloquearPorCargaInicial_Empleados = false;
        private INTERNO_ConfiguracionPantalla_Modelo g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS = null;

        #endregion

        #region Objetos en Pantalla

        //Exferia_BarraProgreso
        internal Exferia_BarraProgreso Exferia_BarraProgreso_Empleados { get { return ex_pgb_P_ArbolJerarquico_Empleados; } }

        //Exferia_Button
        internal Exferia_Button Exferia_Button_Empleados_OrdenListado { get { return ex_btn_P_ArbolJerarquico_Empleados_OrdenListado; } }

        //Exferia_ComboBox
        internal Exferia_ComboBox Exferia_ComboBox_Empleados_OrdenListado { get { return ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado; } }

        //Exferia_DataGridView
        internal Exferia_DataGridView Exferia_DataGridView_Empleados { get { return ex_dgv_P_ArbolJerarquico_Empleados; } }

        //Exferia_TabControl
        internal Exferia_TabControl Exferia_TabControl_AusenciasProgramadasTipos { get { return ex_tbc_P_ArbolJerarquico_AusenciasProgramadasTipos; } }

        //Exferia_TreeView
        internal Exferia_TreeView Exferia_TreeView_Arbol { get { return ex_trv_P_ArbolJerarquico_Arbol; } }


        #endregion

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

            try
            {
                Repintar.Empezar(this);

                CheckForIllegalCrossThreadCalls = false;

                g_bol_BloquearPorCargaInicial_Empleados = true;

                //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_ArbolJerarquico_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);

                //Mirar si hay que bloquear los controles, si solo puede ver los datos
                if ((P_Base_TipoAperturaPantalla != 0 && Datos_Generales.Permisos_Comprobar(g_mdl_PRV_OpcionesDetalle.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, false)) == false)
                {
                    //Bloqueo los Controles
                    SoloLectura.Empezar(this, true);
                }

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

           
                if (Variables.G_DCT_CONFIGURACIONPANTALLA != null && Variables.G_DCT_CONFIGURACIONPANTALLA.Count > 0)
                {
                    //Empleados
                    if (Variables.G_DCT_CONFIGURACIONPANTALLA.ContainsKey(g_obj_Controladora.g_obj_ABS_Listado_KRS_Empleados_P_ArbolJerarquico.NOMBRELISTADO_ALMACENARCONFIGURACION()))
                    {
                        g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS = Variables.G_DCT_CONFIGURACIONPANTALLA[g_obj_Controladora.g_obj_ABS_Listado_KRS_Empleados_P_ArbolJerarquico.NOMBRELISTADO_ALMACENARCONFIGURACION()];
                    }
                }


                //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_ArbolJerarquico) + "/" + nameof(P_ArbolJerarquico));
                    }
                }
                //..................................................................................................................................

                //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_ArbolJerarquico) + "/" + nameof(P_ArbolJerarquico));
            }
            finally
            {
                //Bloquear pantalla hasta que termine la carga por defecto .....
                Enabled = true;
                //.............................................................
            }
        }

        #endregion

        #region Inicio de pantalla
        private void P_ArbolJerarquico_Load(object sender, EventArgs e)
        {
            try
            {
                #region EMPELADOS
                //Crear Columnas Listado
                CrearColumnas_Listado_Empleados();

                //Poner el tipo de orden si lo hubiera por defecto ######################################
                if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_ORDEN_DIRECCION_PORDEFECTO != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_ORDEN_DIRECCION_PORDEFECTO.Trim().Length > 0)
                {
                    //Descendente
                    if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_ORDEN_DIRECCION_PORDEFECTO.Equals("1"))
                    {
                        Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_P_ArbolJerarquico_Empleados_OrdenListado);
                        ex_btn_P_ArbolJerarquico_Empleados_OrdenListado.Tag = "1";

                    }
                    //Ascendente
                    else
                    {
                        Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_P_ArbolJerarquico_Empleados_OrdenListado);
                        ex_btn_P_ArbolJerarquico_Empleados_OrdenListado.Tag = "0";
                    }
                }
                else
                {
                    if (g_obj_Controladora.g_obj_ABS_Listado_KRS_Empleados_P_ArbolJerarquico.ORDENACION_TIPO_PORDEFECTO().Trim().Length > 0)
                    {
                        //Descendente
                        if (g_obj_Controladora.g_obj_ABS_Listado_KRS_Empleados_P_ArbolJerarquico.ORDENACION_TIPO_PORDEFECTO().Equals("1"))
                        {
                            Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_P_ArbolJerarquico_Empleados_OrdenListado);
                            ex_btn_P_ArbolJerarquico_Empleados_OrdenListado.Tag = "1";
                        }
                        //Ascendente
                        else
                        {
                            Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_P_ArbolJerarquico_Empleados_OrdenListado);
                            ex_btn_P_ArbolJerarquico_Empleados_OrdenListado.Tag = "0";

                        }
                    }
                }
                //########################################################################################

                //Seleccionar Orden por Defecto en Combo #################################################
                if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_ORDEN_COLUMNA_PORDEFECTO != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_ORDEN_COLUMNA_PORDEFECTO.Trim().Length > 0)
                {
                    ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem = ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Descripcion.Equals(g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_ORDEN_COLUMNA_PORDEFECTO)).FirstOrDefault();
                }
                else
                {
                    if (g_obj_Controladora.g_obj_ABS_Listado_KRS_Empleados_P_ArbolJerarquico.ORDENACION_NOMBRECOLUMNA_PORDEFECTO().Trim().Length > 0)
                    {
                        ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem = ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(g_obj_Controladora.g_obj_ABS_Listado_KRS_Empleados_P_ArbolJerarquico.ORDENACION_NOMBRECOLUMNA_PORDEFECTO())).FirstOrDefault();
                    }
                    else
                    {
                        ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem = ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().FirstOrDefault();
                    }

                }

                g_bol_BloquearPorCargaInicial_Empleados = false;
                #endregion
            }
            catch (Exception ex)
            {
                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(P_ArbolJerarquico_Load));

                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
        }

        private void P_ArbolJerarquico_Shown(object sender, EventArgs e)
        {
            try
            {
                if (g_bol_ConstructorPantalla_Terminado_Correctamente)
                {
                    //Agraga Rama principal
                    g_obj_Controladora.Agregar_Rama_Inicial();

                    //rellenar Asientos
                    g_obj_Controladora.CargaInicial();
                }
                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_ArbolJerarquico) + "/" + nameof(P_ArbolJerarquico_Shown));

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

        #region Empleados
        private void CrearColumnas_Listado_Empleados()
        {
            ex_dgv_P_ArbolJerarquico_Empleados.AutoGenerateColumns = false;

            List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> lst_ListadoCampos = g_obj_Controladora.g_obj_ABS_Listado_KRS_Empleados_P_ArbolJerarquico.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_EMPLEADOS != null &&
                        g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_COLUMNASAMOSTRAR != null &&
                        g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_COLUMNASAMOSTRAR.Count > 0)
                {
                    if (!g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.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_EMPLEADOS.Add(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna);
                }
                //.....................................................................................................

                //Poner Ancho Columna ................................................................................
                if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_COLUMNAS_ANCHO != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_COLUMNAS_ANCHO.Count > 0 &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.LISTADO_COLUMNAS_ANCHO.ContainsKey(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna))
                {
                    dgv_Columna.Width = g_mdl_INTERNO_ConfiguracionPantalla_Modelo_EMPLEADOS.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_ArbolJerarquico_Empleados.Columns.Add(dgv_Columna);

                //RELLENAR EL ORDEN EN COMBO
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Oculto == false)
                {
                    ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.Items.Add(new INTERNO_ComboBox_Modelo(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna, mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_AMostrar, null));
                }
            }

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

        #region Ordenar
        private void ex_btn_P_ArbolJerarquico_Empleados_OrdenListado_Click(object sender, EventArgs e)
        {
            //Esta Descedente
            if (ex_btn_P_ArbolJerarquico_Empleados_OrdenListado.Tag.ToString().Equals("1"))
            {
                Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_P_ArbolJerarquico_Empleados_OrdenListado);
            }
            //Esta Ascendente
            else
            {
                Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_P_ArbolJerarquico_Empleados_OrdenListado);
            }

            Listado_Empleados_Ordenar_DataGridView();
        }
        private void ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (g_bol_BloquearPorCargaInicial_Empleados == false)
            {
                //Saber el Tipo de Ordenacion .................................
                ListSortDirection obj_ListSortDirection = ListSortDirection.Ascending;
                if (ex_btn_P_ArbolJerarquico_Empleados_OrdenListado.Tag.ToString().Equals("1"))
                {
                    obj_ListSortDirection = ListSortDirection.Descending;
                }
                //..............................................................

                //Cambiar el tipo Orden en Listado
                ex_dgv_P_ArbolJerarquico_Empleados.Sort(ex_dgv_P_ArbolJerarquico_Empleados.Columns[((INTERNO_ComboBox_Modelo)ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem).Identificador], obj_ListSortDirection);

                Listado_Empleados_Ordenar_DataGridView();
            }
        }

        private void ex_dgv_P_ArbolJerarquico_Empleados_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            try
            {
                //Mostrar u Ocultar las columnas
                if (e.Button == MouseButtons.Left)
                {
                    string str_CambioOrdenAnterior = "";
                    if (ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem != null)
                    {
                        str_CambioOrdenAnterior = ((INTERNO_ComboBox_Modelo)ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem).Identificador;
                    }

                    //Seleccionar la columna en el Combo de orden
                    ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem = ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(ex_dgv_P_ArbolJerarquico_Empleados.Columns[e.ColumnIndex].Name)).FirstOrDefault();

                    if (str_CambioOrdenAnterior.Equals(((INTERNO_ComboBox_Modelo)ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem).Identificador))
                    {
                        //Si estaba Ascendente lo pongo descendente
                        if (ex_dgv_P_ArbolJerarquico_Empleados.SortOrder == SortOrder.Ascending)
                        {
                            Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_P_ArbolJerarquico_Empleados_OrdenListado);
                        }
                        //Si estaba descendente lo pongo Ascendente
                        else
                        {
                            Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_P_ArbolJerarquico_Empleados_OrdenListado);
                        }
                    }

                    Listado_Empleados_Ordenar_DataGridView();
                }
            }
            catch
            { }
        }
        public void Listado_Empleados_Ordenar_DataGridView()
        {
            try
            {
                if (ex_dgv_P_ArbolJerarquico_Empleados.Rows.Count > 0)
                {
                    //Saber el Tipo de Ordenacion .................................
                    ListSortDirection obj_ListSortDirection = ListSortDirection.Ascending;
                    if (ex_btn_P_ArbolJerarquico_Empleados_OrdenListado.Tag.ToString().Equals("1"))
                    {
                        obj_ListSortDirection = ListSortDirection.Descending;
                    }
                    //..............................................................

                    if (ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                    {
                        ex_dgv_P_ArbolJerarquico_Empleados.Sort(ex_dgv_P_ArbolJerarquico_Empleados.Columns[((INTERNO_ComboBox_Modelo)ex_cbo_P_ArbolJerarquico_Empleados_OrdenListado.SelectedItem).Identificador], obj_ListSortDirection);
                    }
                    else
                    {
                        ex_dgv_P_ArbolJerarquico_Empleados.Sort(ex_dgv_P_ArbolJerarquico_Empleados.Columns[g_obj_Controladora.g_obj_ABS_Listado_KRS_Empleados_P_ArbolJerarquico.ORDENACION_NOMBRECOLUMNA_PORDEFECTO()], obj_ListSortDirection);
                    }
                }
            }
            catch (Exception)
            { }
        }
        #endregion

        #region Mover Opciones
        private bool g_bol_TieneSeleccion = false;
        private void ex_dgv_P_ArbolJerarquico_Empleados_MouseDown(object sender, MouseEventArgs e)
        {
            g_bol_TieneSeleccion = false;
            if (e.Button != MouseButtons.Left)
                return;

            ex_dgv_P_ArbolJerarquico_Empleados.MouseMove += ex_dgv_P_ArbolJerarquico_Empleados_MouseMove;
        }

        private void ex_dgv_P_ArbolJerarquico_Empleados_MouseMove(object sender, MouseEventArgs e)
        {
            if (g_bol_TieneSeleccion == false)
            {
                g_bol_TieneSeleccion = true;

                ex_dgv_P_ArbolJerarquico_Empleados.MouseMove -= ex_dgv_P_ArbolJerarquico_Empleados_MouseMove;

                if (e.Button != MouseButtons.Left)
                    return;

                List<DataGridViewRow> lst_Rows = new List<DataGridViewRow>();

                foreach (DataGridViewRow dgvr_Opcion in ex_dgv_P_ArbolJerarquico_Empleados.SelectedRows)
                {
                    lst_Rows.Add(dgvr_Opcion);
                }

                ex_dgv_P_ArbolJerarquico_Empleados.DoDragDrop(lst_Rows, DragDropEffects.Move);
            }
        }
        #endregion

        private void ex_dgv_P_ArbolJerarquico_Empleados_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 2)
            {
                if (e.Value != null &&
                    e.Value.ToString().Length > 0 &&
                    e.Value.ToString()=="X")
                {
                    //Color Fondo
                    ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.BackColor = Colores.G_COLOR_FONDO_TREEVIEW_ARBOLJERARQUICO_SELECCIONADO_PADRE;
                    ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.SelectionBackColor = Colores.G_COLOR_FONDO_TREEVIEW_ARBOLJERARQUICO_SELECCIONADO_PADRE;

                    //Color Letra
                    ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.ForeColor = Colores.G_COLOR_LETRA_TREEVIEW_ARBOLJERARQUICO_SELECCIONADO_PADRE;
                    ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.SelectionForeColor = Colores.G_COLOR_LETRA_TREEVIEW_ARBOLJERARQUICO_SELECCIONADO_PADRE;
                }
                else
                {
                    if (e.RowIndex % 2 == 0)
                    {
                        //Color celda
                        ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.BackColor = Colores.G_COLOR_LISTADO_FILANORMAL_FONDO;
                        ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.ForeColor = Colores.G_COLOR_LISTADO_FILANORMAL_LETRA;
                    }
                    else
                    {
                        //Color celda
                        ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.BackColor = Colores.G_COLOR_LISTADO_FILAALTERNATIVA_FONDO;
                        ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.ForeColor = Colores.G_COLOR_LISTADO_FILAALTERNATIVA_LETRA;
                    }

                    //Color celda Seleccion
                    ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.SelectionBackColor = Colores.G_COLOR_FONDO_SELECCION;
                    ex_dgv_P_ArbolJerarquico_Empleados[e.ColumnIndex, e.RowIndex].Style.SelectionForeColor = Colores.G_COLOR_LETRA_SELECCION;
                }
            }
        }

        #endregion

        #region Arbol
        private void ex_trv_P_ArbolJerarquico_Arbol_ItemDrag(object sender, ItemDragEventArgs e)
        {
            //Mueve el nodo usando el click izquierdo del raton.
            if (e.Button == MouseButtons.Left)
            {
                DoDragDrop(e.Item, DragDropEffects.Move);
            }

            //Copia el nodo usando mel click derecho del raton
            else if (e.Button == MouseButtons.Right)
            {
                DoDragDrop(e.Item, DragDropEffects.Copy);
            }
        }
        private void ex_trv_P_ArbolJerarquico_Arbol_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }
        private void ex_trv_P_ArbolJerarquico_Arbol_DragOver(object sender, DragEventArgs e)
        {
            try
            {
                // Recupera las coordenadas de la posicion del raton
                Point Posicion = ex_trv_P_ArbolJerarquico_Arbol.PointToClient(new Point(e.X, e.Y));

                // Seleciona el nodo en la posicion del ratón
                ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = ex_trv_P_ArbolJerarquico_Arbol.GetNodeAt(Posicion);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(ex_trv_P_ArbolJerarquico_Arbol_DragOver));
            }
        }
        private void ex_trv_P_ArbolJerarquico_Arbol_DragDrop(object sender, DragEventArgs e)
        {
            try
            {
                // Recupera las coordenadas de la posicion del raton
                Point Posicion = ex_trv_P_ArbolJerarquico_Arbol.PointToClient(new Point(e.X, e.Y));

                // Recupera la posicion de colocacion del nodo
                TreeNode trn_Nodo_Objetivo = ex_trv_P_ArbolJerarquico_Arbol.GetNodeAt(Posicion);

                string str_MensajeError = "";

                if (e.Data.GetData(typeof(TreeNode)) != null)
                {
                    // Recupera el nodo que fue arrastrado
                    TreeNode trn_Nodo_En_Movimiento = (TreeNode)e.Data.GetData(typeof(TreeNode));
                    if (trn_Nodo_Objetivo != null)
                    {
                        //Confirma si el nodo esta en la posicion de colocacion y si es un nodo o un descendiente de nodo
                        if (!trn_Nodo_En_Movimiento.Equals(trn_Nodo_Objetivo))
                        {
                            long lng_idEmpleado = long.Parse(trn_Nodo_En_Movimiento.Tag.ToString());
                            long lng_idEmpleadoPadre = -1;
                            string str_NombreEmpleado = trn_Nodo_Objetivo.Text;

                            if (trn_Nodo_Objetivo.Tag.ToString().Trim().Length>0)
                            {
                                lng_idEmpleadoPadre = long.Parse(trn_Nodo_Objetivo.Tag.ToString());
                            }

                            if (trn_Nodo_Objetivo.Tag.ToString().Trim().Length == 0 || Nodos_HijoYPadreALaVez_Descendente(trn_Nodo_En_Movimiento, lng_idEmpleadoPadre) == false)
                            {
                                //Si se trata de un movimiento, elimina el nodo y lo agrega al nodo de colocacion
                                if (e.Effect == DragDropEffects.Move)
                                {
                                    trn_Nodo_En_Movimiento.Remove();
                                    trn_Nodo_Objetivo.Nodes.Add(trn_Nodo_En_Movimiento);

                                    //Quitar los empleados (Supereriores) que no sean padres
                                    List<long> lst_idEmpleadosPadres = new List<long>();
                                    Nodos_Devolver_EmpleadosSupervisores(ref lst_idEmpleadosPadres, lng_idEmpleado);

                                    //Grupos
                                    g_obj_Controladora.AusenciasProgramadasTipos_EmpleadosBorrarQueNoSonSupervisores(lng_idEmpleado, lst_idEmpleadosPadres);
                                }
                            }
                            else
                            {
                                str_MensajeError += str_NombreEmpleado + " ya ha sido introducido en este grupo, no se puede mover." + System.Environment.NewLine;
                            }

                            //Selccionar Nodos
                            Nodos_Seleccionar(trn_Nodo_En_Movimiento);
                            ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = trn_Nodo_En_Movimiento;
                            ex_trv_P_ArbolJerarquico_Arbol.Select();

                            //Expande el nodo
                            trn_Nodo_Objetivo.Expand();
                        }
                    }
                }
                //Listado de Opciones Seleccionadas
                else if (e.Data.GetData(typeof(List<DataGridViewRow>)) != null)
                {
                    List<DataGridViewRow> lst_Rows = (List<DataGridViewRow>)e.Data.GetData(typeof(List<DataGridViewRow>));

                    if (lst_Rows != null && lst_Rows.Count > 0)
                    {
                        if (trn_Nodo_Objetivo != null)
                        {
                            //Si se trata de un movimiento, elimina el nodo y lo agrega al nodo de colocacion
                            if (e.Effect == DragDropEffects.Move)
                            {
                                TreeNode trn_NodoNuevo = null;

                                TreeNode trn_NodoUltimoIntroducido = null;

                                long lng_idEmpleado = -1;
                                string str_NombreEmpleado= "";
                               
                                //Añadimos tantos nodos como filas haya
                                foreach (DataGridViewRow dgvr_Filas in lst_Rows)
                                {
                                    //Datos del Empleado
                                    lng_idEmpleado = long.Parse(dgvr_Filas.Cells[nameof(INTERNO_KRS_Empleados_Modelo.id)].Value.ToString());
                                    str_NombreEmpleado = dgvr_Filas.Cells[nameof(INTERNO_KRS_Empleados_Modelo.nombre)].Value.ToString();

                                    if (Nodos_HijoYPadreALaVez_Ascedente(trn_Nodo_Objetivo, lng_idEmpleado) ==false)
                                    {
                                        //Creacion del nodo
                                        trn_NodoNuevo = new TreeNode(str_NombreEmpleado);
                                        trn_NodoNuevo.Name = g_obj_Controladora.g_lng_idArbol_NuevosNodos.ToString();
                                        trn_NodoNuevo.Text = str_NombreEmpleado;
                                        trn_NodoNuevo.Tag = lng_idEmpleado;

                                        //Agregar Nodo
                                        trn_Nodo_Objetivo.Nodes.Add(trn_NodoNuevo);

                                        trn_NodoUltimoIntroducido = trn_NodoNuevo;

                                        //Agregar al Diccionario
                                        List<TreeNode> lst_TreeNode = null;
                                        if (g_obj_Controladora.g_dct_NodosArbolEmpleados.ContainsKey(lng_idEmpleado))
                                        {
                                            lst_TreeNode = g_obj_Controladora.g_dct_NodosArbolEmpleados[lng_idEmpleado];
                                            lst_TreeNode.Add(trn_NodoNuevo);

                                            g_obj_Controladora.g_dct_NodosArbolEmpleados[lng_idEmpleado] = lst_TreeNode;
                                        }
                                        else
                                        {
                                            lst_TreeNode = new List<TreeNode>();
                                            lst_TreeNode.Add(trn_NodoNuevo);
                                            g_obj_Controladora.g_dct_NodosArbolEmpleados.Add(lng_idEmpleado, lst_TreeNode);
                                        }

                                        //Selccionar Nodos
                                        Nodos_Seleccionar(trn_NodoNuevo);

                                        //Sumar -1
                                        g_obj_Controladora.g_lng_idArbol_NuevosNodos += -1;
                                    }
                                    else
                                    {
                                        str_MensajeError += str_NombreEmpleado + " ya ha sido introducido en este grupo." + System.Environment.NewLine;
                                    }
                                   
                                }

                                //Seleccionar el ultimo introducido
                                if (trn_NodoUltimoIntroducido != null)
                                {
                                    ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = trn_NodoUltimoIntroducido;
                                    ex_trv_P_ArbolJerarquico_Arbol.Select();
                                }

                                //Expande el nodo
                                trn_Nodo_Objetivo.Expand();
                            }
                        }
                    }
                }

                if (str_MensajeError.Trim().Length > 0)
                {
                    Mensajes.MostrarMensaje(str_MensajeError);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(ex_trv_P_ArbolJerarquico_Arbol_DragDrop));
            }
        }

        private void ex_trv_P_ArbolJerarquico_Arbol_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            Nodos_Seleccionar(e.Node);
        }

        #region Mover
        private void ex_btn_P_ArbolJerarquico_IzquierdaNodo_Click(object sender, EventArgs e)
        {
            try
            {
                TreeNode trn_NodoSeleccionado = ex_trv_P_ArbolJerarquico_Arbol.SelectedNode;
                if (trn_NodoSeleccionado != null)
                {
                    //No puede ser el prinicipal
                    if (trn_NodoSeleccionado.Tag.ToString().Trim().Length>0)
                    {
                        //Tiene que tener un padre
                        if (trn_NodoSeleccionado.Parent != null)
                        {
                            //Tiene que un Abuelo apra poder moverlo
                            if (trn_NodoSeleccionado.Parent.Parent != null)
                            {
                                TreeNode trn_NodoAbuelo = trn_NodoSeleccionado.Parent.Parent;
                                long lng_idEmpleadoAbuelo = -1;
                                if (trn_NodoAbuelo.Tag.ToString().Trim().Length > 0)
                                {
                                    lng_idEmpleadoAbuelo = long.Parse(trn_NodoAbuelo.Tag.ToString());
                                }
                                long lng_idEmpleado = long.Parse(trn_NodoSeleccionado.Tag.ToString());
                                string str_EmpleadoNombre = trn_NodoSeleccionado.Text;

                                if (Nodos_HijoYPadreALaVez_Descendente(trn_NodoSeleccionado, lng_idEmpleadoAbuelo) == false)
                                {                                   
                                    trn_NodoSeleccionado.Remove();
                                    trn_NodoAbuelo.Nodes.Add(trn_NodoSeleccionado);
                                    //Expande el nodo
                                    trn_NodoAbuelo.Expand();

                                    //Quitar los empleados (Supereriores) que no sean padres
                                    List<long> lst_idEmpleadosPadres = new List<long>();
                                    Nodos_Devolver_EmpleadosSupervisores(ref lst_idEmpleadosPadres, lng_idEmpleado);

                                    //Grupos
                                    g_obj_Controladora.AusenciasProgramadasTipos_EmpleadosBorrarQueNoSonSupervisores(lng_idEmpleado, lst_idEmpleadosPadres);
                                }
                                else
                                {
                                    Mensajes.MostrarMensaje(str_EmpleadoNombre + " ya ha sido introducido en este grupo, no se puede mover.");
                                }
                            }

                            //Seleccionar Nodo
                            Nodos_Seleccionar(trn_NodoSeleccionado);
                            ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = trn_NodoSeleccionado;
                            ex_trv_P_ArbolJerarquico_Arbol.Select();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(ex_btn_P_ArbolJerarquico_IzquierdaNodo_Click));
            }
        }
        private void ex_btn_P_ArbolJerarquico_DerechaNodo_Click(object sender, EventArgs e)
        {
            try
            {
                TreeNode trn_NodoSeleccionado = ex_trv_P_ArbolJerarquico_Arbol.SelectedNode;
                if (trn_NodoSeleccionado != null)
                {
                    //No puede ser el prinicipal
                    if (trn_NodoSeleccionado.Tag.ToString().Trim().Length > 0)
                    {
                        //Tiene que existir un nodo a la derecha debajo
                        if (trn_NodoSeleccionado.NextNode != null)
                        {
                            string str_Empleado_Siguiente = trn_NodoSeleccionado.NextNode.Text;
                            long lng_idEmpleado_Siguiente = long.Parse(trn_NodoSeleccionado.NextNode.Tag.ToString());

                            if (Nodos_HijoYPadreALaVez_Descendente(trn_NodoSeleccionado, lng_idEmpleado_Siguiente) == false)
                            {
                                TreeNode trn_NodoSiguiente = trn_NodoSeleccionado.NextNode;
                                trn_NodoSeleccionado.Remove();
                                trn_NodoSiguiente.Nodes.Add(trn_NodoSeleccionado);

                                //Expande el nodo
                                trn_NodoSiguiente.Expand();
                            }
                            else
                            {
                                Mensajes.MostrarMensaje(str_Empleado_Siguiente + " ya ha sido introducido en este grupo.");
                            }
                        }

                        //Seleccionar Nodo
                        Nodos_Seleccionar(trn_NodoSeleccionado);
                        ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = trn_NodoSeleccionado;
                        ex_trv_P_ArbolJerarquico_Arbol.Select();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(ex_btn_P_ArbolJerarquico_DerechaNodo_Click));
            }
        }
        private void ex_btn_P_ArbolJerarquico_PrimeroNodo_Click(object sender, EventArgs e)
        {
            try
            {
                int int_Posicion;

                TreeNode trn_NodoSeleccionado = ex_trv_P_ArbolJerarquico_Arbol.SelectedNode;
                if (trn_NodoSeleccionado != null)
                {
                    //No puede ser el prinicipal
                    if (trn_NodoSeleccionado.Tag.ToString().Trim().Length > 0)
                    {
                        if (trn_NodoSeleccionado.Parent != null)
                        {
                            TreeNode trn_nodoPadre = trn_NodoSeleccionado.Parent;
                            int_Posicion = trn_nodoPadre.Nodes[0].Index;
                            trn_NodoSeleccionado.Remove();
                            trn_nodoPadre.Nodes.Insert(int_Posicion - 1, trn_NodoSeleccionado);
                        }

                        //Seleccionar Nodo
                        Nodos_Seleccionar(trn_NodoSeleccionado);
                        ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = trn_NodoSeleccionado;
                        ex_trv_P_ArbolJerarquico_Arbol.Select();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(ex_btn_P_ArbolJerarquico_PrimeroNodo_Click));
            }
        }
        private void ex_btn_P_ArbolJerarquico_SubirNodo_Click(object sender, EventArgs e)
        {
            try
            {
                int int_Posicion;

                TreeNode trn_NodoSeleccionado = ex_trv_P_ArbolJerarquico_Arbol.SelectedNode;
                if (trn_NodoSeleccionado != null)
                {
                    //No puede ser el prinicipal
                    if (trn_NodoSeleccionado.Tag.ToString().Trim().Length > 0)
                    {
                        if (trn_NodoSeleccionado.Parent != null)
                        {
                            TreeNode trn_nodoPadre = trn_NodoSeleccionado.Parent;
                            int_Posicion = trn_nodoPadre.Nodes.IndexOf(trn_NodoSeleccionado);
                            trn_NodoSeleccionado.Remove();
                            trn_nodoPadre.Nodes.Insert(int_Posicion - 1, trn_NodoSeleccionado);
                        }

                        //Seleccionar Nodo
                        Nodos_Seleccionar(trn_NodoSeleccionado);
                        ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = trn_NodoSeleccionado;
                        ex_trv_P_ArbolJerarquico_Arbol.Select();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(ex_btn_P_ArbolJerarquico_SubirNodo_Click));
            }
        }
        private void ex_btn_P_ArbolJerarquico_BajarNodo_Click(object sender, EventArgs e)
        {
            try
            {
                int int_Posicion;

                TreeNode trn_NodoSeleccionado = ex_trv_P_ArbolJerarquico_Arbol.SelectedNode;
                if (trn_NodoSeleccionado != null)
                {
                    //No puede ser el prinicipal
                    if (trn_NodoSeleccionado.Tag.ToString().Trim().Length > 0)
                    {
                        if (trn_NodoSeleccionado.Parent != null)
                        {
                            TreeNode trn_NodoPadre = trn_NodoSeleccionado.Parent;
                            int_Posicion = trn_NodoPadre.Nodes.IndexOf(trn_NodoSeleccionado);
                            trn_NodoSeleccionado.Remove();
                            trn_NodoPadre.Nodes.Insert(int_Posicion + 1, trn_NodoSeleccionado);
                        }

                        //Seleccionar Nodo
                        Nodos_Seleccionar(trn_NodoSeleccionado);
                        ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = trn_NodoSeleccionado;
                        ex_trv_P_ArbolJerarquico_Arbol.Select();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(ex_btn_P_ArbolJerarquico_BajarNodo_Click));
            }
        }
        private void ex_btn_P_ArbolJerarquico_UltimoNodo_Click(object sender, EventArgs e)
        {
            try
            {
                int int_Posicion;

                TreeNode trn_NodoSeleccionado = ex_trv_P_ArbolJerarquico_Arbol.SelectedNode;
                if (trn_NodoSeleccionado != null)
                {
                    //No puede ser el prinicipal
                    if (trn_NodoSeleccionado.Tag.ToString().Trim().Length > 0)
                    {
                        if (trn_NodoSeleccionado.Parent != null)
                        {
                            TreeNode trn_nodoPadre = trn_NodoSeleccionado.Parent;
                            int_Posicion = trn_nodoPadre.Nodes[trn_nodoPadre.Nodes.Count - 1].Index;
                            trn_NodoSeleccionado.Remove();
                            trn_nodoPadre.Nodes.Insert(int_Posicion + 1, trn_NodoSeleccionado);

                            ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = trn_NodoSeleccionado;
                            ex_trv_P_ArbolJerarquico_Arbol.Select();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(ex_btn_P_ArbolJerarquico_UltimoNodo_Click));
            }
        }
        #endregion

        #region Borrar
        private void ex_btn_P_ArbolJerarquico_EliminarRama_Click(object sender, EventArgs e)
        {
            try
            {
                TreeNode trn_NodoSeleccionado = ex_trv_P_ArbolJerarquico_Arbol.SelectedNode;
               
                if (trn_NodoSeleccionado != null)
                {
                    //No puede ser el prinicipal
                    if (trn_NodoSeleccionado.Tag.ToString().Trim().Length > 0)
                    {
                        //Borrar del listado de nodos que esta en el diccionario
                        Borrar_Nodo_EnDiccionario_Recursivo(trn_NodoSeleccionado);

                        //Borrar nodo
                        trn_NodoSeleccionado.Remove();

                        //Borrar diccinario
                        Borrar_Diccionario();

                        //Restructurar grupos, quitando los supervisores que faltan
                        List<long> lst_idEmpleadosUtilizados = new List<long>();
                        Restructurar_Grupos(ex_trv_P_ArbolJerarquico_Arbol.Nodes[0],ref lst_idEmpleadosUtilizados);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(ex_btn_P_ArbolJerarquico_EliminarRama_Click));
            }
        }

        private void Borrar_Nodo_EnDiccionario_Recursivo(TreeNode _trn_NodoSeleccionado)
        {
            try
            {
                //Si no es la principal
                if (_trn_NodoSeleccionado.Tag.ToString().Trim().Length > 0)
                {
                    foreach (KeyValuePair<long,List<TreeNode>> kvp_PorEmpleados in g_obj_Controladora.g_dct_NodosArbolEmpleados)
                    {
                        kvp_PorEmpleados.Value.RemoveAll(m => m.Name.Equals(_trn_NodoSeleccionado.Name));
                    }
                }

                //Hijos
                if (_trn_NodoSeleccionado.Nodes != null && _trn_NodoSeleccionado.Nodes.Count > 0)
                {
                    foreach (TreeNode trn_NodoSeleccionado in _trn_NodoSeleccionado.Nodes)
                    {
                        Borrar_Nodo_EnDiccionario_Recursivo(trn_NodoSeleccionado);
                    }
                }

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

        private void Borrar_Diccionario()
        {
            try
            {
                List<long> lst_idEmpleados = new List<long>();
                Nodos_Devolver_EmpleadosInferiores(ref lst_idEmpleados, ex_trv_P_ArbolJerarquico_Arbol.Nodes[0]);
               
                List<long> lst_EmpleadosEnDiccionario = g_obj_Controladora.g_dct_NodosArbolEmpleados.Keys.ToList();
                if (lst_EmpleadosEnDiccionario != null && lst_EmpleadosEnDiccionario.Count>0)
                {
                    foreach (long lng_idEmpleado in lst_EmpleadosEnDiccionario)
                    {
                        if (lst_idEmpleados==null ||
                            lst_idEmpleados.Count==0 ||
                            !lst_idEmpleados.Contains(lng_idEmpleado))
                        {
                            g_obj_Controladora.g_dct_NodosArbolEmpleados.Remove(lng_idEmpleado);
                        }
                    }
                }

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

        private void Restructurar_Grupos(TreeNode _trn_Rama,ref List<long> _lst_idEmpleadosUtilizados)
        {
            try
            {
                if (_trn_Rama.Nodes != null && _trn_Rama.Nodes.Count > 0)
                {
                    foreach (TreeNode trn_Rama_Interna in _trn_Rama.Nodes)
                    {
                        //idEmpleado de la rama
                        long lng_idEmpleado = long.Parse(trn_Rama_Interna.Tag.ToString());

                        if (!_lst_idEmpleadosUtilizados.Contains(lng_idEmpleado))
                        {
                            //Obtener los Supervisores
                            List<long> lst_idEmpleadosSupervisores = new List<long>();
                            Nodos_Devolver_EmpleadosSupervisores(ref lst_idEmpleadosSupervisores, lng_idEmpleado);

                            //Borrar los que no son Supervisores
                            g_obj_Controladora.AusenciasProgramadasTipos_EmpleadosBorrarQueNoSonSupervisores(lng_idEmpleado,lst_idEmpleadosSupervisores);

                            //Añadirlo al listado para que no se vuelva a utilizar mas
                            _lst_idEmpleadosUtilizados.Add(lng_idEmpleado);
                        }

                        Restructurar_Grupos(trn_Rama_Interna, ref _lst_idEmpleadosUtilizados);
                    }
                }
            }
            catch(Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(Restructurar_Grupos));
            }
        }
        #endregion

        private void Nodos_Seleccionar(TreeNode _trn_Nodo)
        {
            try
            {
                #region Vaciar Seleccion anterior
                g_obj_Controladora.AusenciasProgramadasTipos_ActualizarEmpleadoSeleccionadoArbol(null);
                if (ex_trv_P_ArbolJerarquico_Arbol.Nodes != null && ex_trv_P_ArbolJerarquico_Arbol.Nodes.Count > 0)
                {
                    Nodos_VaciarSeleccion(ex_trv_P_ArbolJerarquico_Arbol.Nodes);
                }
                #endregion

                #region DataGridView Poner todos como hijos
                foreach (DataGridViewRow dgvr_Empleado in ex_dgv_P_ArbolJerarquico_Empleados.Rows.Cast<DataGridViewRow>().ToList())
                {
                    dgvr_Empleado.Cells[nameof(INTERNO_KRS_Empleados_Modelo.EsPadre_AUX)].Value = "";
                }
                ex_dgv_P_ArbolJerarquico_Empleados.Refresh();
                #endregion

                #region Vaciar grupos
                g_obj_Controladora.AusenciasProgramadasTipos_Vaciar();
                #endregion

                //Seleccion de todos los nodos que sena del mismo empleado
                if (_trn_Nodo.Tag.ToString().Trim().Length > 0)
                {
                    if (g_obj_Controladora.g_dct_NodosArbolEmpleados.Count > 0)
                    {
                        long lng_idEmpleado = long.Parse(_trn_Nodo.Tag.ToString());

                        if (g_obj_Controladora.g_dct_NodosArbolEmpleados.ContainsKey(lng_idEmpleado))
                        {
                            //Empleado seleccionado en arbol
                            g_obj_Controladora.AusenciasProgramadasTipos_ActualizarEmpleadoSeleccionadoArbol(g_obj_Controladora.g_lst_INTERNO_KRS_Empleados_Modelo.Where(m => m.id.Equals(lng_idEmpleado)).FirstOrDefault());

                            List<TreeNode> lst_Nodos = g_obj_Controladora.g_dct_NodosArbolEmpleados[lng_idEmpleado];

                            if (lst_Nodos != null && lst_Nodos.Count > 0)
                            {
                                foreach (TreeNode trn_NodoSeleccionado in lst_Nodos)
                                {
                                    trn_NodoSeleccionado.BackColor = Colores.G_COLOR_FONDO_TREEVIEW_ARBOLJERARQUICO_SELECCIONADO;
                                    trn_NodoSeleccionado.ForeColor = Colores.G_COLOR_LETRA_TREEVIEW_ARBOLJERARQUICO_SELECCIONADO;


                                    //Seleccionar nodos padre de los nodos selccionados
                                    if (trn_NodoSeleccionado.Parent!=null)
                                    {
                                        Nodos_Seleccionar_Padre(trn_NodoSeleccionado.Parent);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(Nodos_Seleccionar));
            }
        }
        private void Nodos_Seleccionar_Padre(TreeNode _trn_Nodo)
        {
            try
            {
                if (_trn_Nodo.Tag.ToString().Trim().Length > 0)
                {
                    long lng_idEmpleado = long.Parse(_trn_Nodo.Tag.ToString());

                    _trn_Nodo.BackColor = Colores.G_COLOR_FONDO_TREEVIEW_ARBOLJERARQUICO_SELECCIONADO_PADRE;
                    _trn_Nodo.ForeColor = Colores.G_COLOR_LETRA_TREEVIEW_ARBOLJERARQUICO_SELECCIONADO_PADRE;

                    #region DataGridView Poner como Padre
                    DataGridViewRow dgvr_Seleccionada= ex_dgv_P_ArbolJerarquico_Empleados.Rows
                                                                                         .Cast<DataGridViewRow>()
                                                                                         .Where(r => r.Cells[0].Value.Equals(lng_idEmpleado)).FirstOrDefault();
                    if (dgvr_Seleccionada!=null)
                    {
                        dgvr_Seleccionada.Cells[nameof(INTERNO_KRS_Empleados_Modelo.EsPadre_AUX)].Value = "X";
                    }
                    ex_dgv_P_ArbolJerarquico_Empleados.Refresh();
                    #endregion

                    if (_trn_Nodo.Parent != null)
                    {
                        Nodos_Seleccionar_Padre(_trn_Nodo.Parent);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(Nodos_Seleccionar_Padre));
            }
        }

        #region Nodos Devolver Empleados Supervisores
        private void Nodos_Devolver_EmpleadosSupervisores(ref List<long> _lst_idEmpleadosSupervisores, long _lng_idEmpleado)
        {
            List<TreeNode> lst_Nodos = g_obj_Controladora.g_dct_NodosArbolEmpleados[_lng_idEmpleado];

            if (lst_Nodos != null && lst_Nodos.Count > 0)
            {
                foreach (TreeNode trn_NodoSeleccionado in lst_Nodos)
                {
                    Nodos_Devolver_EmpleadosSupervisores_Recursivo(ref _lst_idEmpleadosSupervisores, trn_NodoSeleccionado.Parent);
                }
            }
        }
        private void Nodos_Devolver_EmpleadosSupervisores_Recursivo(ref List<long> _lst_idEmpleadosSupervisores, TreeNode _trn_Nodo)
        {
            try
            {
                if (_trn_Nodo.Tag.ToString().Trim().Length > 0)
                {
                    _lst_idEmpleadosSupervisores.Add(long.Parse(_trn_Nodo.Tag.ToString()));

                    if (_trn_Nodo.Parent != null)
                    {
                        Nodos_Devolver_EmpleadosSupervisores_Recursivo(ref _lst_idEmpleadosSupervisores, _trn_Nodo.Parent);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArbolJerarquico) + "/" + nameof(Nodos_Devolver_EmpleadosSupervisores));
            }
        }
        #endregion

        #region Nodos Devolver Empleados Inferiores
        private void Nodos_Devolver_EmpleadosInferiores(ref List<long> _lst_idEmpleadosInferiores, TreeNode _trn_Rama)
        {
            //Si no es la principal
            if (_trn_Rama.Tag.ToString().Trim().Length>0)
            {
                if (!_lst_idEmpleadosInferiores.Exists(m=>m==long.Parse(_trn_Rama.Tag.ToString())))
                {
                    _lst_idEmpleadosInferiores.Add(long.Parse(_trn_Rama.Tag.ToString()));
                }
            }

            //Hijos
            if (_trn_Rama.Nodes != null && _trn_Rama.Nodes.Count > 0)
            {
                foreach (TreeNode trn_NodoSeleccionado in _trn_Rama.Nodes)
                {
                    Nodos_Devolver_EmpleadosInferiores(ref _lst_idEmpleadosInferiores, trn_NodoSeleccionado);
                }
            }
        }
        #endregion

        private void Nodos_VaciarSeleccion(TreeNodeCollection _lst_trn_Nodos)
        {
            ex_trv_P_ArbolJerarquico_Arbol.SelectedNode = null;
            ex_trv_P_ArbolJerarquico_Arbol.Select();

            foreach (TreeNode trn_Nodo in _lst_trn_Nodos)
            {
                if (trn_Nodo.Tag.ToString().Trim().Length > 0)
                {
                    trn_Nodo.BackColor = Color.White;
                    trn_Nodo.ForeColor = Color.Black;
                }

                //Tiene hijos
                if (trn_Nodo.Nodes != null && trn_Nodo.Nodes.Count > 0)
                {
                    Nodos_VaciarSeleccion(trn_Nodo.Nodes);
                }
            }
        }
        private bool Nodos_HijoYPadreALaVez_Ascedente(TreeNode _trn_Nodo_Padre,long _lng_idEmpleado)
        {
            bool bol_ValorDevuelto = false;

            if (_trn_Nodo_Padre.Tag.ToString().Trim().Length>0)
            {
                long lng_idEmpleado_Padre = long.Parse(_trn_Nodo_Padre.Tag.ToString());
                if (lng_idEmpleado_Padre== _lng_idEmpleado)
                {
                    bol_ValorDevuelto= true;
                }
            }

            //Tiene Padre
            if (bol_ValorDevuelto==false && _trn_Nodo_Padre.Parent!=null)
            {
                bol_ValorDevuelto= Nodos_HijoYPadreALaVez_Ascedente(_trn_Nodo_Padre.Parent,_lng_idEmpleado);
            }

            return bol_ValorDevuelto;
        }
        private bool Nodos_HijoYPadreALaVez_Descendente(TreeNode _trn_Nodo, long _lng_idEmpleado)
        {
            bool bol_ValorDevuelto = false;

            if (_trn_Nodo.Tag.ToString().Trim().Length > 0)
            {
                long lng_idEmpleado = long.Parse(_trn_Nodo.Tag.ToString());
                if (lng_idEmpleado == _lng_idEmpleado)
                {
                    bol_ValorDevuelto = true;
                }
            }

            //Tiene Hijos
            if (bol_ValorDevuelto == false && _trn_Nodo.Nodes != null)
            {
                foreach(TreeNode trn_Nodo in _trn_Nodo.Nodes)
                {
                    bol_ValorDevuelto = Nodos_HijoYPadreALaVez_Descendente(trn_Nodo, _lng_idEmpleado);

                    if (bol_ValorDevuelto==true)
                    {
                        break;
                    }
                }
            }

            return bol_ValorDevuelto;
        }

        #endregion

        #region Grabar
        private void ex_btn_P_ArbolJerarquico_Grabar_Click(object sender, EventArgs e)
        {
            Grabar();
        }
        private void Grabar()
        {
            if (//Modificar
                (Datos_Generales.Permisos_Comprobar(g_mdl_PRV_OpcionesDetalle.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, true)))
            {
                g_obj_Controladora.GrabarDatos();
            }
        }
        #endregion

        #region Teclas de acceso rapido
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            // Salir sin Seleccionar
            if (keyData == Keys.F10)
            {
                Salir_P_Base();
                return true;
            }
            // Grabar
            else if (keyData == Keys.F2)
            {
                Grabar();
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
        #endregion
    }
}
