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_EntityFramework;
using Exferia_Formularios;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using Exferia_Compras.General;
using System.Globalization;

namespace Exferia_Compras._3_Vistas.ControlesPersonalizados_DentroPaneles
{
    public partial class CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen : UserControl          
    {
        #region Variables privadas
        private P_Base g_frm_Pantalla_DeDondeereda = null;
        private int g_int_NumeroObjeto;

        private COM_FacturasCabecera_Resumen g_mdl_COM_FacturasCabecera_Resumen;
        private List<GEN_ImpuestosLineas> g_lst_GEN_ImpuestosLineas = null;
        private GEN_Retenciones g_mdl_GEN_Retenciones = null;
        private GEN_ImpuestosLineas g_mdl_GEN_ImpuestosLineas_Seleccionado = null;
        private bool g_bol_RecargoEquivalencia = false;

        private decimal g_dcm_DescuentoFinalFactura_Porcentaje = 0m;
        private decimal g_dcm_DescuentoFinalFactura_Valor = 0m;
        private decimal g_dcm_DescuentoProntoPago_Porcentaje = 0m;
        private decimal g_dcm_DescuentoProntoPago_Valor = 0m;

        //Para calculos
        private decimal g_dcm_Bruto = 0m;
        private decimal g_dcm_Base = 0m;
        private decimal g_dcm_Impuesto_Porcentaje = 0m;
        private decimal g_dcm_Impuesto_Valor = 0m;
        private decimal g_dcm_Recargo_Porcentaje = 0m;
        private decimal g_dcm_Recargo_Valor = 0m;
        private decimal g_dcm_Retencion_Base = 0m;
        private decimal g_dcm_Retencion_Porcentaje = 0m;
        private decimal g_dcm_Retencion_Valor = 0m;
        private decimal g_dcm_TotalSinRetenciones = 0m;
        private decimal g_dcm_TotalFinal = 0m;

        //Impuestos
        private long g_lng_idImpuestoTipo = -1;
        private long g_lng_idImpuestoLinea = -1;
        #endregion

        #region Eventos Publicos
        public event EventHandler<INTERNO_EventArgs> Boton_P_CTU_P_FacturaCabecera_LineaResumenDelete_Click;
        #endregion

        #region Propiedades Publicas
        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto { get { return g_dcm_Bruto; } }
        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible { get { return g_dcm_Base; } }
        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Impuesto_Valor { get { return g_dcm_Impuesto_Valor; } }
        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Recargo_Valor { get { return g_dcm_Recargo_Valor; } }
        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Retencion_Base { get { return g_dcm_Retencion_Base; } }
        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Retencion_Valor { get { return g_dcm_Retencion_Valor; } }
        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_TotalSinRetenciones { get { return g_dcm_TotalSinRetenciones; } }
        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_TotalFinal { get { return g_dcm_TotalFinal; } }

        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_DescuentoFinalFactura_Valor
        {
            get
            {
                return (g_dcm_Bruto - g_dcm_Base) - g_dcm_DescuentoProntoPago_Valor;
            }
        }
        public decimal CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_DescuentoProntoPago_Valor
        {
            get
            {
                return g_dcm_DescuentoProntoPago_Valor;
            }
        }

        public long CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_IdImpuestoTipo
        {
            get
            {
                return g_lng_idImpuestoTipo;
            }
        }
        public string CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo_Codigo
        {
            get
            {
                string str_Valor_Devuelto = "";

                if (g_lng_idImpuestoTipo > 0)
                {
                    str_Valor_Devuelto = ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Codigo;
                }
                return str_Valor_Devuelto;
            }
        }

        #endregion

        #region Constructor
        public CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen()
        {
            InitializeComponent();

            Repintar.Empezar(this);
        }
        public CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen(P_Base _frm_Pantalla_DeDondeereda,
                                                                int _int_NumerObjeto,
                                                                COM_FacturasCabecera_Resumen _mdl_COM_FacturasCabecera_Resumen,
                                                                List<GEN_ImpuestosLineas> _lst_GEN_ImpuestosLineas,
                                                                GEN_Retenciones _mdl_GEN_Retenciones,
                                                                decimal _dcm_DescuentoProntoPago_Porcentaje,
                                                                decimal _dcm_DescuentoFinalFactura_Porcentaje,
                                                                GEN_ImpuestosTipos _mdl_GEN_ImpuestosTipos,
                                                                string _str_Estado,
                                                                bool _bol_RecargoEquivalencia)
        {
            InitializeComponent();

            Repintar.Empezar(this);

            g_int_NumeroObjeto = _int_NumerObjeto;
            g_mdl_COM_FacturasCabecera_Resumen = _mdl_COM_FacturasCabecera_Resumen;
            g_lst_GEN_ImpuestosLineas = _lst_GEN_ImpuestosLineas;
            g_mdl_GEN_Retenciones = _mdl_GEN_Retenciones;
            g_frm_Pantalla_DeDondeereda = _frm_Pantalla_DeDondeereda;
            g_bol_RecargoEquivalencia = _bol_RecargoEquivalencia;

            g_dcm_DescuentoProntoPago_Porcentaje = _dcm_DescuentoProntoPago_Porcentaje;
            g_dcm_DescuentoFinalFactura_Porcentaje = _dcm_DescuentoFinalFactura_Porcentaje;

            //ImpuestoTipo
            ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_GEN_IMPUESTOTIPO;
            ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_PantallaContenedora = _frm_Pantalla_DeDondeereda;

            //Retencion
            BloquearDesbloquear_Retencion( false);

            //Reasignar el Tabindex
            ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoPorcentaje.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoValor.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoPorcentaje.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoValor.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor.TabIndex += (_int_NumerObjeto * 100);
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Total.TabIndex += (_int_NumerObjeto * 100);
            ex_lbl_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_TotalFinal.TabIndex += (_int_NumerObjeto * 100);

            if (g_mdl_COM_FacturasCabecera_Resumen == null && _mdl_GEN_ImpuestosTipos != null)
            {
                ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Id = _mdl_GEN_ImpuestosTipos.id;
                ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Codigo = _mdl_GEN_ImpuestosTipos.codigo;
                ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Descripcion = _mdl_GEN_ImpuestosTipos.descripcion;
                ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_FechaBorrado = _mdl_GEN_ImpuestosTipos.fechaBorrado;

                ImpuestoTipo_Cambio(_mdl_GEN_ImpuestosTipos.id);
            }

            //Cargar los Datos Iniciales
            Cargar_Datos_Inicial();

            Actualizar_F3();

            //Bloqueo los Controles
            CerrarAbrir(_str_Estado);
        }
        #endregion

        #region Foco
        public void PonerFoco()
        {
            ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto.Exferia_TextBox_Foco();
        }
        #endregion

        #region Carga de datos 
        private void Cargar_Datos_Inicial()
        {
            try
            {
                //Rellenar Componente
                if (g_mdl_COM_FacturasCabecera_Resumen != null)
                {
                    //idImpuestoTipo
                    ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Id = g_mdl_COM_FacturasCabecera_Resumen.GEN_ImpuestosTipos.id;
                    ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Codigo = g_mdl_COM_FacturasCabecera_Resumen.GEN_ImpuestosTipos.codigo;
                    ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_COM_FacturasCabecera_Resumen.GEN_ImpuestosTipos.descripcion;
                    ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_COM_FacturasCabecera_Resumen.GEN_ImpuestosTipos.fechaBorrado;
                    g_lng_idImpuestoTipo = g_mdl_COM_FacturasCabecera_Resumen.idImpuestoTipo;

                    //idImpuestoLinea
                    g_lng_idImpuestoLinea = g_mdl_COM_FacturasCabecera_Resumen.idImpuestoLinea;

                    //bruto
                    g_dcm_Bruto = g_mdl_COM_FacturasCabecera_Resumen.bruto;

                    //descuentoProntoPago_Valor
                    g_dcm_DescuentoProntoPago_Valor = g_mdl_COM_FacturasCabecera_Resumen.descuentoProntoPago_Valor;

                    //descuentoFinalFactura_Valor
                    g_dcm_DescuentoFinalFactura_Valor = g_mdl_COM_FacturasCabecera_Resumen.descuentoFinalFactura_Valor != null ? g_mdl_COM_FacturasCabecera_Resumen.descuentoFinalFactura_Valor.Value : 0;

                    //base Imponible
                    g_dcm_Base = g_mdl_COM_FacturasCabecera_Resumen.baseImponible;

                    //Impuesto_Porcentaje
                    g_dcm_Impuesto_Porcentaje = g_mdl_COM_FacturasCabecera_Resumen.impuesto_Porcentaje;

                    //Impuesto_Valor
                    g_dcm_Impuesto_Valor = g_mdl_COM_FacturasCabecera_Resumen.impuesto_Valor;

                    //Recargo_Porcentaje
                    g_dcm_Recargo_Porcentaje = g_mdl_COM_FacturasCabecera_Resumen.recargo_Porcentaje;

                    //Recargo_Valor
                    g_dcm_Recargo_Valor = g_mdl_COM_FacturasCabecera_Resumen.recargo_Valor;

                    //total_sinRetencion
                    g_dcm_TotalSinRetenciones = g_mdl_COM_FacturasCabecera_Resumen.total_sinRetencion;

                    //retencion_Base
                    g_dcm_Retencion_Base = g_mdl_COM_FacturasCabecera_Resumen.retencion_Base != null ? g_mdl_COM_FacturasCabecera_Resumen.retencion_Base.Value : 0m;

                    //retencion_Porcentaje
                    g_dcm_Retencion_Porcentaje = g_mdl_COM_FacturasCabecera_Resumen.retencion_Porcentaje;

                    //retencion_valor
                    g_dcm_Retencion_Valor = g_mdl_COM_FacturasCabecera_Resumen.retencion_Valor;

                    //total_Final
                    g_dcm_TotalFinal = g_mdl_COM_FacturasCabecera_Resumen.total != null ? g_mdl_COM_FacturasCabecera_Resumen.total.Value : 0m;

                    //Rellenar los datos de los TextBox
                    Rellenar_Datos(0, false);

                    g_frm_Pantalla_DeDondeereda.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen) + "/" + nameof(Cargar_Datos_Inicial));
            }
        }
        private void Rellenar_Datos(int _int_Nivel, bool _bol_CalcularTotales)
        {
            try
            {
                //bruto
                if (_int_Nivel == 0 || _int_Nivel == 2)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto.Text = string.Format("{0:0.00}", g_dcm_Bruto);
                }

                //base
                if (_int_Nivel == 0 || _int_Nivel == 1)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible.Text = string.Format("{0:0.00}", g_dcm_Base);
                }

                //impuesto porcentaje
                if (_int_Nivel < 3)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoPorcentaje.Text = string.Format("{0:0.00}", g_dcm_Impuesto_Porcentaje);
                }

                //impuesto valor
                if (_int_Nivel < 4)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoValor.Text = string.Format("{0:0.00}", g_dcm_Impuesto_Valor);
                }

                //recargo porcentaje
                if (_int_Nivel < 5)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoPorcentaje.Text = string.Format("{0:0.00}", g_dcm_Recargo_Porcentaje);
                }

                //recargo valor
                if (_int_Nivel < 6)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoValor.Text = string.Format("{0:0.00}", g_dcm_Recargo_Valor);
                }

                //retencion_Base
                if (_int_Nivel < 7)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Text = string.Format("{0:0.00}", g_dcm_Retencion_Base);
                }

                //retencion_Porcentaje
                if (_int_Nivel < 8)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje.Text = string.Format("{0:0.00}", g_dcm_Retencion_Porcentaje);
                }

                //retencion_valor
                if (_int_Nivel < 9)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor.Text = string.Format("{0:0.00}", g_dcm_Retencion_Valor);
                }

                //Total
                if (_int_Nivel < 10)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Total.Text = string.Format("{0:0.00}", g_dcm_TotalSinRetenciones);
                }

                //TotalFInal
                if (_int_Nivel < 11)
                {
                    ex_lbl_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_TotalFinal.Text = string.Format("{0:0.00}", g_dcm_TotalFinal);
                }

                //Totales
                if (_bol_CalcularTotales)
                {
                    ((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Calcular_Totales();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen) + "/" + nameof(Rellenar_Datos));
            }
        }

        #endregion

        #region Boton Borrar
        private void ex_btn_P_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Borrar_Click(object sender, EventArgs e)
        {
            //Para que salte el evento en el otro lado
            Boton_P_CTU_P_FacturaCabecera_LineaResumenDelete_Click?.Invoke(sender, new INTERNO_EventArgs(g_int_NumeroObjeto));
        }
        #endregion

        #region Controles
        #region Bruto
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_dcm_Bruto = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto.Text.Trim().Length > 0)
            {
                g_dcm_Bruto = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto.Text);
            }
        }
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            //Valor Actual
            decimal dcm_Auxiliar = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto.Text.Trim().Length > 0)
            {
                dcm_Auxiliar = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Bruto.Text);
            }

            //Ver si son diferentes
            if (g_dcm_Bruto != dcm_Auxiliar)
            {
                g_dcm_Bruto = dcm_Auxiliar;

                Calculos(1, true);
            }
        }
        #endregion

        #region Base
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_dcm_Base = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible.Text.Trim().Length > 0)
            {
                g_dcm_Base = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible.Text);
            }
        }

        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            //Valor Actual
            decimal dcm_Auxiliar = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible.Text.Trim().Length > 0)
            {
                dcm_Auxiliar = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible.Text);
            }

            //Ver si son diferentes
            if (g_dcm_Base != dcm_Auxiliar)
            {
                g_dcm_Base = dcm_Auxiliar;

                Calculos(2, true);
            }
        }
        #endregion

        #region Impuesto_Valor
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoValor_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_dcm_Impuesto_Valor = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoValor.Text.Trim().Length > 0)
            {
                g_dcm_Impuesto_Valor = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoValor.Text);
            }
        }
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoValor_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            //Valor Actual
            decimal dcm_Auxiliar = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoValor.Text.Trim().Length > 0)
            {
                dcm_Auxiliar = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoValor.Text);
            }

            //Ver si son diferentes
            if (g_dcm_Impuesto_Valor != dcm_Auxiliar)
            {
                g_dcm_Impuesto_Valor = dcm_Auxiliar;

                Calculos(4, true);
            }
        }
        #endregion

        #region Recargo
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoValor_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_dcm_Recargo_Valor = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoValor.Text.Trim().Length > 0)
            {
                g_dcm_Recargo_Valor = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoValor.Text);
            }
        }
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoValor_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            //Valor Actual
            decimal dcm_Auxiliar = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoValor.Text.Trim().Length > 0)
            {
                dcm_Auxiliar = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RecargoValor.Text);
            }

            //Ver si son diferentes
            if (g_dcm_Recargo_Valor != dcm_Auxiliar)
            {
                g_bol_RecargoEquivalencia = true;

                g_dcm_Recargo_Valor = dcm_Auxiliar;

                Calculos(6, true);
            }
        }
        #endregion

        #region Retencion_Base
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_dcm_Retencion_Base = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Text.Trim().Length > 0)
            {
                g_dcm_Retencion_Base = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Text);
            }

        }
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            //Valor Actual
            decimal dcm_Auxiliar = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Text.Trim().Length > 0)
            {
                dcm_Auxiliar = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Text);
            }

            //Ver si son diferentes
            if (g_dcm_Retencion_Base != dcm_Auxiliar)
            {
                g_dcm_Retencion_Base = dcm_Auxiliar;

                Calculos(7, true);
            }
        }
        #endregion

        #region Retencion_Porcentaje
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_dcm_Retencion_Porcentaje = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje.Text.Trim().Length > 0)
            {
                g_dcm_Retencion_Porcentaje = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje.Text);
            }
        }
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            //Valor Actual
            decimal dcm_Auxiliar = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje.Text.Trim().Length > 0)
            {
                dcm_Auxiliar = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje.Text);
            }

            //Ver si son diferentes
            if (g_dcm_Retencion_Porcentaje != dcm_Auxiliar)
            {
                g_dcm_Retencion_Porcentaje = dcm_Auxiliar;

                Calculos(8, true);
            }
        }
        #endregion

        #region Retencion_Valor
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            g_dcm_Retencion_Valor = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor.Text.Trim().Length > 0)
            {
                g_dcm_Retencion_Valor = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor.Text);
            }
        }
        private void ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            //Valor Actual
            decimal dcm_Auxiliar = 0m;
            if (ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor.Text.Trim().Length > 0)
            {
                dcm_Auxiliar = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor.Text);
            }

            //Ver si son diferentes
            if (g_dcm_Retencion_Valor != dcm_Auxiliar)
            {
                g_dcm_Retencion_Valor = dcm_Auxiliar;

                Calculos(9, true);
            }
        }

        #endregion

        #region Tipo impuesto
        private void ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo_Exferia_F3_Evento_TerminoBusqueda(object sender, EventArgs e)
        {
            long? lng_idImpuestoTipo = null;
            if (ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Id > -1)
            {
                lng_idImpuestoTipo = ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Id;
            }

            ImpuestoTipo_Cambio(lng_idImpuestoTipo);
        }
        private void ImpuestoTipo_Cambio(long? _lng_idImpuestoTipo)
        {
            g_dcm_Impuesto_Porcentaje = 0m;
            g_dcm_Recargo_Porcentaje = 0m;
            g_lng_idImpuestoTipo = -1;
            g_lng_idImpuestoLinea = -1;

            if (_lng_idImpuestoTipo != null)
            {
                g_lng_idImpuestoTipo = _lng_idImpuestoTipo.Value;

                //Busco con el impuesto tipo en las lineas de la cabecera para obtener el impuesto linea correcto
                if (g_lst_GEN_ImpuestosLineas != null &&
                    g_lst_GEN_ImpuestosLineas.Count > 0)
                {
                    //Obtengo el impuesto linea por el impuestotipo seleccionado
                    //fecha Seleccionada
                    DateTime dtt_FechaActual = g_frm_Pantalla_DeDondeereda.P_Base_FechaTrabajo;
                    if (((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "")
                    {
                        dtt_FechaActual = DateTime.ParseExact(((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                    }

                    #region Impuesto Lineas
                    g_mdl_GEN_ImpuestosLineas_Seleccionado = g_lst_GEN_ImpuestosLineas.Where(x => x.idImpuestoTipo.Equals(_lng_idImpuestoTipo) &&
                                                                                                                       (x.fechaDesde <= dtt_FechaActual) &&
                                                                                                                       (x.fechaHasta == null || (x.fechaHasta.Value >= dtt_FechaActual))
                                                                                                                )
                                                                                                                .FirstOrDefault();

                    if (g_mdl_GEN_ImpuestosLineas_Seleccionado != null)
                    {
                        //Variable para guardar el impuesto linea
                        g_lng_idImpuestoLinea = g_mdl_GEN_ImpuestosLineas_Seleccionado.id;

                        g_dcm_Impuesto_Porcentaje = g_mdl_GEN_ImpuestosLineas_Seleccionado.impuesto != null ? g_mdl_GEN_ImpuestosLineas_Seleccionado.impuesto.Value : 0m;
                        if (g_bol_RecargoEquivalencia)
                        {
                            g_dcm_Recargo_Porcentaje = g_mdl_GEN_ImpuestosLineas_Seleccionado.recargo != null ? g_mdl_GEN_ImpuestosLineas_Seleccionado.recargo.Value : 0m;
                        }
                    }
                    #endregion
                }
            }

            Calculos(1, true);
        }
        #endregion
        #endregion

        #region Calculos
        private void Calculos(int _int_Nivel, bool _bol_CalcularTotales)
        {
            //Base
            if (_int_Nivel == 1)
            {
                decimal[] arr_Valores = Funciones_Compras.FacturasCompraAUX_Calcular_Base(g_dcm_Bruto, g_dcm_DescuentoFinalFactura_Porcentaje, g_dcm_DescuentoProntoPago_Porcentaje);

                g_dcm_Base = arr_Valores[0];
                g_dcm_DescuentoFinalFactura_Valor = arr_Valores[1];
                g_dcm_DescuentoProntoPago_Valor = arr_Valores[2];
            }

            //Bruto
            if (_int_Nivel == 2)
            {
                if (g_dcm_Bruto == 0m)
                {
                    decimal[] arr_Valores = Funciones_Compras.FacturasCompraAUX_Calcular_Bruto(g_dcm_Base, g_dcm_DescuentoFinalFactura_Porcentaje, g_dcm_DescuentoProntoPago_Porcentaje);

                    g_dcm_Bruto = arr_Valores[0];
                    g_dcm_DescuentoFinalFactura_Valor = arr_Valores[1];
                    g_dcm_DescuentoProntoPago_Valor = arr_Valores[2];
                }
            }

            //Impuesto
            if (_int_Nivel < 3)
            {
                g_dcm_Impuesto_Valor = Funciones_Compras.FacturasCompraAUX_Calcular_Impuesto(g_dcm_Base, g_dcm_Impuesto_Porcentaje);
            }

            //Recargo
            if (_int_Nivel < 5)
            {
                g_dcm_Recargo_Valor = Funciones_Compras.FacturasCompraAUX_Calcular_Recargo(g_dcm_Base, g_dcm_Recargo_Porcentaje);
            }

            //Retencion
            if (_int_Nivel <= 9)
            {
                if (g_mdl_GEN_Retenciones != null)
                {
                    //Si es menor que 7, significa que se ha actualizado la base o el total del linea
                    if (_int_Nivel < 7)
                    {
                        //Calcular sobre la total
                        if (g_mdl_GEN_Retenciones.aplicar_BaseImponible_O_Total == 2)
                        {
                            g_dcm_Retencion_Base = g_dcm_Base + g_dcm_Impuesto_Valor + g_dcm_Recargo_Valor;
                        }
                        //Calcular sobre la base imponible
                        else
                        {
                            g_dcm_Retencion_Base = g_dcm_Base;
                        }
                    }

                    //Si es igual o menor que 8 es que se modifico el porcentaje o la base y tiene que calcular el valor de la retencion
                    if (_int_Nivel <= 8)
                    {
                        g_dcm_Retencion_Valor = Funciones_Compras.FacturasCompraAUX_Calcular_Retencion(g_dcm_Retencion_Base, g_dcm_Retencion_Porcentaje);
                    }
                }
                else
                {
                    g_dcm_Retencion_Base = 0m;
                    g_dcm_Retencion_Porcentaje = 0m;
                    g_dcm_Retencion_Valor = 0m;
                }
            }

            //Total
            if (_int_Nivel < 10)
            {
                g_dcm_TotalSinRetenciones = (g_dcm_Base + g_dcm_Impuesto_Valor + g_dcm_Recargo_Valor);
            }

            //TotalFInal
            if (_int_Nivel < 11)
            {
                g_dcm_TotalFinal = g_dcm_TotalSinRetenciones - g_dcm_Retencion_Valor;
            }

            //Rellenar los datos de los TextBox
            Rellenar_Datos(_int_Nivel, _bol_CalcularTotales);
        }

        #endregion

        #region Bloquear Desbloquear Retencion
        public void BloquearDesbloquear_Retencion(bool _bol_Calcular)
        {

            if (g_mdl_GEN_Retenciones != null)
            {
                ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Exferia_TextBox_NoBloquear = true;
                ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje.Exferia_TextBox_NoBloquear = true;
                ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor.Exferia_TextBox_NoBloquear = true;

                #region Retencion
                g_dcm_Retencion_Porcentaje = g_mdl_GEN_Retenciones.retencion;

                //Total
                if (g_mdl_GEN_Retenciones.aplicar_BaseImponible_O_Total == 2)
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Text = ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_Total.Text;

                }
                //Base imponible
                else
                {
                    ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Text = ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseImponible.Text;
                }
                #endregion
            }
            else
            {
                ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Exferia_TextBox_NoBloquear = false;
                ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje.Exferia_TextBox_NoBloquear = false;
                ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor.Exferia_TextBox_NoBloquear = false;

                ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Text = "0,00";
                ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionPorcentaje.Text = "0,00";
                ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_RetencionValor.Text = "0,00";
            }

            g_dcm_Retencion_Base = decimal.Parse(ex_txt_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_BaseRetencion.Text);

            if (_bol_Calcular)
            {
                Calculos(7, true);
            }
        }
        #endregion

        #region Cerrar/Abrir
        public void CerrarAbrir(string _str_Estado)
        {
            //Bloqueo los Controles
            if (_str_Estado == Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO)
            {
                SoloLectura.Empezar(this, true);
            }
            else
            {
                SoloLectura.Empezar(this, false);
            }
        }
        #endregion

        #region Datos a Grabar
        public COM_FacturasCabecera_Resumen Obtener_Datos_A_Grabar(long _lng_idFacuraCabecera)
        {
            COM_FacturasCabecera_Resumen mdl_COM_FacturasCabecera_Resumen = new COM_FacturasCabecera_Resumen();

            //id
            mdl_COM_FacturasCabecera_Resumen.id = -1;

            //idFacturaCabecera
            mdl_COM_FacturasCabecera_Resumen.idFacturaCabecera = _lng_idFacuraCabecera;

            //idImpuestoTipo
            mdl_COM_FacturasCabecera_Resumen.idImpuestoTipo = g_lng_idImpuestoTipo;

            //idImpuestoLinea
            mdl_COM_FacturasCabecera_Resumen.idImpuestoLinea = g_lng_idImpuestoLinea;

            //bruto
            mdl_COM_FacturasCabecera_Resumen.bruto = g_dcm_Bruto;

            //DescuentoProntoPago_Valor
            mdl_COM_FacturasCabecera_Resumen.descuentoProntoPago_Valor = g_dcm_DescuentoProntoPago_Valor;

            //DescuentoFinalFactura_Valor
            mdl_COM_FacturasCabecera_Resumen.descuentoFinalFactura_Valor = g_dcm_DescuentoFinalFactura_Valor;

            //baseImponible
            mdl_COM_FacturasCabecera_Resumen.baseImponible = g_dcm_Base;

            //impuesto_Porcentaje
            mdl_COM_FacturasCabecera_Resumen.impuesto_Porcentaje = g_dcm_Impuesto_Porcentaje;

            //impuesto_Valor
            mdl_COM_FacturasCabecera_Resumen.impuesto_Valor = g_dcm_Impuesto_Valor;

            //recargo_Porcentaje
            mdl_COM_FacturasCabecera_Resumen.recargo_Porcentaje = g_dcm_Recargo_Porcentaje;

            //recargo_Valor
            mdl_COM_FacturasCabecera_Resumen.recargo_Valor = g_dcm_Recargo_Valor;

            //total_sinRetencion
            mdl_COM_FacturasCabecera_Resumen.total_sinRetencion = g_dcm_TotalSinRetenciones;

            //retencion_Base
            if (g_dcm_Retencion_Porcentaje != 0m)
            {
                mdl_COM_FacturasCabecera_Resumen.retencion_Base = g_dcm_Retencion_Base;
            }
            else
            {
                mdl_COM_FacturasCabecera_Resumen.retencion_Base = 0m;
            }

            //retencion_Porcentaje
            mdl_COM_FacturasCabecera_Resumen.retencion_Porcentaje = g_dcm_Retencion_Porcentaje;

            //retencion_Valor
            mdl_COM_FacturasCabecera_Resumen.retencion_Valor = g_dcm_Retencion_Valor;

            //retencion_Valor
            mdl_COM_FacturasCabecera_Resumen.total = g_dcm_TotalFinal;


            return mdl_COM_FacturasCabecera_Resumen;
        }

        #endregion

        #region Validacion
        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // El ImpuestoTipo no puede estar Vacio (Obligatorio)
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                    ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length == 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay ImpuestoTipo validar que es Correcto
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // Tiene que tener un idImpuestoLinea
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && g_lng_idImpuestoLinea == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_FACTURAS_VALIDACION_NOENCONTRO_IMPUESTOS_PROVEEDOR();
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen) + "/" + nameof(ValidarDatos));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #endregion

        #region Actualizar 
        public void Actualizar_Descuento_FinalFactura(decimal _dcm_DescuentoFinalFactura_Porcentaje)
        {
            g_dcm_DescuentoFinalFactura_Porcentaje = _dcm_DescuentoFinalFactura_Porcentaje;

            Calculos(1, true);
        }

        public void Actualizar_Descuento_ProntoPago(decimal _dcm_DescuentoProntoPago_Porcentaje)
        {
            g_dcm_DescuentoProntoPago_Porcentaje = _dcm_DescuentoProntoPago_Porcentaje;

            Calculos(1, true);
        }

        public void Actualizar_CambioProveedor(List<GEN_ImpuestosLineas> _lst_GEN_ImpuestosLineas,
                                                GEN_Retenciones _mdl_GEN_Retenciones,
                                                decimal _dcm_DescuentoProntoPago_Porcentaje,
                                                decimal _dcm_DescuentoFinalFactura_Porcentaje,
                                                bool _bol_RecargoEquivalencia)
        {
            try
            {
                g_lst_GEN_ImpuestosLineas = _lst_GEN_ImpuestosLineas;
                g_mdl_GEN_Retenciones = _mdl_GEN_Retenciones;
                g_bol_RecargoEquivalencia = _bol_RecargoEquivalencia;

                //descuentoProntoPago_Porcentaje
                g_dcm_DescuentoProntoPago_Porcentaje = _dcm_DescuentoProntoPago_Porcentaje;

                //descuentoFinalFactura_Porcentaje
                g_dcm_DescuentoFinalFactura_Porcentaje = _dcm_DescuentoFinalFactura_Porcentaje;

                //Actualizar el F3
                Actualizar_F3();

                //Busco con el impuesto tipo en las lineas de la cabecera para obtener el impuesto linea correcto
                if (g_lst_GEN_ImpuestosLineas != null &&
                    g_lst_GEN_ImpuestosLineas.Count > 0)
                {
                    //fecha Seleccionada
                    DateTime dtt_FechaActual = g_frm_Pantalla_DeDondeereda.P_Base_FechaTrabajo;
                    if (((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "")
                    {
                        dtt_FechaActual = DateTime.ParseExact(((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                    }

                    #region Impuesto Linea
                    g_mdl_GEN_ImpuestosLineas_Seleccionado = g_lst_GEN_ImpuestosLineas.Where(x => x.idImpuestoTipo.Equals(ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Id) &&
                                                                                                                       (x.fechaDesde <= dtt_FechaActual) &&
                                                                                                                       (x.fechaHasta == null || (x.fechaHasta.Value >= dtt_FechaActual))
                                                                                                                )
                                                                                                                .FirstOrDefault();
                    if (g_mdl_GEN_ImpuestosLineas_Seleccionado != null)
                    {
                        //Variable para guardar el impuesto linea
                        g_lng_idImpuestoLinea = g_mdl_GEN_ImpuestosLineas_Seleccionado.id;

                        g_dcm_Impuesto_Porcentaje = g_mdl_GEN_ImpuestosLineas_Seleccionado.impuesto != null ? g_mdl_GEN_ImpuestosLineas_Seleccionado.impuesto.Value : 0m;

                        if (g_bol_RecargoEquivalencia)
                        {
                            g_dcm_Recargo_Porcentaje = g_mdl_GEN_ImpuestosLineas_Seleccionado.recargo != null ? g_mdl_GEN_ImpuestosLineas_Seleccionado.recargo.Value : 0m;
                        }
                    }
                    #endregion
                }

                #region Impuesto Retencion
                g_dcm_Retencion_Porcentaje = 0m;
                if (g_mdl_GEN_Retenciones != null )
                {
                    g_dcm_Retencion_Porcentaje = g_mdl_GEN_Retenciones.retencion;
                }
                #endregion

                //Rellenar los datos de los TextBox
                Calculos(1, false);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen) + "/" + nameof(Actualizar_CambioProveedor));
            }

        }
        public void Actualizar_CambioImpuestoCabecera(List<GEN_ImpuestosLineas> _lst_GEN_ImpuestosLineas,
                                                      long _lng_idImpuestoLinea)
        {
            try
            {
                g_lst_GEN_ImpuestosLineas = _lst_GEN_ImpuestosLineas;

                //Actualizar el F3
                Actualizar_F3();

                //Busco con el impuesto tipo en las lineas de la cabecera para obtener el impuesto linea correcto
                if (g_lst_GEN_ImpuestosLineas != null &&
                    g_lst_GEN_ImpuestosLineas.Count > 0)
                {
                    //fecha Seleccionada
                    DateTime dtt_FechaActual = g_frm_Pantalla_DeDondeereda.P_Base_FechaTrabajo;
                    if (((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "")
                    {
                        dtt_FechaActual = DateTime.ParseExact(((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                    }

                    #region Impusto Lineas
                    g_mdl_GEN_ImpuestosLineas_Seleccionado = g_lst_GEN_ImpuestosLineas.Where(x => x.idImpuestoTipo.Equals(ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_Id) &&
                                                                                                                       (x.fechaDesde <= dtt_FechaActual) &&
                                                                                                                       (x.fechaHasta == null || (x.fechaHasta.Value >= dtt_FechaActual))
                                                                                                                )
                                                                                                                .FirstOrDefault();

                    if (g_mdl_GEN_ImpuestosLineas_Seleccionado != null)
                    {
                        //Variable para guardar el impuesto linea
                        g_lng_idImpuestoLinea = g_mdl_GEN_ImpuestosLineas_Seleccionado.id;

                        g_dcm_Impuesto_Porcentaje = g_mdl_GEN_ImpuestosLineas_Seleccionado.impuesto != null ? g_mdl_GEN_ImpuestosLineas_Seleccionado.impuesto.Value : 0m;
                        if (g_bol_RecargoEquivalencia)
                        {
                            g_dcm_Recargo_Porcentaje = g_mdl_GEN_ImpuestosLineas_Seleccionado.recargo != null ? g_mdl_GEN_ImpuestosLineas_Seleccionado.recargo.Value : 0m;
                        }
                    }
                    #endregion
                }

                //Rellenar los datos de los TextBox
                Calculos(1, false);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen) + "/" + nameof(Actualizar_CambioImpuestoCabecera));
            }

        }

        public void Actualizar_CambioRetencion(GEN_Retenciones _mdl_GEN_Retenciones)
        {
            try
            {
                g_mdl_GEN_Retenciones = _mdl_GEN_Retenciones;


                #region Retencion
                g_dcm_Retencion_Porcentaje = 0m;
                if (g_mdl_GEN_Retenciones != null)
                {
                    g_dcm_Retencion_Porcentaje = g_mdl_GEN_Retenciones.retencion;
                }
                #endregion

                //Rellenar los datos de los TextBox
                Calculos(1, false);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen) + "/" + nameof(Actualizar_CambioRetencion));
            }

        }
        #endregion

        private void Actualizar_F3()
        {
            try
            {


                //Filtrado de Opciones del Padre
                List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo = new List<INTERNO_Filtro_OpcionPadre_Modelo>();

                //Para que busque con el Filtro del Ejercicio
                long lng_idImpuestoCabecera = -1;
                if (((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_F3_SoloSeleccion_ImpuestoCabecera.Exferia_F3_SoloSeleccion_Id > -1)
                {
                    lng_idImpuestoCabecera = ((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_F3_SoloSeleccion_ImpuestoCabecera.Exferia_F3_SoloSeleccion_Id;
                }
                lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo("idImpuestoCabecera", -1, lng_idImpuestoCabecera));

                //Para que busque con el Filtro del estado, que no este abierto
                DateTime dtt_FechaActual = g_frm_Pantalla_DeDondeereda.P_Base_FechaTrabajo;
                if (((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "")
                {
                    dtt_FechaActual = DateTime.ParseExact(((P_FacturaCabecera_Auxiliar_2)g_frm_Pantalla_DeDondeereda).Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                }
                lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo("Fecha", -1, dtt_FechaActual));

                //Filtros 
                ex_usc_F3_CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen_ImpuestoTipo.Exferia_F3_SoloSeleccion_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_FacturaCabecera_Auxiliar_2_LineaResumen) + "/" + nameof(Actualizar_F3));
            }
        }
    }
}
