using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Aplicacion.Modelos_ControlesPersonalizados;
using static Exferia_Aplicacion.General.Enumerados;
using System.Threading;
using Exferia_Aplicacion.Modelos_Contabilidad;
using System.Reflection;
using Exferia_Formularios;
using Exferia_Aplicacion.Modelos_Listado_Filtros;
using Exferia_Aplicacion.Modelos_Excel;
using Exferia_EntityFramework;
using Exferia_General;

namespace Exferia_Controles.ControlesAuxiliares
{
    public partial class CTU_Cartera_Personal : UserControl
    {
        #region Variables privadas
        private INTERNO_ValoresGenerales_Modelo g_mdl_INTERNO_ValoresGenerales_Modelo = null;
        private DateTime g_dtt_FechaPorDefecto = DateTime.Now;
        private P_Base g_frm_P_Base_Origen = null;


        private BackgroundWorker g_obj_TareaAsincrona_RellenarGrid;

        private List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Lineas_Columnas=null;
        private ABS_Listado g_obj_ABS_Listado_CTU_Cartera_Personal = null;
        private List<string> g_lst_ColumnasAMostrar_CTU_Cartera_Personal = new List<string>();
        public Dictionary<string, object> g_dct_ListadoFiltros = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados = 0;
        private int g_int_TotalRegistros = 0;

        private List<INTERNO_Filtro_OpcionPadre_Modelo> g_lst_INTERNO_Filtro_OpcionPadre_Modelo = null;

        private List<INTERNO_CTU_Cartera_Personal_Modelo> g_lst_INTERNO_CTU_Cartera_Personal_Modelo = null;
        private List<INTERNO_CTU_Cartera_Personal_Modelo> g_lst_INTERNO_CTU_Cartera_Personal_Modelo_Filtradas = null;
        
        private G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO g_obj_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO = G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO.Nomina;
        private long g_lng_idDocumento = -1;

        private bool g_bol_BloquearPorCargaInicial = false;

        #endregion

        #region Constructores
        public CTU_Cartera_Personal()
        {
            InitializeComponent();

            Repintar.Empezar(this);

            ex_btn_Ver.Exferia_Button_Bloqueable = false;
            ex_btn_Filtros.Exferia_Button_Bloqueable = false;
            ex_btn_Excel.Exferia_Button_Bloqueable = false;
            ex_btn_OrdenListado.Exferia_Button_Bloqueable = false;
            ex_btn_Actualizar.Exferia_Button_Bloqueable = false;
            ex_cbo_OrdenListado.Exferia_ComboBox_Bloqueable = false;
        }
        #endregion

        public void Inicializar_Control(INTERNO_ValoresGenerales_Modelo _mdl_INTERNO_ValoresGenerales_Modelo,DateTime _dtt_FechaPorDefecto,P_Base _frm_P_Base_Origen)
        {
            try
            {
                g_mdl_INTERNO_ValoresGenerales_Modelo = _mdl_INTERNO_ValoresGenerales_Modelo;
                g_dtt_FechaPorDefecto = _dtt_FechaPorDefecto;
                g_frm_P_Base_Origen = _frm_P_Base_Origen;
                g_obj_ABS_Listado_CTU_Cartera_Personal = new ABS_Listado_CTU_Cartera_Personal(_mdl_INTERNO_ValoresGenerales_Modelo);

                #region Crear Columnas
                g_bol_BloquearPorCargaInicial = true;
                ex_dgv_Listado.AutoGenerateColumns = false;

                g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Lineas_Columnas = g_obj_ABS_Listado_CTU_Cartera_Personal.LISTADO_COLUMNAS().Values.ToList();

                foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Lineas_Columnas)
                {
                    DataGridViewTextBoxColumn 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.NoOcultable == false)
                    {
                        if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Oculto)
                        {
                            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_lst_ColumnasAMostrar_CTU_Cartera_Personal.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 = "d";
                    }

                    //Poner Ancho Columna ................................................................................
                    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.LONG_TEXT) ||
                        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_Listado.Columns.Add(dgv_Columna);

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

                ex_cbo_OrdenListado.SelectedItem = ex_cbo_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(nameof(INTERNO_CTU_Cartera_Personal_Modelo.NumeroOrden_Mostrar))).FirstOrDefault();
                #endregion
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_Cartera_Personal) + "/" + nameof(Inicializar_Control));
            }
            finally
            {
                g_bol_BloquearPorCargaInicial = false;
            }
        }

        #region Rellenar DataGrid 
        public void Rellenar_DataGrid(G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO _obj_G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO,
                                      long _lng_idDocumento,
                                      bool _bol_Buscar_BD)
        {
            try
            {

                if (g_obj_TareaAsincrona_RellenarGrid != null)
                {
                    while (g_obj_TareaAsincrona_RellenarGrid.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_RellenarGrid = new BackgroundWorker();
                    g_obj_TareaAsincrona_RellenarGrid.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_DoWork);
                    g_obj_TareaAsincrona_RellenarGrid.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ProgressChanged);
                    g_obj_TareaAsincrona_RellenarGrid.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Completed);
                    g_obj_TareaAsincrona_RellenarGrid.WorkerReportsProgress = true;
                    g_obj_TareaAsincrona_RellenarGrid.WorkerSupportsCancellation = true;
                }


                //Vaciar el Listado
                ex_dgv_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados = 0;
                g_int_TotalRegistros = 0;
                ex_pgb_Listado.Exferia_BarraProgreso_Total = g_int_TotalRegistros;
                ex_pgb_Listado.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados;
               
                //Almcenar los datos recibidos
                g_obj_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO = _obj_G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO;
                g_lng_idDocumento = _lng_idDocumento;

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_obj_G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO);
                lst_Argumentos.Add(_lng_idDocumento);
                lst_Argumentos.Add(_bol_Buscar_BD);

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_RellenarGrid.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_Cartera_Personal) + "/" + nameof(Rellenar_DataGrid));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;

                G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO obj_G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO = (G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO)lst_Argumentos[0];
                long lng_idDocumento = (long)lst_Argumentos[1];
                bool bol_Buscar_BD = (bool)lst_Argumentos[2];

                if (bol_Buscar_BD)
                {
                    g_lst_INTERNO_CTU_Cartera_Personal_Modelo = null;

                    //Nomina
                    if (obj_G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO.Equals(G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO.Nomina))
                    {
                        //Cargamos el ensamblado
                        Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_PERSONAL + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type = m_assembly.GetType("" + Variables.G_STR_LIBRERIA_PERSONAL + "." + Variables.G_STR_LIBRERIA_DATOSPERSONAL);
                        //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_DATOSPERSONAL_PROCEDIMIENTO_PERNOMINAS_OBTENER_PARA_CTUCARTERAPERSONAL_POR_NOMINA, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros = { lng_idDocumento,g_mdl_INTERNO_ValoresGenerales_Modelo.lng_idEmpresa };

                        //Pasamos los parametros al metodo y lo ejecutamos
                        g_lst_INTERNO_CTU_Cartera_Personal_Modelo = (List<INTERNO_CTU_Cartera_Personal_Modelo>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                    }
                    //Empleado
                    else if (obj_G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO.Equals(G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO.Empleado))
                    {
                        //Cargamos el ensamblado
                        Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_PERSONAL + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type = m_assembly.GetType("" + Variables.G_STR_LIBRERIA_PERSONAL + "." + Variables.G_STR_LIBRERIA_DATOSPERSONAL);
                        //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_DATOSPERSONAL_PROCEDIMIENTO_PERNOMINAS_OBTENER_PARA_CTUCARTERAPERSONAL_POR_EMPLEADO, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros = { lng_idDocumento, g_mdl_INTERNO_ValoresGenerales_Modelo.lng_idEmpresa };

                        //Pasamos los parametros al metodo y lo ejecutamos
                        g_lst_INTERNO_CTU_Cartera_Personal_Modelo = (List<INTERNO_CTU_Cartera_Personal_Modelo>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                    }
                }

                g_lst_INTERNO_CTU_Cartera_Personal_Modelo_Filtradas = Filtrar();
                if (g_lst_INTERNO_CTU_Cartera_Personal_Modelo_Filtradas != null && g_lst_INTERNO_CTU_Cartera_Personal_Modelo_Filtradas.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros = g_lst_INTERNO_CTU_Cartera_Personal_Modelo_Filtradas.Count;

                    foreach (INTERNO_CTU_Cartera_Personal_Modelo mdl_INTERNO_CTU_Cartera_Personal_Modelo in g_lst_INTERNO_CTU_Cartera_Personal_Modelo_Filtradas.OrderBy(m=>m.NumeroOrden_Ordenar))
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados += 1;


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

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_Cartera_Personal) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_Cartera_Personal) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_Base_Origen.IsDisposed)
                {
                    //Añadir Linea al DataGrid de AlbaranLinea
                    ex_dgv_Listado.Rows.Add((DataGridViewRow)e.UserState);

                    //Barra de Progreso
                    ex_pgb_Listado.Exferia_BarraProgreso_Total = g_int_TotalRegistros;
                    ex_pgb_Listado.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados;
                }

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
        }

        public DataGridViewRow Transformar_Modelo_A_Row_AlbaranLinea(INTERNO_CTU_Cartera_Personal_Modelo _mdl_INTERNO_CTU_Cartera_Personal_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

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

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Lineas_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CTU_Cartera_Personal_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTU_Cartera_Personal_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CTU_Cartera_Personal_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTU_Cartera_Personal_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_CTU_Cartera_Personal_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTU_Cartera_Personal_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_CTU_Cartera_Personal_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTU_Cartera_Personal_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_CTU_Cartera_Personal_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTU_Cartera_Personal_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                {
                    string str_Valor = (string)_mdl_INTERNO_CTU_Cartera_Personal_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTU_Cartera_Personal_Modelo, null);

                    long? lng_valor = long.Parse(str_Valor);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CTU_Cartera_Personal_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTU_Cartera_Personal_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CTU_Cartera_Personal_Modelo> Filtrar()
        {
            //Filtros Avanzados
            if (g_lst_INTERNO_CTU_Cartera_Personal_Modelo != null)
            {
                if (g_dct_ListadoFiltros != null && g_dct_ListadoFiltros.Count > 0)
                {
                    return g_lst_INTERNO_CTU_Cartera_Personal_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CTU_Cartera_Personal_Modelo>(g_dct_ListadoFiltros, g_obj_ABS_Listado_CTU_Cartera_Personal)).ToList();
                }
                else
                {
                    return g_lst_INTERNO_CTU_Cartera_Personal_Modelo.AsQueryable().ToList();
                }
            }
            else
            {
                return null;
            }
        }

        #endregion

        #region Ordenar Listado
        private void Cargar_Combo_Orden()
        {
            ex_cbo_OrdenListado.Items.Clear();

            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_obj_ABS_Listado_CTU_Cartera_Personal.LISTADO_COLUMNAS().Values.Where(m => g_lst_ColumnasAMostrar_CTU_Cartera_Personal.Contains(m.Descripcion_Interna)).ToList())
            {
                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo = new INTERNO_ComboBox_Modelo(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna, mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_AMostrar, null);
                ex_cbo_OrdenListado.Items.Add(mdl_INTERNO_ComboBox_Modelo);
            }
        }

        private void ex_btn_OrdenListado_Click(object sender, EventArgs e)
        {
            //Esta Descedente
            if (ex_btn_OrdenListado.Tag.ToString().Equals("1"))
            {
                Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_OrdenListado);
            }
            //Esta Ascendente
            else
            {
                Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_OrdenListado);
            }

            Ordenar_DataGridView();
        }

        private void ex_cbo_OrdenListado_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (g_bol_BloquearPorCargaInicial == false)
            {
                Ordenar_DataGridView();
            }
        }
        private void ex_dgv_Listado_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            try
            {
                if (e.Button == MouseButtons.Left)
                {
                    string str_CambioOrdenAnterior = "";
                    if (ex_cbo_OrdenListado.SelectedItem != null)
                    {
                        str_CambioOrdenAnterior = ((INTERNO_ComboBox_Modelo)ex_cbo_OrdenListado.SelectedItem).Identificador;
                    }

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

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

                    Ordenar_DataGridView();
                }
            }
            catch
            { }
        }
        private void Ordenar_DataGridView()
        {
            try
            {
                if (ex_dgv_Listado.Rows.Count > 0)
                {
                    //Saber el Tipo de Ordenacion .................................
                    ListSortDirection obj_ListSortDirection = ListSortDirection.Ascending;
                    if (ex_btn_OrdenListado.Tag.ToString().Equals("1"))
                    {
                        obj_ListSortDirection = ListSortDirection.Descending;
                    }
                    //..............................................................

                    if (ex_cbo_OrdenListado.SelectedItem != null && 
                        ((INTERNO_ComboBox_Modelo)ex_cbo_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                    {
                        if (((INTERNO_ComboBox_Modelo)ex_cbo_OrdenListado.SelectedItem).Identificador.Equals(nameof(INTERNO_CTU_Cartera_Personal_Modelo.NumeroOrden_Mostrar)))
                        {
                            ex_dgv_Listado.Sort(ex_dgv_Listado.Columns[nameof(INTERNO_CTU_Cartera_Personal_Modelo.NumeroOrden_Ordenar)], obj_ListSortDirection);
                        }
                        else
                        {
                            ex_dgv_Listado.Sort(ex_dgv_Listado.Columns[((INTERNO_ComboBox_Modelo)ex_cbo_OrdenListado.SelectedItem).Identificador], obj_ListSortDirection);
                        }
                    }
                    else
                    {
                        ex_dgv_Listado.Sort(ex_dgv_Listado.Columns[g_obj_ABS_Listado_CTU_Cartera_Personal.ORDENACION_NOMBRECOLUMNA_PORDEFECTO()], obj_ListSortDirection);
                    }
                }
            }
            catch (Exception)
            { }
        }

       
        #endregion

        #region Filtrar
        private void ex_btn_Filtros_Click(object sender, EventArgs e)
        {
            MostrarOcultar_Columnas_Y_Fitros(ex_btn_Filtros.Location.X, 0);
        }
        private void MostrarOcultar_Columnas_Y_Fitros(int _int_PosicionX, int _int_PosicionY)
        {
            PE_Listados_Filtros frm_PE_Listados_Filtros = new PE_Listados_Filtros(g_obj_ABS_Listado_CTU_Cartera_Personal, ex_dgv_Listado.Columns, g_dct_ListadoFiltros);
            frm_PE_Listados_Filtros.ShowDialog();

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

                //Cargar Datos del Combo de orden ##################################################################################
                g_bol_BloquearPorCargaInicial = true;
                bool bol_Reordenar_Listado = false;
                //Guardar seleccion del Combo de orden
                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_ORDENELECCIONADO = null;
                if (ex_cbo_OrdenListado.SelectedItem != null)
                {
                    mdl_INTERNO_ComboBox_Modelo_ORDENELECCIONADO = (INTERNO_ComboBox_Modelo)ex_cbo_OrdenListado.SelectedItem;
                }
                Cargar_Combo_Orden();

                //Existe el registro que habia seelccionado en el listado de campos mostrados
                if (mdl_INTERNO_ComboBox_Modelo_ORDENELECCIONADO != null &&
                    g_lst_ColumnasAMostrar_CTU_Cartera_Personal.Where(m => m.Equals(mdl_INTERNO_ComboBox_Modelo_ORDENELECCIONADO.Identificador)).FirstOrDefault() != null)
                {
                    ex_cbo_OrdenListado.SelectedItem = ex_cbo_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().ToList().Where(m => m.Identificador.Equals(mdl_INTERNO_ComboBox_Modelo_ORDENELECCIONADO.Identificador)).FirstOrDefault();
                }
                else
                {
                    ex_cbo_OrdenListado.SelectedItem = ex_cbo_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().ToList().FirstOrDefault();
                    bol_Reordenar_Listado = true;
                }
                g_bol_BloquearPorCargaInicial = false;
                //####################################################################################################

                foreach (DataGridViewColumn dgvc_ColumnasActuales in ex_dgv_Listado.Columns)
                {
                    //Mostrar
                    if (g_lst_ColumnasAMostrar_CTU_Cartera_Personal.Contains(dgvc_ColumnasActuales.Name))
                    {
                        dgvc_ColumnasActuales.Visible = true;
                    }
                    //Ocultar
                    else
                    {
                        dgvc_ColumnasActuales.Visible = false;
                    }
                }

                #region Campos que al cambiar siempre tienen que ir a base de datos con un filtro
                List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_CTU_Cartera_Personal.LISTADO_COLUMNAS().Values.ToList().Where(m => m.BuscarSiempreBDAlCambiar).ToList();
                if (g_obj_ABS_Listado_CTU_Cartera_Personal.LISTADO_COLUMNAS().Values.ToList().Exists(m => m.BuscarSiempreBDAlCambiar))
                {
                    INTERNO_Filtro_OpcionPadre_Modelo mdl_INTERNO_Filtro_OpcionPadre_Modelo = null;
                    long lng_idValorAnterior = -1;
                    long lng_idValorNuevo = -1;

                    if (g_lst_INTERNO_Filtro_OpcionPadre_Modelo != null && g_lst_INTERNO_Filtro_OpcionPadre_Modelo.Count > 0)
                    {
                        foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo)
                        {
                            //Ver si antes tenia un filtro
                            lng_idValorAnterior = -1;
                            mdl_INTERNO_Filtro_OpcionPadre_Modelo = g_lst_INTERNO_Filtro_OpcionPadre_Modelo.Where(m => m.NOMBRE_CAMPO.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Relacionadas_Modelo.CAMPO)).FirstOrDefault();
                            if (mdl_INTERNO_Filtro_OpcionPadre_Modelo != null)
                            {
                                lng_idValorAnterior = mdl_INTERNO_Filtro_OpcionPadre_Modelo.VALOR;
                            }

                            //Valor Nuevo
                            lng_idValorNuevo = -1;
                            if (frm_PE_Listados_Filtros.g_dct_ListadoFiltros != null)
                            {
                                INTERNO_Listado_Filtros_Relacionadas_Modelo mdl_INTERNO_Listado_Filtros_Relacionadas_Modelo = (INTERNO_Listado_Filtros_Relacionadas_Modelo)frm_PE_Listados_Filtros.g_dct_ListadoFiltros.Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).Select(x => x.Value).FirstOrDefault();
                                if (mdl_INTERNO_Listado_Filtros_Relacionadas_Modelo != null &&
                                    mdl_INTERNO_Listado_Filtros_Relacionadas_Modelo.ID != null &&
                                        mdl_INTERNO_Listado_Filtros_Relacionadas_Modelo.ID.Count > 0)
                                {
                                    lng_idValorNuevo = mdl_INTERNO_Listado_Filtros_Relacionadas_Modelo.ID.FirstOrDefault();
                                }
                            }

                            //Si son Diferentes se actualiza el listado general y se pone a recargar desde base de datos
                            if (lng_idValorAnterior != lng_idValorNuevo)
                            {
                                if (lng_idValorNuevo > -1)
                                {
                                    if (g_lst_INTERNO_Filtro_OpcionPadre_Modelo.Exists(m => m.NOMBRE_CAMPO.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Relacionadas_Modelo.CAMPO)))
                                    {
                                        g_lst_INTERNO_Filtro_OpcionPadre_Modelo[g_lst_INTERNO_Filtro_OpcionPadre_Modelo.FindIndex(m => m.NOMBRE_CAMPO.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Relacionadas_Modelo.CAMPO))].VALOR = lng_idValorNuevo;
                                    }
                                    else
                                    {
                                        g_lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Relacionadas_Modelo.CAMPO, lng_idValorNuevo));
                                    }
                                }
                                else
                                {
                                    g_lst_INTERNO_Filtro_OpcionPadre_Modelo.RemoveAll(m => m.NOMBRE_CAMPO.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.g_mdl_INTERNO_Filtro_Relacionadas_Modelo.CAMPO));
                                }

                                frm_PE_Listados_Filtros.g_bol_RecargarListado = true;
                            }

                        }
                    }
                }
                #endregion

                //Ver si hay que recargar el listado desde base de datos(Por agregar o quitar algun campo con relacion)
                if (frm_PE_Listados_Filtros.g_bol_RecargarListado)
                {
                    //Rellenar los nuevos filtros
                    g_dct_ListadoFiltros = frm_PE_Listados_Filtros.g_dct_ListadoFiltros.ToDictionary(entry => entry.Key, entry => entry.Value);

                    Rellenar_DataGrid(g_obj_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO, g_lng_idDocumento, true);
                }
                else
                {
                    bool bol_Recargar = true;

                    //Si antes no tenia filtros y ahora tampoco no recargo el listado
                    if ((g_dct_ListadoFiltros == null || g_dct_ListadoFiltros.Count == 0) &&
                        (frm_PE_Listados_Filtros.g_dct_ListadoFiltros == null || frm_PE_Listados_Filtros.g_dct_ListadoFiltros.Count == 0))
                    {
                        bol_Recargar = false;
                    }
                    
                    //Rellenar los nuevos filtros
                    g_dct_ListadoFiltros = frm_PE_Listados_Filtros.g_dct_ListadoFiltros.ToDictionary(entry => entry.Key, entry => entry.Value);

                    if (bol_Recargar)
                    {
                        Rellenar_DataGrid(g_obj_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO,g_lng_idDocumento,false);
                    }
                    else
                    {
                        if (bol_Reordenar_Listado)
                        {
                            Ordenar_DataGridView();
                        }
                    }
                }
            }
        
        }
        #endregion

        #region Colores
        private void ex_dgv_Listado_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            try
            {
                if (ex_dgv_Listado.Columns[e.ColumnIndex].Name == nameof(INTERNO_CTU_Cartera_Personal_Modelo.Nomina_Importe) ||
                    ex_dgv_Listado.Columns[e.ColumnIndex].Name == nameof(INTERNO_CTU_Cartera_Personal_Modelo.Vencimiento_Importe) ||
                    ex_dgv_Listado.Columns[e.ColumnIndex].Name == nameof(INTERNO_CTU_Cartera_Personal_Modelo.Pago_Importe) ||
                    ex_dgv_Listado.Columns[e.ColumnIndex].Name == nameof(INTERNO_CTU_Cartera_Personal_Modelo.Saldo))
                {
                    //Nomina
                    if (ex_dgv_Listado.Rows[e.RowIndex].Cells[nameof(INTERNO_CTU_Cartera_Personal_Modelo.Documento_Tipo)].Value.ToString() == Variables.G_MDL_TIPODOCUMENTOS_PERSONAL_NOMINA.Codigo)
                    {
                        //Color Fondo
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Colores.G_COLOR_FONDO_CTUCARTERAPERSONAL_NOMINA;
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Colores.G_COLOR_FONDO_CTUCARTERAPERSONAL_NOMINA;

                        //Color Letra
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.ForeColor = Colores.G_COLOR_LETRA_CTUCARTERAPERSONAL_NOMINA;
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionForeColor = Colores.G_COLOR_LETRA_CTUCARTERAPERSONAL_NOMINA;
                    }
                    //Vencimiento
                    else if (ex_dgv_Listado.Rows[e.RowIndex].Cells[nameof(INTERNO_CTU_Cartera_Personal_Modelo.Documento_Tipo)].Value.ToString() == Variables.G_MDL_TIPODOCUMENTOS_PERSONAL_VENCIMIENTO.Codigo)
                    {
                        //Color Fondo
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Colores.G_COLOR_FONDO_CTUCARTERAPERSONAL_VENCIMIENTO;
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Colores.G_COLOR_FONDO_CTUCARTERAPERSONAL_VENCIMIENTO;

                        //Color Letra
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.ForeColor = Colores.G_COLOR_LETRA_CTUCARTERAPERSONAL_VENCIMIENTO;
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionForeColor = Colores.G_COLOR_LETRA_CTUCARTERAPERSONAL_VENCIMIENTO;
                    }
                    //Pagos
                    else 
                    {
                        //Color Fondo
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Colores.G_COLOR_FONDO_CTUCARTERAPERSONAL_PAGOS;
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Colores.G_COLOR_FONDO_CTUCARTERAPERSONAL_PAGOS;

                        //Color Letra
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.ForeColor = Colores.G_COLOR_LETRA_CTUCARTERAPERSONAL_PAGOS;
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionForeColor = Colores.G_COLOR_LETRA_CTUCARTERAPERSONAL_PAGOS;
                    }
                }
                else
                {
                    if (ex_dgv_Listado.Rows[e.RowIndex].Cells[nameof(INTERNO_CTU_Cartera_Personal_Modelo.Documento_Estado)].Value.ToString() == Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO)
                    {
                        //Color Letra
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.ForeColor = Colores.G_COLOR_LETRA_CTUCARTERAPERSONAL_DOCUMENTOABIERTO;
                        ex_dgv_Listado.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionForeColor = Colores.G_COLOR_LETRA_CTUCARTERAPERSONAL_DOCUMENTOABIERTO;
                    }
                }
            }
            catch (Exception)
            { }

        }
        #endregion

        #region Exportar a Excel
        private void ex_btn_Excel_Click(object sender, EventArgs e)
        {
            Exportar_Excel();
        }
        private void Exportar_Excel()
        {
            
            try
            {
                List<INTERNO_ExportarExcel_Hoja_Modelo> lst_INTERNO_ExportarExcel_Hoja_Modelo = new List<INTERNO_ExportarExcel_Hoja_Modelo>();

                INTERNO_ExportarExcel_Hoja_Modelo mdl_INTERNO_ExportarExcel_Hoja_Modelo = new INTERNO_ExportarExcel_Hoja_Modelo();
                //Hoja
                mdl_INTERNO_ExportarExcel_Hoja_Modelo.Hoja_Descripcion = "Cartera";


                //Crear las Cabeceras ...................................................................................................................................
                List<INTERNO_ExportarExcel_Cabecera_Modelo> lst_INTERNO_ExportarExcel_Cabecera_Modelo = new List<INTERNO_ExportarExcel_Cabecera_Modelo>();

                List<DataGridViewColumn> lst_ColumnasVisibles = ex_dgv_Listado.Columns
                                                                .Cast<DataGridViewColumn>()
                                                                .Where(r => r.Visible)
                                                                .OrderBy(r => r.DisplayIndex)
                                                                .ToList();

                foreach (DataGridViewColumn dgvc_Columna in lst_ColumnasVisibles)
                {
                    lst_INTERNO_ExportarExcel_Cabecera_Modelo.Add(new INTERNO_ExportarExcel_Cabecera_Modelo(dgvc_Columna.HeaderText,
                                                                                                            Colores.G_COLOR_PRINCIPAL_BASE,
                                                                                                            Colores.G_COLOR_LISTADO_CABECERA_LETRA));
                }
                //Añadir Listado de Cabecera
                mdl_INTERNO_ExportarExcel_Hoja_Modelo.Cabecera = lst_INTERNO_ExportarExcel_Cabecera_Modelo;

                //Filas
                List<INTERNO_ExportarExcel_Filas_Modelo> lst_INTERNO_ExportarExcel_Filas_Modelo = new List<INTERNO_ExportarExcel_Filas_Modelo>();

                if (g_lst_INTERNO_CTU_Cartera_Personal_Modelo_Filtradas != null)
                {
                    //Recorrer las Filas
                    foreach (INTERNO_CTU_Cartera_Personal_Modelo mdl_INTERNO_CTU_Cartera_Personal_Modelo in g_lst_INTERNO_CTU_Cartera_Personal_Modelo_Filtradas.OrderBy(m => m.NumeroOrden_Ordenar))
                    {
                        //Celdas .........................................
                        List<INTERNO_ExportarExcel_Celdas_Modelo> lst_INTERNO_ExportarExcel_Celdas_Modelo = new List<INTERNO_ExportarExcel_Celdas_Modelo>();
                        foreach (DataGridViewColumn dgvc_Columna in lst_ColumnasVisibles)
                        {
                            string str_NombreColumna = dgvc_Columna.Name;

                            //Delegacion
                            if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Delegacion).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Delegacion, G_ENUM_TIPOSDATOS.TEXT, Color.White, Color.Black));
                            }
                            //Ejercicio
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Ejercicio).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Ejercicio, G_ENUM_TIPOSDATOS.TEXT, Color.White, Color.Black));
                            }
                            //Nomina_Codigo
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Nomina_Codigo).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Nomina_Codigo, G_ENUM_TIPOSDATOS.LONG, Color.White, Color.Black));
                            }
                            //NumeroOrden_Mostrar
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.NumeroOrden_Mostrar).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.NumeroOrden_Mostrar, G_ENUM_TIPOSDATOS.TEXT, Color.White, Color.Black));
                            }
                            //Documento_Tipo_Texto
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Documento_Tipo_Texto).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Documento_Tipo_Texto, G_ENUM_TIPOSDATOS.TEXT, Color.White, Color.Black));
                            }
                            //Documento_Numero
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Documento_Numero).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Documento_Numero, G_ENUM_TIPOSDATOS.LONG, Color.White, Color.Black));
                            }
                            //Documento_Fecha
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Documento_Fecha).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Documento_Fecha, G_ENUM_TIPOSDATOS.DATETIME, Color.White, Color.Black));
                            }
                            //Remesa_Codigo
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Remesa_Codigo).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Remesa_Codigo, G_ENUM_TIPOSDATOS.LONG, Color.White, Color.Black));
                            }
                            //Remesa_Importe
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Remesa_Importe).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Remesa_Importe, G_ENUM_TIPOSDATOS.DECIMAL, Color.White, Color.Black));
                            }
                            //Nomina_Importe
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Nomina_Importe).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Nomina_Importe, G_ENUM_TIPOSDATOS.DECIMAL, Color.White, Color.Black));
                            }
                            //Vencimiento_Importe
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Vencimiento_Importe).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Vencimiento_Importe, G_ENUM_TIPOSDATOS.DECIMAL, Color.White, Color.Black));
                            }
                            //Pago_Importe
                            else if (nameof(INTERNO_CTU_Cartera_Personal_Modelo.Pago_Importe).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Pago_Importe, G_ENUM_TIPOSDATOS.DECIMAL, Color.White, Color.Black));
                            }
                            //Saldo
                            else if(nameof(INTERNO_CTU_Cartera_Personal_Modelo.Saldo).Equals(str_NombreColumna))
                            {
                                lst_INTERNO_ExportarExcel_Celdas_Modelo.Add(new INTERNO_ExportarExcel_Celdas_Modelo(mdl_INTERNO_CTU_Cartera_Personal_Modelo.Saldo, G_ENUM_TIPOSDATOS.DECIMAL, Color.White, Color.Black));
                            }

                        }

                        INTERNO_ExportarExcel_Filas_Modelo mdl_INTERNO_ExportarExcel_Filas_Modelo = new INTERNO_ExportarExcel_Filas_Modelo();
                        mdl_INTERNO_ExportarExcel_Filas_Modelo.Celdas = lst_INTERNO_ExportarExcel_Celdas_Modelo;
                        //....................................................

                        //Añadir la Fila
                        lst_INTERNO_ExportarExcel_Filas_Modelo.Add(mdl_INTERNO_ExportarExcel_Filas_Modelo);

                    }
                }
                mdl_INTERNO_ExportarExcel_Hoja_Modelo.Filas = lst_INTERNO_ExportarExcel_Filas_Modelo;


                //Añadir al Listado la Hoja
                lst_INTERNO_ExportarExcel_Hoja_Modelo.Add(mdl_INTERNO_ExportarExcel_Hoja_Modelo);

                //Si tiene algo lo genero en Excel sino no
                if (lst_INTERNO_ExportarExcel_Hoja_Modelo != null && lst_INTERNO_ExportarExcel_Hoja_Modelo.Count > 0)
                {
                    string str_RutaCompleta = "";

                    string str_NombreFichero = Funciones.Quitar_CaracteresEspeciales("Cartera_" + DateTime.Now.ToString("yyyyMMdd"));
                    string str_Ruta = @"C:";
                    DateTime dtt_fechaActual = DateTime.Now;
                    //...................................................................................................................................................

                    List<INTERNO_CodigoDescripcion_Modelo> lst_INTERNO_CodigoDescripcion_Modelo = new List<INTERNO_CodigoDescripcion_Modelo>();
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_CODIGO_EMPRESA.Codigo, g_mdl_INTERNO_ValoresGenerales_Modelo.str_Empresa_Codigo));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_FECHA.Codigo, dtt_fechaActual.ToString("yyyyMMdd")));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_HORA.Codigo, dtt_fechaActual.ToString("HHmmss")));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_EJERCICIO.Codigo, g_mdl_INTERNO_ValoresGenerales_Modelo.EjercicioActivo.anioControl));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_FICHERO.Codigo, "Cartera"));

                    str_RutaCompleta = Funciones.Transformar_Ruta(str_Ruta, str_NombreFichero, ".xlsx", lst_INTERNO_CodigoDescripcion_Modelo);

                    //...................................................................................................................................................

                    Funciones_FicherosExcel.Generar_DocumentoListado_Excel(lst_INTERNO_ExportarExcel_Hoja_Modelo, str_RutaCompleta);
                }
                else
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_EXPORTAREXCEL());
                }

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_Cartera_Personal) + "/" + nameof(Exportar_Excel));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_EXPORTAREXCEL());
            }
            
        }



        #endregion

        #region Ver
        private void ex_btn_Ver_Click(object sender, EventArgs e)
        {
            Ver();
        }
        private void ex_dgv_Listado_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            Ver();
        }
        private void Ver()
        {
            try
            {
                if (ex_dgv_Listado.Rows.Count > 0 && ex_dgv_Listado.SelectedRows.Count > 0)
                {
                    int? int_Nulo = null;

                    long lng_DocumentoId = long.Parse(ex_dgv_Listado.SelectedRows[0].Cells[nameof(INTERNO_CTU_Cartera_Personal_Modelo.Documento_Id)].Value.ToString());
                    string str_TipoDocumento = ex_dgv_Listado.SelectedRows[0].Cells[nameof(INTERNO_CTU_Cartera_Personal_Modelo.Documento_Tipo)].Value.ToString();
                    int? int_TipoPantalla= ((ex_dgv_Listado.SelectedRows[0].Cells[nameof(INTERNO_CTU_Cartera_Personal_Modelo.tipoPantalla)]!=null && ex_dgv_Listado.SelectedRows[0].Cells[nameof(INTERNO_CTU_Cartera_Personal_Modelo.tipoPantalla)].Value != null) ? int.Parse(ex_dgv_Listado.SelectedRows[0].Cells[nameof(INTERNO_CTU_Cartera_Personal_Modelo.tipoPantalla)].Value.ToString()) : int_Nulo);

                    string str_Opcion = "";
                    string str_Libreria = "";

                    //Nomina
                    if (str_TipoDocumento==Variables.G_MDL_TIPODOCUMENTOS_PERSONAL_NOMINA.Codigo)
                    {
                        str_Opcion = Variables.G_STR_OPCION_PER_NOMINA;
                        str_Libreria = Variables.G_STR_LIBRERIA_PERSONAL;
                    }
                    //Vencimiento
                    else if (str_TipoDocumento == Variables.G_MDL_TIPODOCUMENTOS_PERSONAL_VENCIMIENTO.Codigo)
                    {
                        str_Opcion = Variables.G_STR_OPCION_PER_NOMINAVENCIMIENTO;
                        str_Libreria = Variables.G_STR_LIBRERIA_PERSONAL;
                    }
                    //Pago
                    else if(str_TipoDocumento == Variables.G_MDL_TIPODOCUMENTOS_PERSONAL_PAGO.Codigo)
                    {
                        str_Opcion = Variables.G_STR_OPCION_PER_NOMINAPAGO;
                        str_Libreria = Variables.G_STR_LIBRERIA_PERSONAL;
                    }

                    INTERNO_OpcionesDetalle_Modelo mdl_INTERNO_OpcionesDetalle_Modelo = Datos_Generales.PRV_Opciones_Buscar_Detalles(str_Opcion);


                    //Cargamos el ensamblado
                    Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + str_Libreria + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type = m_assembly.GetType(str_Libreria + "." + 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);

                    //Obtener valores
                    object[] arr_Parametros = { str_Opcion,
                                            g_frm_P_Base_Origen,
                                            null,
                                            g_mdl_INTERNO_ValoresGenerales_Modelo,
                                            g_dtt_FechaPorDefecto,
                                            mdl_INTERNO_OpcionesDetalle_Modelo,
                                            lng_DocumentoId,
                                            "",
                                            "",
                                            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(CTU_Cartera_Personal) + "/" + nameof(Ver));
            }

        }

        #endregion

        #region Actualizar listado
        private void ex_btn_Actualizar_Click(object sender, EventArgs e)
        {
            Rellenar_DataGrid(g_obj_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO,g_lng_idDocumento,true);
        }
        #endregion
    }
}
