using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Generales;
using Exferia_Aplicacion.Calculos;
using Exferia_EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Exferia_Aplicacion.Calculos.VentasCompras
{
    public class VentasCompras_Impuestos_Calculos
    {
        #region Variables Privadas
        private int g_int_Tipo_ClienteProveedor = 0;
        private long g_lng_idEmpresa = -1;
        private long g_lng_idClienteProveedor = -1;
        private DateTime g_dtt_Fecha = DateTime.Now;

        #endregion

        #region Constructor
        public VentasCompras_Impuestos_Calculos(int _int_Tipo_ClienteProveedor, 
                                                  long _lng_idClienteProveedor, 
                                                  DateTime _dtt_Fecha, 
                                                  long _lng_idEmpresa)
        {
            g_int_Tipo_ClienteProveedor = _int_Tipo_ClienteProveedor;
            g_lng_idClienteProveedor = _lng_idClienteProveedor;
            g_lng_idEmpresa = _lng_idEmpresa;
            g_dtt_Fecha = _dtt_Fecha;

        }
        #endregion

        #region Cambios de datos

        public void Cambio_ClienteProveedor(long _lng_idClienteProveedor)
        {
            try
            {
                g_lng_idClienteProveedor = _lng_idClienteProveedor;
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(VentasCompras_Impuestos_Calculos) + "/" + nameof(Cambio_ClienteProveedor));
            }
        }

        public void Cambio_Fecha(DateTime _dtt_Fecha)
        {
            try
            {
                g_dtt_Fecha = _dtt_Fecha;
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(VentasCompras_Impuestos_Calculos) + "/" + nameof(Cambio_Fecha));
            }
        }
        #endregion

        #region Impuestos
        public INTERNO_ValorDevuelto_Modelo Calcular_ImportesImpuestos(GEN_ImpuestosCabecera _mdl_GEN_ImpuestosCabecera,
                                                                        List<INTERNO_GEN_ImpuestosTipos_Listado_Modelo> _lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo,
                                                                        decimal? _dcm_Descuento_ProntoPago,
                                                                        decimal? _dcm_Descuento_FinalFactura,
                                                                        decimal? _dcm_Descuento_FinalAlbaran,
                                                                        List<INTERNO_VentasCompras_Calculo_Lineas_Modelo> _lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo,
                                                                        List<VTA_AlbaranesCabecera> _lst_VTA_AlbaranesCabecera,
                                                                        bool _bol_CalcularRecargo)

        {
            //Variable a Devolver
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //## 1 LINEAS 
                #region Lineas Calculadas Final
                List<INTERNO_ImportesImpuestos_Modelo> lst_INTERNO_ImportesImpuestos_Modelo_Final = new List<INTERNO_ImportesImpuestos_Modelo>();

                //## 1.1 LINEAS NORMALES
                List<INTERNO_ImportesImpuestos_Modelo> lst_INTERNO_ImportesImpuestos_Modelo_NORMALES = Calcular_ImportesImpuestos_Lineas_Normales(  _mdl_GEN_ImpuestosCabecera,
                                                                                                                                                    _lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo,
                                                                                                                                                    _dcm_Descuento_ProntoPago,
                                                                                                                                                    _dcm_Descuento_FinalFactura,
                                                                                                                                                    _dcm_Descuento_FinalAlbaran,
                                                                                                                                                    _lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo,
                                                                                                                                                    _bol_CalcularRecargo);
                if (lst_INTERNO_ImportesImpuestos_Modelo_NORMALES!=null && lst_INTERNO_ImportesImpuestos_Modelo_NORMALES.Count>0)
                {
                    lst_INTERNO_ImportesImpuestos_Modelo_Final.AddRange(lst_INTERNO_ImportesImpuestos_Modelo_NORMALES);
                }

                //## 1.2 LINEAS DE ALBARANES
                List<INTERNO_ImportesImpuestos_Modelo> lst_INTERNO_ImportesImpuestos_Modelo_ALBARANES = Calcular_ImportesImpuestos_Lineas_Albaranes_En_Facturas( _mdl_GEN_ImpuestosCabecera,
                                                                                                                                                                _lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo,
                                                                                                                                                                _dcm_Descuento_ProntoPago,
                                                                                                                                                                _dcm_Descuento_FinalFactura,
                                                                                                                                                                _lst_VTA_AlbaranesCabecera,
                                                                                                                                                                _bol_CalcularRecargo);
                if (lst_INTERNO_ImportesImpuestos_Modelo_ALBARANES != null && lst_INTERNO_ImportesImpuestos_Modelo_ALBARANES.Count > 0)
                {
                    lst_INTERNO_ImportesImpuestos_Modelo_Final.AddRange(lst_INTERNO_ImportesImpuestos_Modelo_ALBARANES);
                }
                #endregion

                //## 2 TOTALES
                INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES_FINAL = ImportesImpuestos_Totales(lst_INTERNO_ImportesImpuestos_Modelo_Final);

                //## 3º DEVOLVER LOS VALORES CALCULOS
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_INTERNO_ImportesImpuestos_Modelo_Final;//Listado de las lineas Calculadas
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_1 = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES_FINAL;//linea de los totales finales
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_2 = true;//Si se tiene que actualar la base ded datos
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Impuestos_Calculos) + "/" + nameof(Calcular_ImportesImpuestos));
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private List<INTERNO_ImportesImpuestos_Modelo> Calcular_ImportesImpuestos_Lineas_Normales(GEN_ImpuestosCabecera _mdl_GEN_ImpuestosCabecera,
                                                                                                    List<INTERNO_GEN_ImpuestosTipos_Listado_Modelo> _lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo,
                                                                                                    decimal? _dcm_Descuento_ProntoPago,
                                                                                                    decimal? _dcm_Descuento_FinalFactura,
                                                                                                    decimal? _dcm_Descuento_FinalAlbaran,
                                                                                                    List<INTERNO_VentasCompras_Calculo_Lineas_Modelo> _lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo,
                                                                                                    bool _bol_CalcularRecargo)
        {
            List<INTERNO_ImportesImpuestos_Modelo> lst_INTERNO_ImportesImpuestos_Modelo = new List<INTERNO_ImportesImpuestos_Modelo>();

            try
            {
                //Tiene que tener lineas
                if (_lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo != null &&
                    _lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo.Count > 0)
                {
                    //Tiene que tener algo en el listado de ImpuestosTipos
                    if (_lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo != null)
                    {
                        foreach (INTERNO_GEN_ImpuestosTipos_Listado_Modelo mdl_INTERNO_GEN_ImpuestosTipos_Listado_Modelo in _lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo)
                        {
                            // Actualizar el Listado de importes/Impuestos
                            lst_INTERNO_ImportesImpuestos_Modelo = ImportesImpuestos_Actualizar(_mdl_GEN_ImpuestosCabecera,
                                                                                                    mdl_INTERNO_GEN_ImpuestosTipos_Listado_Modelo.id,
                                                                                                    mdl_INTERNO_GEN_ImpuestosTipos_Listado_Modelo.descripcion,
                                                                                                    0m, 
                                                                                                    lst_INTERNO_ImportesImpuestos_Modelo,
                                                                                                    _bol_CalcularRecargo);
                        }
                    }
                
                    if (lst_INTERNO_ImportesImpuestos_Modelo != null &&
                        lst_INTERNO_ImportesImpuestos_Modelo.Count > 0)
                    {
                        // ## 2º--> VACIAR LOS VALORES DEL LISTADO '_lst_INTERNO_ImportesImpuestos_Modelo' CALCULADOS, PARA PODER HACER LOS CALCULOS DE NUEVO ####################
                        foreach (INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo in lst_INTERNO_ImportesImpuestos_Modelo)
                        {
                            //Bruto
                            mdl_INTERNO_ImportesImpuestos_Modelo.Bruto = 0;
                            //DescuentoProntoPago_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado = 0;
                            //DescuentoFacturaFinal_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado = 0;
                            //Base
                            mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible = 0;
                            //Impuesto_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado = 0;

                            //Recargo_Porcentaje
                            if (_bol_CalcularRecargo==false)
                            {
                                mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje = 0;
                            }

                            //Recargo_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado = 0;
                            //Total
                            mdl_INTERNO_ImportesImpuestos_Modelo.Total = 0;
                            //Total_Final
                            mdl_INTERNO_ImportesImpuestos_Modelo.Total_Final = 0;

                            //IdAlbaranCabecera
                            mdl_INTERNO_ImportesImpuestos_Modelo.IdAlbaranCabecera = null;
                            //DescuentoAlbaranFinal
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal = 0;
                            //DescuentoAlbaranFinal_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado = 0;
                        }

                        // ## 3º--> RECORRER LAS LINEAS INSERTANDO EL IMPORTE EN EL LISTADO '_lst_INTERNO_ImportesImpuestos_Modelo' COMO BRUTO
                        MAE_Articulos mdl_MAE_Articulos_ = null;
                        MAE_ArticulosComodin mdl_MAE_ArticulosComodin = null;
                        string str_Descripcion_ImpuestoTipo = "";
                        foreach (INTERNO_VentasCompras_Calculo_Lineas_Modelo mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo in _lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo)
                        {
                            mdl_MAE_Articulos_ = null;
                            mdl_MAE_ArticulosComodin = null;
                            str_Descripcion_ImpuestoTipo = "";

                            long? lng_idImpuestoTipo = mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.IdImpuestoTipo;
                            if (mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.IdImpuestoTipo == null)
                            {
                                //Articulo Comodin
                                if (mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.EsArticuloComodin)
                                {
                                    mdl_MAE_ArticulosComodin = ArticuloComodin_Obtener(mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.IdArticuloComodin);
                                    lng_idImpuestoTipo = mdl_MAE_ArticulosComodin.idImpuestoTipo;
                                }
                                //Articulo
                                else
                                {
                                    mdl_MAE_Articulos_ = Articulo_Obtener_ConImpuestosTipo(mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.IdArticulo);
                                    lng_idImpuestoTipo = mdl_MAE_Articulos_.idImpuestoTipo;
                                }
                            }

                            //Buscar en g_lst_INTERNO_ImportesImpuestos_Modelo si existe el registro por idImpuestoTipo
                            INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo = lst_INTERNO_ImportesImpuestos_Modelo.Where(m => m.IdImpuestoTipo.Equals(lng_idImpuestoTipo.Value) &&  m.IdAlbaranCabecera==null).FirstOrDefault();

                            //Si existe ya el registro, se suma el valor del bruto
                            if (mdl_INTERNO_ImportesImpuestos_Modelo != null)
                            {
                                mdl_INTERNO_ImportesImpuestos_Modelo.Bruto += mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.Importe;
                            }
                            //Si no existe, se intenta buscar en base de datos
                            else
                            {
                                //Articulo Comodin
                                if (mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.EsArticuloComodin)
                                {
                                    if (mdl_MAE_ArticulosComodin == null)
                                    {
                                        mdl_MAE_ArticulosComodin = ArticuloComodin_Obtener(mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.IdArticuloComodin);

                                        if (mdl_MAE_ArticulosComodin != null)
                                        {
                                            str_Descripcion_ImpuestoTipo = mdl_MAE_ArticulosComodin.GEN_ImpuestosTipos.descripcion;
                                        }
                                    }
                                }
                                //Articulo
                                else
                                {
                                    if (mdl_MAE_Articulos_ == null)
                                    {
                                        mdl_MAE_Articulos_ = Articulo_Obtener_ConImpuestosTipo(mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.IdArticulo);

                                        if (mdl_MAE_Articulos_ != null)
                                        {
                                            str_Descripcion_ImpuestoTipo = mdl_MAE_Articulos_.GEN_ImpuestosTipos.descripcion;
                                        }
    
                                    }
                                }

                                // Actualizar el Listado de importes/Impuestos
                                lst_INTERNO_ImportesImpuestos_Modelo =ImportesImpuestos_Actualizar(_mdl_GEN_ImpuestosCabecera, 
                                                                                                    lng_idImpuestoTipo.Value, 
                                                                                                    str_Descripcion_ImpuestoTipo, 
                                                                                                    mdl_INTERNO_VentasCompras_Calculo_Lineas_Modelo.Importe, 
                                                                                                    lst_INTERNO_ImportesImpuestos_Modelo, 
                                                                                                    _bol_CalcularRecargo);

                            }
                        }

                        // ## 4º--> RECORRER LAS LINEAS DEL LISTADO '_lst_INTERNO_ImportesImpuestos_Modelo' E IR CALCULANDO LOS VALORES DE LA BASE, IMPUESTOS ETC. ######
                        foreach (INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo in lst_INTERNO_ImportesImpuestos_Modelo)
                        {

                            //DescuentoAlbaranFinal_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado = Funciones.RedondearDecimal((mdl_INTERNO_ImportesImpuestos_Modelo.Bruto * ((_dcm_Descuento_FinalAlbaran != null ? _dcm_Descuento_FinalAlbaran.Value : 0m) / 100)), 2);

                            //DescuentoFacturaFinal_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado = Funciones.RedondearDecimal(((mdl_INTERNO_ImportesImpuestos_Modelo.Bruto - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado) * ((_dcm_Descuento_FinalFactura != null ? _dcm_Descuento_FinalFactura.Value : 0m) / 100)), 2);

                            //DescuentoProntoPago_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado = Funciones.RedondearDecimal((((mdl_INTERNO_ImportesImpuestos_Modelo.Bruto - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado) - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado) * ((_dcm_Descuento_ProntoPago != null ? _dcm_Descuento_ProntoPago.Value : 0m) / 100)), 2);

                            //BaseImponible
                            mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible = Funciones.RedondearDecimal((((mdl_INTERNO_ImportesImpuestos_Modelo.Bruto - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado) - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado) - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado), 2);

                            //Impuesto_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado = Funciones.RedondearDecimal((((mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje.Value : 0m) / 100) * mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible), 2);

                            //Recargo_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado = _bol_CalcularRecargo ? (Funciones.RedondearDecimal((((mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje.Value : 0m) / 100) * mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible), 2)) : 0m;

                            //Total
                            mdl_INTERNO_ImportesImpuestos_Modelo.Total = Funciones.RedondearDecimal((mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible + mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado + mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado), 2);

                            //Total_Final
                            mdl_INTERNO_ImportesImpuestos_Modelo.Total_Final = mdl_INTERNO_ImportesImpuestos_Modelo.Total;
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VentasCompras_Impuestos_Calculos) + "/" + nameof(Calcular_ImportesImpuestos_Lineas_Normales), true);
            }


            return lst_INTERNO_ImportesImpuestos_Modelo;
        }

        private List<INTERNO_ImportesImpuestos_Modelo> Calcular_ImportesImpuestos_Lineas_Albaranes_En_Facturas(GEN_ImpuestosCabecera _mdl_GEN_ImpuestosCabecera,
                                                                                                         List<INTERNO_GEN_ImpuestosTipos_Listado_Modelo> _lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo,
                                                                                                         decimal? _dcm_Descuento_ProntoPago,
                                                                                                         decimal? _dcm_Descuento_FinFactura,
                                                                                                         List<VTA_AlbaranesCabecera> _lst_VTA_AlbaranesCabecera,
                                                                                                         bool _bol_CalcularRecargo)
        {
            //Variable a Devolver
            List<INTERNO_ImportesImpuestos_Modelo> lst_INTERNO_ImportesImpuestos_Modelo = new List<INTERNO_ImportesImpuestos_Modelo>();

            try
            {
                 //Instanciar el listado
                if (_lst_VTA_AlbaranesCabecera!=null && 
                    _lst_VTA_AlbaranesCabecera.Count>0)
                {
                    //Recorrer los albaranes
                    foreach (VTA_AlbaranesCabecera mdl_VTA_AlbaranesCabecera in _lst_VTA_AlbaranesCabecera)
                    {
                        if (mdl_VTA_AlbaranesCabecera.VTA_AlbaranesCabecera_Resumen!=null && mdl_VTA_AlbaranesCabecera.VTA_AlbaranesCabecera_Resumen.Count>0)
                        {
                            //Recorrer el resumen de los albaranes
                            foreach (VTA_AlbaranesCabecera_Resumen mdl_VTA_AlbaranesCabecera_Resumen in mdl_VTA_AlbaranesCabecera.VTA_AlbaranesCabecera_Resumen)
                            {
                                //Buscar el impuestoTipo
                                INTERNO_GEN_ImpuestosTipos_Listado_Modelo mdl_INTERNO_GEN_ImpuestosTipos_Listado_Modelo = _lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo.Where(m=>m.id== mdl_VTA_AlbaranesCabecera_Resumen.idImpuestoTipo).FirstOrDefault();

                                if (mdl_INTERNO_GEN_ImpuestosTipos_Listado_Modelo != null)
                                {


                                    //Buscar GEN_ImpuestosLineas para aplicar el impuesto y el recargo
                                    GEN_ImpuestosLineas mdl_GEN_ImpuestosLineas = _mdl_GEN_ImpuestosCabecera.GEN_ImpuestosLineas.Where(m => m.idImpuestoTipo != null &&
                                                                                                                                            m.idImpuestoTipo.Value.Equals(mdl_INTERNO_GEN_ImpuestosTipos_Listado_Modelo.id) &&
                                                                                                                                            m.fechaDesde <= g_dtt_Fecha &&
                                                                                                                                            ((m.fechaHasta == null) || (m.fechaHasta != null && m.fechaHasta.Value >= g_dtt_Fecha))).FirstOrDefault();
                                    if (mdl_GEN_ImpuestosLineas != null)
                                    {
                                        INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo = new INTERNO_ImportesImpuestos_Modelo();

                                        //IdImpuestoTipo
                                        mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoTipo = mdl_INTERNO_GEN_ImpuestosTipos_Listado_Modelo.id;
                                        //ImpuestoTipo
                                        mdl_INTERNO_ImportesImpuestos_Modelo.ImpuestoTipo = mdl_INTERNO_GEN_ImpuestosTipos_Listado_Modelo.descripcion.ToUpper();
                                        //IdImpuestoLinea
                                        mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoLinea = mdl_GEN_ImpuestosLineas.id;
                                        //Bruto
                                        mdl_INTERNO_ImportesImpuestos_Modelo.Bruto = mdl_VTA_AlbaranesCabecera_Resumen.bruto;
                                        //DescuentoProntoPago_Calculado
                                        mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado = 0;
                                        //DescuentoFacturaFinal_Calculado
                                        mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado = 0;
                                        //DescuentoAlbaranFinal
                                        mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal = mdl_VTA_AlbaranesCabecera.descuentoFinalAlbaran;
                                        //DescuentoAlbaranFinal_Calculado
                                        mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado = 0;
                                        //BaseImponible
                                        mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible = mdl_VTA_AlbaranesCabecera_Resumen.baseImponible;
                                        //Impuesto_Porcentaje
                                        mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje = mdl_GEN_ImpuestosLineas.impuesto != null ? mdl_GEN_ImpuestosLineas.impuesto.Value : 0m;
                                        //Impuesto_Calculado
                                        mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado = 0;
                                        //Recargo_Porcentaje
                                        mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje = _bol_CalcularRecargo ? (mdl_GEN_ImpuestosLineas.recargo != null ? mdl_GEN_ImpuestosLineas.recargo.Value : 0m) : 0m;
                                        //Recargo_Calculado
                                        mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado = 0;
                                        //Total
                                        mdl_INTERNO_ImportesImpuestos_Modelo.Total = 0;
                                        //Total_Final
                                        mdl_INTERNO_ImportesImpuestos_Modelo.Total_Final = 0;
                                        //EsLineaTotal
                                        mdl_INTERNO_ImportesImpuestos_Modelo.EsLineaTotal = false;
                                        //IdAlbaranCabecera
                                        mdl_INTERNO_ImportesImpuestos_Modelo.IdAlbaranCabecera = mdl_VTA_AlbaranesCabecera.id;
                                        //Albaran_Numero
                                        mdl_INTERNO_ImportesImpuestos_Modelo.Albaran_Numero = mdl_VTA_AlbaranesCabecera.numeroAlbaran.ToString();

                                        //Añadir al listado
                                        lst_INTERNO_ImportesImpuestos_Modelo.Add(mdl_INTERNO_ImportesImpuestos_Modelo);
                                    }
                                }
                            }
                        }
                    }
                }
                
                if (lst_INTERNO_ImportesImpuestos_Modelo != null &&
                    lst_INTERNO_ImportesImpuestos_Modelo.Count > 0)
                {
                    
                    //Tiene que tener lineas
                    if (_lst_VTA_AlbaranesCabecera != null &&
                        _lst_VTA_AlbaranesCabecera.Count > 0)
                    {
                        // ## 4º--> RECORRER LAS LINEAS DEL LISTADO '_lst_INTERNO_ImportesImpuestos_Modelo' E IR CALCULANDO LOS VALORES DE LA BASE, IMPUESTOS ETC. ######
                        foreach (INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo in lst_INTERNO_ImportesImpuestos_Modelo)
                        {
                            //DescuentoAlbaranFinal_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado = Funciones.RedondearDecimal((mdl_INTERNO_ImportesImpuestos_Modelo.Bruto * ((mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal != null ? mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal.Value : 0m) / 100)), 2);

                            //DescuentoFacturaFinal_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado = Funciones.RedondearDecimal(((mdl_INTERNO_ImportesImpuestos_Modelo.Bruto - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado) * ((_dcm_Descuento_FinFactura != null ? _dcm_Descuento_FinFactura.Value : 0m) / 100)), 2);

                            //DescuentoProntoPago_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado = Funciones.RedondearDecimal((((mdl_INTERNO_ImportesImpuestos_Modelo.Bruto - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado) - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado) * ((_dcm_Descuento_ProntoPago != null ? _dcm_Descuento_ProntoPago.Value : 0m) / 100)), 2);

                            //BaseImponible
                            mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible = Funciones.RedondearDecimal((((mdl_INTERNO_ImportesImpuestos_Modelo.Bruto - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado) - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado) - mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado), 2);

                            //Impuesto_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado = Funciones.RedondearDecimal((((mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje.Value : 0m) / 100) * mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible), 2);

                            //Recargo_Calculado
                            mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado = _bol_CalcularRecargo ? (Funciones.RedondearDecimal((((mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje.Value : 0m) / 100) * mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible), 2)) : 0m;

                            //Total
                            mdl_INTERNO_ImportesImpuestos_Modelo.Total = Funciones.RedondearDecimal((mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible + mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado + mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado), 2);

                            //Total_Final
                            mdl_INTERNO_ImportesImpuestos_Modelo.Total_Final = mdl_INTERNO_ImportesImpuestos_Modelo.Total;

                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VentasCompras_Impuestos_Calculos) + "/" + nameof(Calcular_ImportesImpuestos_Lineas_Albaranes_En_Facturas), true);
            }

            return lst_INTERNO_ImportesImpuestos_Modelo;
        }

        private INTERNO_ImportesImpuestos_Modelo ImportesImpuestos_Totales(List<INTERNO_ImportesImpuestos_Modelo> _lst_INTERNO_ImportesImpuestos_Modelo)
        {
            INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES = new INTERNO_ImportesImpuestos_Modelo();

            try
            {
                //Modelo creado para poner una linea con los totales de los importes e impuestos al final del DataGridView 
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.IdImpuestoTipo = 0;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.ImpuestoTipo = "TOTALES";
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.EsLineaTotal = true;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Bruto = 0;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.DescuentoProntoPago_Calculado =0;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.DescuentoAlbaranFinal_Calculado = 0;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.DescuentoFacturaFinal_Calculado = 0;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.BaseImponible = 0;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Impuesto_Porcentaje = null;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Impuesto_Calculado = 0;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Recargo_Porcentaje = null;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Recargo_Calculado = 0;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Total =0;
                mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Total_Final = 0;

                if (_lst_INTERNO_ImportesImpuestos_Modelo != null && _lst_INTERNO_ImportesImpuestos_Modelo.Count > 0)
                {
                    foreach (INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo in _lst_INTERNO_ImportesImpuestos_Modelo)
                    {
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Bruto = Funciones.RedondearDecimal(mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Bruto + mdl_INTERNO_ImportesImpuestos_Modelo.Bruto, 2);
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.DescuentoProntoPago_Calculado = Funciones.RedondearDecimal(mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.DescuentoProntoPago_Calculado + mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado, 2);
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.DescuentoAlbaranFinal_Calculado = Funciones.RedondearDecimal(mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.DescuentoAlbaranFinal_Calculado + mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado, 2);
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.DescuentoFacturaFinal_Calculado = Funciones.RedondearDecimal(mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.DescuentoFacturaFinal_Calculado + mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado, 2);
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.BaseImponible = Funciones.RedondearDecimal(mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.BaseImponible + mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible, 2);
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Impuesto_Porcentaje = null;
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Impuesto_Calculado = Funciones.RedondearDecimal(mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Impuesto_Calculado + mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado, 2);
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Recargo_Porcentaje = null;
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Recargo_Calculado = Funciones.RedondearDecimal(mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Recargo_Calculado + mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado, 2);
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Total = Funciones.RedondearDecimal(mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Total + mdl_INTERNO_ImportesImpuestos_Modelo.Total, 2);
                        mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Total_Final = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES.Total;
                    }
                }

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VentasCompras_Impuestos_Calculos) + "/" + nameof(ImportesImpuestos_Totales), true);
            }

            return mdl_INTERNO_ImportesImpuestos_Modelo_TOTALESFINALES;
        }


        private List<INTERNO_ImportesImpuestos_Modelo> ImportesImpuestos_Actualizar(GEN_ImpuestosCabecera _mdl_GEN_ImpuestosCabecera,
                                                                                    long _lng_idImpuestoTipo,
                                                                                    string _str_ImpuestoTipo_Descripcion,
                                                                                    decimal _dcm_Bruto,
                                                                                    List<INTERNO_ImportesImpuestos_Modelo> _lst_INTERNO_ImportesImpuestos_Modelo,
                                                                                    bool _bol_CalcularRecargo)
        {
            if (_mdl_GEN_ImpuestosCabecera != null &&
                _mdl_GEN_ImpuestosCabecera.GEN_ImpuestosLineas != null)
            {

                INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo = new INTERNO_ImportesImpuestos_Modelo();

                //idImpuestoTipo
                mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoTipo = _lng_idImpuestoTipo;

                //ImpuestoTipo
                mdl_INTERNO_ImportesImpuestos_Modelo.ImpuestoTipo = _str_ImpuestoTipo_Descripcion.ToUpper();

                //IdRetencionTipo
                mdl_INTERNO_ImportesImpuestos_Modelo.IdRetencionTipo = null;

                //RetencionTipo
                mdl_INTERNO_ImportesImpuestos_Modelo.RetencionTipo = "";



                //Buscar GEN_ImpuestosLineas para aplicar el impuesto y el recargo
                GEN_ImpuestosLineas mdl_GEN_ImpuestosLineas = _mdl_GEN_ImpuestosCabecera.GEN_ImpuestosLineas.Where(m => m.idImpuestoTipo != null &&
                                                                                                                        m.idImpuestoTipo.Value.Equals(_lng_idImpuestoTipo) &&
                                                                                                                        m.fechaDesde <= g_dtt_Fecha &&
                                                                                                                        ((m.fechaHasta == null) || (m.fechaHasta != null && m.fechaHasta.Value >= g_dtt_Fecha))).FirstOrDefault();
                if (mdl_GEN_ImpuestosLineas != null)
                {
                    //IdImpuestoLinea
                    mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoLinea = mdl_GEN_ImpuestosLineas.id;
                    //IdRetencion
                    mdl_INTERNO_ImportesImpuestos_Modelo.IdRetencion = null;
                    //Bruto
                    mdl_INTERNO_ImportesImpuestos_Modelo.Bruto = _dcm_Bruto;
                    //DescuentoFacturaFinal_Calculado
                    mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado = 0;
                    //DescuentoProntoPago_Calculado
                    mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado = 0;
                    //BaseImponible
                    mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible = 0;
                    //BaseRetencion
                    mdl_INTERNO_ImportesImpuestos_Modelo.BaseRetencion = 0;
                    //Impuesto_Porcentaje
                    mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje = mdl_GEN_ImpuestosLineas.impuesto != null ? mdl_GEN_ImpuestosLineas.impuesto.Value : 0m;
                    //Impuesto_Calculado
                    mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado = 0;
                    //Recargo_Porcentaje
                    mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje = _bol_CalcularRecargo ? (mdl_GEN_ImpuestosLineas.recargo != null ? mdl_GEN_ImpuestosLineas.recargo.Value : 0m) : 0m;
                    //Recargo_Calculado
                    mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado = 0;

                    //Retencion_Porcentaje
                    mdl_INTERNO_ImportesImpuestos_Modelo.Retencion_Porcentaje = null;
                    //Retencion_Calculado
                    mdl_INTERNO_ImportesImpuestos_Modelo.Retencion_Calculado = 0;


                    //Total
                    mdl_INTERNO_ImportesImpuestos_Modelo.Total = 0;
                    //Total_Final
                    mdl_INTERNO_ImportesImpuestos_Modelo.Total_Final = 0;
                    //EsLineaTotal
                    mdl_INTERNO_ImportesImpuestos_Modelo.EsLineaTotal = false;

                    //IdAlbaranCabecera
                    mdl_INTERNO_ImportesImpuestos_Modelo.IdAlbaranCabecera = null;
                    //DescuentoAlbaranFinal
                    mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal = 0;
                    //DescuentoAlbaranFinal_Calculado
                    mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado = 0;

                    //Añadir al listado
                    _lst_INTERNO_ImportesImpuestos_Modelo.Add(mdl_INTERNO_ImportesImpuestos_Modelo);

                }
            }

            return _lst_INTERNO_ImportesImpuestos_Modelo;
        }

        #endregion

        #region Articulo/ArticuloComodin
        public MAE_Articulos Articulo_Obtener_Simple(long _lng_idArticulo)
        {
            MAE_Articulos mdl_MAE_Articulos = null;
            try
            {
                // 1º cargar los datos del articulo seleccionado
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOS_OBTENER_MODELO_POR_ID_AUX1, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { _lng_idArticulo,true,true,true,true,true,true,true };

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_MAE_Articulos = (MAE_Articulos)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                //##################################################################################################################################################################################################
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Impuestos_Calculos) + "/" + nameof(Articulo_Obtener_Simple), true);
            }

            return mdl_MAE_Articulos;
        }

        private MAE_Articulos Articulo_Obtener_ConImpuestosTipo(long _lng_idArticulo)
        {
            MAE_Articulos mdl_MAE_Articulos = null;
            try
            {
                // 1º cargar los datos del articulo seleccionado
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOS_OBTENER_MODELO_POR_ID_AUX1, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { _lng_idArticulo,true,false,false,false,false,true,true };

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_MAE_Articulos = (MAE_Articulos)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                //##################################################################################################################################################################################################
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Impuestos_Calculos) + "/" + nameof(Articulo_Obtener_ConImpuestosTipo), true);
            }

            return mdl_MAE_Articulos;
        }

        public MAE_ArticulosComodin ArticuloComodin_Obtener(long _lng_idArticuloComodin)
        {
            MAE_ArticulosComodin mdl_MAE_ArticulosComodin = null;
            try
            {
                // 1º cargar los datos del articulo seleccionado
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOSCOMODIN_OBTENERMODELO_POR_ID_AUX1, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { _lng_idArticuloComodin,true,true,true,true,true };

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_MAE_ArticulosComodin = (MAE_ArticulosComodin)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                //##################################################################################################################################################################################################
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Impuestos_Calculos) + "/" + nameof(ArticuloComodin_Obtener), true);
            }

            return mdl_MAE_ArticulosComodin;
        }
        #endregion

    }
}
