using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_Maestros._0_Modelos;
using Exferia_Maestros._3_Vistas.Controladoras;
using Exferia_Maestros._3_Vistas.ListadosSeleccion;
using Exferia_Maestros.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Maestros._3_Vistas
{
    public partial class P_FormaPago : Exferia_Formularios.P_Base_Mantenimientos
    {
        #region Variables Generales
        private P_FormaPago_Controladora g_obj_Controladora;

        private bool g_bol_ConstructorPantalla_Terminado_Correctamente = true;
        public PRV_OpcionesDetalle g_mdl_PRV_OpcionesDetalle = null;
        
        internal List<INTERNO_Permisos_Modelo> g_lst_INTERNO_Permisos_Modelo = null;

        private System.Windows.Forms.Timer g_timer_Filtrar_Agrupaciones = new System.Windows.Forms.Timer();

        //Variables paginador
        public Funciones_Paginador g_obj_Funciones_Paginador;
        private System.Windows.Forms.Timer g_timer_Paginar = new System.Windows.Forms.Timer();
        #endregion

        #region Objetos en Pantalla
        //Exferia_CheckBox
        internal Exferia_CheckBox Exferia_CheckBox_GeneraRemesa { get { return ex_chk_P_FormaPago_GeneraRemesa; } }

        //Exferia_ComboBox
        internal Exferia_ComboBox Exferia_ComboBox_CampoFechaParaCalculo { get { return ex_cbo_P_FormaPago_CampoFechaParaCalculo; } }
        internal Exferia_ComboBox Exferia_ComboBox_TipoInicio { get { return ex_cbo_P_FormaPago_TipoInicio; } }

        //Exferia_DataGridView
        internal Exferia_DataGridView Exferia_DataGridView_Detalle { get { return ex_dgv_P_FormaPago_Detalle; } }

        //Exferia_Label
        internal Exferia_Label Exferia_Label_Codigo { get{ return ex_lbl_P_FormaPago_Codigo; } }
        internal Exferia_Label Exferia_Label_Descripcion { get { return ex_lbl_P_FormaPago_Descripcion; } }
        internal Exferia_Label Exferia_Label_DiasEntreGiros { get { return ex_lbl_P_FormaPago_DiasEntreGiros; } }
        internal Exferia_Label Exferia_Label_CampoFechaParaCalculo { get { return ex_lbl_P_FormaPago_CampoFechaParaCalculo; } }
        internal Exferia_Label Exferia_Label_MesesDesplazamientoInicial { get { return ex_lbl_P_FormaPago_MesesDesplazamientoInicial; } }
        internal Exferia_Label Exferia_Label_DiasDesplazamientoInicial { get { return ex_lbl_P_FormaPago_DiasDesplazamientoInicial; } }
        internal Exferia_Label Exferia_Label_NumeroVencimientos { get { return ex_lbl_P_FormaPago_NumeroVencimientos; } }
        internal Exferia_Label Exferia_Label_MesesEntreGiros { get { return ex_lbl_P_FormaPago_MesesEntreGiros; } }

        // Exferia_Paginador
        internal Exferia_Paginador Exferia_Paginador_FormaPago { get { return ex_Paginador; } }

        //Exferia_RadioButton
        internal Exferia_RadioButton Exferia_RadioButton_Impuesto_AplicarPrimerVencimiento { get { return ex_rdb_P_FormaPago_Impuesto_AplicarPrimerVencimiento; } }
        internal Exferia_RadioButton Exferia_RadioButton_Impuesto_AplicarProporcional { get { return ex_rdb_P_FormaPago_Impuesto_AplicarProporcional; } }
        internal Exferia_RadioButton Exferia_RadioButton_Impuesto_AplicarUltimoVencimiento { get { return ex_rdb_P_FormaPago_Impuesto_AplicarUltimoVencimiento; } }

        //Exferia_TabPage
        internal TabPage TabPage_Palzos { get { return ex_tbp_P_FormaPago_Plazos; ; } }

        //Exferia_TextBox
        internal Exferia_TextBox Exferia_TextBox_Codigo { get{ return ex_txt_P_FormaPago_Codigo; } }
        internal Exferia_TextBox Exferia_TextBox_Descripcion { get{ return ex_txt_P_FormaPago_Descripcion; } }
        internal Exferia_TextBox Exferia_TextBox_DiasEntreGiros { get{ return ex_txt_P_FormaPago_DiasEntreGiros; } }
        internal Exferia_TextBox Exferia_TextBox_MesesDesplazamientoInicial { get { return ex_txt_P_FormaPago_MesesDesplazamientoInicial; } }
        internal Exferia_TextBox Exferia_TextBox_DiasDesplazamientoInicial { get { return ex_txt_P_FormaPago_DiasDesplazamientoInicial; } }
        internal Exferia_TextBox Exferia_TextBox_NumeroVencimientos { get { return ex_txt_P_FormaPago_NumeroVencimientos; } }
        internal Exferia_TextBox Exferia_TextBox_MesesEntreGiros { get { return ex_txt_P_FormaPago_MesesEntreGiros; } }
        internal Exferia_TextBox Exferia_TextBox_TipoInicio_Dia { get { return ex_txt_P_FormaPago_TipoInicio_Dia; } }

        #endregion

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

            try
            {
                Repintar.Empezar(this);

                CheckForIllegalCrossThreadCalls = false;

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

                //Poner los Botones que no se Spueden poner bloqueados o de solo lectura
                ex_btn_P_FormaPago_Borrar.Exferia_Button_Bloqueable = false;
                ex_btn_P_FormaPago_Grabar.Exferia_Button_Bloqueable = false;

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

            
                //Tipo de campo Codigo, poner como numérico o texto ...............................
                if (Variables.G_LST_GEN_CONFIGURACION_CAMPOCODIGO != null)
                {
                    //Si no existe es Text
                    if (Variables.G_LST_GEN_CONFIGURACION_CAMPOCODIGO.Where(m => m.nombreCampoCodigo.Equals(nameof(MAE_FormasPago.codigo)) && m.opcion.Equals(g_mdl_PRV_OpcionesDetalle.opcion)).FirstOrDefault() != null)
                    {
                        ex_txt_P_FormaPago_Codigo.Exferia_TextBox_Tipos = G_ENUM_TEXTBOX_TIPODATO.Digitos;
                        ex_txt_P_FormaPago_Codigo.Exferia_TextBox_Tipo_Decimal_Enteros = ex_txt_P_FormaPago_Codigo.Exferia_TextBox_MaxLength;

                        g_obj_Controladora.g_bol_CampoCodigo_Numerico = true;
                    }
                }
                //................................................................................


                // 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.Message, ex, nameof(P_FormaPago) + "/" + nameof(P_FormaPago));
                    }
                }
                //....................................................................................................

                //Bloquear pantalla hasta que termine la carga por defecto .....
                Enabled = false;
                //.............................................................

                g_obj_Funciones_Paginador = new Funciones_Paginador();
            }
            catch (Control_Errores)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
            catch (Exception ex)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;

                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_FormaPago) + "/" + nameof(P_FormaPago));
            }
            finally
            {
                //Bloquear pantalla hasta que termine la carga por defecto .....
                Enabled = true;
                //.............................................................
            }
        }
        #endregion

        #region Inicio de pantalla
        private void P_FormaPago_Load(object sender, EventArgs e)
        {
            try
            {
                #region TIMER PAGINACION
                //Configurar el Timer para Paginacion ###############################################################
                g_timer_Paginar.Interval = 1000;
                g_timer_Paginar.Tick += delegate (object s, EventArgs ee)
                {
                    g_timer_Paginar.Stop();
                    try
                    {
                        g_obj_Controladora.RecargarDatos();
                    }
                    catch (Control_Errores)
                    {
                        Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                        Salir_P_Base();
                    }
                };
                #endregion

                #region PLAZOS
                //Crear Columnas Listado
                Crear_Columnas_Listado_Detalle();
                #endregion
            }
            catch (Exception ex)
            {
                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_FormaPago) + "/" + nameof(P_FormaPago_Load));

                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
        }

        private void P_FormaPago_Shown(object sender, EventArgs e)
        {
            try
            {
                if (g_bol_ConstructorPantalla_Terminado_Correctamente)
                {

                    // Si el Tipo de Apertura de Pantalla es Añadir(g_int_tipoAperturaPantalla = 0), se desactivan los botones correspondientes
                    // Añadir
                    if (P_Base_TipoAperturaPantalla == 0)
                    {
                        P_Base_TituloPantalla = P_Base_TituloPantalla + " - Añadir";

                        ActivarBotones(false);

                        //Se cambia el valor de la variable para no salte el evento de se modifico algo
                        g_obj_Controladora.g_bol_Termino_CargaDatos_Inicial = false;

                        //Poner Texto predeterminado y foco
                        if ((P_Base_Campo_1 != null && P_Base_Campo_1.Trim().Length > 0) ||
                            (P_Base_Campo_2 != null && P_Base_Campo_2.Trim().Length > 0))
                        {
                            if (P_Base_Campo_1 != null && P_Base_Campo_1.Trim().Length > 0)
                            {
                                Exferia_TextBox_Codigo.Text = P_Base_Campo_1;
                                Exferia_TextBox_Descripcion.Exferia_TextBox_Foco();
                            }
                            if (P_Base_Campo_2 != null && P_Base_Campo_2.Trim().Length > 0)
                            {
                                Exferia_TextBox_Descripcion.Text = P_Base_Campo_2;
                                Exferia_TextBox_Codigo.Exferia_TextBox_Foco();
                            }
                        }
                        else
                        {
                            Exferia_TextBox_Codigo.Exferia_TextBox_Foco();
                        }

                        //Ponemos siempre a true el checkbox
                        Exferia_CheckBox_GeneraRemesa.Checked = true;

                        //Ocultamos el textbox de dias por que por defecto no sale
                        ex_txt_P_FormaPago_TipoInicio_Dia.Visible = false;

                        g_obj_Controladora.g_bol_Termino_CargaDatos_Inicial = true;
                    }
                    // Modificar
                    else
                    {
                        ActivarBotones(true);

                        //Paginacion
                        if (P_Base_PantallaOrigen != null &&
                           P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                           P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                        {
                            g_obj_Funciones_Paginador.Listado_ARecorrer(P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.ToList(), 1);

                            // Asignando las paginas totales
                            Exferia_Paginador_FormaPago.PaginasTotales = g_obj_Funciones_Paginador.Numero_Paginas_Totales;
                        }
                        else
                        {
                            Exferia_Paginador_FormaPago.Visible = false;
                        }

                        g_obj_Controladora.RecargarDatos();
                    }
                }
                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.Message, ex, nameof(P_FormaPago) + "/" + nameof(P_FormaPago_Shown));

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

        public void ActivarBotones(bool _bol_Activar)
        {
            if (Exferia_Paginador_FormaPago.Visible)
            {
                Exferia_Paginador_FormaPago.Visible = _bol_Activar;
            }

            if (ex_btn_P_FormaPago_Borrar.Enabled)
            {
                ex_btn_P_FormaPago_Borrar.Enabled = _bol_Activar;
            }
        }

        #endregion

        #region Botones Grabar,Borrar,BuscarCodigoSiguiente
        private void ex_btn_P_FormaPago_Grabar_Click(object sender, EventArgs e)
        {
            Grabar();
        }
        private void Grabar()
        {
            if (//Añadir
                (P_Base_TipoAperturaPantalla == 0 && Datos_Generales.Permisos_Comprobar(g_mdl_PRV_OpcionesDetalle.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Anadir, true)) ||
                //Modificar
                (P_Base_TipoAperturaPantalla != 0 && Datos_Generales.Permisos_Comprobar(g_mdl_PRV_OpcionesDetalle.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, true)))
            {
                g_obj_Controladora.GrabarDatos(true);
            }
        }

        private void ex_btn_P_FormaPago_Borrar_Click(object sender, EventArgs e)
        {
            Borrar();
        }
        private void Borrar()
        {
            if (Datos_Generales.Permisos_Comprobar(g_mdl_PRV_OpcionesDetalle.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Borrar, true))
            {
                g_obj_Controladora.BorrarDatos(true);
            }
        }

        private void ex_btn_P_FormaPago_BuscarCodigoSiguiente_Click(object sender, EventArgs e)
        {
            BuscarCodigoSiguiente();
        }
        private void BuscarCodigoSiguiente()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = g_obj_Controladora.Buscar_CodigoSiguiente();
            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false && mdl_INTERNO_ValorDevuelto_Modelo.Mensaje.Trim().Length > 0)
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo.Mensaje);
            }
            else
            {
                P_Base_SeModificoDatosPantalla = true;
            }
        }
        #endregion

        #region Detalle
        private void Crear_Columnas_Listado_Detalle()
        {
            ex_dgv_P_FormaPago_Detalle.AutoGenerateColumns = false;

            g_obj_Controladora.g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Detalle_Columnas = g_obj_Controladora.g_obj_ABS_Listado_MAE_FormasPago_Detalle.LISTADO_COLUMNAS().Values.ToList();

            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_obj_Controladora.g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Detalle_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.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_obj_Controladora.g_lst_ColumnasAMostrar_MAE_FormasPagos_Detalle.Add(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna);
                }
                //.....................................................................................................

                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_FormaPago_Detalle.Columns.Add(dgv_Columna);
            }
        }

        //Para el formateo de las celdas del DataGrid Detalle
        private void ex_dgv_P_FormaPago_Detalle_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            string str_NombreColumna = ex_dgv_P_FormaPago_Detalle.Columns[e.ColumnIndex].Name;

            INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_Controladora.g_obj_ABS_Listado_MAE_FormasPago_Detalle.LISTADO_COLUMNAS().Values.Where(m => m.DescripcionInterna_CampoAPintar.Equals(str_NombreColumna)).FirstOrDefault();

            if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
            {
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.CondicionesColores != null && mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.CondicionesColores.Count > 0)
                {
                    bool bol_Entro = false;
                    Color clr_Letra = Color.Black;
                    Color clr_Fondo = Color.White;
                    string str_ColumnaAPintar = "";

                    //Valor Actual ...........................
                    dynamic dnm_ValorAComparar = null;

                    object obj_Valor = ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna].Value;

                    if (obj_Valor != null)
                    {
                        if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                        { dnm_ValorAComparar = DateTime.ParseExact(obj_Valor.ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture); }
                        else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                        { dnm_ValorAComparar = decimal.Parse(obj_Valor.ToString().Replace(",", ".")); }
                        else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                        { dnm_ValorAComparar = int.Parse(obj_Valor.ToString()); }
                        else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                        { dnm_ValorAComparar = long.Parse(obj_Valor.ToString()); }
                        else
                        { dnm_ValorAComparar = ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna].Value; }
                    }

                    foreach (INTERNO_ABS_Listado_CondicionesColores_Modelo mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo in mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.CondicionesColores)
                    {
                        clr_Letra = mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.COLOR_LETRA;
                        clr_Fondo = mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.COLOR_FONDO;
                        str_ColumnaAPintar = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.DescripcionInterna_CampoAPintar;

                        //Igual que
                        if (mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA.Codigo.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_GENERAL_IGUALA.Codigo))
                        {
                            if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                            {
                                if (dnm_ValorAComparar.Equals("X"))
                                {
                                    bol_Entro = true;
                                }
                            }
                            else
                            {
                                if (dnm_ValorAComparar.Equals(mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.VALOR_DECOMPRACION))
                                {
                                    bol_Entro = true;
                                }
                            }
                            break;
                        }
                        //Menor que
                        else if (mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA.Codigo.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_GENERAL_MENORA.Codigo))
                        {
                            //Solo los tipos de datos numericos y datetime
                            if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                            {
                                if (dnm_ValorAComparar < mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.VALOR_DECOMPRACION)
                                {
                                    bol_Entro = true;
                                }
                            }

                            break;
                        }
                        //Menor Igual que
                        else if (mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA.Codigo.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_GENERAL_MENORIGUALA.Codigo))
                        {
                            //Solo los tipos de datos numericos y datetime
                            if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                            {
                                if (dnm_ValorAComparar <= mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.VALOR_DECOMPRACION)
                                {
                                    bol_Entro = true;
                                }
                            }
                            break;
                        }
                        //Mayor que
                        else if (mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA.Codigo.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_GENERAL_MAYORA.Codigo))
                        {
                            //Solo los tipos de datos numericos y datetime
                            if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                            {
                                if (dnm_ValorAComparar > mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.VALOR_DECOMPRACION)
                                {
                                    bol_Entro = true;
                                }
                            }

                            break;
                        }
                        //Mayor Igual que
                        else if (mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA.Codigo.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_GENERAL_MAYORIGUALA.Codigo))
                        {
                            //Solo los tipos de datos numericos y datetime
                            if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL) ||
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                            {
                                if (dnm_ValorAComparar >= mdl_INTERNO_ABS_Listado_CondicionesColores_Modelo.VALOR_DECOMPRACION)
                                {
                                    bol_Entro = true;
                                }
                            }
                            break;
                        }
                    }

                    if (bol_Entro && str_ColumnaAPintar.Trim().Length > 0)
                    {
                        //Color Fondo
                        ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[str_ColumnaAPintar].Style.BackColor = clr_Letra;
                        ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[str_ColumnaAPintar].Style.SelectionBackColor = clr_Letra;

                        //Color Letra
                        ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[str_ColumnaAPintar].Style.ForeColor = clr_Fondo;
                        ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[str_ColumnaAPintar].Style.SelectionForeColor = clr_Fondo;
                    }
                }
            }
        }
        #endregion

        #region Eventos del Paginador
        protected void ctu_Paginacion_Primera_Click(object sender, EventArgs e)
        {
            if (g_obj_Controladora.ComprobarCambios())// Si no han habido contratiempos pasamos a la pagina indicada
            {
                if (g_obj_Funciones_Paginador.Primera())
                {
                    // Asignando al control la pagina actual.
                    Exferia_Paginador_FormaPago.PaginaActual = g_obj_Funciones_Paginador.GetPaginaActual();
                    
                    // Refrescamos el listado a mostrar en el form.
                    P_Base_id = g_obj_Funciones_Paginador.Objeto_Devuelto.FirstOrDefault().ID;
                    
                    g_timer_Paginar.Stop();
                    g_timer_Paginar.Start();
                }
            }
        }
        protected void ctu_Paginacion_Anterior_Click(object sender, EventArgs e)
        {
            if (g_obj_Controladora.ComprobarCambios()) // Si no han habido contratiempos pasamos a la pagina indicada
            {
                if (g_obj_Funciones_Paginador.Anterior())
                {
                    // Asignando al control la pagina actual.
                    Exferia_Paginador_FormaPago.PaginaActual = g_obj_Funciones_Paginador.GetPaginaActual();
                    
                    // Refrescamos el listado a mostrar en el form.
                    P_Base_id = g_obj_Funciones_Paginador.Objeto_Devuelto.FirstOrDefault().ID;
                    
                    g_timer_Paginar.Stop();
                    g_timer_Paginar.Start();
                }
            }
        }
        protected void ctu_Paginacion_Siguiente_Click(object sender, EventArgs e)
        {
            if (g_obj_Controladora.ComprobarCambios()) // Si no han habido contratiempos pasamos a la pagina indicada
            {
                if (g_obj_Funciones_Paginador.Siguiente())
                {
                    // Asignando al control la pagina actual.
                    Exferia_Paginador_FormaPago.PaginaActual = g_obj_Funciones_Paginador.GetPaginaActual();
                    
                    // Refrescamos el listado a mostrar en el form.
                    P_Base_id = g_obj_Funciones_Paginador.Objeto_Devuelto.FirstOrDefault().ID;
                    
                    g_timer_Paginar.Stop();
                    g_timer_Paginar.Start();
                }
            }
        }
        protected void ctu_Paginacion_Ultima_Click(object sender, EventArgs e)
        {
            if (g_obj_Controladora.ComprobarCambios()) // Si no han habido contratiempos pasamos a la pagina indicada
            {
                if (g_obj_Funciones_Paginador.Ultima())
                {
                    // Asignando al control la pagina actual.
                    Exferia_Paginador_FormaPago.PaginaActual = g_obj_Funciones_Paginador.GetPaginaActual();
                    
                    // Refrescamos el listado a mostrar en el form.
                    P_Base_id = g_obj_Funciones_Paginador.Objeto_Devuelto.FirstOrDefault().ID;
                    
                    g_timer_Paginar.Stop();
                    g_timer_Paginar.Start();
                }
            }
        }
        protected void txt_PaginaActual_KeyPress(object sender, KeyPressEventArgs e)
        {
            // Si pulsamos Enter.
            if (e.KeyChar.Equals('\r'))
            {
                if (g_obj_Controladora.ComprobarCambios()) // Si no han habido contratiempos pasamos a la pagina indicada
                {
                    // Asignamos a la paginacion el valor del textbox
                    g_obj_Funciones_Paginador.SetPaginaActual(Exferia_Paginador_FormaPago.txt_ValorPaginaActual - 1);

                    // Asignando al control la pagina actual.
                    Exferia_Paginador_FormaPago.PaginaActual = g_obj_Funciones_Paginador.GetPaginaActual();
                    
                    // Refrescamos el listado a mostrar en el form.
                    P_Base_id = g_obj_Funciones_Paginador.Objeto_Devuelto.FirstOrDefault().ID;
                    
                    g_timer_Paginar.Stop();
                    g_obj_Controladora.RecargarDatos();
                }
            }
        }
        #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;
            }
            // Borrar
            else if (keyData == Keys.F5)
            {
                Borrar();
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
        #endregion

        #region Controlar si se modifica algo

        private void Controlar_Modificaciones_TextBox_TextChanged(object sender, EventArgs e)
        {
            Controlar_Modificaciones();
        }
        private void Controlar_Modificaciones_ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            Controlar_Modificaciones();
        }
        private void Controlar_Modificaciones_CheckBox_CheckedChanged(object sender, EventArgs e)
        {
            Controlar_Modificaciones();
        }
        private void Controlar_Modificaciones()
        {
            if (Enabled && g_obj_Controladora != null && g_obj_Controladora.g_bol_Termino_CargaDatos_Inicial)
            {
                P_Base_SeModificoDatosPantalla = true;
            }
        }

        #endregion

        #region Metodos del ComboBox Tipo inicio
        private void ex_cbo_P_FormaPago_InicioDesde_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora != null)
            {
                //Si se selecciona el campo de dia del mes Ponemos visible el textbox
                if (ex_cbo_P_FormaPago_TipoInicio.SelectedItem != null && Variables.G_MDL_TIPOINICIO_DIA.Codigo.Equals(((INTERNO_ComboBox_Modelo)ex_cbo_P_FormaPago_TipoInicio.SelectedItem).Identificador))
                {
                    ex_txt_P_FormaPago_TipoInicio_Dia.Visible = true;
                }
                else
                { 
                    ex_txt_P_FormaPago_TipoInicio_Dia.Visible = false;
                }

                Controlar_Modificaciones();
            }
        }
        #endregion

        #region Metodos del TextBox Cuotas

        #region NumeroVencimientos
        private string g_str_NumeroVencimientos_GotFocus = "";
        private void ex_txt_P_FormaPago_NumeroVencimientos_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_str_NumeroVencimientos_GotFocus = ex_txt_P_FormaPago_NumeroVencimientos.Text;
        }
        private void ex_txt_P_FormaPago_NumeroVencimientos_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            string str_NumeroVencimientos_LostFocus = ex_txt_P_FormaPago_NumeroVencimientos.Text;

            if (str_NumeroVencimientos_LostFocus!= g_str_NumeroVencimientos_GotFocus)
            {
                if (ex_txt_P_FormaPago_NumeroVencimientos.Text == "")
                {
                    ex_txt_P_FormaPago_NumeroVencimientos.Text = "0";
                }

                CalcularCuotas();

                Controlar_Modificaciones();
            }
        }
        #endregion

        #region MesesDesplazamientoInicial
        private string g_str_MesesDesplazamientoInicial_GotFocus = "";
        private void ex_txt_P_FormaPago_MesesDesplazamientoInicial_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_str_MesesDesplazamientoInicial_GotFocus = ex_txt_P_FormaPago_MesesDesplazamientoInicial.Text;
        }
        private void ex_txt_P_FormaPago_MesesDesplazamientoInicial_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            string str_MesesDesplazamientoInicial_LostFocus = ex_txt_P_FormaPago_MesesDesplazamientoInicial.Text;

            if (str_MesesDesplazamientoInicial_LostFocus != g_str_MesesDesplazamientoInicial_GotFocus)
            {
                if (ex_txt_P_FormaPago_MesesDesplazamientoInicial.Text == "")
                {
                    ex_txt_P_FormaPago_MesesDesplazamientoInicial.Text = "0";
                }

                CalcularCuotas();

                Controlar_Modificaciones();
            }
        }
        #endregion

        #region DiasDesplazamientoInicial
        private string g_str_DiasDesplazamientoInicial_LostFocus = "";
        private void ex_txt_P_FormaPago_DiasDesplazamientoInicial_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_str_DiasDesplazamientoInicial_LostFocus = ex_txt_P_FormaPago_DiasDesplazamientoInicial.Text;
        }
        private void ex_txt_P_FormaPago_DiasDesplazamientoInicial_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            string str_DiasDesplazamientoInicial_LostFocus = ex_txt_P_FormaPago_DiasDesplazamientoInicial.Text;

            if (str_DiasDesplazamientoInicial_LostFocus != g_str_DiasDesplazamientoInicial_LostFocus)
            {
                if (ex_txt_P_FormaPago_DiasDesplazamientoInicial.Text == "")
                {
                    ex_txt_P_FormaPago_DiasDesplazamientoInicial.Text = "0";
                }

                CalcularCuotas();

                Controlar_Modificaciones();
            }
        }
        #endregion

        #region MesesEntreGiros
        private string g_str_MesesEntreGiros_GotFocus = "";
        private void ex_txt_P_FormaPago_MesesEntreGiros_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_str_MesesEntreGiros_GotFocus = ex_txt_P_FormaPago_MesesEntreGiros.Text;
        }
        private void ex_txt_P_FormaPago_MesesEntreGiros_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            string str_MesesEntreGiros_LostFocus = ex_txt_P_FormaPago_MesesEntreGiros.Text;

            if (str_MesesEntreGiros_LostFocus != g_str_MesesEntreGiros_GotFocus)
            {
                if (ex_txt_P_FormaPago_MesesEntreGiros.Text == "")
                {
                    ex_txt_P_FormaPago_MesesEntreGiros.Text = "0";
                }

                CalcularCuotas();

                Controlar_Modificaciones();
            }
        }
        #endregion

        #region DiasEntreGiros
        private string g_str_DiasEntreGiros_GotFocus = "";
        private void ex_txt_P_FormaPago_DiasEntreGiros_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_str_DiasEntreGiros_GotFocus = ex_txt_P_FormaPago_DiasEntreGiros.Text;
        }
        private void ex_txt_P_FormaPago_DiasEntreGiros_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            string str_DiasEntreGiros_LostFocus = ex_txt_P_FormaPago_DiasEntreGiros.Text;

            if (str_DiasEntreGiros_LostFocus != g_str_DiasEntreGiros_GotFocus)
            {
                if (ex_txt_P_FormaPago_DiasEntreGiros.Text == "")
                {
                    ex_txt_P_FormaPago_DiasEntreGiros.Text = "0";
                }

                CalcularCuotas();

                Controlar_Modificaciones();
            }
        }
        #endregion

        private void CalcularCuotas()
        {
            //Obtengo todos los datos necesarios
            int int_Cuotas = ex_txt_P_FormaPago_NumeroVencimientos.Text != "" ? Convert.ToInt32(ex_txt_P_FormaPago_NumeroVencimientos.Text) : 0;

            int int_Meses = ex_txt_P_FormaPago_MesesDesplazamientoInicial.Text != "" ? Convert.ToInt32(ex_txt_P_FormaPago_MesesDesplazamientoInicial.Text) : 0;
            int int_Dias = ex_txt_P_FormaPago_DiasDesplazamientoInicial.Text != "" ? Convert.ToInt32(ex_txt_P_FormaPago_DiasDesplazamientoInicial.Text) : 0;

            int int_MesesEntreGiros = ex_txt_P_FormaPago_MesesEntreGiros.Text != "" ? Convert.ToInt32(ex_txt_P_FormaPago_MesesEntreGiros.Text) : 0;
            int int_DiasEntreGiros = ex_txt_P_FormaPago_DiasEntreGiros.Text != "" ? Convert.ToInt32(ex_txt_P_FormaPago_DiasEntreGiros.Text) : 0;

            //Creo los plazos del DataGridView
            g_obj_Controladora.Crear_Plazos(int_Cuotas, int_Meses, int_Dias, int_MesesEntreGiros, int_DiasEntreGiros);
        }
        
        #endregion

        #region Metodos del DataGridView
        //Evento para cuendo se selecciona una celda que no sea NumeroVencimiento
        private void ex_dgv_P_FormaPago_Plazos_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
            {
                //Si la celda No Es Numero Vencimiento entonces ponemos la celda en modo edicion
                if (ex_dgv_P_FormaPago_Detalle.CurrentCell != ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[nameof(MAE_FormasPago_Detalle.orden)])
                {
                    ex_dgv_P_FormaPago_Detalle.CurrentCell.ReadOnly = false;
                    ex_dgv_P_FormaPago_Detalle.BeginEdit(true);
                }
            }
        }

        //Evento para Cuando se estan editando las celdas Mes,Dias o porcentaje #####
        private void ex_dgv_P_FormaPago_Plazos_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            DataGridViewTextBoxEditingControl obj_DataGridViewTextBoxEditingControl = (DataGridViewTextBoxEditingControl)e.Control;

            //Si son dias o meses llamamo a un evento
            if (ex_dgv_P_FormaPago_Detalle.CurrentCell != 
                ex_dgv_P_FormaPago_Detalle.Rows[ex_dgv_P_FormaPago_Detalle.CurrentCell.RowIndex].Cells[nameof(MAE_FormasPago_Detalle.porcentaje)])
            {
                obj_DataGridViewTextBoxEditingControl.KeyPress -= new KeyPressEventHandler(dataGridview_KeyPress_Mes_Dias);
                obj_DataGridViewTextBoxEditingControl.KeyPress += new KeyPressEventHandler(dataGridview_KeyPress_Mes_Dias);
            }
            //si son porcentajes llamamos a otro
            else
            {
                obj_DataGridViewTextBoxEditingControl.KeyPress -= new KeyPressEventHandler(DataGridView_KeyPress_Porcentaje);
                obj_DataGridViewTextBoxEditingControl.KeyPress += new KeyPressEventHandler(DataGridView_KeyPress_Porcentaje);
                obj_DataGridViewTextBoxEditingControl.TextChanged += new EventHandler(DataGridView_TextChanged_Porcentaje);
            }
        }

        //Evento que se llama Cuando se modifica dias o meses 
        //(Controla que solo puedas meter 2 digitos)
        private void dataGridview_KeyPress_Mes_Dias(object sender, KeyPressEventArgs e)
        {
            DataGridViewTextBoxEditingControl obj_DataGridViewTextBoxEditingControl = ((DataGridViewTextBoxEditingControl)sender);

            //Esto lo hago para que en la edicion de las celdas solo pueda poner 2 digitos
            if (!(obj_DataGridViewTextBoxEditingControl.Text.ToString().Trim().Length > 1) || e.KeyChar == (Char)Keys.Back)
            {
                if (Char.IsNumber(e.KeyChar) || e.KeyChar == (Char)Keys.Back)
                {
                    e.Handled = false;
                }
                else
                {
                    e.Handled = true;
                }
            }
            else
            {
                e.Handled = true;
            }
        }

        //Evento que se llama Cuando se modifican porcentajes
        //(Controla que solo se puedan meter 3 enteros y dos deciamles)
        private void DataGridView_KeyPress_Porcentaje(object sender, KeyPressEventArgs e)
        {
            DataGridViewTextBoxEditingControl obj_DataGridViewTextBoxEditingControl = ((DataGridViewTextBoxEditingControl)sender);

            ControlDecimales(e, obj_DataGridViewTextBoxEditingControl);
        }
        //Evento para controlar que el porcentaje no supere el 100%
        private void DataGridView_TextChanged_Porcentaje(object sender, EventArgs e)
        {
            DataGridViewTextBoxEditingControl obj_DataGridViewTextBoxEditingControl = ((DataGridViewTextBoxEditingControl)sender);
            decimal dcm_ParteEntera_Porcentaje = obj_DataGridViewTextBoxEditingControl.Text != "" ? Convert.ToDecimal(obj_DataGridViewTextBoxEditingControl.Text) : 0;

            if(dcm_ParteEntera_Porcentaje > 100)
            {
                obj_DataGridViewTextBoxEditingControl.Text = "100,00";
            }

            obj_DataGridViewTextBoxEditingControl.SelectionStart = obj_DataGridViewTextBoxEditingControl.Text.Length;
        }
        //Evento cedido por controles en la parte de TextBox decimal
        private void ControlDecimales(KeyPressEventArgs e, DataGridViewTextBoxEditingControl _obj_TextBoxDataGrid)
        {
            int int_Decimal_Decimales = 2;
            int int_Entero = 3;

            e.Handled = false;

            //Cambiar Punto por Coma
            if (e.KeyChar == 46)
            {
                e.KeyChar = (char)44;
            }
            char ch = e.KeyChar;

            //Es un simbolo menos y ya existe una
            if (ch == 45 &&
                _obj_TextBoxDataGrid.Text.IndexOf('-') != -1)
            {
                e.Handled = true;
                return;
            }
            //Es un simbolo menos y esta vacio el textbox
            else if (ch == 45 &&
                     _obj_TextBoxDataGrid.Text.Length > 0 &&
                     _obj_TextBoxDataGrid.SelectionStart > 0)
            {
                e.Handled = true;
                return;
            }
            //Es una Coma y ya existe una
            else if (ch == 44 &&
                     _obj_TextBoxDataGrid.Text.IndexOf(',') != -1)
            {
                e.Handled = true;
                return;
            }
            //Es una Coma y esta vacio el textbox
            else if (ch == 44 &&
                     _obj_TextBoxDataGrid.Text.Length == 0)
            {
                e.Handled = true;
                return;
            }
            //Es una Coma y no esta vacio pero tiene el simbolo menos en el primer registro
            else if (ch == 44 &&
                     _obj_TextBoxDataGrid.Text.Length > 0 &&
                     _obj_TextBoxDataGrid.Text.Substring(0, 1).Equals("-") &&
                     _obj_TextBoxDataGrid.SelectionStart < 2)
            {
                e.Handled = true;
                return;
            }
            //Es una Coma y no esta vacio y no tiene el simbolo menos en el primer registro
            else if (ch == 44 &&
                     _obj_TextBoxDataGrid.Text.Length > 0 &&
                     !_obj_TextBoxDataGrid.Text.Substring(0, 1).Equals("-") &&
                     _obj_TextBoxDataGrid.SelectionStart < 1)
            {
                e.Handled = true;
                return;
            }

            //No es un digito, ni una coma, ni retroceso
            if (!char.IsDigit(ch) &&
                ch != 8 &&
                ch != 44 &&
                ch != 45)
            {
                e.Handled = true;
            }

            if (char.IsDigit(ch))
            {
                int int_ParteEnteraOdecimal = 0;
                //Saber si se esta en la parte entera o la decimal .............
                if (_obj_TextBoxDataGrid.Text.IndexOf(',') > -1 && _obj_TextBoxDataGrid.SelectionStart > (_obj_TextBoxDataGrid.Text.IndexOf(',')))
                {
                    int_ParteEnteraOdecimal = 1;
                }
                //...............................................................

                //Parte Entera
                if (int_ParteEnteraOdecimal == 0)
                {
                    //Comprobar tamaño de la parte entero .................
                    string str_ParteEntera = "";
                    if (_obj_TextBoxDataGrid.Text.Length > 0)
                    {
                        if (_obj_TextBoxDataGrid.Text.IndexOf(',') != -1)
                        {
                            str_ParteEntera = _obj_TextBoxDataGrid.Text.Substring(0, _obj_TextBoxDataGrid.Text.IndexOf(','));
                        }
                        else
                        {
                            str_ParteEntera = _obj_TextBoxDataGrid.Text;
                        }
                    }

                    if (str_ParteEntera.Length >= int_Entero && _obj_TextBoxDataGrid.SelectedText.Length == 0)
                    {
                        e.Handled = true;
                    }
                }
                //Parte decimal
                else
                {
                    string str_ParteDecimal = "";
                    if (_obj_TextBoxDataGrid.Text.IndexOf(',') < (_obj_TextBoxDataGrid.Text.Length - 1))
                    {
                        str_ParteDecimal = _obj_TextBoxDataGrid.Text.Substring(_obj_TextBoxDataGrid.Text.IndexOf(',') + 1, (_obj_TextBoxDataGrid.Text.Length - (_obj_TextBoxDataGrid.Text.IndexOf(',') + 1)));
                    }

                    //Comprobar tamaño de la parte decimal
                    if (str_ParteDecimal.Length >= int_Decimal_Decimales && _obj_TextBoxDataGrid.SelectedText.Length == 0)
                    {
                        e.Handled = true;
                    }
                }
            }
            else
            {
                //Si es una coma, despue de la coma solo puede haber una catidad de decimales
                if (ch == 44)
                {
                    int int_Cantidad_DespuesComa = _obj_TextBoxDataGrid.Text.Length - _obj_TextBoxDataGrid.SelectionStart;
                    string str_TextoAntesComa = _obj_TextBoxDataGrid.Text.Substring(0, _obj_TextBoxDataGrid.SelectionStart);

                    if (int_Cantidad_DespuesComa > int_Decimal_Decimales)
                    {
                        _obj_TextBoxDataGrid.Text = str_TextoAntesComa + "," + _obj_TextBoxDataGrid.Text.Substring(_obj_TextBoxDataGrid.SelectionStart, int.Parse(int_Decimal_Decimales.ToString()));
                        e.Handled = true;
                    }
                }
            }
            if (_obj_TextBoxDataGrid.SelectedText.Contains(","))
            {
                if (!(_obj_TextBoxDataGrid.SelectedText.Equals(",")))
                {
                    string str_TextoAntesComa = _obj_TextBoxDataGrid.Text.Substring(0, _obj_TextBoxDataGrid.Text.IndexOf(','));
                    string str_ParteDecimal = _obj_TextBoxDataGrid.Text.Split(',')[1];
                    string str_TextoDespuesComa = _obj_TextBoxDataGrid.Text.Substring((_obj_TextBoxDataGrid.Text.IndexOf(',') + 1), str_ParteDecimal.Length);

                    //Partes Seleccionadas antes y despues de la coma
                    string str_SeleccionAntesComa = _obj_TextBoxDataGrid.SelectedText.Split(',')[0];
                    string str_SeleccionDespuesComa = _obj_TextBoxDataGrid.SelectedText.Split(',')[1];


                    int int_ParteEntera = str_TextoAntesComa.Length - str_SeleccionAntesComa.Length;
                    int int_ParteDecimal = str_TextoDespuesComa.Length - str_SeleccionDespuesComa.Length;

                    int int_Borrrar = 0;

                    //Si No se pulsa retroceso suma 1
                    if (ch != 8)
                    {
                        int_Borrrar = 1;
                    }

                    //Comprueba si el conjunto de numeros supera el valor del entero
                    if ((int_ParteEntera + int_ParteDecimal + int_Borrrar) > int_Entero)
                    {
                        e.Handled = true;
                    }
                }
                else
                {
                    e.Handled = true;
                }
            }
            //Si se pulsa la tecla retroceso y contiene una coma el textBox
            if (ch == 8 && _obj_TextBoxDataGrid.Text.Contains(","))
            {
                string str_TextoAntesComa = _obj_TextBoxDataGrid.Text.Substring(0, _obj_TextBoxDataGrid.Text.IndexOf(','));

                //Compruebo si el cursor del TextBox se encuentra en la posicion de la coma                
                if (_obj_TextBoxDataGrid.SelectionStart == (str_TextoAntesComa.Length + 1))
                {
                    string str_ParteDecimal = _obj_TextBoxDataGrid.Text.Split(',')[1];
                    string str_TextoDespuesComa = _obj_TextBoxDataGrid.Text.Substring((_obj_TextBoxDataGrid.Text.IndexOf(',') + 1), str_ParteDecimal.Length);

                    //Si al quitar la coma la parte entera mide mas de lo que deberia no hace nada
                    if ((str_TextoAntesComa.Length + str_TextoDespuesComa.Length) > int_Entero)
                    {
                        e.Handled = true;
                    }
                }
            }
        }
        // ###########################################################################

        //Evento para cuando se termina de editar alguna de las celdas 
        //Lo que hace es actualizar el modelo de el listado que al final se grabará en base de datos
        private void ex_dgv_P_FormaPago_Plazos_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            //Obtengo el modelo a modificar
            MAE_FormasPago_Detalle mdl_MAE_FormasPago_Detalle = g_obj_Controladora.g_lst_MAE_FormasPago_Detalle.Where(x =>
                                                                                                 x.orden.Equals
                                                                                                 (ex_dgv_P_FormaPago_Detalle.CurrentRow.Cells[nameof(MAE_FormasPago_Detalle.orden)].Value)).FirstOrDefault();

            //Mes
            if (ex_dgv_P_FormaPago_Detalle[e.ColumnIndex,e.RowIndex] == ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[nameof(MAE_FormasPago_Detalle.meses)])
            {
                mdl_MAE_FormasPago_Detalle.meses = (ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex].Value != null && ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex].Value.ToString() != "") 
                                                                ? Convert.ToInt32(ex_dgv_P_FormaPago_Detalle[e.ColumnIndex,e.RowIndex].Value) : 0;
                //Si el row es el primero lo aplico al textbox
                if(e.RowIndex == 0)
                {
                    ex_txt_P_FormaPago_MesesDesplazamientoInicial.Text = mdl_MAE_FormasPago_Detalle.meses.ToString();
                }
            }
            //Dias
            else if (ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex] == ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[nameof(MAE_FormasPago_Detalle.dias)])
            {
                mdl_MAE_FormasPago_Detalle.dias = (ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex].Value != null && ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex].Value.ToString() != "")
                                                               ? Convert.ToInt32(ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex].Value) : 0;

                //Si el row es el primero lo aplico al textbox
                if (e.RowIndex == 0)
                {
                    ex_txt_P_FormaPago_DiasDesplazamientoInicial.Text = mdl_MAE_FormasPago_Detalle.dias.ToString();
                }
            }
            //Porcentaje
            else if (ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex] == ex_dgv_P_FormaPago_Detalle.Rows[e.RowIndex].Cells[nameof(MAE_FormasPago_Detalle.porcentaje)])
            {
                mdl_MAE_FormasPago_Detalle.porcentaje = (ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex].Value != null && ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex].Value.ToString() != "")
                                                               ? Convert.ToDecimal(ex_dgv_P_FormaPago_Detalle[e.ColumnIndex, e.RowIndex].Value) : 0;
            }
        }
        #endregion

        #region Metodos del TextBox TipoInicio Dia
        //Evento que no permite meter un dia menor de 0 ni lmallor de 31
        private void ex_txt_P_FormaPago_DiaDelMes_Exferia_TextBox_Evento_TextChanged(object sender, EventArgs e)
        {
            Exferia_TextBox obj_Exferia_TextBox = ((Exferia_TextBox)sender);
            int int_DiaMes = obj_Exferia_TextBox.Text != "" ? Convert.ToInt32(obj_Exferia_TextBox.Text) : 0;

            if(int_DiaMes > 31)
            {
                obj_Exferia_TextBox.Text = "31";
            }
            else if(int_DiaMes < 1)
            {
                obj_Exferia_TextBox.Text = "1";
            }

            //Se hace para que el cursor se quede al final
            obj_Exferia_TextBox.Exferia_TextBox_SelectionStart = obj_Exferia_TextBox.Text.Length;

            Controlar_Modificaciones();
        }


        #endregion

        
    }
}
