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_Maestros._3_Vistas.ControlesPersonalizados_DentroPaneles;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_Maestros._1_Datos;
using Exferia_Maestros.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Maestros._0_Modelos;
using Exferia_General;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Maestros._3_Vistas.ControlesPersonalizados_DentroPaneles
{
    public partial class CTU_P_Articulo_Embalajes : UserControl
    {
        #region Propiedades Privadas
        private MAE_Articulos_Embalajes g_mdl_MAE_Articulos_Embalajes = null;
        private List<MAE_Embalajes> g_lst_MAE_Embalajes=null;
        private int g_int_NumerObjeto;
        private static long g_lng_idArticulo = -1;
        private List<MAE_NomenclaturasPrecios> g_lst_MAE_NomenclaturasPrecios = null;
        private List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_OPERACIONES = new List<INTERNO_ComboBox_Modelo>();
        private P_Articulo g_frm_P_Articulo = null;
        private bool g_bol_EsEmbalajePrincipal = false;
        private List<TabPage> lst_TabPages_Embalajes = new List<TabPage>();

        private bool g_bol_Modificando_PrecioPorSegundaUnidad = false;

        private decimal g_dcm_ImpuestoParaCalcular = 0m;

        //Permisos
        public PRV_OpcionesDetalle g_mdl_PRV_OpcionesDetalle = null;
        internal List<INTERNO_Permisos_Modelo> g_lst_INTERNO_Permisos_Modelo = null;

        private int g_int_Alto_Inicial_pnl_Articulos_EmbalajesPrecios;
        private int g_int_Alto_Inicial_CTU_Articulos_Embalajes;

        private int g_int_Ancho_controlUser_P_Articulo_EmbalajesPrecios;
        private int g_int_Alto_controlUser_P_Articulo_EmbalajesPrecios;

        private CTU_P_Articulo_Embalajes_Precio g_controlUsuario_P_Articulo_Embalajes_Precios;

        private List<INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo> g_lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo = null;

        private bool g_bol_Cambio_Cantidad = false;
        private bool g_bol_Cambio_SegundaUnidad = false;

        #endregion

        #region Eventos Publicos

        public event EventHandler<INTERNO_EventArgs> Boton_P_Articulo_EmbalajesPrecios_Delete_Click;

        #endregion

        #region Propiedades Publicas

        public decimal CTU_P_Articulo_Embalajes_Cantidad
        {
            get
            {
                return ex_txt_CTU_P_Articulo_Embalajes_Cantidad.Text.Trim().Length > 0 ? decimal.Parse(ex_txt_CTU_P_Articulo_Embalajes_Cantidad.Text) : 0m; 
            }
        }

        public bool CTU_P_Articulo_Embalajes_EsPrincipal
        {
            get
            {
                return g_bol_EsEmbalajePrincipal;
            }
        }

        public long CTU_P_Articulo_Embalajes_EmbalajeSeleccionado
        {
            get
            {
                return ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem != null ? long.Parse(((INTERNO_ComboBox_Modelo)ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem).Identificador) : -1; 
            }
        }

        public long CTU_P_Articulo_Embalajes_EmbalajeRelacionalSeleccionado
        {
            get
            {
                return ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.SelectedItem != null ? long.Parse(((INTERNO_ComboBox_Modelo)ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.SelectedItem).Identificador) : -1;
            }
        }

        public int CTU_P_Articulo_Embalajes_Precio_Cantidad_SegundaUnidad
        {
            get
            {
                int int_Valordevuelto = 0;
                if (bol_relacional)
                {
                    if (ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_SegundaUnidad.Checked)
                    {
                        int_Valordevuelto = 1;
                    }
                }

                return int_Valordevuelto;
            }
        }

        //indicamos que este embalaje tiene relación con otro embalaje
        bool bol_relacional = true;
        public bool CTU_P_Articulo_Embalajes_ElementoRelacionado
        {
            set
            {
                bol_relacional = value;
                ex_pnl_CTU_P_Articulo_Embalajes_Relacional.Visible = value;
            }
            get
            {
                return bol_relacional;
            }
        }
        
        //Eliminamos el Boton Borrar para el CTU principal
        bool bol_Boton_Borrar = true;
        public bool CTU_P_Articulo_Embalajes_QuitarBoton_Borrar
        {
            set
            {
                bol_Boton_Borrar = value;
                ex_btn_CTU_P_Articulo_Embalajes_Borrar.Enabled = !value;
                ex_btn_CTU_P_Articulo_Embalajes_Borrar.Visible = !value;
            }
            get
            {
                return bol_Boton_Borrar;
            }
        }

        //Titulo de la etiqueta de Tipoembalaje
        public string CTU_P_Articulo_Embalajes_TipoEmbalajes_TITULO
        {
            get
            {
                return ex_lbl_CTU_P_Articulo_Embalajes_TipoEmbalaje.Text;
            }
        }

        //Texto del elemento seleccionado
        public string CTU_P_Articulo_Embalajes_TipoEmbalajes_Seleccionado
        {
            get
            {
                string str_valorSeleccionado = "";

                if (ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.Visible &&
                     ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.SelectedItem != null)
                {
                    str_valorSeleccionado = ((INTERNO_ComboBox_Modelo)ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem).Descripcion;
                }

                return str_valorSeleccionado;
            }
        }
        #endregion

        #region Constructor

        public CTU_P_Articulo_Embalajes (MAE_Articulos_Embalajes _mdl_MAE_Articulos_Embalajes, 
                                        List<MAE_Embalajes> _lst_MAE_Embalajes, 
                                        int _int_NumerObjeto, 
                                        long _lng_idArticulo,            
                                        List<MAE_NomenclaturasPrecios> _lst_MAE_NomenclaturasPrecios,
                                        P_Articulo _frm_P_Articulo,
                                        bool _bol_EsEmbalajePrincipal,
                                        decimal _dcm_ImpuestoParaCalcular)
        {
            InitializeComponent();

            //Valores Recibidos
            g_mdl_MAE_Articulos_Embalajes = _mdl_MAE_Articulos_Embalajes;
            g_lst_MAE_Embalajes = _lst_MAE_Embalajes;
            g_int_NumerObjeto = _int_NumerObjeto;
            g_lng_idArticulo = _lng_idArticulo;
            g_lst_MAE_NomenclaturasPrecios = _lst_MAE_NomenclaturasPrecios;
            g_frm_P_Articulo= _frm_P_Articulo;
            g_bol_EsEmbalajePrincipal = _bol_EsEmbalajePrincipal;
            g_dcm_ImpuestoParaCalcular = _dcm_ImpuestoParaCalcular;

            //Si es Emblaje prinicpal ocultar Controles
            ex_btn_CTU_P_Articulo_Embalajes_Borrar.Visible = !g_bol_EsEmbalajePrincipal;
            ex_cbo_CTU_P_Articulo_Embalajes_Operacion.Visible = !g_bol_EsEmbalajePrincipal;
            ex_lbl_CTU_P_Articulo_Embalajes_Operacion.Visible = !g_bol_EsEmbalajePrincipal;

            //Buscar los permisos
            g_lst_INTERNO_Permisos_Modelo = Datos_Generales.Permisos_Buscar(Variables.G_STR_OPCION_MAE_ARTICULO_EMBALAJE_PRECIO);

            //Creamos los tabs de las nomenclatura para los precios ........................................
            if (g_lst_MAE_NomenclaturasPrecios != null && g_lst_MAE_NomenclaturasPrecios.Count > 0)
            {
                foreach (MAE_NomenclaturasPrecios mdl_MAE_NomenclaturasPrecios in g_lst_MAE_NomenclaturasPrecios)
                {
                    //TabPage dinamico
                    TabPage tbp_Aux = new TabPage();
                    tbp_Aux.Location = new System.Drawing.Point(4, 22);
                    tbp_Aux.Name = "TabPage_" + mdl_MAE_NomenclaturasPrecios.id;
                    tbp_Aux.BackColor = Color.White;
                    tbp_Aux.Size = new System.Drawing.Size(626, 271);
                    tbp_Aux.TabIndex = 0;
                    tbp_Aux.Tag = mdl_MAE_NomenclaturasPrecios.id;
                    tbp_Aux.Text = mdl_MAE_NomenclaturasPrecios.descripcion;
                    tbp_Aux.UseVisualStyleBackColor = true;

                    //Objeto personalizado
                    g_controlUsuario_P_Articulo_Embalajes_Precios = new CTU_P_Articulo_Embalajes_Precio(mdl_MAE_NomenclaturasPrecios,g_frm_P_Articulo, _bol_EsEmbalajePrincipal, g_dcm_ImpuestoParaCalcular);
                    g_controlUsuario_P_Articulo_Embalajes_Precios.Name = "controlusuario_CTU_P_Articulo_Embalajes_Precio_" + mdl_MAE_NomenclaturasPrecios.id;
                    g_controlUsuario_P_Articulo_Embalajes_Precios.Anchor = (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left);
                    g_controlUsuario_P_Articulo_Embalajes_Precios.Location = new Point(20, 3);
                    tbp_Aux.Controls.Add(g_controlUsuario_P_Articulo_Embalajes_Precios);
                    g_controlUsuario_P_Articulo_Embalajes_Precios.Exferia_TextBox_Precio.Name = "ex_txt_CTU_P_Articulo_Embalajes_Precios_Precio_" + mdl_MAE_NomenclaturasPrecios.id;

                    //Añadir el TabPage al TabControl
                    ex_tbc_CTU_P_Articulo_Embalajes_Precio.TabPages.Add(tbp_Aux);
                    lst_TabPages_Embalajes.Add(tbp_Aux);
                }
            }

            //Cargamos los valores iniciales de posicion y tamaños de los controles de embalajesPrecios
            g_int_Alto_Inicial_pnl_Articulos_EmbalajesPrecios = ex_pnl_CTU_P_Articulo_Embalajes_Relacional.Height;
            g_int_Alto_Inicial_CTU_Articulos_Embalajes = this.Height;

            //Obtenemos el ancho y alto del control que vamos a meter
            //g_controlUsuario_P_Articulo_Embalajes_Precios = new CTU_P_Articulo_Embalajes_Precio();
            if (g_controlUsuario_P_Articulo_Embalajes_Precios != null)
            {
                g_int_Ancho_controlUser_P_Articulo_EmbalajesPrecios = g_controlUsuario_P_Articulo_Embalajes_Precios.Width;
                g_int_Alto_controlUser_P_Articulo_EmbalajesPrecios = g_controlUsuario_P_Articulo_Embalajes_Precios.Height;
            }

            //Vaciamos los CombosBox Embalajes
            ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.Items.Clear();
            ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.Items.Clear();

            //Rellenando los ComboBox con los embalajes
            if (g_lst_MAE_Embalajes != null && g_lst_MAE_Embalajes.Count > 0)
            {
                
                foreach (MAE_Embalajes mdl_MAE_Embalajes in g_lst_MAE_Embalajes.Where(m => m.fechaBorrado == null))
                {
                    //Rellenando el ComboBox de los Embalajes
                    ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.Items.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Embalajes.id.ToString(), mdl_MAE_Embalajes.descripcion.ToString(), mdl_MAE_Embalajes.fechaBorrado));

                    //Rellenando el ComboBox de los Embalajes relacionales
                    ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.Items.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Embalajes.id.ToString(), mdl_MAE_Embalajes.descripcion.ToString(), mdl_MAE_Embalajes.fechaBorrado));
                }

                ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem = g_lst_MAE_Embalajes.First();
                ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.SelectedItem = g_lst_MAE_Embalajes.First();
            }

            //Rellenando los ComboBox Operaciones
            INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_MULTIPLICAR = new INTERNO_ComboBox_Modelo(Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Codigo, Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Descripcion, null);
            g_lst_INTERNO_ComboBox_Modelo_OPERACIONES.Add(mdl_INTERNO_ComboBox_Modelo_MULTIPLICAR);
            ex_cbo_CTU_P_Articulo_Embalajes_Operacion.Items.Add(mdl_INTERNO_ComboBox_Modelo_MULTIPLICAR);

            INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_DIVIDIR = new INTERNO_ComboBox_Modelo(Variables.G_MDL_TIPOOPERACION_DIVIDIR.Codigo, Variables.G_MDL_TIPOOPERACION_DIVIDIR.Descripcion, null);
            g_lst_INTERNO_ComboBox_Modelo_OPERACIONES.Add(mdl_INTERNO_ComboBox_Modelo_DIVIDIR);
            ex_cbo_CTU_P_Articulo_Embalajes_Operacion.Items.Add(mdl_INTERNO_ComboBox_Modelo_DIVIDIR);

            ex_cbo_CTU_P_Articulo_Embalajes_Operacion.SelectedIndex = 0;
            

            Repintar.Empezar(this);
        }
        #endregion

        public void CargarDatos_EmbalajePrincipal(MAE_Articulos_Embalajes _mdl_MAE_Articulos_Embalajes, decimal _dcm_ImpuestoParaCalcular)
        {
            try
            {
                g_mdl_MAE_Articulos_Embalajes = _mdl_MAE_Articulos_Embalajes;
                g_dcm_ImpuestoParaCalcular = _dcm_ImpuestoParaCalcular;

                ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem = ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(_mdl_MAE_Articulos_Embalajes.idEmbalajePrincipal.ToString())).FirstOrDefault();
                ex_txt_CTU_P_Articulo_Embalajes_Cantidad.Text = _mdl_MAE_Articulos_Embalajes.cantidadEmbalajePrincipal.ToString();
                ex_txt_CTU_P_Articulo_Embalajes_Descripcion.Text = _mdl_MAE_Articulos_Embalajes.descripcion;

                //Precio Por Segunda Unidad
                if (_mdl_MAE_Articulos_Embalajes.precio_Cantidad_SegundaUnidad != null && 
                    _mdl_MAE_Articulos_Embalajes.precio_Cantidad_SegundaUnidad.Value == 1)
                {
                    ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_SegundaUnidad.Checked = true;
                }
                //Por Cantidad
                else
                {
                    ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_Cantidad.Checked = true;
                }


                ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Relacional.Text = _mdl_MAE_Articulos_Embalajes.cantidadEmbalajeRelacional.ToString();
                if (_mdl_MAE_Articulos_Embalajes.idEmbalajeRelacional != null)
                {
                    //CTU_P_Articulo_Embalajes_ElementoRelacionado = true;
                    ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.SelectedItem = ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(_mdl_MAE_Articulos_Embalajes.idEmbalajeRelacional.ToString())).FirstOrDefault();
                }
                

                //Cargamos los Precios pertenecientes al embalaje principal
                List<MAE_Articulos_EmbalajesPrincipal_Precios> lst_MAE_Articulos_EmbalajesPrincipal_Precios = null;
                if (_mdl_MAE_Articulos_Embalajes != null)
                {
                    //obtenemos un Listado de todos los Precios para los Embalajes
                    lst_MAE_Articulos_EmbalajesPrincipal_Precios = _mdl_MAE_Articulos_Embalajes.MAE_Articulos_EmbalajesPrincipal_Precios.ToList();
                }

                if (lst_MAE_Articulos_EmbalajesPrincipal_Precios != null)
                {
                    MAE_Articulos_EmbalajesPrincipal_Precios mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX = null;
                    long lng_idNomenclaturaPrecio = -1;

                    //Recorremos el listado recibido para crear los controles de precios (segun la cantidad de nomenclaturas que haya) 
                    foreach (MAE_Articulos_EmbalajesPrincipal_Precios mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX_2 in lst_MAE_Articulos_EmbalajesPrincipal_Precios)
                    {
                        lng_idNomenclaturaPrecio = mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX_2.idNomenclaturaPrecio;

                        if (lst_MAE_Articulos_EmbalajesPrincipal_Precios != null)
                        {
                            mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX = lst_MAE_Articulos_EmbalajesPrincipal_Precios.Where(m => m.idNomenclaturaPrecio.Equals(lng_idNomenclaturaPrecio)).FirstOrDefault();
                        }

                        CTU_P_Articulo_Embalajes_Precio obj_CTU_P_Articulo_Embalajes_Principal_Precio = null;
                        //Obtenemos el control de Usuario dentro de los tabs del otro control de usuario
                        obj_CTU_P_Articulo_Embalajes_Principal_Precio = (CTU_P_Articulo_Embalajes_Precio)ex_tbc_CTU_P_Articulo_Embalajes_Precio.TabPages["TabPage_" + mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX_2.idNomenclaturaPrecio].Controls.Find("controlusuario_CTU_P_Articulo_Embalajes_Precio_" + mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX_2.idNomenclaturaPrecio, true).FirstOrDefault();

                        if (mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX != null)
                        {
                            obj_CTU_P_Articulo_Embalajes_Principal_Precio.CTU_P_Articulo_Embalajes_Precio_Id = mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX.id;
                            obj_CTU_P_Articulo_Embalajes_Principal_Precio.CTU_P_Articulo_Embalajes_Precio_PrecioFinal = mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX.precio;

                            obj_CTU_P_Articulo_Embalajes_Principal_Precio.CTU_P_Articulo_Embalajes_Precio_Actualizar_ConCompras = mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX.actualizarPreciosCompras_Cuando;
                            obj_CTU_P_Articulo_Embalajes_Principal_Precio.CTU_P_Articulo_Embalajes_Precio_TipoActualizacion = mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX.actualizarPreciosCompras_Tipo;
                            obj_CTU_P_Articulo_Embalajes_Principal_Precio.CTU_P_Articulo_Embalajes_Precio_Preguntar = mdl_MAE_Articulos_EmbalajesPrincipal_Precios_AUX.actualizarPreciosCompras_Preguntar;

                            obj_CTU_P_Articulo_Embalajes_Principal_Precio.Calcular_Precio_Mas_Impuesto(_dcm_ImpuestoParaCalcular);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Articulo_Embalajes) + "/" + nameof(CargarDatos_EmbalajePrincipal));
            }
        }

        public void Cargar_Datos()
        {
            try
            {
                if (g_mdl_MAE_Articulos_Embalajes != null)
                {
                    //CargarDatos para el control en caso de que existan datos para el embalaje
                    ex_txt_CTU_P_Articulo_Embalajes_Cantidad.Text = g_mdl_MAE_Articulos_Embalajes.cantidadEmbalajePrincipal.ToString();
                    ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem = ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(g_mdl_MAE_Articulos_Embalajes.idEmbalajePrincipal.ToString())).FirstOrDefault();
                    ex_txt_CTU_P_Articulo_Embalajes_Descripcion.Text = g_mdl_MAE_Articulos_Embalajes.descripcion;

                    //Precio Por Segunda Unidad
                    if (g_mdl_MAE_Articulos_Embalajes.precio_Cantidad_SegundaUnidad != null && g_mdl_MAE_Articulos_Embalajes.precio_Cantidad_SegundaUnidad.Value == 1)
                    {
                        ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_SegundaUnidad.Checked = true;
                    }
                    //Por Cantidad
                    else
                    {
                        ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_Cantidad.Checked = true;
                    }

                    //Embalaje relacional
                    ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Relacional.Text = g_mdl_MAE_Articulos_Embalajes.cantidadEmbalajeRelacional.ToString();
                    if (g_mdl_MAE_Articulos_Embalajes.idEmbalajeRelacional != null)
                    {
                        CTU_P_Articulo_Embalajes_ElementoRelacionado = true;
                        ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.SelectedItem = ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(g_mdl_MAE_Articulos_Embalajes.idEmbalajeRelacional.ToString())).FirstOrDefault();
                    }

                    //Operacion
                    if (g_mdl_MAE_Articulos_Embalajes.operacion != null)
                    {
                        ex_cbo_CTU_P_Articulo_Embalajes_Operacion.SelectedItem = g_lst_INTERNO_ComboBox_Modelo_OPERACIONES.Where(m => m.Identificador.Equals(g_mdl_MAE_Articulos_Embalajes.operacion)).FirstOrDefault();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Articulo_Embalajes) + "/" + nameof(Cargar_Datos));
            }
        }

        public INTERNO_ValorDevuelto_Modelo Validar()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Debe haber un tipoEmbalaje seleccionado
            if (ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedIndex == -1)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_lbl_CTU_P_Articulo_Embalajes_TipoEmbalaje.Text);
            }

            //El campo cantidad no puede estar vacio
            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && ex_txt_CTU_P_Articulo_Embalajes_Cantidad.Text.Trim().Length == 0)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = ex_txt_CTU_P_Articulo_Embalajes_Cantidad;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_lbl_CTU_P_Articulo_Embalajes_Cantidad.Text);
            }

            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.Id = long.Parse(((INTERNO_ComboBox_Modelo)ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem).Identificador);
                
                //Solo se validan los percios cuando es emblaje Principal
                if (g_bol_EsEmbalajePrincipal)
                {
                    //Validamos para el Embalaje Principal el Precio asociado
                    CTU_P_Articulo_Embalajes_Precio obj_CTU_P_Articulo_Embalajes_Precio_Principal = null;

                    foreach (MAE_NomenclaturasPrecios mdl_MAE_NomenclaturasPrecios_Aux in g_lst_MAE_NomenclaturasPrecios)
                    {
                        //Obtenemos el CTU que esta dentro del Tab 
                        obj_CTU_P_Articulo_Embalajes_Precio_Principal = (CTU_P_Articulo_Embalajes_Precio)ex_tbc_CTU_P_Articulo_Embalajes_Precio.TabPages["TabPage_" + mdl_MAE_NomenclaturasPrecios_Aux.id].Controls.Find("controlusuario_CTU_P_Articulo_Embalajes_Precio_" + mdl_MAE_NomenclaturasPrecios_Aux.id, true).FirstOrDefault();

                        if (obj_CTU_P_Articulo_Embalajes_Precio_Principal != null)
                        {
                            //no puede estar vacio el precio
                            if (obj_CTU_P_Articulo_Embalajes_Precio_Principal.Exferia_TextBox_Precio.Text.Trim().Length == 0)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_tbc_CTU_P_Articulo_Embalajes_Precio.TabPages["TabPage_" + mdl_MAE_NomenclaturasPrecios_Aux.id].Text);
                                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = obj_CTU_P_Articulo_Embalajes_Precio_Principal.Exferia_TextBox_Precio;

                                break;
                            }
                        }
                    }
                }
            }


            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public MAE_Articulos_Embalajes Obtener(long _lng_idArticulos)
        {
            MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes = null;

            //Tiene algun Embalaje seleccionado
            if (ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedIndex != -1)
            {
                mdl_MAE_Articulos_Embalajes = new MAE_Articulos_Embalajes();

                mdl_MAE_Articulos_Embalajes.id = g_mdl_MAE_Articulos_Embalajes!=null ? g_mdl_MAE_Articulos_Embalajes.id : -1;
                mdl_MAE_Articulos_Embalajes.idArticulo = _lng_idArticulos;
                mdl_MAE_Articulos_Embalajes.idEmbalajePrincipal = ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem!=null ? long.Parse(((INTERNO_ComboBox_Modelo)ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem).Identificador) : -1;
                mdl_MAE_Articulos_Embalajes.cantidadEmbalajePrincipal = ex_txt_CTU_P_Articulo_Embalajes_Cantidad.Text.Trim().Length>0 ? decimal.Parse(ex_txt_CTU_P_Articulo_Embalajes_Cantidad.Text) : 0m;
                mdl_MAE_Articulos_Embalajes.descripcion = ex_txt_CTU_P_Articulo_Embalajes_Descripcion.Text;
                mdl_MAE_Articulos_Embalajes.operacion = ((INTERNO_ComboBox_Modelo)ex_cbo_CTU_P_Articulo_Embalajes_Operacion.SelectedItem).Identificador;

                if (bol_relacional &&
                    ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.SelectedItem != null)
                {
                    mdl_MAE_Articulos_Embalajes.idEmbalajeRelacional = long.Parse(((INTERNO_ComboBox_Modelo)ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.SelectedItem).Identificador);

                    //Precio por Segunda Unidad
                    if (ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_SegundaUnidad.Checked)
                    {
                        mdl_MAE_Articulos_Embalajes.precio_Cantidad_SegundaUnidad = 1;
                    }
                    //Por Cantidad
                    else
                    {
                        mdl_MAE_Articulos_Embalajes.precio_Cantidad_SegundaUnidad = 0;
                    }
                }
                else
                {
                    mdl_MAE_Articulos_Embalajes.idEmbalajeRelacional = null;
                    mdl_MAE_Articulos_Embalajes.precio_Cantidad_SegundaUnidad = 0;
                }

                mdl_MAE_Articulos_Embalajes.esPrincipal = g_bol_EsEmbalajePrincipal;

                if (!string.IsNullOrEmpty(ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Relacional.Text.Trim()))
                {
                    mdl_MAE_Articulos_Embalajes.cantidadEmbalajeRelacional = decimal.Parse(ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Relacional.Text.Trim());
                }
                else
                {
                    mdl_MAE_Articulos_Embalajes.cantidadEmbalajeRelacional = null;
                }


                //Obtener Precio
                if (g_bol_EsEmbalajePrincipal)
                {
                    mdl_MAE_Articulos_Embalajes.MAE_Articulos_EmbalajesPrincipal_Precios = Obtener_Articulos_Embalajes_Precios();
                }
                else
                {
                    mdl_MAE_Articulos_Embalajes.MAE_Articulos_EmbalajesPrincipal_Precios = null;
                }
            }

            return mdl_MAE_Articulos_Embalajes;
        }

        #region Actualizar Precios, calculando desde el embalaje principal

        public void CTU_P_Articulo_Embalajes_Precios_Actualizar_TODOS(List<INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo> _lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo, decimal _dcm_ImpuestoParaCalcular)
        {
            g_lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo = _lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo;
            g_dcm_ImpuestoParaCalcular = _dcm_ImpuestoParaCalcular;

            INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo = null;
            foreach (MAE_NomenclaturasPrecios mdl_MAE_NomenclaturasPrecios in g_lst_MAE_NomenclaturasPrecios)
            {
                mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo = null;

                if (g_lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo != null)
                {
                    mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo= g_lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.Where(m => m.IdNomenclatura.Equals(mdl_MAE_NomenclaturasPrecios.id)).FirstOrDefault();
                }

                //Si existe el valor, se pone
                if (mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo!=null)
                {
                    CTU_P_Articulo_Embalajes_Precios_Actualizar(mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo, _dcm_ImpuestoParaCalcular);
                }
                //Se borrar el precio
                else
                {
                    CTU_P_Articulo_Embalajes_Precios_Borrar_INDIVIDUAL(mdl_MAE_NomenclaturasPrecios.id);
                }
            }
        }
        public void CTU_P_Articulo_Embalajes_Precios_Actualizar_INDIVIDUAL(List<INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo> _lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo,
                                                                           INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo _mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo, decimal _dcm_ImpuestoParaCalcular)
        {
            g_dcm_ImpuestoParaCalcular = _dcm_ImpuestoParaCalcular;

            //Actualizamos el listado general
            g_lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo = _lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo;

            //Actualiamos el registro
            CTU_P_Articulo_Embalajes_Precios_Actualizar(_mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo, _dcm_ImpuestoParaCalcular);
        }

        private void CTU_P_Articulo_Embalajes_Precios_Actualizar(INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo _mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo, decimal _dcm_ImpuestoParaCalcular)
        {
            //Añadir control creado en subproceso en el hilo principal .........................................
            if (InvokeRequired)
            {
                Invoke((MethodInvoker)delegate
                {
                    CTU_P_Articulo_Embalajes_Precios_Actualizar(_mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo, _dcm_ImpuestoParaCalcular);
                });
                return;
            }

            CTU_P_Articulo_Embalajes_Precio CTU_P_Articulo_Embalajes = null;
            CTU_P_Articulo_Embalajes = (CTU_P_Articulo_Embalajes_Precio)ex_tbc_CTU_P_Articulo_Embalajes_Precio.TabPages["TabPage_" + _mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.IdNomenclatura].Controls.Find("controlusuario_CTU_P_Articulo_Embalajes_Precio_" + _mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.IdNomenclatura, true).FirstOrDefault();
          
            //Si el Embalaje principal es relacional
            if (_mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.EsRelacional)
            {
                //Precio Por Segunda Unidad
                if (_mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.Precio_Cantidad_SegundaUnidad == 1)
                {
                    ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_SegundaUnidad.Checked = true;
                }
                //Por Cantidad
                else
                {
                    ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_Cantidad.Checked = true;
                }
            }


            //Es relacional y tiene el precio por segunda unidad
            bool bol_Relacional_PrecioSegundaUnidad = false;
            if (bol_relacional)
            {
                //Precio por Segunda Unidad
                if (ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_SegundaUnidad.Checked)
                {
                    bol_Relacional_PrecioSegundaUnidad = true;
                }
            }

            //Indicamos que hemos creado un control más
            if (CTU_P_Articulo_Embalajes != null)
            {
                decimal dcm_Precio = 0m;

                decimal dcm_Cantidad_Calculo = ex_txt_CTU_P_Articulo_Embalajes_Cantidad.Text.Trim().Length > 0 ? decimal.Parse(ex_txt_CTU_P_Articulo_Embalajes_Cantidad.Text) : 0m;
                decimal dcm_Cantidad_SegundaUnidad_Calculo = ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Relacional.Text.Trim().Length > 0 ? decimal.Parse(ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Relacional.Text) : 0m;
                
                //Si el embalaje principal es relacional y tiene precio por segunda unidad se pone el mismo precio que el embalaje principal
                if (_mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.EsRelacional &&
                    _mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.Precio_Cantidad_SegundaUnidad == 1)
                {
                    dcm_Precio = _mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.Precio;
                }
                //Si el embalaje secundario es relacional y se calcula el precio por 2 Unidad
                else if (bol_Relacional_PrecioSegundaUnidad)
                {
                    dcm_Precio = (_mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.Precio / dcm_Cantidad_SegundaUnidad_Calculo)* dcm_Cantidad_Calculo;
                }
                else
                {
                    if (dcm_Cantidad_Calculo != 0)
                    {
                        dcm_Precio = _mdl_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo.Precio;

                        //Dividir
                        if (((INTERNO_ComboBox_Modelo)ex_cbo_CTU_P_Articulo_Embalajes_Operacion.SelectedItem).Identificador.Equals(Variables.G_MDL_TIPOOPERACION_DIVIDIR.Codigo))
                        {
                            dcm_Precio = dcm_Precio / dcm_Cantidad_Calculo;
                        }
                        //Multiplicar
                        else
                        {
                            dcm_Precio = dcm_Precio * dcm_Cantidad_Calculo;
                        }
                    }
                }

                CTU_P_Articulo_Embalajes.CTU_P_Articulo_Embalajes_Precio_PrecioFinal = Funciones.RedondearDecimal(dcm_Precio,3);

                CTU_P_Articulo_Embalajes.Calcular_Precio_Mas_Impuesto(_dcm_ImpuestoParaCalcular);
            }
        }
        public void CTU_P_Articulo_Embalajes_Precios_Borrar_INDIVIDUAL(long _lng_idNomenclaturaPrecio)
        {
            //Añadir control creado en subproceso en el hilo principal .........................................
            if (InvokeRequired)
            {
                Invoke((MethodInvoker)delegate
                {
                    CTU_P_Articulo_Embalajes_Precios_Borrar_INDIVIDUAL(_lng_idNomenclaturaPrecio);
                });
                return;
            }

            CTU_P_Articulo_Embalajes_Precio CTU_P_Articulo_Embalajes = null;
            CTU_P_Articulo_Embalajes = (CTU_P_Articulo_Embalajes_Precio)ex_tbc_CTU_P_Articulo_Embalajes_Precio.TabPages["TabPage_" + _lng_idNomenclaturaPrecio].Controls.Find("controlusuario_CTU_P_Articulo_Embalajes_Precio_" + _lng_idNomenclaturaPrecio, true).FirstOrDefault();

            //Indicamos que hemos creado un control más
            if (CTU_P_Articulo_Embalajes != null)
            {
                CTU_P_Articulo_Embalajes.CTU_P_Articulo_Embalajes_Precio_PrecioFinal = 0m;
            }
        }

        //Recogemos en una lista los datos que contiene los controles de precios
        public List<MAE_Articulos_EmbalajesPrincipal_Precios> Obtener_Articulos_Embalajes_Precios()
        {
            List<MAE_Articulos_EmbalajesPrincipal_Precios> lst_MAE_Articulos_EmbalajesPrincipal_Precios = new List<MAE_Articulos_EmbalajesPrincipal_Precios>();

            CTU_P_Articulo_Embalajes_Precio obj_CTU_P_Articulo_EmbalajesPrecios = null;
            foreach (MAE_NomenclaturasPrecios mdl_MAE_NomenclaturasPrecios in g_lst_MAE_NomenclaturasPrecios)
            {
                MAE_Articulos_EmbalajesPrincipal_Precios mdl_MAE_Articulos_EmbalajesPrincipal_Precios = new MAE_Articulos_EmbalajesPrincipal_Precios();
               
                //Obtenemos el Control de Usuario dentro del otro
                obj_CTU_P_Articulo_EmbalajesPrecios = (CTU_P_Articulo_Embalajes_Precio)ex_tbc_CTU_P_Articulo_Embalajes_Precio.Controls.Find("controlusuario_CTU_P_Articulo_Embalajes_Precio_" + mdl_MAE_NomenclaturasPrecios.id, true).FirstOrDefault();

                if(obj_CTU_P_Articulo_EmbalajesPrecios != null && obj_CTU_P_Articulo_EmbalajesPrecios.CTU_P_Articulo_Embalajes_Precio_HayValor)
                {
                    mdl_MAE_Articulos_EmbalajesPrincipal_Precios.id = obj_CTU_P_Articulo_EmbalajesPrecios.CTU_P_Articulo_Embalajes_Precio_Id;
                    mdl_MAE_Articulos_EmbalajesPrincipal_Precios.idArticulo_Embalaje = obj_CTU_P_Articulo_EmbalajesPrecios.CTU_P_Articulo_Embalajes_Precio_IdArticulo_Embalaje;
                    mdl_MAE_Articulos_EmbalajesPrincipal_Precios.idNomenclaturaPrecio = mdl_MAE_NomenclaturasPrecios.id;
                    mdl_MAE_Articulos_EmbalajesPrincipal_Precios.precio = obj_CTU_P_Articulo_EmbalajesPrecios.CTU_P_Articulo_Embalajes_Precio_PrecioFinal;

                    mdl_MAE_Articulos_EmbalajesPrincipal_Precios.actualizarPreciosCompras_Cuando = obj_CTU_P_Articulo_EmbalajesPrecios.CTU_P_Articulo_Embalajes_Precio_Actualizar_ConCompras;
                    mdl_MAE_Articulos_EmbalajesPrincipal_Precios.actualizarPreciosCompras_Tipo = obj_CTU_P_Articulo_EmbalajesPrecios.CTU_P_Articulo_Embalajes_Precio_TipoActualizacion;
                    mdl_MAE_Articulos_EmbalajesPrincipal_Precios.actualizarPreciosCompras_Preguntar = obj_CTU_P_Articulo_EmbalajesPrecios.CTU_P_Articulo_Embalajes_Precio_Preguntar;

                    lst_MAE_Articulos_EmbalajesPrincipal_Precios.Add(mdl_MAE_Articulos_EmbalajesPrincipal_Precios);
                }
            }
            return lst_MAE_Articulos_EmbalajesPrincipal_Precios;
        }

        public void CTU_P_Articulo_Embalajes_Precios_Actualizar_PrecioMasImpuestos(decimal _dcm_ImpuestoParaCalculo)
        {
            CTU_P_Articulo_Embalajes_Precio obj_CTU_P_Articulo_EmbalajesPrecios = null;
            foreach (MAE_NomenclaturasPrecios mdl_MAE_NomenclaturasPrecios in g_lst_MAE_NomenclaturasPrecios)
            {
                obj_CTU_P_Articulo_EmbalajesPrecios = (CTU_P_Articulo_Embalajes_Precio)ex_tbc_CTU_P_Articulo_Embalajes_Precio.Controls.Find("controlusuario_CTU_P_Articulo_Embalajes_Precio_" + mdl_MAE_NomenclaturasPrecios.id, true).FirstOrDefault();

                if (obj_CTU_P_Articulo_EmbalajesPrecios != null)
                {
                    obj_CTU_P_Articulo_EmbalajesPrecios.Calcular_Precio_Mas_Impuesto(_dcm_ImpuestoParaCalculo);
                }
            }
        }

        #endregion

        #region Eventos
        private void btn_P_ArticuloPrecios_Borrar_Click (object sender, EventArgs e)
        {
            //Para que salte el evento en el otro lado
            EventHandler<INTERNO_EventArgs> temp = Boton_P_Articulo_EmbalajesPrecios_Delete_Click;
            if (temp != null)
                temp(sender, new INTERNO_EventArgs(g_int_NumerObjeto));
        }

        private void txt_Decimal_KeyPress(object sender, KeyPressEventArgs e)
        {
            g_frm_P_Articulo.Controlar_Modificaciones();

        }

        private void cbo_P_ArticuloPrecios_TiposEmbalajes_SelectedIndexChanged(object sender, EventArgs e)
        {
            g_frm_P_Articulo.Controlar_Modificaciones();

            try
            {
                MAE_Embalajes mdl_MAE_Embalajes = g_lst_MAE_Embalajes.Where(m => m.id.Equals(long.Parse(((INTERNO_ComboBox_Modelo)ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem).Identificador))).FirstOrDefault();
                bool bol_SePuedeCambiar = true;
                string str_Mensaje = "";
                CTU_P_Articulo_Embalajes obj_CTU_P_Articulo_Embalajes_PRINCIPAL = null;

                //Si es Embalaje principal
                if (g_bol_EsEmbalajePrincipal)
                {
                    //Si el embalaje anterior no tenia embalaje relacional y el selecionado si, 
                    //hay que validar si el resto de los embalajes tienen embalaje relacional, sino no se puede cambiar
                    if (CTU_P_Articulo_Embalajes_ElementoRelacionado==false && mdl_MAE_Embalajes.embalajeConRelacion)
                    {
                        //Revisar el resto de los embalajes
                        if (!g_frm_P_Articulo.EmbalajesSecundarios_TodosTienenEmbalajeRelacional())
                        {
                            bol_SePuedeCambiar = false;
                            str_Mensaje = Mensajes.G_STR_ARTICULOS_HAYEMBALAJESSECUNDARIOS_SINEMBALAJERELACIONAL(mdl_MAE_Embalajes.descripcion);
                        }
                    }
                }
                //Si es Embalaje secundario
                else
                {
                    //Embalaje principal es relacional
                    obj_CTU_P_Articulo_Embalajes_PRINCIPAL = g_frm_P_Articulo.EmbalajePrincipal_TieneEmbalajeRelacional();
                    if (obj_CTU_P_Articulo_Embalajes_PRINCIPAL != null)
                    {
                        //Si el embalaje anterior embalaje relacional y el selecionado no
                        if (CTU_P_Articulo_Embalajes_ElementoRelacionado && 
                            mdl_MAE_Embalajes.embalajeConRelacion==false)
                        {   
                       
                            bol_SePuedeCambiar = false;
                            str_Mensaje = Mensajes.G_STR_ARTICULOS_EMBALAJEPRINCIPALRELACIONAL(mdl_MAE_Embalajes.descripcion);
                        }
                        else
                        {
                            //Seleccionar el comboBox igual que del embalaje principal
                            ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.SelectedItem = ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(obj_CTU_P_Articulo_Embalajes_PRINCIPAL.CTU_P_Articulo_Embalajes_EmbalajeRelacionalSeleccionado.ToString())).FirstOrDefault();
                            ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.Enabled = false;
                        }
                    }
                    else
                    {
                        ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje_Relacional.Enabled = true;
                    }
                }

                // Al cambiar el combobox, si esta relacionado se mostraran u ocultaran los determinados
                if (bol_SePuedeCambiar)
                {
                    CTU_P_Articulo_Embalajes_ElementoRelacionado = mdl_MAE_Embalajes.embalajeConRelacion;

                    //Si tiene Embalaje relacional, marcar 'Precio por...' igual que el principal
                    if (obj_CTU_P_Articulo_Embalajes_PRINCIPAL != null)
                    {
                        //Precio Por Segunda Unidad
                        if (obj_CTU_P_Articulo_Embalajes_PRINCIPAL.CTU_P_Articulo_Embalajes_Precio_Cantidad_SegundaUnidad==1)
                        {
                            ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_SegundaUnidad.Checked = true;
                        }
                        //Por Cantidad
                        else
                        {
                            ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_Cantidad.Checked = true;
                        }
                    }



                    //Si es embalaje principal actualizar el resto de los embalajes los calculos de los precios
                    if (g_bol_EsEmbalajePrincipal)
                    {
                        g_frm_P_Articulo.Calculos_ArticulosEmbalajes_Actualizar_TodasNomenclaturas();
                    }

                }
                //Se queda con el anterior
                else
                {
                    if (g_mdl_MAE_Articulos_Embalajes != null)
                    {
                        ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem = ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(g_mdl_MAE_Articulos_Embalajes.idEmbalajePrincipal.ToString())).FirstOrDefault();
                    }
                    else
                    {
                        ex_cbo_CTU_P_Articulo_Embalajes_TipoEmbalaje.SelectedItem = null;
                    }

                    Mensajes.MostrarMensaje(str_Mensaje);
                }
            }
            catch
            { }  
        }

        private void ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Exferia_TextBox_Evento_TextChanged(object sender, EventArgs e)
        {
            g_frm_P_Articulo.Controlar_Modificaciones();

        }

        private void ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_CheckedChanged(object sender, EventArgs e)
        {
            if (g_bol_Modificando_PrecioPorSegundaUnidad == false)
            {
                g_frm_P_Articulo.Controlar_Modificaciones();

                Comprobar_Cambio_PrecioPor();
            }
        }

        private void Comprobar_Cambio_PrecioPor()
        {
            g_bol_Modificando_PrecioPorSegundaUnidad = true;

            //Es embalaje Principal
            if (g_bol_EsEmbalajePrincipal)
            {
                g_frm_P_Articulo.Calculos_ArticulosEmbalajes_Actualizar_TodasNomenclaturas();
            }
            //Es embalaje Secundario
            else
            {
                //Embalaje principal es relacional
                CTU_P_Articulo_Embalajes obj_CTU_P_Articulo_Embalajes_PRINCIPAL = g_frm_P_Articulo.EmbalajePrincipal_TieneEmbalajeRelacional();
                if (obj_CTU_P_Articulo_Embalajes_PRINCIPAL != null)
                {

                    //Si el embalaje principal esta el precio por segunda unidad y en el embalaje actual esa por cantidad, no se puede
                    if (obj_CTU_P_Articulo_Embalajes_PRINCIPAL.CTU_P_Articulo_Embalajes_Precio_Cantidad_SegundaUnidad == 1 &&
                        ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_Cantidad.Checked)
                    {
                        ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_SegundaUnidad.Checked = true;
                        Mensajes.MostrarMensaje(Mensajes.G_STR_ARTICULOS_EMBALAJESECUNDARIO_PRECIOPOR_DIFERENTE_EMBALAJEPRINCIPAL());
                    }
                    //Si el embalaje principal esta el precio por cantidad y en el embalaje actual esa por segunda unidad, no se puede
                    else if (obj_CTU_P_Articulo_Embalajes_PRINCIPAL.CTU_P_Articulo_Embalajes_Precio_Cantidad_SegundaUnidad == 0 &&
                        ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_SegundaUnidad.Checked)
                    {
                        ex_rdb_CTU_P_Articulo_Embalajes_PrecioPor_Cantidad.Checked = true;
                        Mensajes.MostrarMensaje(Mensajes.G_STR_ARTICULOS_EMBALAJESECUNDARIO_PRECIOPOR_DIFERENTE_EMBALAJEPRINCIPAL());
                    }
                }

                Calcular_Precios_SegunEmbalajePrincipal();
            }

            g_bol_Modificando_PrecioPorSegundaUnidad = false;
        }

        #endregion

        private void ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Exferia_TextBox_Evento_KeyDown(object sender, KeyEventArgs e)
        {
            g_bol_Cambio_Cantidad = true;
        }
        private void ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            if (g_bol_Cambio_Cantidad)
            {
                Calcular_Precios_SegunEmbalajePrincipal();
            }
            g_bol_Cambio_Cantidad = false;
        }

        private void ex_cbo_CTU_P_Articulo_Embalajes_Operacion_SelectedIndexChanged(object sender, EventArgs e)
        {
            Calcular_Precios_SegunEmbalajePrincipal();
        }

        private void Calcular_Precios_SegunEmbalajePrincipal()
        {
            if (g_bol_EsEmbalajePrincipal==false)
            {
                CTU_P_Articulo_Embalajes_Precios_Actualizar_TODOS(g_lst_INTERNO_AUX_Calculos_ArticulosEmbalajes_Modelo, g_dcm_ImpuestoParaCalcular);
            }
            else
            {
                g_frm_P_Articulo.Calculos_ArticulosEmbalajes_Actualizar_TodasNomenclaturas();
            }
        }

        private void ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Relacional_Exferia_TextBox_Evento_KeyDown(object sender, KeyEventArgs e)
        {
            g_bol_Cambio_SegundaUnidad = true;
        }
        private void ex_txt_CTU_P_Articulo_Embalajes_Cantidad_Relacional_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            if (g_bol_Cambio_SegundaUnidad)
            {
                Calcular_Precios_SegunEmbalajePrincipal();
            }
            g_bol_Cambio_SegundaUnidad = false;
        }

        
    }
}
