using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Sincronizacion;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_General._3_Vistas.ListadosSeleccion;
using Exferia_Maestros._0_Modelos;
using Exferia_Maestros._1_Datos;
using Exferia_Maestros._3_Vistas.ControlesPersonalizados_DentroPaneles;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;

namespace Exferia_Maestros._3_Vistas.Controladoras
{
    public class P_TarifaPromocion_Controladora
    {
        #region Variables Generales
        private P_TarifaPromocion g_frm_P_TarifaPromocion = null;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        //Clases de Negocio Necesarias para la carga de datos
        private MAE_TarifasPromociones_Datos g_obj_MAE_TarifasPromociones_Datos = new MAE_TarifasPromociones_Datos();
        private MAE_Articulos_Datos g_obj_MAE_Articulos_Datos = new MAE_Articulos_Datos();
        public MAE_TarifasPromociones g_mdl_MAE_TarifasPromociones = null;

        public bool g_bol_Termino_CargaDatos_Inicial = false;//Se utiliza para saber cuando se termina la carga de datos estaticos inciales

        private int g_int_ClienteProveedor_RECIBIDO=-1;
        private int g_int_TarifaPromocion_RECIBIDO = -1;

        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;
        public bool g_bol_CargarDatos_Termino = true;

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        private bool g_bol_GrabarDatos_TerminoCorrectamente = true;
        private bool g_bol_GrabarDatos_VolverListado = true;

        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;
        private bool g_bol_BorrarDatos_VolverListado = true;

        public bool g_bol_CampoCodigo_Numerico = false;

        private MAE_Embalajes_Datos g_obj_MAE_Embalajes_Datos = new MAE_Embalajes_Datos();
        private List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_EMBALAJES = new List<INTERNO_ComboBox_Modelo>();

        #endregion

        #region Constructor
        public P_TarifaPromocion_Controladora(P_TarifaPromocion _frm_P_TarifaPromocion,int _int_ClienteProveedor,int _int_TarifaPromocion)
        {
            g_frm_P_TarifaPromocion = _frm_P_TarifaPromocion;

            //variables recibidas
            g_int_ClienteProveedor_RECIBIDO = _int_ClienteProveedor;
            g_int_TarifaPromocion_RECIBIDO = _int_TarifaPromocion;

            Datos_Iniciales();
            Valores_PorDefecto();

            //Si tiene Seleccionado Promocion
            if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Promocion.Checked)
            {
                //Si tiene Seleccionado Cliente
                if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Proveedor.Checked)
                {
                    g_frm_P_TarifaPromocion.Exferia_Panel_Degradado_AportacionProveedor.Visible = false;
                }
                else
                {
                    g_frm_P_TarifaPromocion.Exferia_Panel_Degradado_AportacionProveedor.Visible = true;
                }

                Cambiar_PromocionesPorUnidades_Precio(true,false);
            }
            else
            {
                g_frm_P_TarifaPromocion.Exferia_Panel_Degradado_AportacionProveedor.Visible = false;

                Cambiar_PromocionesPorUnidades_Precio(false, true);
            }

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        private void Datos_Iniciales()
        {
            //Obtenemos la lista de embalajes 
            List<MAE_Embalajes> lst_MAE_Embalajes = g_obj_MAE_Embalajes_Datos.Obtener_ModeloListado();
            // Rellenar combo de Embalajes
            INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_VACIO = new INTERNO_ComboBox_Modelo("-1", "", null);
            g_lst_INTERNO_ComboBox_Modelo_EMBALAJES.Add(mdl_INTERNO_ComboBox_Modelo_VACIO);
            g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.Items.Add(mdl_INTERNO_ComboBox_Modelo_VACIO);

            if (lst_MAE_Embalajes != null)
            {
                //Rellenando el ComboBox de los Embalajes
                foreach (MAE_Embalajes mdl_MAE_Embalajes in lst_MAE_Embalajes)
                {
                    INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo = new INTERNO_ComboBox_Modelo(mdl_MAE_Embalajes.id.ToString(), mdl_MAE_Embalajes.descripcion, mdl_MAE_Embalajes.fechaBorrado);

                    //Añadir al listado general
                    g_lst_INTERNO_ComboBox_Modelo_EMBALAJES.Add(mdl_INTERNO_ComboBox_Modelo);

                    //Añadir al combo
                    g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.Items.Add(mdl_INTERNO_ComboBox_Modelo);
                }
            }
        }

        public void Valores_PorDefecto()
        {
            //Si tiene valores en la variable recibida _int_ClienteProveedor
            if (g_int_ClienteProveedor_RECIBIDO > -1)
            {
                //Cliente
                if (g_int_ClienteProveedor_RECIBIDO.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO))
                {
                    g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Cliente.Checked = true;
                }
                //Proveedor
                else
                {
                    g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Proveedor.Checked = true;
                }

                g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Cliente.Enabled = false;
                g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Proveedor.Enabled = false;
            }

            //Si tiene valores en la variable recibida _int_TarifaPromocion
            if (g_int_TarifaPromocion_RECIBIDO > -1)
            {
                //Tarifa
                if (g_int_TarifaPromocion_RECIBIDO.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_PROMOCIONES_CODIGO))
                {
                    g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Promocion.Checked = true;
                }
                //Promocion
                else
                {
                    g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Tarifa.Checked = true;
                }

                g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Tarifa.Enabled = false;
                g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Promocion.Enabled = false;
            }
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //codigo
            g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo.Text = "";
            //descripcion
            g_frm_P_TarifaPromocion.Exferia_TextBox_Descripcion.Text = "";
            //desactivada
            g_frm_P_TarifaPromocion.Exferia_CheckBox_Desactivada.Checked = false;
            //Tipo cliente
            g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Cliente.Checked = true;
            //Tipo Tarifa
            g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Tarifa.Checked = true;
            //incremento
            g_frm_P_TarifaPromocion.Exferia_TextBox_Incremento.Text = "";
            //descuento 1
            g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_1.Text = "";
            //descuento 2
            g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_2.Text = "";
            //descuento 3
            g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_3.Text = "";
            //descuento 4
            g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_4.Text = "";
            //descuento 5
            g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_5.Text = "";
            //aportacion al proveedor coste
            g_frm_P_TarifaPromocion.Exferia_RadioButton_AportacionProveedor_Coste.Checked = true;
            //aportacion al proveedor porcentaje
            g_frm_P_TarifaPromocion.Exferia_TextBox_AportacionProveedor_Porcentaje.Text = "";
            //decimales
            g_frm_P_TarifaPromocion.Exferia_RadioButton_Decimales_3.Checked = true;

            //precio fijo
            g_frm_P_TarifaPromocion.Exferia_RadioButton_PreciosPromociones_PrecioFijo.Checked = true;
            //precio
            g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Precio.Text = "";
            //descuento moneda
            g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_DescuentoMoneda.Text = "";

            //cantidad A
            g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_A.Text = "";
            //cantidad B
            g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B.Text = "";
            //porcentaje cantidad B
            g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Porcentaje_CantidadB.Text = "";

            //nomemclatura
            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Id = -1;
            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Codigo = "";
            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Descripcion = "";
            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_FechaBorrado = null;

            //articulo
            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Id = -1;
            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Codigo = "";
            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Descripcion = "";
            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_FechaBorrado = null;

            //Embalaje
            g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.SelectedIndex = 0;

            //valores por defecto
            Valores_PorDefecto();

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_TarifaPromocion.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_TarifaPromocion.P_Base_TituloPantalla = (g_frm_P_TarifaPromocion.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
            }

            //Actualizar el Boton de Seleccion de pantalla ####################################################
            Variables.G_EMS_CONTROL_MENUSUPERIOR.Update_Texto_NombrePantalla(g_frm_P_TarifaPromocion.Tag.ToString());
            //#################################################################################################

            g_mdl_MAE_TarifasPromociones = null;
        }
        #endregion

        #region Buscar Codigo Siguiente
        public INTERNO_ValorDevuelto_Modelo Buscar_CodigoSiguiente()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente(nameof(MAE_TarifasPromociones),
                                                                                    nameof(MAE_TarifasPromociones.codigo),
                                                                                    nameof(MAE_TarifasPromociones.idEmpresa),
                                                                                    g_mdl_MAE_TarifasPromociones != null ? g_mdl_MAE_TarifasPromociones.idEmpresa : Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_TarifaPromocion.P_Base_ValoresGenerales.lng_idEmpresa, nameof(MAE_TarifasPromociones)),
                                                                                    true,
                                                                                    g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo.Text = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO(g_frm_P_TarifaPromocion.Exferia_Label_Codigo.Text);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(Buscar_CodigoSiguiente));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Comprobacion de cambios, para  grabar o no antes de salir o cambiar de registro
        public bool ComprobarCambios()
        {
            if (g_frm_P_TarifaPromocion.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(false);

                    //Te quedas espernado a que termine la tarea asincrona de grabar
                    while (g_obj_TareaAsincrona_GrabarDatos.IsBusy)
                        Application.DoEvents();

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        #endregion

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_TarifaPromocion.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos != null)
                {
                    while (g_obj_TareaAsincrona_CargarDatos.IsBusy)
                        Application.DoEvents();

                    //Vaciar
                    VaciarDatos();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = false;
                }

                g_bol_CargarDatos_Termino = false;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_CargarDatos.RunWorkerAsync();
                //#################################################################################################

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_TarifaPromocion.Enabled = true;
                g_bol_CargarDatos_Termino = true;

                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(RecargarDatos), true);
            }
        }
        private void TareaAsincrona_CargarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Cargar Valores
                if (CargarDatos(g_frm_P_TarifaPromocion.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear el Formulario
            g_frm_P_TarifaPromocion.Enabled = true;


            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_TarifaPromocion.Salir_P_Base();
                }
                else
                {
                    //Se bloquea, porque sino puede cambiar de cliente a proveedor, y si tenia creado promociones esquema o agrupaciones de articulos-cliente o articulos-proveedor dejar de funcionar correctamente
                    g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Cliente.Enabled = false;
                    g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Proveedor.Enabled = false;

                    //Si tiene Seleccionado Promocion
                    if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Promocion.Checked)
                    {
                        //Si tiene Seleccionado Cliente
                        if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Proveedor.Checked)
                        {
                            g_frm_P_TarifaPromocion.Exferia_Panel_Degradado_AportacionProveedor.Visible = false;
                        }
                        else
                        {
                            g_frm_P_TarifaPromocion.Exferia_Panel_Degradado_AportacionProveedor.Visible = true;
                        }

                        Cambiar_PromocionesPorUnidades_Precio(true,false);
                    }
                    else
                    {
                        g_frm_P_TarifaPromocion.Exferia_Panel_Degradado_AportacionProveedor.Visible = false;

                        Cambiar_PromocionesPorUnidades_Precio(false, true);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_TarifaPromocion.Salir_P_Base();
            }
            finally
            {
                g_bol_CargarDatos_Termino = true;
                //Hacemos foco al primer control.
                g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo.Exferia_TextBox_Foco();
            }
        }
        public bool CargarDatos(long _lng_id)
        {
            bool bol_ValorDevuelto = true;

            try
            {
                g_mdl_MAE_TarifasPromociones = g_obj_MAE_TarifasPromociones_Datos.Obtener(_lng_id);

                //Si no es Nulo Cargo lo Datos
                if (g_mdl_MAE_TarifasPromociones != null)
                {
                    //Paginador ................................................................................
                    if (g_frm_P_TarifaPromocion.P_Base_PantallaOrigen != null &&
                        g_frm_P_TarifaPromocion.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                        g_frm_P_TarifaPromocion.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_MAE_TarifasPromociones.id;
                        int int_PaginaDelObjeto = g_frm_P_TarifaPromocion.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_TarifaPromocion.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

                        g_frm_P_TarifaPromocion.g_obj_Funciones_Paginador.SetPaginaActual(int_PaginaDelObjeto);
                        // Asignando al paginador la pagina actual.
                        g_frm_P_TarifaPromocion.Exferia_Paginador_TarifaPromocion.PaginaActual = g_frm_P_TarifaPromocion.g_obj_Funciones_Paginador.GetPaginaActual();
                    }
                    //...........................................................................................

                    //TextBox
                    g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo.Text = g_mdl_MAE_TarifasPromociones.codigo;
                    g_frm_P_TarifaPromocion.Exferia_TextBox_Descripcion.Text = g_mdl_MAE_TarifasPromociones.descripcion;

                    //Cliente/Proveedor
                    if (g_mdl_MAE_TarifasPromociones.clienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO))
                    {
                        g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Cliente.Checked = true;
                    }
                    else
                    {
                        g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Proveedor.Checked = true;
                    }

                    //Tarifa/Promocion
                    if (g_mdl_MAE_TarifasPromociones.tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_PROMOCIONES_CODIGO))
                    {
                        g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Promocion.Checked = true;
                    }
                    else
                    {
                        g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Tarifa.Checked = true;
                    }

                    //Desactivada
                    g_frm_P_TarifaPromocion.Exferia_CheckBox_Desactivada.Checked = g_mdl_MAE_TarifasPromociones.desactivada!=null ? true : false;


                    //Incremento
                    g_frm_P_TarifaPromocion.Exferia_TextBox_Incremento.Text = g_mdl_MAE_TarifasPromociones.incremento != null ? g_mdl_MAE_TarifasPromociones.incremento.Value.ToString() : "";

                    //Decimales
                    if (g_mdl_MAE_TarifasPromociones.numeroRedondeo != null)
                    {
                        //0 decimales
                        if (g_mdl_MAE_TarifasPromociones.numeroRedondeo.Value == 0)
                        {
                            g_frm_P_TarifaPromocion.Exferia_RadioButton_Decimales_0.Checked = true;
                        }
                        //1 decimales
                        else if (g_mdl_MAE_TarifasPromociones.numeroRedondeo.Value == 1)
                        {
                            g_frm_P_TarifaPromocion.Exferia_RadioButton_Decimales_1.Checked = true;
                        }
                        //2 decimales
                        else if (g_mdl_MAE_TarifasPromociones.numeroRedondeo.Value == 2)
                        {
                            g_frm_P_TarifaPromocion.Exferia_RadioButton_Decimales_2.Checked = true;
                        }
                        //3 decimales
                        else
                        {
                            g_frm_P_TarifaPromocion.Exferia_RadioButton_Decimales_3.Checked = true;
                        }
                    }
                    //3 decimales
                    else
                    {
                        g_frm_P_TarifaPromocion.Exferia_RadioButton_Decimales_3.Checked = true;
                    }

                    //Descuentos
                    g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_1.Text = g_mdl_MAE_TarifasPromociones.descuento_1 != null ? g_mdl_MAE_TarifasPromociones.descuento_1.Value.ToString() : "";
                    g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_2.Text = g_mdl_MAE_TarifasPromociones.descuento_2 != null ? g_mdl_MAE_TarifasPromociones.descuento_2.Value.ToString() : "";
                    g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_3.Text = g_mdl_MAE_TarifasPromociones.descuento_3 != null ? g_mdl_MAE_TarifasPromociones.descuento_3.Value.ToString() : "";
                    g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_4.Text = g_mdl_MAE_TarifasPromociones.descuento_4 != null ? g_mdl_MAE_TarifasPromociones.descuento_4.Value.ToString() : "";
                    g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_5.Text = g_mdl_MAE_TarifasPromociones.descuento_5 != null ? g_mdl_MAE_TarifasPromociones.descuento_5.Value.ToString() : "";


                    //Precio Fijo
                    if (g_mdl_MAE_TarifasPromociones.precioFijoDinamico.Equals(Variables.G_INT_TIPOPRECIO_FIJO_CODIGO))
                    {
                        g_frm_P_TarifaPromocion.Exferia_RadioButton_PreciosPromociones_PrecioFijo.Checked = true;

                        //Precio
                        g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Precio.Text = g_mdl_MAE_TarifasPromociones.precio != null ? g_mdl_MAE_TarifasPromociones.precio.Value.ToString() : "";

                        //Vaciar Nomenclatura
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Id = -1;
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_FechaBorrado = null;
                    }
                    else
                    {
                        g_frm_P_TarifaPromocion.Exferia_RadioButton_PreciosPromociones_PrecioDinamico.Checked = true;

                        //Nomenclatura
                        if (g_mdl_MAE_TarifasPromociones.MAE_NomenclaturasPrecios != null)
                        {
                            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Id = g_mdl_MAE_TarifasPromociones.MAE_NomenclaturasPrecios.id;
                            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Codigo = g_mdl_MAE_TarifasPromociones.MAE_NomenclaturasPrecios.codigo;
                            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Descripcion = g_mdl_MAE_TarifasPromociones.MAE_NomenclaturasPrecios.descripcion;
                            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_FechaBorrado = g_mdl_MAE_TarifasPromociones.MAE_NomenclaturasPrecios.fechaBorrado;
                        }
                        else
                        {
                            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Id = -1;
                            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Codigo = string.Empty;
                            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Descripcion = string.Empty;
                            g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_FechaBorrado = null;
                        }

                        //Precio
                        g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Precio.Text = "";
                    }

                    //Descuento Moneda
                    g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_DescuentoMoneda.Text = g_mdl_MAE_TarifasPromociones.descuentoMoneda != null ? g_mdl_MAE_TarifasPromociones.descuentoMoneda.Value.ToString() : "";

                    //Cantidad
                    g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_A.Text = g_mdl_MAE_TarifasPromociones.AB_Cantidad_A != null ? g_mdl_MAE_TarifasPromociones.AB_Cantidad_A.Value.ToString() : "";
                    g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B.Text = g_mdl_MAE_TarifasPromociones.AB_Cantidad_B != null ? g_mdl_MAE_TarifasPromociones.AB_Cantidad_B.Value.ToString() : "";
                    g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Porcentaje_CantidadB.Text = g_mdl_MAE_TarifasPromociones.AB_Porcentaje != null ? g_mdl_MAE_TarifasPromociones.AB_Porcentaje.Value.ToString() : "";

                    //Articulo promocion
                    if (g_mdl_MAE_TarifasPromociones.MAE_Articulos != null)
                    {
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Id = g_mdl_MAE_TarifasPromociones.MAE_Articulos.id;
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Codigo = g_mdl_MAE_TarifasPromociones.MAE_Articulos.codigo;
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Descripcion = g_mdl_MAE_TarifasPromociones.MAE_Articulos.descripcion;
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_FechaBorrado = g_mdl_MAE_TarifasPromociones.MAE_Articulos.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Id = -1;
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_FechaBorrado = null;
                    }

                    //Embalaje
                    if (g_mdl_MAE_TarifasPromociones.AB_idEmbalaje != null && g_lst_INTERNO_ComboBox_Modelo_EMBALAJES != null)
                    {
                        g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.SelectedItem = g_lst_INTERNO_ComboBox_Modelo_EMBALAJES.Where(m => m.Identificador.Equals(g_mdl_MAE_TarifasPromociones.AB_idEmbalaje.ToString())).FirstOrDefault();
                    }

                    //Aportacion del proveedor
                    if (g_mdl_MAE_TarifasPromociones.aportacionProveedor_Tipo!=null)
                    {
                        //Coste
                        if (g_mdl_MAE_TarifasPromociones.aportacionProveedor_Tipo.Value.Equals(Variables.G_INT_TIPOAPORTACIONPROVEEDOR_COSTE_CODIGO))
                        {
                            g_frm_P_TarifaPromocion.Exferia_RadioButton_AportacionProveedor_Coste.Checked=true;
                        }
                        //Venta
                        else if (g_mdl_MAE_TarifasPromociones.aportacionProveedor_Tipo.Value.Equals(Variables.G_INT_TIPOAPORTACIONPROVEEDOR_VENTA_CODIGO))
                        {
                            g_frm_P_TarifaPromocion.Exferia_RadioButton_AportacionProveedor_Venta.Checked = true;
                        }
                        //Tarifa
                        else if (g_mdl_MAE_TarifasPromociones.aportacionProveedor_Tipo.Value.Equals(Variables.G_INT_TIPOAPORTACIONPROVEEDOR_TARIFA_CODIGO))
                        {
                            g_frm_P_TarifaPromocion.Exferia_RadioButton_AportacionProveedor_Tarifa.Checked = true;
                        }
                    }
                    //Porcentaje aportacion del proveedor
                    g_frm_P_TarifaPromocion.Exferia_TextBox_AportacionProveedor_Porcentaje.Text = g_mdl_MAE_TarifasPromociones.aportacionProveedor_Porcentaje != null ? g_mdl_MAE_TarifasPromociones.aportacionProveedor_Porcentaje.Value.ToString() : "";

                    // Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior = "";
                    if (g_frm_P_TarifaPromocion.g_mdl_PRV_OpcionesDetalle != null &&
                        g_frm_P_TarifaPromocion.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                        g_frm_P_TarifaPromocion.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de Campos
                        string[] arr_Campos = g_frm_P_TarifaPromocion.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Split(new Char[] { ',' });
                        string str_ValorAMostrarFinal = "";

                        string[] str_Separador = new string[] { " [" };
                        //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
                        if (g_frm_P_TarifaPromocion.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_TarifaPromocion.P_Base_TituloPantalla = (g_frm_P_TarifaPromocion.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

                        dynamic dnm_Objeto = g_mdl_MAE_TarifasPromociones;
                        foreach (string str_campo in arr_Campos)
                        {
                            var Valor = dnm_Objeto.GetType().GetProperty(str_campo).GetValue(dnm_Objeto, null);
                            if (Valor != null)
                            {
                                str_ValorAMostrarFinal += " " + Valor;
                            }

                            // codigo
                            if (str_campo.Equals(nameof(g_mdl_MAE_TarifasPromociones.codigo)))
                            {
                                str_MenuSuperior += g_mdl_MAE_TarifasPromociones.codigo;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_TarifaPromocion.P_Base_TituloPantalla += " [" + str_ValorAMostrarFinal + "] -Modificar";
                        }
                    }

                    //Actualizar el Boton de Seleccion de pantalla ####################################################
                    Variables.G_EMS_CONTROL_MENUSUPERIOR.Add_Texto_NombrePantalla_Descripciones(g_frm_P_TarifaPromocion.Tag.ToString(), str_MenuSuperior);
                    //#################################################################################################

                    g_frm_P_TarifaPromocion.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(CargarDatos));
                bol_ValorDevuelto = false;
            }

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_VolverAlListado)
        {
            try
            {
                g_bol_GrabarDatos_VolverListado = _bol_VolverAlListado;

                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_TarifaPromocion.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                g_obj_TareaAsincrona_GrabarDatos = new BackgroundWorker();
                g_obj_TareaAsincrona_GrabarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_GrabarDatos_DoWork);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_GrabarDatos_Completed);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerAsync();

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_bol_GrabarDatos_TerminoCorrectamente = false;
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_TarifaPromocion.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(GrabarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_GrabarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;

            try
            {
                // Validar Primero
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo = GrabarDatos_Final();
                }
                else
                {
                    mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_TarifaPromocion.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);

                        //Poner el Foco en el objeto que tuvoel problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_TarifaPromocion, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    #region SINCRONIZACION
                    INTERNO_Sincronizacion_ActualizarRegistro_Modelo mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo = new INTERNO_Sincronizacion_ActualizarRegistro_Modelo();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.tabla = nameof(MAE_TarifasPromociones);
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.idClavePrimaria = mdl_ValorDevuelto_Modelo_Resultado.Id;

                    Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_RESTOTABLAS(mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo);
                    #endregion

                    // Devolver al Listado el Row Añadido/Modificado
                    if (g_frm_P_TarifaPromocion.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_TarifaPromocion.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    if (g_bol_GrabarDatos_VolverListado)
                    {
                        g_frm_P_TarifaPromocion.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_TarifaPromocion.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

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

            try
            {
                //Si el codigo esta vacio y se intenta buscar el ultimo numerico y llego al limite de base de datos
                if (g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo.Text.Trim().Length == 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo = Buscar_CodigoSiguiente();

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo.Mensaje;
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo;
                    }
                }

                // El codigo no puede estar Repetido
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Codigo = g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo.Text.Trim();
                    if (g_bol_CampoCodigo_Numerico)
                    {
                        int int_Codigo = int.Parse(str_Codigo);
                        str_Codigo = int_Codigo.ToString();
                    }

                    if (Datos_Generales.Buscar_CodigoRepetido(nameof(MAE_TarifasPromociones), nameof(MAE_TarifasPromociones.codigo), str_Codigo, nameof(MAE_TarifasPromociones.id), (g_mdl_MAE_TarifasPromociones != null ? g_mdl_MAE_TarifasPromociones.id : -1), nameof(MAE_TarifasPromociones.idEmpresa), g_frm_P_TarifaPromocion.P_Base_ValoresGenerales.lng_idEmpresa, true))
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_TarifaPromocion.Exferia_Label_Codigo.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo;
                    }
                }

                //La Descripcion no puede estar vacia
                if ((mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_TarifaPromocion.Exferia_TextBox_Descripcion.Text.Trim().Length == 0))
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_TarifaPromocion.Exferia_Label_Descripcion.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_TextBox_Descripcion;
                }

                //Si tiene el precio es dinamico debes poner una nomenclatura
                if ((mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto) &&
                    g_frm_P_TarifaPromocion.Exferia_RadioButton_PreciosPromociones_PrecioDinamico.Checked)
                {
                    // La Nomenclatura no puede estar Vacia 
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Codigo.Trim().Length == 0 &&
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Descripcion.Trim().Length == 0)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Titulo);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                    }

                    //Si hay Nomenclatura Validar que es correcta
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Codigo.Trim().Length != 0 ||
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Id == -1)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Titulo);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                    }
                }

                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto &&
                   g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Tarifa.Checked)
                {
                    if (g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Precio.Text.Trim().Length == 0 &&
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Id == -1)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_TarifaPromocion.Exferia_Label_PreciosPromociones_Precio.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Precio;
                    }
                }

                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Promocion.Checked)
                {
                    //Si la CantidadA tiene valor y la cantidadB no
                    if (g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_A.Text.Trim().Length > 0 &&
                        g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B.Text.Trim().Length == 0)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_TarifaPromocion.Exferia_Label_PreciosPromociones_Cantidad.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B;
                    }
                    //Si la CantidadA no tiene valor y la cantidadB si
                    else if (g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_A.Text.Trim().Length == 0 &&
                             g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B.Text.Trim().Length > 0)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_TarifaPromocion.Exferia_Label_PreciosPromociones_Cantidad.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_A;
                    }

                    //Si hay dos cantidades tiene que ser mayores que 0
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto &&
                        g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_A.Text.Trim().Length > 0 &&
                        g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B.Text.Trim().Length > 0)
                    {
                        //Si la CantidadA tiene valor y la cantidadB no
                        if (decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_A.Text.Trim()) == 0 ||
                            decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B.Text.Trim()) == 0)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_TarifaPromocion.Exferia_Label_PreciosPromociones_Cantidad.Text);
                            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B;
                        }
                    }

                    //Si hay Articulo Validar que es correcta
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Codigo.Trim().Length != 0 ||
                        g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Id == -1)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Titulo);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                    }

                    //Si tiene un Articulo, tiene que tener un embalaje selecionado
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        if (g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Id != -1)
                        {
                            //Tiene que tener un embalaje seleccionado
                            if (g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.SelectedIndex == -1 || ((INTERNO_ComboBox_Modelo)g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.SelectedItem).Identificador.Equals("-1"))
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_TarifaPromocion.Exferia_Label_PreciosPromociones_Embalaje.Text);
                                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje;
                            }

                            //Tiene que tener un embalaje valido
                            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                            {
                                string str_Valor = ((INTERNO_ComboBox_Modelo)g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.SelectedItem).Descripcion;
                                long lng_Valor = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.SelectedItem).Identificador);

                                List<long> lst_idsEmbalajes_porArticulo_AB = g_obj_MAE_Articulos_Datos.Obtener_Ids_Embalajes(g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Id);

                                if (lst_idsEmbalajes_porArticulo_AB != null && lst_idsEmbalajes_porArticulo_AB.Count > 0)
                                {
                                    //Buscar el idEmbalaje seleccionado en el articulo seleccioando
                                    if (lst_idsEmbalajes_porArticulo_AB.Where(m => m.Equals(lng_Valor)).Count() == 0)
                                    {
                                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TARIFASPROMOCIONES_VALIDACIONES_EMBALAJENOEXISTE_PARAARTICULO(str_Valor);
                                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje;
                                    }
                                }
                                else
                                {
                                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TARIFASPROMOCIONES_VALIDACIONES_EMBALAJENOEXISTE_PARAARTICULO(str_Valor);
                                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje;
                                }
                            }
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(ValidarDatos));

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    decimal? dcm_Nulo = null;
                    long lng_idTarifaPromocion = -1;

                    MAE_TarifasPromociones mdl_MAE_TarifasPromociones = new MAE_TarifasPromociones();
                    mdl_MAE_TarifasPromociones.id = g_mdl_MAE_TarifasPromociones != null ? g_mdl_MAE_TarifasPromociones.id : -1;

                    //Asignar el idEmpresa...........................................................................................
                    if ((g_mdl_MAE_TarifasPromociones != null ? g_mdl_MAE_TarifasPromociones.idEmpresa : -1) != -1)
                    {
                        mdl_MAE_TarifasPromociones.idEmpresa = g_mdl_MAE_TarifasPromociones.idEmpresa;
                    }
                    else
                    {
                        //Buscar el idEmpresa que Corresponda
                        mdl_MAE_TarifasPromociones.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_TarifaPromocion.P_Base_ValoresGenerales.lng_idEmpresa, nameof(MAE_Vendedores));
                    }

                    //Codigo
                    mdl_MAE_TarifasPromociones.codigo = g_frm_P_TarifaPromocion.Exferia_TextBox_Codigo.Text.Trim();

                    //Descripcion
                    mdl_MAE_TarifasPromociones.descripcion = g_frm_P_TarifaPromocion.Exferia_TextBox_Descripcion.Text.Trim();

                    //Cliente/Proveedor
                    if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Proveedor.Checked)
                    {
                        mdl_MAE_TarifasPromociones.clienteProveedor = Variables.G_INT_TIPOCLIENTEPROVEEDOR_PROVEEDOR_CODIGO;
                    }
                    else
                    {
                        mdl_MAE_TarifasPromociones.clienteProveedor = Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO;
                    }

                    //Tarifa/Promocion
                    if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Promocion.Checked)
                    {
                        mdl_MAE_TarifasPromociones.tipo = Variables.G_INT_TIPO_TARIFAPROMOCION_PROMOCIONES_CODIGO;
                    }
                    else
                    {
                        mdl_MAE_TarifasPromociones.tipo = Variables.G_INT_TIPO_TARIFAPROMOCION_TARIFA_CODIGO;
                    }

                    //Desactivada
                    if (g_frm_P_TarifaPromocion.Exferia_CheckBox_Desactivada.Checked)
                    {
                        if (g_mdl_MAE_TarifasPromociones != null && g_mdl_MAE_TarifasPromociones.desactivada == null)
                        {
                            mdl_MAE_TarifasPromociones.desactivada = DateTime.Now;
                        }
                    }
                    else
                    {
                        mdl_MAE_TarifasPromociones.desactivada = null;
                    }

                    //Incremento
                    mdl_MAE_TarifasPromociones.incremento = g_frm_P_TarifaPromocion.Exferia_TextBox_Incremento.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_Incremento.Text) : dcm_Nulo;

                    //Decimales
                    if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Decimales_0.Checked)
                    {
                        mdl_MAE_TarifasPromociones.numeroRedondeo = 0;
                    }
                    else if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Decimales_1.Checked)
                    {
                        mdl_MAE_TarifasPromociones.numeroRedondeo = 1;
                    }
                    else if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Decimales_2.Checked)
                    {
                        mdl_MAE_TarifasPromociones.numeroRedondeo = 2;
                    }
                    else
                    {
                        mdl_MAE_TarifasPromociones.numeroRedondeo = 3;
                    }

                    //Comprobar que tiene algun dato
                    if (g_frm_P_TarifaPromocion.Exferia_RadioButton_PreciosPromociones_PrecioFijo.Checked)
                    {
                        mdl_MAE_TarifasPromociones.precioFijoDinamico = Variables.G_INT_TIPOPRECIO_FIJO_CODIGO;
                        mdl_MAE_TarifasPromociones.precio = g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Precio.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Precio.Text) : dcm_Nulo;
                        mdl_MAE_TarifasPromociones.idNomenclaturaPrecio = null;
                    }
                    else
                    {
                        mdl_MAE_TarifasPromociones.precioFijoDinamico = Variables.G_INT_TIPOPRECIO_DINAMICO_CODIGO;
                        mdl_MAE_TarifasPromociones.idNomenclaturaPrecio = g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Nomenclatura.Exferia_F3_Id;
                        mdl_MAE_TarifasPromociones.precio = null;
                    }

                    //Promociones
                    if (g_frm_P_TarifaPromocion.Exferia_RadioButton_Tipo_Promocion.Checked)
                    {
                        //Cantidad A
                        mdl_MAE_TarifasPromociones.AB_Cantidad_A = g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_A.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_A.Text) : dcm_Nulo;
                        //Cantidad B
                        mdl_MAE_TarifasPromociones.AB_Cantidad_B = g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Cantidad_B.Text) : dcm_Nulo;
                        //Porcentaje Cantidad B
                        mdl_MAE_TarifasPromociones.AB_Porcentaje = g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Porcentaje_CantidadB.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Porcentaje_CantidadB.Text) : dcm_Nulo;
                        //Articulo
                        if (g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Id != -1)
                        {
                            mdl_MAE_TarifasPromociones.AB_idArticulo = g_frm_P_TarifaPromocion.Exferia_F3_PreciosPromociones_Articulo.Exferia_F3_Id;
                        }
                        else
                        {
                            mdl_MAE_TarifasPromociones.AB_idArticulo = null;
                        }

                        //Embalaje
                        if ((INTERNO_ComboBox_Modelo)g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.SelectedItem == null ||
                            ((INTERNO_ComboBox_Modelo)g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.SelectedItem).Identificador.Equals("-1"))
                        {
                            mdl_MAE_TarifasPromociones.AB_idEmbalaje = null;
                        }
                        else
                        {
                            mdl_MAE_TarifasPromociones.AB_idEmbalaje = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_TarifaPromocion.Exferia_ComboBox_PreciosPromociones_Embalaje.SelectedItem).Identificador);
                        }
                    }
                    else
                    {
                        mdl_MAE_TarifasPromociones.AB_Cantidad_A = dcm_Nulo;
                        mdl_MAE_TarifasPromociones.AB_Cantidad_B = dcm_Nulo;
                        mdl_MAE_TarifasPromociones.AB_Porcentaje = dcm_Nulo;
                        mdl_MAE_TarifasPromociones.AB_idArticulo = null;
                        mdl_MAE_TarifasPromociones.AB_idEmbalaje = null;
                    }

                    //Descuento en moneda
                    mdl_MAE_TarifasPromociones.descuentoMoneda = g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_DescuentoMoneda.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_DescuentoMoneda.Text) : dcm_Nulo;

                    //Descuentos
                    mdl_MAE_TarifasPromociones.descuento_1 = g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_1.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_1.Text) : dcm_Nulo;
                    mdl_MAE_TarifasPromociones.descuento_2 = g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_2.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_2.Text) : dcm_Nulo;
                    mdl_MAE_TarifasPromociones.descuento_3 = g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_3.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_3.Text) : dcm_Nulo;
                    mdl_MAE_TarifasPromociones.descuento_4 = g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_4.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_4.Text) : dcm_Nulo;
                    mdl_MAE_TarifasPromociones.descuento_5 = g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_5.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_Descuento_5.Text) : dcm_Nulo;

                    //Aportacion Proveedor solo si es tarifa promocion de proveedor
                    if (g_frm_P_TarifaPromocion.Exferia_Panel_Degradado_AportacionProveedor.Visible)
                    {
                        //Tarifa
                        if (g_frm_P_TarifaPromocion.Exferia_RadioButton_AportacionProveedor_Tarifa.Checked)
                        {
                            mdl_MAE_TarifasPromociones.aportacionProveedor_Tipo = Variables.G_INT_TIPOAPORTACIONPROVEEDOR_TARIFA_CODIGO;
                        }
                        //Venta
                        else if (g_frm_P_TarifaPromocion.Exferia_RadioButton_AportacionProveedor_Venta.Checked)
                        {
                            mdl_MAE_TarifasPromociones.aportacionProveedor_Tipo = Variables.G_INT_TIPOAPORTACIONPROVEEDOR_VENTA_CODIGO;
                        }
                        //Coste
                        else
                        {
                            mdl_MAE_TarifasPromociones.aportacionProveedor_Tipo = Variables.G_INT_TIPOAPORTACIONPROVEEDOR_COSTE_CODIGO;
                        }

                        //Porcentaje aportacion proveedor
                        mdl_MAE_TarifasPromociones.aportacionProveedor_Porcentaje = g_frm_P_TarifaPromocion.Exferia_TextBox_AportacionProveedor_Porcentaje.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_TarifaPromocion.Exferia_TextBox_AportacionProveedor_Porcentaje.Text) : dcm_Nulo;
                    }
                    else
                    {
                        mdl_MAE_TarifasPromociones.aportacionProveedor_Tipo = null;
                        mdl_MAE_TarifasPromociones.aportacionProveedor_Porcentaje = null;
                    }

                    // Se graba el modelo ya relleno.
                    mdl_ValorDevuelto_Modelo = g_obj_MAE_TarifasPromociones_Datos.Grabar(mdl_MAE_TarifasPromociones);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Obtenemos la id de la TarifaPromocion
                        lng_idTarifaPromocion = mdl_ValorDevuelto_Modelo.Id;

                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }
            
            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Datos
        public void BorrarDatos(bool _bol_VolverAlListado)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_bol_BorrarDatos_VolverListado = _bol_VolverAlListado;
                    g_frm_P_TarifaPromocion.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    g_obj_TareaAsincrona_BorrarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Completed);
                    g_obj_TareaAsincrona_BorrarDatos.RunWorkerAsync();

                    g_frm_PE_Esperando.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                g_frm_P_TarifaPromocion.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(BorrarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Borrar
                mdl_ValorDevuelto_Modelo = BorrarDatos_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_TarifaPromocion.Enabled = true;

            try
            {


                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    #region SINCRONIZACION
                    INTERNO_Sincronizacion_ActualizarRegistro_Modelo mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo = new INTERNO_Sincronizacion_ActualizarRegistro_Modelo();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.tabla = nameof(MAE_TarifasPromociones);
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.idClavePrimaria = mdl_ValorDevuelto_Modelo_Resultado.Id;

                    Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_RESTOTABLAS(mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo);
                    #endregion

                    // Devolver al Listado el Row Borrar
                    if (g_frm_P_TarifaPromocion.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_TarifaPromocion.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_TarifaPromocion.P_Base_F3Origen != null)
                    {
                        g_frm_P_TarifaPromocion.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    if (g_bol_BorrarDatos_VolverListado)
                    {
                        g_frm_P_TarifaPromocion.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_TarifaPromocion.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_MAE_TarifasPromociones_Datos.Borrar(g_mdl_MAE_TarifasPromociones != null ? g_mdl_MAE_TarifasPromociones.id : -1);
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_TarifaPromocion_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        public void Cambiar_PromocionesPorUnidades_Precio(bool _bol_PromocionPorUnidadesVisible,bool _bol_PrecioObligatorio)
        {
            g_frm_P_TarifaPromocion.Exferia_Panel_Degradado_PromocionUnidades.Visible = _bol_PromocionPorUnidadesVisible;
            g_frm_P_TarifaPromocion.Exferia_TextBox_PreciosPromociones_Precio.Exferia_TextBox_Obligatorio = _bol_PrecioObligatorio;
        }

    }
}
