using Exferia_Aplicacion.Calculos.VentasCompras;
using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Generales;
using Exferia_Aplicacion.Modelos_Listado_Filtros;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_Mythos._0_Modelos;
using Exferia_Mythos._1_Datos;
using Exferia_Mythos._3_Vistas.ControlesPersonalizados_DentroPaneles;
using Exferia_Mythos._3_Vistas.Listados;
using Exferia_Mythos._3_Vistas.ListadosSeleccion;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Mythos._3_Vistas.Controladoras
{
    public class P_ParteLinea_Controladora
    {
        #region Variables Generales
        private P_ParteLinea g_frm_P_ParteLinea = 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

        //Clase de Negocio Necesarias
        private MYT_PartesLineas_Datos g_obj_MYT_PartesLineas_Datos = new MYT_PartesLineas_Datos();
        private MYT_PartesLineas_TarifasPromociones_Datos g_obj_MYT_PartesLineas_TarifasPromociones_Datos = new MYT_PartesLineas_TarifasPromociones_Datos();
        private MYT_PartesLineas_Comentarios_Datos g_obj_MYT_PartesLineas_Comentarios_Datos = new MYT_PartesLineas_Comentarios_Datos();
        private MYT_PartesLineas_Trazabilidad_Datos g_obj_MYT_PartesLineas_Trazabilidad_Datos = new MYT_PartesLineas_Trazabilidad_Datos();

        public VentasCompras_Calculos g_obj_VentasCompras_Calculos = null;

        public List<MAE_Embalajes> g_lst_MAE_Embalajes = null;
        public GEN_TiposCompraVenta g_mdl_GEN_TiposCompraVenta_SELECCIONADA = null;

        public bool g_bol_Termino_CargaDatos_Inicial = false;//Se utiliza para saber cuando se termina la carga de datos estaticos inciales
        public bool g_bol_ModificacionDatosAfectaTrazabilidad = true;//Se utiliza para saber si se modificador datos que afecten a la trazabilidad, y que se tienen que grabar antes de tocar las lineas de trazabilidad


        //Modelo de Ejercicio Actual
        public GEN_EjerciciosActivos_Empresa g_mdl_GEN_EjerciciosActivos_Empresa = null;

        //Si se estuviera Modificando el Modelo del Registro seleccionado
        public INTERNO_MYT_PartesLineas_Modelo g_mdl_INTERNO_MYT_PartesLineas_Modelo = null;

        //Modelo de la cabecera a la que pertenece
        public INTERNO_MYT_Partes_Modelo g_mdl_INTERNO_MYT_Partes_Modelo = null;
        private List<INTERNO_ImportesImpuestos_Modelo> g_lst_INTERNO_ImportesImpuestos_Modelo = null;

        //Total de las lineas que ya hay grabadas, por si se crea una nueva, saber el numeroLinea que ponerle
        public int g_int_TotalLineas = 0;

        //Se utilizan por si se cambian, saber como reorganizar el listadod e la cabecera
        public int g_int_NumeroLinea_Principal_Inicial = -1;
        public int g_int_NumeroLinea_Relacionado_Inicial = -1;


        #region Tareas Asincronas
        //Tarea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos = null;
        public bool g_bol_CargarDatos_Termino = true;

        //Tarea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos = null;
        public bool g_bol_GrabarDatos_TerminoCorrectamente = true;
        public bool g_bol_GrabarDatos_VaciarDatos = false;

        //Tarea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos = null;

        //Tarea Asincrona de cambio de Articulo
        private BackgroundWorker g_obj_TareaAsincrona_Cambio_Articulo = null;
        public bool g_bol_TareaAsincrona_CambioArticulo_Termino = true;

        //Tarea Asincrona de cambio de TipoCompraVenta
        private BackgroundWorker g_obj_TareaAsincrona_Cambio_TipoCompraVenta = null;

        //Tarea Asincrona de cargar los datos de las tarifas y promociones en el DataGridView
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones = null;

        #endregion

        #region Tarifas/Promociones
        private BackgroundWorker g_obj_TareaAsincrona_TarifasPromociones_BorrarDatos = null;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_TarifasPromociones_Columnas;

        //Filtrado del Listado de TarifasPromociones
        public List<string> g_lst_ColumnasAMostrar_MYT_PartesLineas_TarifasPromociones = new List<string>();
        public ABS_Listado_MYT_PartesLineas_TarifasPromociones g_obj_ABS_Listado_MYT_PartesLineas_TarifasPromociones = new ABS_Listado_MYT_PartesLineas_TarifasPromociones();
        private int g_int_TotalRegistrosInsertados_TarifasPromociones = 0;
        private int g_int_TotalRegistros_TarifasPromociones = 0;
        #endregion

        #region Comentarios
        //Variables para la creación de las Lineas de Comentarios ###########
        private int g_int_NumeroLineas_Comentarios = 0;
        private List<int> g_Array_ListadoLineas_Comentarios = new List<int>();
        #endregion

        #region Comentarios ArticuloEnPromocion
        //Variables para la creación de las Lineas de Comentarios ArticuloEnPromocion ###########
        private int g_int_NumeroLineas_Comentarios_ArticuloEnPromocion = 0;
        private List<int> g_Array_ListadoLineas_Comentarios_ArticuloEnPromocion = new List<int>();
        #endregion

        #region Trazabilidad
        //Tarea Asincrona para la Rellenar DataGridView de ParteLineas_Trazabilidad
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad = null;

        //Tarea Asincrona para la Borrar ParteLineas_Trazabilidad
        private BackgroundWorker g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad = null;

        //Listado de ParteLineas_Trazabilidad
        public List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo = null;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ParteLineas_Trazabilidad_Columnas;

        //Filtrado del Listado de ParteLineas_Trazabilidad
        public List<string> g_lst_ColumnasAMostrar_MYT_PartesLineas_Trazabilidad = new List<string>();
        public ABS_Listado_MYT_PartesLineas_Trazabilidad g_obj_ABS_Listado_MYT_PartesLineas_Trazabilidad = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_MYT_PartesLineas_Trazabilidad = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad = 0;
        private int g_int_TotalRegistros_ParteLineas_Trazabilidad = 0;
        #endregion

        #region Trazabilidad Articulo En Promocion
        //Tarea Asincrona para la Rellenar DataGridView de ParteLineas_Trazabilidad_ArticuloEnPromocion
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion = null;

        //Tarea Asincrona para la Borrar ParteLineas_Trazabilidad_ArticuloEnPromocion
        private BackgroundWorker g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion = null;

        //Listado de ParteLineas_Trazabilidad_ArticuloEnPromocion
        public List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion = null;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ParteLineas_Trazabilidad_ArticuloEnPromocion_Columnas;

        //Filtrado del Listado de ParteLineas_Trazabilidad_ArticuloEnPromocion
        public List<string> g_lst_ColumnasAMostrar_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion = new List<string>();
        public ABS_Listado_MYT_PartesLineas_Trazabilidad g_obj_ABS_Listado_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad_ArticuloEnPromocion = 0;
        private int g_int_TotalRegistros_ParteLineas_Trazabilidad_ArticuloEnPromocion = 0;
        #endregion

        #region Lineas
        public List<string> g_lst_ColumnasAMostrar_Lineas = new List<string>();
        public ABS_Listado_MYT_PartesLineas_P_ParteLinea g_obj_ABS_Listado_Lineas = null;

        public Dictionary<string, object> g_dct_ListadoFiltros_Lineas = new Dictionary<string, object>();

        public List<INTERNO_MYT_PartesLineas_Listado_Modelo> g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo = null;

        #region Tareas Asincronas
        private bool g_bol_Rellenar_DataGrid_Lineas_CANCELAR = false;
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Lineas = null;
        #endregion

        private int g_int_TotalRegistrosInsertados_Lineas = 0;
        private int g_int_TotalRegistros_Lineas = 0;

        #endregion

        public bool g_bol_Traspasado = false;

        #endregion

        #region Controladora
        public P_ParteLinea_Controladora(P_ParteLinea _frm_P_ParteLinea,
                                                    INTERNO_MYT_Partes_Modelo _mdl_INTERNO_MYT_Partes_Modelo,
                                                    List<INTERNO_ImportesImpuestos_Modelo> _lst_INTERNO_ImportesImpuestos_Modelo,
                                                    int _int_TotalLineas)
        {
            g_frm_P_ParteLinea = _frm_P_ParteLinea;
            g_mdl_INTERNO_MYT_Partes_Modelo = _mdl_INTERNO_MYT_Partes_Modelo;
            g_lst_INTERNO_ImportesImpuestos_Modelo = _lst_INTERNO_ImportesImpuestos_Modelo;
            g_int_TotalLineas = _int_TotalLineas;

            g_obj_ABS_Listado_Lineas = new ABS_Listado_MYT_PartesLineas_P_ParteLinea(g_frm_P_ParteLinea.P_Base_ValoresGenerales);

            //Obtener el TipoCompraPorDefecto
            g_mdl_GEN_TiposCompraVenta_SELECCIONADA = Datos_Generales.GEN_TiposCompraVenta_Obtener_Registro_Por_Defecto(int.Parse(Variables.G_MDL_TIPOCOMPRAVENTA_VENTA.Codigo));


            //Instanciar la clase de Calculos
            g_obj_VentasCompras_Calculos = new VentasCompras_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                      g_mdl_INTERNO_MYT_Partes_Modelo.MYT_InstalacionesCabecera.idCliente,
                                                                      g_mdl_INTERNO_MYT_Partes_Modelo.fechaHoraRecepcion.Value,
                                                                      g_mdl_INTERNO_MYT_Partes_Modelo.idEmpresa,
                                                                      (g_mdl_INTERNO_MYT_Partes_Modelo.MYT_InstalacionesCabecera.MAE_Clientes.descuentoGeneral != null ? g_mdl_INTERNO_MYT_Partes_Modelo.MYT_InstalacionesCabecera.MAE_Clientes.descuentoGeneral.Value : 0m));


            //Trazabilidad
            g_obj_ABS_Listado_MYT_PartesLineas_Trazabilidad = new ABS_Listado_MYT_PartesLineas_Trazabilidad(g_frm_P_ParteLinea.P_Base_ValoresGenerales);

            //Trazabilidad Articulo en Promocion
            g_obj_ABS_Listado_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion = new ABS_Listado_MYT_PartesLineas_Trazabilidad(g_frm_P_ParteLinea.P_Base_ValoresGenerales);

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        public void Datos_Iniciales()
        {
            try
            {
                #region Datos de la Cabecera
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Resumen.Text = "▬ Código de Parte: " + g_mdl_INTERNO_MYT_Partes_Modelo.codigo.ToString();
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Resumen.Text += "   ▬ Fecha: " + g_mdl_INTERNO_MYT_Partes_Modelo.fechaHoraRecepcion.Value.ToString("dd/MM/yyyy HH:mm");
                //Cliente
                if (g_mdl_INTERNO_MYT_Partes_Modelo.MYT_InstalacionesCabecera.MAE_Clientes != null)
                {
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_Resumen.Text += "   ▬ Cliente: (" + g_mdl_INTERNO_MYT_Partes_Modelo.MYT_InstalacionesCabecera.MAE_Clientes.codigo.ToUpper() + ") " + g_mdl_INTERNO_MYT_Partes_Modelo.MYT_InstalacionesCabecera.MAE_Clientes.razonSocial.ToUpper();
                }
                #endregion
               
                //Poner un tipo de compra por defecto
                if (g_mdl_GEN_TiposCompraVenta_SELECCIONADA != null)
                {
                    g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Id = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.id;
                    g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Codigo = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.codigo;
                    g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.descripcion;
                    g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.fechaBorrado;
                }

                //Embalajes
                //Cargamos el ensamblado 
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEMBALAJES_OBTENERLISTADO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { };

                //Pasamos los parametros al metodo y lo ejecutamos
                g_lst_MAE_Embalajes = (List<MAE_Embalajes>)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);

                //Colores y fuente de Precio
                g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.Font = Fuentes.G_FONT_ETIQUETAS;
                g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.BackColor = Colores.G_COLOR_FONDO_ETIQUETAS;
                g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.ForeColor = Colores.G_COLOR_ATENCION;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "" + nameof(Datos_Iniciales));
            }
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //Modelo
            g_mdl_INTERNO_MYT_PartesLineas_Modelo = null;

            //Numero de linea iniciales
            g_int_NumeroLinea_Principal_Inicial = -1;
            g_int_NumeroLinea_Relacionado_Inicial = -1;

            //Tipo CompraVenta
            g_mdl_GEN_TiposCompraVenta_SELECCIONADA = Datos_Generales.GEN_TiposCompraVenta_Obtener_Registro_Por_Defecto(int.Parse(Variables.G_MDL_TIPOCOMPRAVENTA_VENTA.Codigo));
            if (g_mdl_GEN_TiposCompraVenta_SELECCIONADA != null)
            {
                g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Id = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.id;
                g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Codigo = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.codigo;
                g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.descripcion;
                g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.fechaBorrado;
            }

            //Vacia Todo
            CambioArticulo_VaciarDatos(true);

            //CHECKEAR QUE NO ES ARTICULO EN PROMOCION
            g_frm_P_ParteLinea.Exferia_CheckBox_ArticuloComodin.Checked = false;
            //ARTICULO
            g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_MAE_ARTICULO;
            g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Bloquear_F3_Descripcion = false;

            //reiniciar la clase de calculos
            g_obj_VentasCompras_Calculos = new VentasCompras_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                      g_mdl_INTERNO_MYT_Partes_Modelo.MYT_InstalacionesCabecera.idCliente,
                                                                      g_mdl_INTERNO_MYT_Partes_Modelo.fechaHoraRecepcion.Value,
                                                                      g_mdl_INTERNO_MYT_Partes_Modelo.idEmpresa,
                                                                      (g_mdl_INTERNO_MYT_Partes_Modelo.MYT_InstalacionesCabecera.MAE_Clientes.descuentoGeneral != null ? g_mdl_INTERNO_MYT_Partes_Modelo.MYT_InstalacionesCabecera.MAE_Clientes.descuentoGeneral.Value : 0m));

            //Comentarios
            g_int_NumeroLineas_Comentarios = 0;
            g_Array_ListadoLineas_Comentarios = new List<int>();
            g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Controls.Clear();


            //Comentarios Articulos en Promocion
            g_int_NumeroLineas_Comentarios_ArticuloEnPromocion = 0;
            g_Array_ListadoLineas_Comentarios_ArticuloEnPromocion = new List<int>();
            g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Controls.Clear();

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_ParteLinea.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_ParteLinea.P_Base_TituloPantalla = (g_frm_P_ParteLinea.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_ParteLinea.Tag.ToString());
            //#################################################################################################
        }
        #endregion

        #region Comprobacion de cambios, para  grabar o no antes de salir o cambiar de registro
        public bool ComprobarCambios()
        {
            if (g_frm_P_ParteLinea.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;
        }
        public bool ComprobarCambios_AfectaTrazabilidad()
        {
            if (g_bol_ModificacionDatosAfectaTrazabilidad)
            {
                GrabarDatos(false);

                //Te quedas espernado a que termine la tarea asincrona de grabar
                if (g_obj_TareaAsincrona_GrabarDatos != null)
                {
                    while (g_obj_TareaAsincrona_GrabarDatos.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }

                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_ParteLinea.Enabled = false;

                g_bol_CargarDatos_Termino = 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();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_ProgressChanged);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = true;
                    g_obj_TareaAsincrona_CargarDatos.WorkerSupportsCancellation = true;
                }

                //Vaciar
                VaciarDatos();

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_ParteLinea.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_ParteLinea_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_EnModelos(g_frm_P_ParteLinea.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
                else
                {
                    if (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null)
                    {
                        //TRAZABILIDAD ########################################################################################################################################
                        if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.PartesTrazabilidades != null)
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.PartesTrazabilidades;
                        }

                        //TRAZABILIDAD ARTICULO EN PROMOCION ##################################################################################################################
                        if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null &&
                            g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.PartesTrazabilidades != null &&
                            g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.PartesTrazabilidades.Count > 0)
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.PartesTrazabilidades;
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_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, nameof(P_ParteLinea_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_ProgressChanged(object sender, ProgressChangedEventArgs e)
        { }
        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_ParteLinea.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);
                        g_frm_P_ParteLinea.Salir_P_Base();
                    }
                }
                else
                {
                    CargarDatos_EnPantalla();

                    //Trazabilidad
                    g_bol_ModificacionDatosAfectaTrazabilidad = false;
                    MostrarOcultar_Resumen_Totales_Trazabilidad(g_frm_P_ParteLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible);
                    Rellenar_DataGrid_ParteLineas_Trazabilidad();

                    //Trazabilidad Articulo En Promocion
                    MostrarOcultar_Resumen_Totales_Trazabilidad_ArticuloEnPromocion(g_frm_P_ParteLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible);
                    Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_ParteLinea.Salir_P_Base();
            }
            finally
            {
                g_bol_CargarDatos_Termino = true;

                //Poner el Foco Inicial
                Funciones.Poner_Foco_Objeto(g_frm_P_ParteLinea, g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_TextBox_Codigo);

                if (g_bol_Traspasado)
                {
                    //Bloqueo los Controles
                    SoloLectura.Empezar(g_frm_P_ParteLinea, true);
                }

                g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = false;

            }
        }

        public bool CargarDatos_EnModelos(long _lng_id)
        {
            bool bol_ValorDevuelto = true;

            try
            {
                g_mdl_INTERNO_MYT_PartesLineas_Modelo = g_obj_MYT_PartesLineas_Datos.Obtener(_lng_id);

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

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

                    #region RELLENAR MODELO DE CALCULOS LINEA PRINCIPAL
                    INTERNO_VentasCompras_Calculos_Modelo mdl_INTERNO_VentasCompras_Calculos_Modelo = new INTERNO_VentasCompras_Calculos_Modelo();

                    //Tipo de Compra Venta
                    g_mdl_GEN_TiposCompraVenta_SELECCIONADA = g_mdl_INTERNO_MYT_PartesLineas_Modelo.GEN_TiposCompraVenta;
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.GEN_TiposCompraVenta.opcion;
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.idTipoCompraVenta;

                    if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.idArticulo != null)
                    {
                        //Articulo
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Articulos.id;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Articulos.codigo;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Articulos.descripcion;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Articulos.tipoTrazabilidad_Salidas;

                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es = false;
                    }
                    else
                    {
                        //ArticuloComodin
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_ArticulosComodin.id;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_ArticulosComodin.codigo;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.descripcionArticuloComodin;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = Variables.G_MDL_TIPOSTRAZABILIDAD_SINTRAZABILIDAD.Codigo;

                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es = true;
                    }

                    //Impuesto Tipo
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.GEN_ImpuestosTipos.id;
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.GEN_ImpuestosTipos.codigo;
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.GEN_ImpuestosTipos.descripcion;

                    //NomenclaturaPrecio
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_NomenclaturasPrecios;

                    //Rellenar el listado de Embalajes
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();

                    #region Articulos_Embalajes
                    if (mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                    {
                        //Cargamos el ensamblado
                        Assembly m_assembly3 = Assembly.LoadFrom(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type3 = m_assembly3.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                        //creamos la instancia
                        var obj_Clase3 = Activator.CreateInstance(m_type3);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo3 = obj_Clase3.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOSEMBALAJES_OBTENERMODELOLISTADO_POR_ARTICULO, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros3 = { g_mdl_INTERNO_MYT_PartesLineas_Modelo.idArticulo };
                        //Pasamos los parametros al metodo y lo ejecutamos
                        List<MAE_Articulos_Embalajes> lst_MAE_Articulos_Embalajes = (List<MAE_Articulos_Embalajes>)obj_MethodInfo3.Invoke(obj_Clase3, arr_Parametros3);

                        if (lst_MAE_Articulos_Embalajes != null &&
                            lst_MAE_Articulos_Embalajes.Count > 0)
                        {
                            foreach (MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes in lst_MAE_Articulos_Embalajes)
                            {
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Articulos_Embalajes.MAE_Embalajes.id.ToString(), mdl_MAE_Articulos_Embalajes.MAE_Embalajes.descripcion, null));
                            }
                        }
                    }
                    else
                    {
                        foreach (MAE_Embalajes mdl_MAE_Embalajes in g_lst_MAE_Embalajes)
                        {
                            mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Embalajes.id.ToString(), mdl_MAE_Embalajes.descripcion, null));
                        }

                    }
                    #endregion

                    //idEmbalaje
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.idEmbalaje;

                    //Embalaje texto
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Embalajes.descripcion;

                    // Cantidad principal
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = g_mdl_INTERNO_MYT_PartesLineas_Modelo.cantidad;

                    //relacion
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.relacion;

                    //Operacion
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.operacion;

                    //precio_Cantidad_SegundaUnidad
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = g_mdl_INTERNO_MYT_PartesLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                    //idEmbalajeRelacional
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.segundaUnidad_idEmbalaje;

                    //Descripcion el embalaje relacional
                    if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Embalajes1 != null)
                    {
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Embalajes1.descripcion;
                    }

                    //relacion embalaje segunda unidad
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.segundaUnidad_relacion != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.segundaUnidad_relacion.Value : 1m;

                    // Cantidad Secundaria
                    if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.segundaUnidad_cantidad != null)
                    {
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = g_mdl_INTERNO_MYT_PartesLineas_Modelo.segundaUnidad_cantidad.Value;
                    }
                    else
                    {
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;
                    }

                    //Precio
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = g_mdl_INTERNO_MYT_PartesLineas_Modelo.precio;

                    //Descuento
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral = g_mdl_INTERNO_MYT_PartesLineas_Modelo.descuentoGeneral != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.descuentoGeneral.Value : 0m;

                    //NumeroRedondeo
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.numeroRedondeo != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.numeroRedondeo.Value : 3;

                    #region Embalaje Principal del Articulo
                    //Embalaje
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.embalajePrincipalDelArticulo_idEmbalaje;
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.embalajePrincipalDelArticulo_relacion;
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.embalajePrincipalDelArticulo_operacion;
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Embalajes2.descripcion;

                    //Listado de los precios de todas las nomenclaturas del embalaje principal del articulo
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios = null;

                    //precio 
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = g_mdl_INTERNO_MYT_PartesLineas_Modelo.embalajePrincipalDelArticulo_precio;

                    //Embalaje Segunda unidad
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje;
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion.Value : 1m;
                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = g_mdl_INTERNO_MYT_PartesLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                    if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Embalajes3 != null)
                    {
                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Embalajes3.descripcion;
                    }
                    #endregion

                    #endregion

                    #region RELLENAR MODELO DE CALCULOS LINEA PROMOCION POR UNIDAD
                    INTERNO_VentasCompras_Calculos_Modelo mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad = new INTERNO_VentasCompras_Calculos_Modelo();

                    if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null)
                    {
                        //Tipo de Compra Venta
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_TipoCompraVenta_Opcion = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.opcion;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_TipoCompraVenta_Id = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.id;

                        //Articulo
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Articulo_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Articulos.id;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Articulo_Codigo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Articulos.codigo;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Articulo_Descripcion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Articulos.descripcion;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Articulo_TipoTrazabilidad = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Articulos.tipoTrazabilidad_Salidas;

                        //Impuesto Tipo
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_ImpuestoTipo_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.GEN_ImpuestosTipos.id;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_ImpuestoTipo_Codigo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.GEN_ImpuestosTipos.codigo;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_ImpuestoTipo_Descripcion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.GEN_ImpuestosTipos.descripcion;

                        //NomenclaturaPrecio
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_NomenclaturaPrecio = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_NomenclaturasPrecios;

                        //Rellenar el listado de Embalajes
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();
                        foreach (MAE_Embalajes mdl_MAE_Embalajes in g_lst_MAE_Embalajes)
                        {
                            mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Embalajes.id.ToString(), mdl_MAE_Embalajes.descripcion, null));
                        }

                        //idEmbalaje
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Embalaje_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.idEmbalaje;

                        //Embalaje texto
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Embalaje_Texto = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Embalajes.descripcion;

                        // Cantidad principal
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Cantidad_Principal = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.cantidad;

                        //relacion
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Embalaje_Relacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.relacion;

                        //Operacion
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Embalaje_Operacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.operacion;

                        //precio_Cantidad_SegundaUnidad
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                        //idEmbalajeRelacional
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajeSegundaUnidad_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.segundaUnidad_idEmbalaje;

                        //Descripcion el embalaje relacional
                        if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Embalajes1 != null)
                        {
                            mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajeSegundaUnidad_Texto = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Embalajes1.descripcion;
                        }

                        //relacion embalaje segunda unidad
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.segundaUnidad_relacion != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.segundaUnidad_relacion.Value : 1m;

                        // Cantidad Secundaria
                        if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.segundaUnidad_cantidad != null)
                        {
                            mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Cantidad_Secundaria = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.segundaUnidad_cantidad.Value;
                        }
                        else
                        {
                            mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Cantidad_Secundaria = 0m;
                        }

                        //Precio
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_Precio_Final = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.precio;

                        //Descuento
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_DescuentoGeneral = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.descuentoGeneral != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.descuentoGeneral.Value : 0m;

                        //NumeroRedondeo
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_NumeroRedondeo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.numeroRedondeo != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.numeroRedondeo.Value : 3;

                        #region Embalaje Principal del Articulo
                        //Embalaje
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.embalajePrincipalDelArticulo_idEmbalaje;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.embalajePrincipalDelArticulo_relacion;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.embalajePrincipalDelArticulo_operacion;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Embalajes2.descripcion;

                        //Listado de los precios de todas las nomenclaturas del embalaje principal del articulo
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipal_Precios = null;

                        //precio 
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.embalajePrincipalDelArticulo_precio;

                        //Embalaje Segunda unidad
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.embalajePrincipalDelArticulo_segundaUnidad_relacion != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.embalajePrincipalDelArticulo_segundaUnidad_relacion.Value : 1m;
                        mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                        if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Embalajes3 != null)
                        {
                            mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MAE_Embalajes3.descripcion;
                        }
                        #endregion
                    }
                    #endregion

                    //Rellenar la clase de calculos
                    g_obj_VentasCompras_Calculos.CargaInicial(mdl_INTERNO_VentasCompras_Calculos_Modelo,
                                                              mdl_INTERNO_VentasCompras_Calculos_Modelo_PromocionPorUnidad,
                                                              g_mdl_INTERNO_MYT_PartesLineas_Modelo.TarifasPromociones);


                    //Traspasado
                    if (g_mdl_INTERNO_MYT_Partes_Modelo.idAlbaranCabecera != null ||
                        g_mdl_INTERNO_MYT_Partes_Modelo.idFacturaCabecera != null)
                    {
                        g_bol_Traspasado = true;
                    }
                    else
                    {
                        g_bol_Traspasado = false;
                    }

                    //Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior_Codigo = "";
                    if (g_frm_P_ParteLinea.g_mdl_PRV_OpcionesDetalle != null &&
                       g_frm_P_ParteLinea.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                       g_frm_P_ParteLinea.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de Campos
                        string[] arr_Campos = g_frm_P_ParteLinea.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_ParteLinea.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_ParteLinea.P_Base_TituloPantalla = (g_frm_P_ParteLinea.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

                        dynamic dnm_Objeto = g_mdl_INTERNO_MYT_PartesLineas_Modelo;
                        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;
                            }

                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_ParteLinea.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_ParteLinea.Tag.ToString(), str_MenuSuperior_Codigo);

                    g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(CargarDatos_EnModelos));
                bol_ValorDevuelto = false;
            }

            return bol_ValorDevuelto;
        }
        public void CargarDatos_EnPantalla()
        {
            try
            {
                //Si no es Nulo Cargo los Datos
                if (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null)
                {
                   
                    //Numerolinea Inicial (LINEA PRINCIPAL)
                    g_int_NumeroLinea_Principal_Inicial = g_mdl_INTERNO_MYT_PartesLineas_Modelo.numero;
                    g_frm_P_ParteLinea.Exferia_TextBox_NumeroLinea.Text = g_int_NumeroLinea_Principal_Inicial.ToString();

                    #region F3 de Articulo
                    //ArticuloComodin
                    if (g_obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Es)
                    {
                        g_frm_P_ParteLinea.Exferia_CheckBox_ArticuloComodin.Checked = true;

                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_MAE_ARTICULOCOMODIN;
                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Bloquear_F3_Descripcion = true;

                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_ArticulosComodin.id;
                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Codigo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_ArticulosComodin.codigo;
                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Descripcion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.descripcionArticuloComodin;
                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_FechaBorrado = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_ArticulosComodin.fechaBorrado;

                    }
                    //Articulo
                    else if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.idArticulo != null)
                    {
                        g_frm_P_ParteLinea.Exferia_CheckBox_ArticuloComodin.Checked = false;

                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_Opcion_BuscarDatos = Variables.G_STR_OPCION_MAE_ARTICULO;
                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Bloquear_F3_Descripcion = false;

                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Id = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Articulos.id;
                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Codigo = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Articulos.codigo;
                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Descripcion = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Articulos.descripcion;
                        g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_FechaBorrado = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MAE_Articulos.fechaBorrado;
                    }
                    g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.CargaInicial();
                    #endregion

                    //TipoCompraVenta 
                    g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Id = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.id;
                    g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Codigo = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.codigo;
                    g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.descripcion;
                    g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_GEN_TiposCompraVenta_SELECCIONADA.fechaBorrado;

                    //Cantidad principal
                    g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Texto;

                    //Cargar Embalajes
                    g_frm_P_ParteLinea.SplitContainer_CantidadPrecios.Panel1.Enabled = true;

                    //Embalaje
                    foreach (INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo in g_obj_VentasCompras_Calculos.PROPIEDAD_Embalajes_Listado)
                    {
                        g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.Items.Add(mdl_INTERNO_ComboBox_Modelo);
                    }
                    g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.SelectedItem = g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Id.ToString())).FirstOrDefault();

                    //Mostrar los datos segun el embale seleccionado
                    Embalaje_Seleccion();

                    //Actualizar nomenclatura precio
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.ForeColor = Colores.G_COLOR_PRINCIPAL_OSCURO;
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_NomenclaturaPrecio;

                    //Actualizar Precio
                    g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Precio_Texto;

                    //Actualizar Descuento
                    g_frm_P_ParteLinea.Exferia_TextBox_Descuento.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_DescuentoGeneral_Texto;

                    //Actualizar Importe
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_mdl_INTERNO_MYT_PartesLineas_Modelo.importe != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.importe.ToString() : "0.00";

                    //ImpuestoTipo
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ImpuestoTipo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Texto;

                    //Tipo Trazabilidad
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_TipoTrazabilidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Articulo_TipoTrazabilidad_Texto;

                    //Comentarios
                    if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.MYT_PartesLineas_Comentarios != null &&
                        g_mdl_INTERNO_MYT_PartesLineas_Modelo.MYT_PartesLineas_Comentarios.Count() > 0)
                    {
                        foreach (MYT_PartesLineas_Comentarios mdl_MYT_PartesLineas_Comentarios in g_mdl_INTERNO_MYT_PartesLineas_Modelo.MYT_PartesLineas_Comentarios)
                        {
                            INTERNO_LineasComentarios_Modelo mdl_INTERNO_LineasComentarios_Modelo = new INTERNO_LineasComentarios_Modelo();
                            mdl_INTERNO_LineasComentarios_Modelo.id = mdl_MYT_PartesLineas_Comentarios.id;
                            mdl_INTERNO_LineasComentarios_Modelo.id_Linea = mdl_MYT_PartesLineas_Comentarios.idParteLinea;
                            mdl_INTERNO_LineasComentarios_Modelo.comentario = mdl_MYT_PartesLineas_Comentarios.comentario;
                            mdl_INTERNO_LineasComentarios_Modelo.mostrarImpresion = mdl_MYT_PartesLineas_Comentarios.mostrarImpresion != null ? mdl_MYT_PartesLineas_Comentarios.mostrarImpresion.Value : true;

                            Crear_Comentario_Linea(mdl_INTERNO_LineasComentarios_Modelo, false);
                        }
                    }

                    //Rellenar Listado Tarifas y promciones
                    Rellenar_DataGridView_TarifasPromociones();

                    //promocion por unidad
                    PromocionPorUnidad_CargarDatos();

                    //Comentarios del Articulo en promocion
                    if (g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null &&
                        g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MYT_PartesLineas_Comentarios != null &&
                        g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MYT_PartesLineas_Comentarios.Count() > 0)
                    {
                        foreach (MYT_PartesLineas_Comentarios mdl_MYT_PartesLineas_Comentarios in g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MYT_PartesLineas_Comentarios)
                        {
                            INTERNO_LineasComentarios_Modelo mdl_INTERNO_LineasComentarios_Modelo = new INTERNO_LineasComentarios_Modelo();
                            mdl_INTERNO_LineasComentarios_Modelo.id = mdl_MYT_PartesLineas_Comentarios.id;
                            mdl_INTERNO_LineasComentarios_Modelo.id_Linea = mdl_MYT_PartesLineas_Comentarios.idParteLinea;
                            mdl_INTERNO_LineasComentarios_Modelo.comentario = mdl_MYT_PartesLineas_Comentarios.comentario;
                            mdl_INTERNO_LineasComentarios_Modelo.mostrarImpresion = mdl_MYT_PartesLineas_Comentarios.mostrarImpresion != null ? mdl_MYT_PartesLineas_Comentarios.mostrarImpresion.Value : true;

                            Crear_ArticuloEnPromocion_Comentario_Linea(mdl_INTERNO_LineasComentarios_Modelo, false);
                        }
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(CargarDatos_EnPantalla));
            }
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_GrabarDatos_VaciarDatos)
        {
            try
            {
                g_bol_GrabarDatos_VaciarDatos = _bol_GrabarDatos_VaciarDatos;

                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_ParteLinea.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_ParteLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_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 = true;

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

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

                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear Formulario
            g_frm_P_ParteLinea.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)
                {
                    g_bol_GrabarDatos_TerminoCorrectamente = false;

                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);

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

                            //Si tuviera valor se cambia
                            if (mdl_ValorDevuelto_Modelo_Resultado.Valor_Anterior != null)
                            {
                                g_bol_Termino_CargaDatos_Inicial = false;
                                Funciones.Poner_Valor_Objeto(mdl_ValorDevuelto_Modelo_Resultado.Objeto, mdl_ValorDevuelto_Modelo_Resultado.Valor_Anterior);
                                g_bol_Termino_CargaDatos_Inicial = true;
                            }
                        }
                    }
                }
                else
                {
                    //Relenar el listado ed Lineas
                    Rellenar_DataGrid_Lineas(true);

                    // Devolver al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_ParteLinea.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Objeto);

                    g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_NADA);

                    //Vaciar los datos para que se pueda meter otro linea
                    if (g_bol_GrabarDatos_VaciarDatos)
                    {
                        //Validacion trazabilidad obligatoria ..................................................
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_TRAZABILIDADOBLIGATORIA = Validar_TrazabilidadObligatoria();
                        if (mdl_INTERNO_ValorDevuelto_Modelo_TRAZABILIDADOBLIGATORIA.TodoCorrecto == false)
                        {
                            Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_TRAZABILIDADOBLIGATORIA.Mensaje);
                        }
                        else
                        {
                            VaciarDatos();

                            g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.TabStop = false;
                        }
                    }

                    //Poner el Foco Inicial
                    Funciones.Poner_Foco_Objeto(g_frm_P_ParteLinea, g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_TextBox_Codigo);
                    //Se pone para que no pregunte si se modifico algo
                    g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

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

            try
            {
                // El Articulo no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Articulo validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // El Numerolinea tiene que ser mayor que 0
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_frm_P_ParteLinea.Exferia_TextBox_NumeroLinea.Text.Trim().Length > 0)
                {
                    if (int.Parse(g_frm_P_ParteLinea.Exferia_TextBox_NumeroLinea.Text) < 0)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_ParteLinea.Exferia_Label_NumeroLinea.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_ParteLinea.Exferia_TextBox_NumeroLinea;
                    }
                }

                // El TipoCompraVenta no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                    g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_ParteLinea.Exferia_F3_SoloSeleccion_TipoVenta.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

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

                //La cantidad no puede ser vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_ParteLinea.Exferia_Label_Cantidad.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_ParteLinea.Exferia_TextBox_Cantidad;
                }

                // El precio no puede ser vacio
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_ParteLinea.Exferia_TextBox_Cantidad;
                }

                //Si tiene embalaje relacionado
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_ParteLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible)
                {
                    //La 2º unidad no puede estar vacia
                    if (g_frm_P_ParteLinea.Exferia_TextBox_SegundaUnidad.Text.Trim().Length == 0)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_ParteLinea.Exferia_Label_SegundaUnidad.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_ParteLinea.Exferia_TextBox_SegundaUnidad;
                    }
                }

                //Tiene que tener una nomenclaturaprecio el articulo por defecto para compra
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (g_obj_VentasCompras_Calculos.PROPIEDAD_NomenclaturaPrecio_Existe == false)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_PARTES_VALIDACION_NOHAYNOMENCLATURAPRECIO();
                    }
                }

                // Si hay Descuento tiene que ser menor o iguala 100 y mayor que 0
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                        g_frm_P_ParteLinea.Exferia_TextBox_Descuento.Text.Trim().Length != 0 &&
                        (
                            decimal.Parse(g_frm_P_ParteLinea.Exferia_TextBox_Descuento.Text.Trim()) < 0 ||
                           decimal.Parse(g_frm_P_ParteLinea.Exferia_TextBox_Descuento.Text.Trim()) > 100
                        )
                    )
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_RANGOVALORINCORRECTO(g_frm_P_ParteLinea.Exferia_Label_Descuento.Text, "mayor que 0", "igual o mayor que 100");
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_ParteLinea.Exferia_TextBox_Descuento;
                }

                //Tiene que tener un impuestoTipo valido para la fecha de la cabecera (PRINCIPAL)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    bool bol_Buscar_ParaValidacion = false;
                    bool bol_Buscar_ParaValidacion_ENBASEDATOS = false;
                    //Si se esta modificando y el idimpuestoTipo es diferente
                    if (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null &&
                        !g_mdl_INTERNO_MYT_PartesLineas_Modelo.idImpuestoTipo.Equals(g_obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Id))
                    {
                        bol_Buscar_ParaValidacion = true;
                    }
                    //Si no se esta modificando una linea
                    else if (g_mdl_INTERNO_MYT_PartesLineas_Modelo == null)
                    {
                        bol_Buscar_ParaValidacion = true;
                    }

                    if (bol_Buscar_ParaValidacion)
                    {
                        //1º--> Se busca en los datos ya grabado del resumen, para ver si ya existe
                        if (g_lst_INTERNO_ImportesImpuestos_Modelo != null && g_lst_INTERNO_ImportesImpuestos_Modelo.Count > 0)
                        {
                            INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo = g_lst_INTERNO_ImportesImpuestos_Modelo.Where(m => m.IdImpuestoTipo.Equals(g_obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Id)).FirstOrDefault();
                            if (mdl_INTERNO_ImportesImpuestos_Modelo == null)
                            {
                                bol_Buscar_ParaValidacion_ENBASEDATOS = true;
                            }
                        }
                        else
                        {
                            bol_Buscar_ParaValidacion_ENBASEDATOS = true;
                        }

                        if (bol_Buscar_ParaValidacion_ENBASEDATOS)
                        {
                            bool? bol_Existe = Datos_Generales.GEN_ImpuestosLineas_Existe(g_mdl_INTERNO_MYT_Partes_Modelo.idImpuestoCabecera.Value, g_obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Id, g_mdl_INTERNO_MYT_Partes_Modelo.fechaHoraRecepcion.Value);
                            if (bol_Existe == null || bol_Existe == false)
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;

                                string str_Articulo = "(" + g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Codigo + ") " + g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Descripcion;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_IMPUESTOTIPO_NOACTIVO_ARTICULOFECHA(str_Articulo, g_mdl_INTERNO_MYT_Partes_Modelo.fechaHoraRecepcion.Value.ToString("dd/MM/yyyy HH:mm"));
                            }
                        }
                    }
                }

                //Si tiene promocion por unidad
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_frm_P_ParteLinea.TabPage_TarifasPromociones_ArticuloEnPromocion.Parent != null)
                {
                    //Si tiene embalaje relacionado
                    if (g_frm_P_ParteLinea.Exferia_Panel_Degradado_PromocionPorUnidad_EmbalajeRelacional.Visible)
                    {
                        //La 2º unidad no puede estar vacia
                        if (g_frm_P_ParteLinea.Exferia_TextBox_ArticuloEnPromocion_CantidadRelacional.Text.Trim().Length == 0)
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_ParteLinea.Exferia_Label_ArticuloEnPromocion_CantidadRelacional.Text);
                            mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_ParteLinea.Exferia_TextBox_ArticuloEnPromocion_CantidadRelacional;
                        }
                    }

                    //Tiene que tener un impuestoTipo valido para la fecha de la cabecera (ARTICULOENPROMOCION)
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        bool bol_Buscar_ParaValidacion_ENBASEDATOS = false;

                        //1º--> Se busca en los datos ya grabado del resumen, para ver si ya existe
                        if (g_lst_INTERNO_ImportesImpuestos_Modelo != null &&
                            g_lst_INTERNO_ImportesImpuestos_Modelo.Count > 0)
                        {
                            INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo = g_lst_INTERNO_ImportesImpuestos_Modelo.Where(m => m.IdImpuestoTipo.Equals(g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Id)).FirstOrDefault();
                            if (mdl_INTERNO_ImportesImpuestos_Modelo == null)
                            {
                                bol_Buscar_ParaValidacion_ENBASEDATOS = true;
                            }
                        }

                        if (bol_Buscar_ParaValidacion_ENBASEDATOS)
                        {
                            bool? bol_Existe = Datos_Generales.GEN_ImpuestosLineas_Existe(g_mdl_INTERNO_MYT_Partes_Modelo.idImpuestoCabecera.Value, g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Id, g_mdl_INTERNO_MYT_Partes_Modelo.fechaHoraRecepcion.Value);
                            if (bol_Existe == null || bol_Existe == false)
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;

                                string str_Articulo = " en promoción " + g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Articulo.Text;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_IMPUESTOTIPO_NOACTIVO_ARTICULOFECHA(str_Articulo, g_mdl_INTERNO_MYT_Partes_Modelo.fechaHoraRecepcion.Value.ToString("dd/MM/yyyy HH:mm"));
                            }
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(ValidarDatos));

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

            return mdl_ValorDevuelto_Modelo;
        }
        public INTERNO_ValorDevuelto_Modelo Validar_TrazabilidadObligatoria()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_ValorDevuelto_Modelo.Mensaje = "";
            try
            {
                #region Trazabilidad
                if (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null)
                {
                    //PRINCIPAL
                    if (g_obj_VentasCompras_Calculos.PROPIEDAD_Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Codigo))
                    {
                        //Cantidad trazada
                        decimal dcm_CantidadPrincipal_TotalLineasTrazadas = 0;
                        if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo != null &&
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Count > 0)
                        {
                            dcm_CantidadPrincipal_TotalLineasTrazadas = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Sum(m => m.cantidad);
                        }
                        //Cantidad de la linea
                        decimal dcm_CantidadPrincipal = g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text.Replace(".", ",")) : 0;

                        //Si no esta trazado completamente
                        if ((dcm_CantidadPrincipal - dcm_CantidadPrincipal_TotalLineasTrazadas) != 0m)
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ADVERTENCIA_CANTIDADMOVIMIENTO_NOTRAZADOCORRECTAMENTE(g_frm_P_ParteLinea.Exferia_Label_Cantidad.Text) + System.Environment.NewLine;
                        }

                    }
                }
                #endregion

                #region Trazabilidad Articulo en promocion
                if (g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Existe &&
                    g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Codigo))
                {
                    //Cantidad trazada
                    decimal dcm_CantidadPrincipal_TotalLineasTrazadas_ArticuloEnPromocion = 0;
                    if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion != null &&
                        g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Count > 0)
                    {
                        dcm_CantidadPrincipal_TotalLineasTrazadas_ArticuloEnPromocion = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Sum(m => m.cantidad);
                    }
                    //Cantidad de la linea
                    decimal dcm_CantidadPrincipal_ArticuloEnPromocion = g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Cantidad.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Cantidad.Text.Replace(".", ",")) : 0;

                    //Si no esta trazado completamente
                    if ((dcm_CantidadPrincipal_ArticuloEnPromocion - dcm_CantidadPrincipal_TotalLineasTrazadas_ArticuloEnPromocion) != 0m)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje += Mensajes.G_STR_ADVERTENCIA_CANTIDADMOVIMIENTO_NOTRAZADOCORRECTAMENTE(g_frm_P_ParteLinea.Exferia_Label_Cantidad.Text + " (Artículo en Promoción)") + System.Environment.NewLine;
                    }
                }
                #endregion
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Validar_TrazabilidadObligatoria));

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

            return mdl_ValorDevuelto_Modelo;
        }

        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            long? lng_Nulo = null;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    long lng_idParteLinea = -1;
                    G_ENUM_TIPOACCION obj_G_ENUM_TIPOACCION_ParteLinea = G_ENUM_TIPOACCION.INT_INSERTAR;

                    long lng_idParteLinea_Asociado = -1;
                    G_ENUM_TIPOACCION obj_G_ENUM_TIPOACCION_ParteLinea_Asociado = G_ENUM_TIPOACCION.INT_INSERTAR;

                    int int_NumeroLinea_LineaPrincipal_Final = -1;
                    int int_NumeroLinea_LineaSecundaria_Final = -1;

                    #region 1º GRABAR (LINEA PRINCIPAL)
                    MYT_PartesLineas mdl_MYT_PartesLineas = new MYT_PartesLineas();
                   
                    //id
                    mdl_MYT_PartesLineas.id = g_mdl_INTERNO_MYT_PartesLineas_Modelo != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.id : -1;

                    //idParte
                    mdl_MYT_PartesLineas.idParte = g_mdl_INTERNO_MYT_Partes_Modelo.id;

                    //fechaHora
                    mdl_MYT_PartesLineas.fechaHora = g_mdl_INTERNO_MYT_PartesLineas_Modelo != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.fechaHora : g_mdl_INTERNO_MYT_Partes_Modelo.fechaHoraRecepcion.Value;

                    //numero
                    if (g_frm_P_ParteLinea.Exferia_TextBox_NumeroLinea.Text.Trim().Length > 0)
                    {
                        int_NumeroLinea_LineaPrincipal_Final = int.Parse(g_frm_P_ParteLinea.Exferia_TextBox_NumeroLinea.Text.Trim());
                    }
                    //Sino tenia numero de linea, miramos si ya hay alguna linea grabada, para poner la ultima +1
                    else
                    {
                        int_NumeroLinea_LineaPrincipal_Final = g_int_TotalLineas + 1;
                    }
                    mdl_MYT_PartesLineas.numero = int_NumeroLinea_LineaPrincipal_Final;

                    //idTerminal
                    mdl_MYT_PartesLineas.idTerminal = g_mdl_INTERNO_MYT_PartesLineas_Modelo != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.idTerminal : null;

                    //idTecnico
                    mdl_MYT_PartesLineas.idTecnico = g_mdl_INTERNO_MYT_PartesLineas_Modelo != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.idTecnico : null;

                    //TipoCompraVenta 
                    mdl_MYT_PartesLineas.idTipoCompraVenta = g_obj_VentasCompras_Calculos.PROPIEDAD_TipoCompraVenta_Id;

                    //idPedidoLinea
                    mdl_MYT_PartesLineas.idPedidoLinea = g_mdl_INTERNO_MYT_PartesLineas_Modelo != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.idPedidoLinea : null;

                    //idArticulo
                    if (g_obj_VentasCompras_Calculos.PROPIEDAD_Articulo_Id > -1)
                    {
                        mdl_MYT_PartesLineas.idArticulo = g_obj_VentasCompras_Calculos.PROPIEDAD_Articulo_Id;
                        mdl_MYT_PartesLineas.descripcionArticuloComodin = "";
                    }
                    else
                    {
                        mdl_MYT_PartesLineas.idArticulo = null;
                    }

                    //idArticuloComodin
                    if (g_obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Id > -1)
                    {
                        mdl_MYT_PartesLineas.idArticuloComodin = g_obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Id;
                        mdl_MYT_PartesLineas.descripcionArticuloComodin = g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Descripcion;
                    }
                    else
                    {
                        mdl_MYT_PartesLineas.idArticuloComodin = null;
                        mdl_MYT_PartesLineas.descripcionArticuloComodin = "";
                    }

                    //cantidad
                    mdl_MYT_PartesLineas.cantidad = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal;

                    //idEmbalaje
                    mdl_MYT_PartesLineas.idEmbalaje = g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Id;

                    //relacion
                    mdl_MYT_PartesLineas.relacion = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;

                    //operacion
                    mdl_MYT_PartesLineas.operacion = g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Operacion;

                    //segundaUnidad_Precio_Cantidad_SegundaUnidad
                    mdl_MYT_PartesLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad = g_obj_VentasCompras_Calculos.PROPIEDAD_PrecioPor_SegundaUnidad_Entero;

                    //segundaUnidad_relacion
                    mdl_MYT_PartesLineas.segundaUnidad_relacion = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Relacion;

                    //segundaUnidad_idEmbalaje
                    mdl_MYT_PartesLineas.segundaUnidad_idEmbalaje = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Id;

                    //segundaUnidad_cantidad
                    if (g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional)
                    {
                        mdl_MYT_PartesLineas.segundaUnidad_cantidad = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional;
                    }
                    else
                    {
                        mdl_MYT_PartesLineas.segundaUnidad_cantidad = null;
                    }

                    //idNomenclaturaPrecio
                    mdl_MYT_PartesLineas.idNomenclaturaPrecio = g_obj_VentasCompras_Calculos.PROPIEDAD_NomenclaturaPrecio_Id;

                    //precio
                    mdl_MYT_PartesLineas.precio = g_obj_VentasCompras_Calculos.PROPIEDAD_Precio;

                    //numeroRedondeo
                    mdl_MYT_PartesLineas.numeroRedondeo = g_obj_VentasCompras_Calculos.PROPIEDAD_NumeroRedondeo;

                    //descuentoGeneral
                    mdl_MYT_PartesLineas.descuentoGeneral = g_obj_VentasCompras_Calculos.PROPIEDAD_DescuentoGeneral;

                    //importe
                    mdl_MYT_PartesLineas.importe = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe;

                    //idImpuestoTipo
                    mdl_MYT_PartesLineas.idImpuestoTipo = g_obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Id;

                    //id_Padre
                    mdl_MYT_PartesLineas.id_Padre = null;

                    //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
                    //embalajePrincipalDelArticulo_idEmbalaje
                    mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_idEmbalaje = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_IdEmbalaje;

                    //embalajePrincipalDelArticulo_relacion
                    mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_relacion = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                    //embalajePrincipalDelArticulo_operacion
                    mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_operacion = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                    //embalajePrincipalDelArticulo_precio
                    mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_precio = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Precio;

                    //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                    mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                    //embalajePrincipalDelArticulo_segundaUnidad_relacion
                    mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                    //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                    mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                    //guid
                    mdl_MYT_PartesLineas.guid = g_mdl_INTERNO_MYT_PartesLineas_Modelo != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.guid : g_mdl_INTERNO_MYT_Partes_Modelo.guid;

                    //idRetencionTipo
                    mdl_MYT_PartesLineas.idRetencionTipo = g_obj_VentasCompras_Calculos.PROPIEDAD_RetencionTipo_Id > -1 ? g_obj_VentasCompras_Calculos.PROPIEDAD_RetencionTipo_Id : lng_Nulo;

                    // ### GRABAR
                    mdl_ValorDevuelto_Modelo = g_obj_MYT_PartesLineas_Datos.Grabar(mdl_MYT_PartesLineas);
                    #endregion

                    // Si esta todo correcto grabamos las talas relacionadas
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        lng_idParteLinea = mdl_ValorDevuelto_Modelo.Id;
                        obj_G_ENUM_TIPOACCION_ParteLinea = mdl_ValorDevuelto_Modelo.TipoAccion;

                        string str_GUID = mdl_MYT_PartesLineas.guid;

                        #region 2º GRABAR COMENTARIOS

                        //Listado de los comentarios de la linea principal
                        List<MYT_PartesLineas_Comentarios> lst_MYT_PartesLineas_Comentarios = Obtener_Comentarios_AGrabar(lng_idParteLinea);

                        //istado inicial
                        List<MYT_PartesLineas_Comentarios> lst_MYT_PartesLineas_Comentarios_Iniciales = new List<MYT_PartesLineas_Comentarios>();
                        if (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null &&
                            g_mdl_INTERNO_MYT_PartesLineas_Modelo.MYT_PartesLineas_Comentarios != null &&
                            g_mdl_INTERNO_MYT_PartesLineas_Modelo.MYT_PartesLineas_Comentarios.Count > 0)
                        {
                            lst_MYT_PartesLineas_Comentarios_Iniciales = g_mdl_INTERNO_MYT_PartesLineas_Modelo.MYT_PartesLineas_Comentarios.ToList();
                        }

                        //BORRAR LOS QUE SOBREN
                        var arr_Lineasids_Comentarios = lst_MYT_PartesLineas_Comentarios.Select(x => x.id).ToArray();
                        var var_LineasBorrar_Comentarios = lst_MYT_PartesLineas_Comentarios_Iniciales.Where(m => !arr_Lineasids_Comentarios.Contains(m.id));
                        if (var_LineasBorrar_Comentarios != null && var_LineasBorrar_Comentarios.Count() > 0)
                        {
                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_BORRAR = null;

                            foreach (MYT_PartesLineas_Comentarios mdl_MYT_PartesLineas_Comentarios in var_LineasBorrar_Comentarios.ToList())
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_BORRAR = g_obj_MYT_PartesLineas_Comentarios_Datos.Borrar(mdl_MYT_PartesLineas_Comentarios.id);
                                if (!mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_BORRAR.TodoCorrecto)
                                {
                                    transaccion_SQL.Dispose();
                                    return mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_BORRAR;
                                }
                            }
                        }

                        //ACTUALIZAR O INSERTAR 
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_ACTUALIZARINSERTAR = null;

                        if (lst_MYT_PartesLineas_Comentarios != null &&
                            lst_MYT_PartesLineas_Comentarios.Count > 0)
                        {
                            foreach (MYT_PartesLineas_Comentarios mdl_MYT_PartesLineas_Comentarios in lst_MYT_PartesLineas_Comentarios)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_ACTUALIZARINSERTAR = g_obj_MYT_PartesLineas_Comentarios_Datos.Grabar(mdl_MYT_PartesLineas_Comentarios);
                                if (!mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_ACTUALIZARINSERTAR.TodoCorrecto)
                                {
                                    transaccion_SQL.Dispose();
                                    return mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_ACTUALIZARINSERTAR;
                                }
                            }
                        }
                        #endregion

                        #region 3º GRABAR TARIFAS/PROMOCIONES
                        //Obtener los datos de las promociones y tarifas
                        List<MYT_PartesLineas_TarifasPromociones> lst_MYT_PartesLineas_TarifasPromociones = Obtener_ParteLineas_TarifasPromociones_A_Grabar(lng_idParteLinea);

                        //Borrar las antiguas
                        INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_TARIFASPROMOCIONES_BORRAR = g_obj_MYT_PartesLineas_TarifasPromociones_Datos.Borrar(lng_idParteLinea);
                        if (!mdl_ValorDevuelto_Modelo_TARIFASPROMOCIONES_BORRAR.TodoCorrecto)
                        {
                            transaccion_SQL.Dispose();
                            return mdl_ValorDevuelto_Modelo_TARIFASPROMOCIONES_BORRAR;
                        }

                        //Insertar nuevas
                        if (lst_MYT_PartesLineas_TarifasPromociones != null && lst_MYT_PartesLineas_TarifasPromociones.Count > 0)
                        {
                            foreach (MYT_PartesLineas_TarifasPromociones mdl_MYT_PartesLineas_TarifasPromociones in lst_MYT_PartesLineas_TarifasPromociones)
                            {
                                mdl_ValorDevuelto_Modelo_TARIFASPROMOCIONES_BORRAR = g_obj_MYT_PartesLineas_TarifasPromociones_Datos.Insertar(mdl_MYT_PartesLineas_TarifasPromociones);
                                if (!mdl_ValorDevuelto_Modelo_TARIFASPROMOCIONES_BORRAR.TodoCorrecto)
                                {
                                    transaccion_SQL.Dispose();
                                    return mdl_ValorDevuelto_Modelo_TARIFASPROMOCIONES_BORRAR;
                                }
                            }
                        }
                        #endregion

                        #region 4º GRABAR LINEA PROMOCION POR UNIDAD (LINEA RELACIONAL)
                        INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_LINEAASOCIADA = new INTERNO_ValorDevuelto_Modelo();
                        mdl_ValorDevuelto_Modelo_LINEAASOCIADA.TodoCorrecto = true;

                        MYT_PartesLineas mdl_MYT_PartesLineas_Asociada = Obtener_ParteLineas_PromocionPorUnidad_Grabar(lng_idParteLinea, mdl_MYT_PartesLineas.numero);

                        //Sino esta vacio y antes tenia algo, borrar la linea
                        if (mdl_MYT_PartesLineas_Asociada == null &&
                            g_mdl_INTERNO_MYT_PartesLineas_Modelo != null &&
                            g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null)
                        {
                            //Guardar el id para actualziar el listado de lineas en cabeceras
                            lng_idParteLinea_Asociado = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.id;

                            mdl_ValorDevuelto_Modelo_LINEAASOCIADA = g_obj_MYT_PartesLineas_Datos.Borrar(lng_idParteLinea_Asociado);
                            if (!mdl_ValorDevuelto_Modelo_LINEAASOCIADA.TodoCorrecto)
                            {
                                transaccion_SQL.Dispose();
                                return mdl_ValorDevuelto_Modelo_LINEAASOCIADA;
                            }
                            else
                            {
                                obj_G_ENUM_TIPOACCION_ParteLinea_Asociado = mdl_ValorDevuelto_Modelo_LINEAASOCIADA.TipoAccion;
                            }
                        }

                        //GRABAR SI NO ES nULO
                        if (mdl_MYT_PartesLineas_Asociada != null)
                        {
                            //Actualziar el numero de linea
                            int_NumeroLinea_LineaSecundaria_Final = mdl_MYT_PartesLineas_Asociada.numero;

                            mdl_ValorDevuelto_Modelo_LINEAASOCIADA = g_obj_MYT_PartesLineas_Datos.Grabar(mdl_MYT_PartesLineas_Asociada);
                            if (!mdl_ValorDevuelto_Modelo_LINEAASOCIADA.TodoCorrecto)
                            {
                                transaccion_SQL.Dispose();
                                return mdl_ValorDevuelto_Modelo_LINEAASOCIADA;
                            }
                            else
                            {
                                lng_idParteLinea_Asociado = mdl_ValorDevuelto_Modelo_LINEAASOCIADA.Id;
                                obj_G_ENUM_TIPOACCION_ParteLinea_Asociado = mdl_ValorDevuelto_Modelo_LINEAASOCIADA.TipoAccion;

                                #region 5º GRABAR COMENTARIOS ARTICULO EN PROMOCION

                                //Listado de los comentarios de la linea en promocion
                                List<MYT_PartesLineas_Comentarios> lst_MYT_PartesLineas_Comentarios_ArticuloEnPromocion = Obtener_ArticuloEnPromocion_Comentarios_AGrabar(lng_idParteLinea_Asociado);

                                //Listado inicial
                                List<MYT_PartesLineas_Comentarios> lst_MYT_PartesLineas_Comentarios_ArticuloEnPromocion_Iniciales = new List<MYT_PartesLineas_Comentarios>();
                                if (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null &&
                                    g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null &&
                                    g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MYT_PartesLineas_Comentarios != null &&
                                   g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MYT_PartesLineas_Comentarios.Count > 0)
                                {
                                    lst_MYT_PartesLineas_Comentarios_ArticuloEnPromocion_Iniciales = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.MYT_PartesLineas_Comentarios.ToList();
                                }

                                //BORRAR LOS QUE SOBREN
                                var arr_Lineasids_Comentarios_ArticuloEnPromocion = lst_MYT_PartesLineas_Comentarios_ArticuloEnPromocion.Select(x => x.id).ToArray();
                                var var_LineasBorrar_Comentarios_ArticuloEnPromocion = lst_MYT_PartesLineas_Comentarios_ArticuloEnPromocion_Iniciales.Where(m => !arr_Lineasids_Comentarios_ArticuloEnPromocion.Contains(m.id));
                                if (var_LineasBorrar_Comentarios_ArticuloEnPromocion != null && var_LineasBorrar_Comentarios_ArticuloEnPromocion.Count() > 0)
                                {
                                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_BORRAR = null;

                                    foreach (MYT_PartesLineas_Comentarios mdl_MYT_PartesLineas_Comentarios in var_LineasBorrar_Comentarios_ArticuloEnPromocion.ToList())
                                    {
                                        mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_BORRAR = g_obj_MYT_PartesLineas_Comentarios_Datos.Borrar(mdl_MYT_PartesLineas_Comentarios.id);
                                        if (!mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_BORRAR.TodoCorrecto)
                                        {
                                            transaccion_SQL.Dispose();
                                            return mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_BORRAR;
                                        }
                                    }
                                }

                                //ACTUALIZAR O INSERTAR 
                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_ArticuloEnPromocion_ACTUALIZARINSERTAR = null;

                                if (lst_MYT_PartesLineas_Comentarios_ArticuloEnPromocion != null &&
                                    lst_MYT_PartesLineas_Comentarios_ArticuloEnPromocion.Count > 0)
                                {
                                    foreach (MYT_PartesLineas_Comentarios mdl_MYT_PartesLineas_Comentarios in lst_MYT_PartesLineas_Comentarios_ArticuloEnPromocion)
                                    {
                                        mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_ArticuloEnPromocion_ACTUALIZARINSERTAR = g_obj_MYT_PartesLineas_Comentarios_Datos.Grabar(mdl_MYT_PartesLineas_Comentarios);
                                        if (!mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_ArticuloEnPromocion_ACTUALIZARINSERTAR.TodoCorrecto)
                                        {
                                            transaccion_SQL.Dispose();
                                            return mdl_INTERNO_ValorDevuelto_Modelo_Comentarios_ArticuloEnPromocion_ACTUALIZARINSERTAR;
                                        }
                                    }
                                }
                                #endregion
                            }
                        }
                        #endregion

                        //Termino Transaccion
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();

                    //Recargar el Modelo de Linea 
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        #region ARGUMENTOS A DEVOLVER, PARA ACTUALIZAR LE LISTADO
                        List<object> lst_Argumentos = new List<object>();

                        //Principal
                        lst_Argumentos.Add(lng_idParteLinea);
                        lst_Argumentos.Add(obj_G_ENUM_TIPOACCION_ParteLinea);

                        //Asociado
                        lst_Argumentos.Add(lng_idParteLinea_Asociado);
                        lst_Argumentos.Add(obj_G_ENUM_TIPOACCION_ParteLinea_Asociado);

                        //Ver si el numeroLinea es el mismo que el que tenia no hacer nada, sino se guarda para que actualice el listado .................
                        int int_NumeroLinea_Final = -1;
                        //Si el NumeroLinea inicial es -1
                        if (g_int_NumeroLinea_Principal_Inicial == -1)
                        {
                            int_NumeroLinea_Final = int_NumeroLinea_LineaPrincipal_Final;
                        }
                        //Si el NumeroLinea inicial de la linea principal es mayor que el que se grabo
                        else if (g_int_NumeroLinea_Principal_Inicial > int_NumeroLinea_LineaPrincipal_Final)
                        {
                            int_NumeroLinea_Final = int_NumeroLinea_LineaPrincipal_Final;
                        }
                        //Si el NumeroLinea inicial del la linea principal es menor que el que se grabo
                        else if (g_int_NumeroLinea_Principal_Inicial < int_NumeroLinea_LineaPrincipal_Final)
                        {
                            int_NumeroLinea_Final = g_int_NumeroLinea_Principal_Inicial;
                        }
                        //Si el NumeroLinea inicial de la linea relacionada es -1
                        else if (g_int_NumeroLinea_Relacionado_Inicial == -1)
                        {
                            int_NumeroLinea_Final = int_NumeroLinea_LineaPrincipal_Final;
                        }
                        //Si el NumeroLinea inicial de la linea relacionada es mayor que el que se grabo
                        else if (g_int_NumeroLinea_Relacionado_Inicial > int_NumeroLinea_LineaSecundaria_Final)
                        {
                            int_NumeroLinea_Final = int_NumeroLinea_LineaPrincipal_Final;
                        }
                        //Si el NumeroLinea inicial del la linea relacionada es menor que el que se grabo
                        else if (g_int_NumeroLinea_Relacionado_Inicial < int_NumeroLinea_LineaSecundaria_Final)
                        {
                            int_NumeroLinea_Final = int_NumeroLinea_LineaPrincipal_Final;
                        }
                        //orden
                        lst_Argumentos.Add(int_NumeroLinea_Final);
                        //..........................................................................................................................

                        mdl_ValorDevuelto_Modelo.Objeto = lst_Argumentos;
                        #endregion

                        //Solo cuando estas insertando)
                        if (g_frm_P_ParteLinea.P_Base_id < 1)
                        {
                            //Actuaizar la cantidad de lineas totales, por si se agrega una nueva,que el numerolinea este correcto
                            g_int_TotalLineas += 1;

                            //Si tiene una linea relacionada, sumar 1 mas
                            if (lng_idParteLinea_Asociado > -1)
                            {
                                g_int_TotalLineas += 1;
                            }
                        }

                        g_mdl_INTERNO_MYT_PartesLineas_Modelo = g_obj_MYT_PartesLineas_Datos.Obtener(lng_idParteLinea);
                        //Si tienes Permisos para Borrar
                        g_frm_P_ParteLinea.Exferia_Button_Borrar.Enabled = true;

                    }
                }
                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, nameof(P_ParteLinea_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()
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_ParteLinea.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_ParteLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_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, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

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

                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear Formulario
            g_frm_P_ParteLinea.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
                {
                    // Devolver al Listado el Row Borrar
                    List<object> lst_obj = new List<object>();

                    //opcion
                    lst_obj.Add(g_frm_P_ParteLinea.g_mdl_PRV_OpcionesDetalle.opcion);


                    //Ids a borrar
                    List<long> lst_id = new List<long>();
                    lst_id.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    lst_obj.Add(lst_id);

                    //Orden
                    lst_obj.Add(g_mdl_INTERNO_MYT_PartesLineas_Modelo.numero);

                    g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_ELIMINAR);

                    g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_ParteLinea.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_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
                {
                    mdl_ValorDevuelto_Modelo = g_obj_MYT_PartesLineas_Datos.Borrar(g_mdl_INTERNO_MYT_PartesLineas_Modelo != null ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.id : -1);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Termino Transaccion
                        transaccion_SQL.Complete();
                    }
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(BorrarDatos_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Calculos
        #region Cambio de TipoCompraVenta 
        public void Cambio_TipoCompraVenta(long _lng_idTipoCompraVenta)
        {
            try
            {
                //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_Cambio_TipoCompraVenta != null)
                {
                    while (g_obj_TareaAsincrona_Cambio_TipoCompraVenta.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_Cambio_TipoCompraVenta = new BackgroundWorker();
                    g_obj_TareaAsincrona_Cambio_TipoCompraVenta.DoWork += new DoWorkEventHandler(TareaAsincrona_Cambio_TipoCompraVenta_DoWork);
                    g_obj_TareaAsincrona_Cambio_TipoCompraVenta.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Cambio_TipoCompraVenta_Completed);
                    g_obj_TareaAsincrona_Cambio_TipoCompraVenta.WorkerReportsProgress = false;
                    g_obj_TareaAsincrona_Cambio_TipoCompraVenta.WorkerSupportsCancellation = true;
                }

                //Vaciar
                CambioTipoCompraVenta_VaciarDatos();

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_lng_idTipoCompraVenta);

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_Cambio_TipoCompraVenta.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################

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

                //Variable de control para que no se ejecuten eventos de los combos, textbox etc al cambiar los valores
                g_bol_TareaAsincrona_CambioArticulo_Termino = true;

                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Cambio_TipoCompraVenta));
            }
        }
        private void TareaAsincrona_Cambio_TipoCompraVenta_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_Seleccionar_CodigoArticuloProveedor = true;
            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;
                long lng_idTipoCompraVenta = (long)lst_Argumentos[0];

                GEN_TiposCompraVenta mdl_GEN_TiposCompraVenta = Datos_Generales.GEN_TiposCompraVenta_Obtener_Modelo_Por_Id(lng_idTipoCompraVenta);

                if (mdl_GEN_TiposCompraVenta != null)
                {
                    g_mdl_GEN_TiposCompraVenta_SELECCIONADA = mdl_GEN_TiposCompraVenta;

                    //Calculos iniciales por cambio de tipoCompraVenta
                    g_obj_VentasCompras_Calculos.Cambio_TipoCompraVenta(g_mdl_GEN_TiposCompraVenta_SELECCIONADA.opcion, g_mdl_GEN_TiposCompraVenta_SELECCIONADA.id);
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Cambio_TipoCompraVenta_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Cambio_TipoCompraVenta_DoWork));
            }
            finally
            {
                e.Result = bol_Seleccionar_CodigoArticuloProveedor;
            }
        }
        private void TareaAsincrona_Cambio_TipoCompraVenta_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                if (g_obj_VentasCompras_Calculos.PROPIEDAD_TipoCompraVenta_Id > -1)
                {
                    CambioTipoCompraVenta_CargarDatos();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Cambio_TipoCompraVenta_Completed));
            }
            finally
            {
                //Variable de control para que no se ejecuten eventos de los combos, textbox etc al cambiar los valores
                g_bol_TareaAsincrona_CambioArticulo_Termino = true;
            }
        }

        private void CambioTipoCompraVenta_VaciarDatos()
        {
            //cantidad
            g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text = "";

            //panel de precios
            g_frm_P_ParteLinea.SplitContainer_CantidadPrecios.Panel1.Enabled = false;

            //Precio
            g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = "0.000";

            //Importe
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = "0.00";

            //Listado de promociones
            if (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones != null)
            {
                while (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.IsBusy)
                    Application.DoEvents();
            }
            g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones.Rows.Clear();
            g_int_TotalRegistrosInsertados_TarifasPromociones = 0;
            g_int_TotalRegistros_TarifasPromociones = 0;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Total = g_int_TotalRegistros_TarifasPromociones;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_TarifasPromociones;

            //Cargar los datos de Promociones por Unidad
            PromocionPorUnidad_Vaciar();
        }

        private void CambioTipoCompraVenta_CargarDatos()
        {
            //Cantidad principal
            g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Texto;

            //Cargar Embalajes
            g_frm_P_ParteLinea.SplitContainer_CantidadPrecios.Panel1.Enabled = true;
            if (g_obj_VentasCompras_Calculos.PROPIEDAD_Embalajes_Listado != null)
            {
                //Mostrar los datos segun el embale seleccionado
                Embalaje_Seleccion();
            }

            //Actualizar Precio
            g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Precio_Texto;

            //Actualizar Importe
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe_Texto;

            //Rellenar Listado Tarifas y promciones
            Rellenar_DataGridView_TarifasPromociones();

            //Cargar la promocion por unidad si la tuviera
            PromocionPorUnidad_CargarDatos();
        }

        #endregion

        #region Cambio de Articulo/ArticuloComodin 
        public void Cambio_Articulo(long _lng_idArticulo_ArticuloComodin, bool _bol_EsArticuloComodin, long? _lng_idEmbalaje)
        {
            try
            {
                //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_Cambio_Articulo != null)
                {
                    while (g_obj_TareaAsincrona_Cambio_Articulo.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_Cambio_Articulo = new BackgroundWorker();
                    g_obj_TareaAsincrona_Cambio_Articulo.DoWork += new DoWorkEventHandler(TareaAsincrona_Cambio_Articulo_DoWork);
                    g_obj_TareaAsincrona_Cambio_Articulo.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Cambio_Articulo_Completed);
                    g_obj_TareaAsincrona_Cambio_Articulo.WorkerReportsProgress = false;
                    g_obj_TareaAsincrona_Cambio_Articulo.WorkerSupportsCancellation = true;
                }

                //Variable de control para que no se ejecuten eventos de los combos, textbox etc al cambiar los valores
                g_bol_TareaAsincrona_CambioArticulo_Termino = false;

                //VALIDACION DEL ARTICULO SI YA EXISTE EN OTRAS LINEAS
                int int_Respuesta = CambioArticulo_ArticuloNoExisteOtroLinea(_lng_idArticulo_ArticuloComodin, _bol_EsArticuloComodin);

                if (int_Respuesta == 3)//Cancelar
                {
                    CambioArticulo_VaciarDatos(true);

                    //Poner el Foco Inicial
                    Funciones.Poner_Foco_Objeto(g_frm_P_ParteLinea, g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_TextBox_Codigo);
                }
                else if (int_Respuesta == 2)//Cargar linea anterior
                {
                    //Ver que linea hay que recargar
                    CambioArticulo_Seleccion_LineaAnterior(_lng_idArticulo_ArticuloComodin, _bol_EsArticuloComodin);
                }
                else //Linea Nueva
                {
                    CambioArticulo_VaciarDatos(false);

                    //Argumentos
                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lng_idArticulo_ArticuloComodin);
                    lst_Argumentos.Add(_bol_EsArticuloComodin);
                    lst_Argumentos.Add(_lng_idEmbalaje);

                    //(Tarea Asincrona) Cargar Datos ##################################################################
                    g_obj_TareaAsincrona_Cambio_Articulo.RunWorkerAsync(lst_Argumentos);
                    //#################################################################################################

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

                //Variable de control para que no se ejecuten eventos de los combos, textbox etc al cambiar los valores
                g_bol_TareaAsincrona_CambioArticulo_Termino = true;

                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Cambio_Articulo));
            }
        }
        private void TareaAsincrona_Cambio_Articulo_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;
                long lng_idArticulo_ArticuloComodin = (long)lst_Argumentos[0];
                bool bol_EsArticuloComodin = (bool)lst_Argumentos[1];
                long? lng_idEmbalaje = (long?)lst_Argumentos[2];

                //Calculos iniciales por cambio de articulo
                g_obj_VentasCompras_Calculos.Cambio_Articulo(lng_idArticulo_ArticuloComodin, bol_EsArticuloComodin, lng_idEmbalaje, g_mdl_GEN_TiposCompraVenta_SELECCIONADA.opcion, g_mdl_GEN_TiposCompraVenta_SELECCIONADA.id);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Articulo_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Articulo_DoWork));
            }
        }
        private void TareaAsincrona_Cambio_Articulo_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                if (g_obj_VentasCompras_Calculos.PROPIEDAD_Articulo_Id > -1 ||
                    g_obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Id > -1)
                {
                    CambioArticulo_CargarDatos();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Articulo_Completed));
            }
            finally
            {
                //Variable de control para que no se ejecuten eventos de los combos, textbox etc al cambiar los valores
                g_bol_TareaAsincrona_CambioArticulo_Termino = true;
            }
        }

        private int CambioArticulo_ArticuloNoExisteOtroLinea(long _lng_idArticulo_ArticuloComodin, bool _bol_EsArticuloComodin)
        {
            int int_Respuesta = 1;

            //Si se esta modificando una linea, y el articulo introducido es el idArticulo de la propia linea no se pregunta nada
            if (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null &&
                    (
                        (_bol_EsArticuloComodin == false && g_mdl_INTERNO_MYT_PartesLineas_Modelo.idArticulo != null && g_mdl_INTERNO_MYT_PartesLineas_Modelo.idArticulo.Value.Equals(_lng_idArticulo_ArticuloComodin)) ||
                        (_bol_EsArticuloComodin && g_mdl_INTERNO_MYT_PartesLineas_Modelo.idArticuloComodin != null && g_mdl_INTERNO_MYT_PartesLineas_Modelo.idArticuloComodin.Value.Equals(_lng_idArticulo_ArticuloComodin))
                    )
                )
            {
                int_Respuesta = 1;
            }
            else
            {
                if (g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado != null &&
                    g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado.Count > 0 &&
                    _lng_idArticulo_ArticuloComodin > -1)
                {

                    INTERNO_Listado_CamposClave_Modelo mdl_INTERNO_Listado_CamposClave_Modelo = null;

                    //Es Articulo en Comodin
                    if (_bol_EsArticuloComodin)
                    {
                        mdl_INTERNO_Listado_CamposClave_Modelo = g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado.Where(m => m.ID_Aux2.Equals(_lng_idArticulo_ArticuloComodin)).FirstOrDefault();
                    }
                    //Es Articulo normal
                    else
                    {
                        mdl_INTERNO_Listado_CamposClave_Modelo = g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado.Where(m => m.ID_Aux1.Equals(_lng_idArticulo_ArticuloComodin)).FirstOrDefault();
                    }

                    if (mdl_INTERNO_Listado_CamposClave_Modelo != null)
                    {
                        int_Respuesta = Mensajes.MostrarMensaje_Pregunta_3Respuesta(Mensajes.G_STR_MENSAJES_GENERAL_ARTICULOEXISTEENLINEA((_bol_EsArticuloComodin ? mdl_INTERNO_Listado_CamposClave_Modelo.Dato_Auxiliar2 : mdl_INTERNO_Listado_CamposClave_Modelo.Dato_Auxiliar)),
                                                                                                                                         "",
                                                                                                                                         Mensajes.G_STR_PARTES_ARTICULOREPETIDOENLINEA_NOMBREBOTON_1(),
                                                                                                                                         Mensajes.G_STR_PARTES_ARTICULOREPETIDOENLINEA_NOMBREBOTON_2(),
                                                                                                                                         Mensajes.G_STR_PARTES_ARTICULOREPETIDOENLINEA_NOMBREBOTON_3());

                    }
                }
                else
                {
                    int_Respuesta = 1;
                }
            }


            return int_Respuesta;
        }
        private void CambioArticulo_Seleccion_LineaAnterior(long _lng_idArticulo_ArticuloComodin, bool _bol_EsArticuloComodin)
        {
            try
            {
                long lng_idInventarioLinea = -1;

                //Ver si hay mas de una linea
                List<INTERNO_Listado_CamposClave_Modelo> lst_INTERNO_Listado_CamposClave_Modelo = null;

                //Es Articulo en Comodin
                if (_bol_EsArticuloComodin)
                {
                    lst_INTERNO_Listado_CamposClave_Modelo = g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado.Where(m => m.ID_Aux2.Equals(_lng_idArticulo_ArticuloComodin)).ToList();
                }
                //Es Articulo normal
                else
                {
                    lst_INTERNO_Listado_CamposClave_Modelo = g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado.Where(m => m.ID_Aux1.Equals(_lng_idArticulo_ArticuloComodin)).ToList();
                }

                if (lst_INTERNO_Listado_CamposClave_Modelo != null &&
                    lst_INTERNO_Listado_CamposClave_Modelo.Count > 1)
                {
                    //Mostrar un Listado para ques selecciones que linea desea cargar

                    // ## 1º--> OBTENER EL LISTADO #################################################################################################
                    ABS_ListadoSeleccion_MYT_PartesLineas_Partes obj_ABS_ListadoSeleccion_MYT_PartesLineas_Partes = new ABS_ListadoSeleccion_MYT_PartesLineas_Partes();
                    obj_ABS_ListadoSeleccion_MYT_PartesLineas_Partes.Registros = g_obj_MYT_PartesLineas_Datos.Obtener_Registros_Para_Listado_Por_Ids(lst_INTERNO_Listado_CamposClave_Modelo.Select(m => m.ID).ToList());

                    // ## 2º--> LLAMAR AL FORMULARIO DE LISTADO DE SELECCIONO MULTIPLE ###############################################################
                    PE_Listados_SoloSeleccion frm_PE_Listados_SoloSeleccion = new PE_Listados_SoloSeleccion(obj_ABS_ListadoSeleccion_MYT_PartesLineas_Partes, g_frm_P_ParteLinea.P_Base_ValoresGenerales, g_frm_P_ParteLinea.P_Base_FechaTrabajo);
                    frm_PE_Listados_SoloSeleccion.ShowDialog();

                    if (frm_PE_Listados_SoloSeleccion.g_dnm_RegistroSeleccionado != null)
                    {
                        INTERNO_MYT_PartesLineas_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Listado_Modelo = (INTERNO_MYT_PartesLineas_Listado_Modelo)frm_PE_Listados_SoloSeleccion.g_dnm_RegistroSeleccionado;
                        lng_idInventarioLinea = mdl_INTERNO_MYT_PartesLineas_Listado_Modelo.id;
                    }
                }
                else
                {
                    lng_idInventarioLinea = lst_INTERNO_Listado_CamposClave_Modelo.FirstOrDefault().ID;
                }


                if (lng_idInventarioLinea > -1)
                {
                    g_frm_P_ParteLinea.P_Base_id = lng_idInventarioLinea;

                    //Variable de control para que no se ejecuten eventos de los combos, textbox etc al cambiar los valores
                    g_bol_TareaAsincrona_CambioArticulo_Termino = true;

                    RecargarDatos();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(CambioArticulo_Seleccion_LineaAnterior));
            }
        }

        public void CambioArticulo_VaciarDatos(bool _bol_Vaciar_Articulo)
        {
            // vaciar el F3 de Articulo
            if (_bol_Vaciar_Articulo)
            {
                //Articulo
                g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Id = -1;
                g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Codigo = "";
                g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_Descripcion = "";
                g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_FechaBorrado = null;
                g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_DatosAuxiliares_1 = null;
            }

            //cantidad
            g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text = "";

            //TipoEmbalaje
            if (g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.Items != null &&
                g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.Items.Count > 0)
            {
                g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.Items.Clear();
            }

            //Relacion cantidad
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Relacion.Text = "";

            //Relacion cantidad calculo
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Relacion_Calculo.Text = "";

            //Impuesto
            g_frm_P_ParteLinea.Exferia_Label_SinColor_ImpuestoTipo.Text = "";
            g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_ImpuestoTipo.Text = "";

            //Tipo Trazabilidad
            g_frm_P_ParteLinea.Exferia_Label_SinColor_TipoTrazabilidad.Text = "";
            g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_TipoTrazabilidad.Text = "";

            //Tipo Embalaje relacionado
            g_frm_P_ParteLinea.Exferia_Label_SinColor_TipoEmbalajeRelacionado_Valor.Text = "";

            //Relacion 2º unidad
            g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad.Text = "";

            //Relacion 2º unidad calculo
            g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = "";

            //precio por
            g_frm_P_ParteLinea.Exferia_Label_SinColor_PrecioPor.Text = Variables.G_STR_PRECIOPOR_CANTIDAD_DESCRIPCION;
            g_frm_P_ParteLinea.Exferia_Label_SinColor_PrecioPor.Tag = Variables.G_STR_PRECIOPOR_CANTIDAD_CODIGO;

            //panel de precios
            g_frm_P_ParteLinea.SplitContainer_CantidadPrecios.Panel1.Enabled = false;

            //NomenclaturaPrecio
            g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.Text = "No existe";
            g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.ForeColor = Colores.G_COLOR_ATENCION;

            //Precio
            g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = "0.000";

            //Descuento
            g_frm_P_ParteLinea.Exferia_TextBox_Descuento.Text = "0.00";

            //Importe
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = "0.00";

            //Vaciar el Listado Trazabilidad
            g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Clear();
            g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad = 0;
            g_int_TotalRegistros_ParteLineas_Trazabilidad = 0;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total = g_int_TotalRegistros_ParteLineas_Trazabilidad;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad;


            //Listado de promociones
            if (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones != null)
            {
                while (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.IsBusy)
                    Application.DoEvents();
            }
            g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones.Rows.Clear();
            g_int_TotalRegistrosInsertados_TarifasPromociones = 0;
            g_int_TotalRegistros_TarifasPromociones = 0;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Total = g_int_TotalRegistros_TarifasPromociones;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_TarifasPromociones;

            //Cargar los datos de Promociones por Unidad
            PromocionPorUnidad_Vaciar();

            g_bol_ModificacionDatosAfectaTrazabilidad = true;
        }

        private void CambioArticulo_CargarDatos()
        {
            //Cantidad principal
            g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Texto;

            //Cargar Embalajes
            g_frm_P_ParteLinea.SplitContainer_CantidadPrecios.Panel1.Enabled = true;
            if (g_obj_VentasCompras_Calculos.PROPIEDAD_Embalajes_Listado != null)
            {
                foreach (INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo in g_obj_VentasCompras_Calculos.PROPIEDAD_Embalajes_Listado)
                {
                    g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.Items.Add(mdl_INTERNO_ComboBox_Modelo);
                }

                //Seleccionar un embalaje
                if (g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Id > -1)
                {
                    g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.SelectedItem = g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Id.ToString())).FirstOrDefault();
                }

                //Mostrar los datos segun el embale seleccionado
                Embalaje_Seleccion();
            }

            //Actualizar nomenclatura precio
            g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.ForeColor = Colores.G_COLOR_PRINCIPAL_OSCURO;
            g_frm_P_ParteLinea.Exferia_Label_SinColor_NomenclaturaPrecio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_NomenclaturaPrecio;

            //Actualizar Precio
            g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Precio_Texto;

            //Actualizar Descuento
            g_frm_P_ParteLinea.Exferia_TextBox_Descuento.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_DescuentoGeneral_Texto;

            //Actualizar Importe
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe_Texto;

            //ImpuestoTipo
            g_frm_P_ParteLinea.Exferia_Label_SinColor_ImpuestoTipo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Texto;

            //Tipo Trazabilidad
            g_frm_P_ParteLinea.Exferia_Label_SinColor_TipoTrazabilidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Articulo_TipoTrazabilidad_Texto;


            //Rellenar Listado Tarifas y promciones
            Rellenar_DataGridView_TarifasPromociones();

            //Cargar la promocion por unidad si la tuviera
            PromocionPorUnidad_CargarDatos();
        }

        #endregion

        #region Cambio Cantidad Principal
        public void Cambio_CantidadPrincipal(decimal? _dcm_Cantidad)
        {
            try
            {
                //Vaciamos los datos necesarios
                Cambio_CantidadPrincipal_VaciarDatos();

                //Actualiar los valoers en la clase de VentasCompras_Calculos
                g_obj_VentasCompras_Calculos.Cambio_CantidadPrincipal(_dcm_Cantidad);

                //Relacion Calculo
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Relacion_Calculo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Relacion_Calculo_Texto;

                //Embalaje relacional
                if (g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional)
                {
                    //2º Unidad
                    g_frm_P_ParteLinea.Exferia_TextBox_SegundaUnidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional_Texto;

                    //relacion con 2º unidad calculo
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional_Relacion_Calculo_Texto;
                }

                //Actualizar Precio
                g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Precio_Texto;

                //Actualizar Importe
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe_Texto;

                //Rellenar Listado Tarifas y promciones
                Rellenar_DataGridView_TarifasPromociones();

                //Cargar la promocion por unidad si la tuviera
                PromocionPorUnidad_CargarDatos();

                g_bol_ModificacionDatosAfectaTrazabilidad = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Cambio_CantidadPrincipal));
            }
        }

        private void Cambio_CantidadPrincipal_VaciarDatos()
        {
            //Relacion cantidad calculo
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Relacion_Calculo.Text = "";

            //Relacion 2º unidad calculo
            g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = "";

            //Precio
            g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = "0.000";

            //Importe
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = "0.00";

            //Listado de promociones
            g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones.Rows.Clear();
            g_int_TotalRegistrosInsertados_TarifasPromociones = 0;
            g_int_TotalRegistros_TarifasPromociones = 0;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Total = g_int_TotalRegistros_TarifasPromociones;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_TarifasPromociones;

            //Cargar los datos de Promociones por Unidad
            PromocionPorUnidad_Vaciar();
        }
        #endregion

        #region Cambio Embalaje
        public void Cambio_Embalaje(long _lng_idEmbalaje)
        {
            try
            {
                //Vaciamos los datos necesarios
                Cambio_Embalaje_VaciarDatos();

                //Actualiar los valores en la clase de VentasCompras_Calculos
                g_obj_VentasCompras_Calculos.Cambio_Embalaje(_lng_idEmbalaje);

                //Actualizar los valores del embalaje seleccionado
                Embalaje_Seleccion();

                //Actualizar Precio
                g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Precio_Texto;

                //Actualizar Importe
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe_Texto;

                //Rellenar Listado Tarifas y promciones
                Rellenar_DataGridView_TarifasPromociones();

                //Cargar la promocion por unidad si la tuviera
                PromocionPorUnidad_CargarDatos();

                //Muestra o Oculta el panel de Resumen de Totales de Trazabilidad
                MostrarOcultar_Resumen_Totales_Trazabilidad(g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional);
                g_bol_ModificacionDatosAfectaTrazabilidad = true;
                Rellenar_Resumen_Totales_Trazabilidad();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Cambio_Embalaje));
            }
        }

        private void Cambio_Embalaje_VaciarDatos()
        {
            //Relacion cantidad
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Relacion.Text = "";

            //Relacion cantidad calculo
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Relacion_Calculo.Text = "";

            //Tipo Embalaje relacionado
            g_frm_P_ParteLinea.Exferia_Label_SinColor_TipoEmbalajeRelacionado_Valor.Text = "";

            //Relacion 2º unidad
            g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad.Text = "";

            //Relacion 2º unidad calculo
            g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = "";

            //precio por
            g_frm_P_ParteLinea.Exferia_Label_SinColor_PrecioPor.Text = Variables.G_STR_PRECIOPOR_CANTIDAD_DESCRIPCION;
            g_frm_P_ParteLinea.Exferia_Label_SinColor_PrecioPor.Tag = Variables.G_STR_PRECIOPOR_CANTIDAD_CODIGO;

            //Precio
            g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = "0.000";

            //Importe
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = "0.00";

            //Listado de promociones
            if (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones != null)
            {
                while (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.IsBusy)
                    Application.DoEvents();
            }
            g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones.Rows.Clear();
            g_int_TotalRegistrosInsertados_TarifasPromociones = 0;
            g_int_TotalRegistros_TarifasPromociones = 0;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Total = g_int_TotalRegistros_TarifasPromociones;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_TarifasPromociones;

            //Cargar los datos de Promociones por Unidad
            PromocionPorUnidad_Vaciar();
        }

        private void Embalaje_Seleccion()
        {
            //Mostrar valores segun tipo embalaje seleccionado embalaje
            if (g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Id > -1)
            {
                //Relacion cantidad
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Relacion.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Relacion_Texto;

                //Relacion Calculo
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Relacion_Calculo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Relacion_Calculo_Texto;

                //Precio Por 
                g_frm_P_ParteLinea.Exferia_Label_SinColor_PrecioPor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PrecioPor;
                g_frm_P_ParteLinea.Exferia_Label_SinColor_PrecioPor.Tag = g_obj_VentasCompras_Calculos.PROPIEDAD_PrecioPor_TAG;

                //Mostrar o no Panel Relacional
                if (g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional)
                {
                    //Mostrar panel de Datos del Embalaje relacional
                    g_frm_P_ParteLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible = true;

                    //Tipo de Embalaje Relacionado
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_TipoEmbalajeRelacionado_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Tipo_Texto;

                    //2º Unidad
                    g_frm_P_ParteLinea.Exferia_TextBox_SegundaUnidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional_Texto;

                    //relacion con 2º unidad
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional_Relacion;

                    //relacion con 2º unidad calculo
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional_Relacion_Calculo_Texto;

                    //Mover Panel de Precio
                    g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios.Location = new Point(g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios.Location.X, (g_frm_P_ParteLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Location.Y + g_frm_P_ParteLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Height + 5));
                }
                else
                {
                    //Ocultar panel de Datos del Embalaje relacional
                    g_frm_P_ParteLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible = false;

                    //Tipo de Embalaje Relacionado
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_TipoEmbalajeRelacionado_Valor.Text = "";

                    //2º Unidad
                    g_frm_P_ParteLinea.Exferia_TextBox_SegundaUnidad.Text = "";

                    //relacion con 2º unidad
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad.Text = "";

                    //relacion con 2º unidad calculo
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = "";


                    //Mover Panel de Precio
                    g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios.Location = new Point(g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios.Location.X, g_frm_P_ParteLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Location.Y);
                }

                //Redimencionar el panel CantidadPrecios
                g_frm_P_ParteLinea.SplitContainer_CantidadPrecios.SplitterDistance = (g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios.Location.Y + g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios.Size.Height + 6);
            }
        }
        #endregion

        #region Cambio Cantidad Secundaria
        public void Cambio_CantidadSecundaria(decimal? _dcm_CantidadSecundaria)
        {
            try
            {
                //Vaciamos los datos necesarios
                Cambio_CantidadSecundaria_VaciarDatos();

                //Actualiar los valoers en la clase de VentasCompras_Calculos
                g_obj_VentasCompras_Calculos.Cambio_CantidadSecundaria(_dcm_CantidadSecundaria);

                //Solo si el precio es por 2º Unidad
                if (g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional &&
                    g_obj_VentasCompras_Calculos.PROPIEDAD_PrecioPor_SegundaUnidad)
                {
                    //Actualizar Precio
                    g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Precio_Texto;

                    //Actualizar Importe
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe_Texto;

                    //Rellenar Listado Tarifas y promciones
                    Rellenar_DataGridView_TarifasPromociones();

                    //Cargar la promocion por unidad si la tuviera
                    PromocionPorUnidad_CargarDatos();
                }

                //relacion con 2º unidad calculo
                g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional_Relacion_Calculo_Texto;

                g_bol_ModificacionDatosAfectaTrazabilidad = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Cambio_CantidadSecundaria));
            }
        }

        private void Cambio_CantidadSecundaria_VaciarDatos()
        {
            //Relacion 2º unidad calculo
            g_frm_P_ParteLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = "";

            //Solo si el precio es por 2º Unidad
            if (g_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional &&
                g_obj_VentasCompras_Calculos.PROPIEDAD_PrecioPor_SegundaUnidad)
            {

                //Precio
                g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = "0.000";

                //Importe
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = "0.00";

                //Listado de promociones
                g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones.Rows.Clear();
                g_int_TotalRegistrosInsertados_TarifasPromociones = 0;
                g_int_TotalRegistros_TarifasPromociones = 0;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Total = g_int_TotalRegistros_TarifasPromociones;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_TarifasPromociones;

                //Cargar los datos de Promociones por Unidad
                PromocionPorUnidad_Vaciar();
            }
        }
        #endregion

        #region Cambio Precio
        public void Cambio_Precio(decimal? _dcm_Precio)
        {
            try
            {
                //Vaciamos los datos necesarios
                Cambio_Precio_VaciarDatos();

                //Actualizar los valoers en la clase de VentasCompras_Calculos
                g_obj_VentasCompras_Calculos.Cambio_Precio(_dcm_Precio);

                //Actualizar Importe
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe_Texto;

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Cambio_Precio));
            }
        }

        private void Cambio_Precio_VaciarDatos()
        {
            //Importe
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = "0.00";
        }
        #endregion

        #region Cambio DescuentoGeneral
        public void Cambio_DescuentoGeneral(decimal? _dcm_DescuentoGeneral)
        {
            try
            {
                //Vaciamos los datos necesarios
                Cambio_DescuentoGeneral_VaciarDatos();

                //Actualizar los valoers en la clase de VentasCompras_Calculos
                g_obj_VentasCompras_Calculos.Cambio_DescuentoGeneral(_dcm_DescuentoGeneral);

                //Actualizar Importe
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe_Texto;

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Cambio_DescuentoGeneral));
            }
        }

        private void Cambio_DescuentoGeneral_VaciarDatos()
        {
            //Importe
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = "0.00";
        }
        #endregion

        #region Cambio Promocion por Unidad Cantidad Secundaria
        public void Cambio_PromocionPorUnidad_CantidadSecundaria(decimal? _dcm_CantidadSecundaria)
        {
            try
            {
                //Vaciamos los datos necesarios
                Cambio_PromocionPorUnidad_CantidadSecundaria_VaciarDatos();

                //Actualiar los valoers en la clase de VentasCompras_Calculos
                g_obj_VentasCompras_Calculos.Cambio_PromocionPorUnidad_CantidadSecundaria(_dcm_CantidadSecundaria);

                //Solo si el precio es por 2º Unidad
                if (g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Existe &&
                    g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_EsRelacional &&
                    g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_PrecioPor_SegundaUnidad)
                {
                    //Actualizar Importe
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Importe.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Importe_Texto;
                }

                //relacion con 2º unidad calculo
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_RelacionSegundaUnidad_Calculo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional_Relacion_Calculo_Texto;

                g_bol_ModificacionDatosAfectaTrazabilidad = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Cambio_PromocionPorUnidad_CantidadSecundaria));
            }
        }

        private void Cambio_PromocionPorUnidad_CantidadSecundaria_VaciarDatos()
        {
            //Relacion 2º unidad calculo
            g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_RelacionSegundaUnidad_Calculo.Text = "";

            //Solo si el precio es por 2º Unidad
            if (g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Existe &&
                g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_EsRelacional &&
                g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_PrecioPor_SegundaUnidad)
            {
                //Importe
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Importe.Text = "0.00";
            }
        }
        #endregion

        #region Cambio de TarifaPromocion 
        public void Cambio_TarifaPromocion()
        {
            try
            {
                //Vaciamos los datos necesarios
                Cambio_TarifaPromocion_VaciarDatos();

                //Actualizar Precio
                g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Precio_Texto;

                //Actualizar Importe
                g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe_Texto;

                //Rellenar Listado Tarifas y promciones
                Rellenar_DataGridView_TarifasPromociones();

                //Cargar la promocion por unidad si la tuviera
                PromocionPorUnidad_CargarDatos();

                g_bol_ModificacionDatosAfectaTrazabilidad = true;

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Cambio_TarifaPromocion));
            }
        }

        private void Cambio_TarifaPromocion_VaciarDatos()
        {
            //Precio
            g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = "0.000";

            //Importe
            g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = "0.00";

            //Listado de promociones
            if (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones != null)
            {
                while (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.IsBusy)
                    Application.DoEvents();
            }
            g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones.Rows.Clear();
            g_int_TotalRegistrosInsertados_TarifasPromociones = 0;
            g_int_TotalRegistros_TarifasPromociones = 0;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Total = g_int_TotalRegistros_TarifasPromociones;
            g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_TarifasPromociones;

            //Cargar los datos de Promociones por Unidad
            PromocionPorUnidad_Vaciar();
        }

        public void Agregar_TarifaPromocion(long _lng_TarifaPromocion)
        {
            try
            {
                //Agregar la Tarifa/promocion selecconada
                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VentasCompras_Calculos.Agregar_TarifaPromocion_PorSeleccion(_lng_TarifaPromocion);

                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    //Vaciamos los datos necesarios
                    Cambio_TarifaPromocion_VaciarDatos();

                    //Actualizar Precio
                    g_frm_P_ParteLinea.Exferia_TextBox_Precio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Precio_Texto;

                    //Actualizar Importe
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_Importe_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_Importe_Texto;

                    //Rellenar Listado Tarifas y promciones
                    Rellenar_DataGridView_TarifasPromociones();

                    //Cargar la promocion por unidad si la tuviera
                    PromocionPorUnidad_CargarDatos();

                    g_bol_ModificacionDatosAfectaTrazabilidad = true;
                }
                else
                {
                    if (mdl_INTERNO_ValorDevuelto_Modelo.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo.Mensaje);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Agregar_TarifaPromocion));
            }
        }

        #endregion

        #region Promociones por unidad

        private void PromocionPorUnidad_Vaciar()
        {
            try
            {
                //Ocultar el Tab de promocion por Unidad
                g_frm_P_ParteLinea.TabPage_TarifasPromociones_ArticuloEnPromocion.Parent = null;
                g_frm_P_ParteLinea.TabPage_LineasTrazabilidad_ArticuloEnPromocion.Parent = null;

                //Articulo
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Articulo.Text = "";

                //Cantidad
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Cantidad.Text = "";

                //Tipo Embalaje
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_TipoEmbalaje.Text = "";

                //Relacion
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Relacion.Text = "";

                //Relacion calculo
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Relacion_Calculo.Text = "";

                //Precio por
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_PrecioPor.Text = Variables.G_STR_PRECIOPOR_CANTIDAD_DESCRIPCION;
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_PrecioPor.Tag = Variables.G_STR_PRECIOPOR_CANTIDAD_CODIGO;

                //Relacion 2º unidad
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_RelacionSegundaUnidad.Text = "";

                //Relacion 2º unidad  calculo
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_RelacionSegundaUnidad_Calculo.Text = "";

                //Tipo embalaje relacionado
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_TipoEmbalajeRelacionado_Valor.Text = "";

                //2º Unidad
                g_frm_P_ParteLinea.Exferia_TextBox_ArticuloEnPromocion_CantidadRelacional.Text = "";

                //NomenclaturapPrecio
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_NomenclaturaPrecio.Text = "";

                //Precio
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Precio.Text = "";

                //Descuento
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Descuento.Text = "";

                //Importe
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Importe.Text = "";

                //Tipo Impuesto
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_ImpuestoTipo.Text = "";

                //Tipo trazabilidad
                g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_TipoTrazabilidad.Text = "";

                //Vaciar el Listado Trazabilidad
                g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Rows.Clear();
                g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad_ArticuloEnPromocion = 0;
                g_int_TotalRegistros_ParteLineas_Trazabilidad_ArticuloEnPromocion = 0;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Total = g_int_TotalRegistros_ParteLineas_Trazabilidad_ArticuloEnPromocion;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad_ArticuloEnPromocion;

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(PromocionPorUnidad_Vaciar));
            }
        }

        private void PromocionPorUnidad_CargarDatos()
        {
            try
            {
                if (g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    //Articulo
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Articulo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Articulo_Texto;

                    //Cantidad principal
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Cantidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Texto;

                    //Embalaje Principal
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_TipoEmbalaje.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Tipo_Texto;

                    //Relacion
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Relacion.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion_Texto;

                    //Relacion Calculo
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Relacion_Calculo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion_Calculo_Texto;

                    //Nomenclatura
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_NomenclaturaPrecio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NomenclaturaPrecio;

                    //Precio
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Precio.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Precio_Texto;

                    //Descuento
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Descuento.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_DescuentoGeneral_Texto + "%";

                    //Importe
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Importe.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Importe_Texto;

                    //Impuesto Tipo
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_ImpuestoTipo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Texto;

                    //Tipo trazabilidad
                    g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_TipoTrazabilidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Articulo_TipoTrazabilidad_Texto;

                    //Muestra el Panel de Embalaje relacional
                    if (g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_EsRelacional)
                    {
                        //Precio Por
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_PrecioPor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_PrecioPor;
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_PrecioPor.Tag = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_PrecioPor_TAG;

                        //Relacion 2º unidad
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_RelacionSegundaUnidad.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional_Relacion;

                        //relacion con 2º unidad calculo
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_RelacionSegundaUnidad_Calculo.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional_Relacion_Calculo_Texto;

                        //Tipo Embalaje 2º Unidad
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_TipoEmbalajeRelacionado_Valor.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Tipo_Texto;

                        //cantidad 2º unidad
                        g_frm_P_ParteLinea.Exferia_TextBox_ArticuloEnPromocion_CantidadRelacional.Text = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional_Texto;

                        //#########################################################################################################################
                        //Panel de embalaje relacional visible
                        g_frm_P_ParteLinea.Exferia_Panel_Degradado_PromocionPorUnidad_EmbalajeRelacional.Visible = true;

                        //Mover Panel de Precio de articulo en promocion
                        g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios_ArticuloEnPromocion.Location = new Point(g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios_ArticuloEnPromocion.Location.X, (g_frm_P_ParteLinea.Exferia_Panel_Degradado_PromocionPorUnidad_EmbalajeRelacional.Location.Y + g_frm_P_ParteLinea.Exferia_Panel_Degradado_PromocionPorUnidad_EmbalajeRelacional.Height + 5));

                        //Mostrar el panel de Articulo en Promocion
                        g_frm_P_ParteLinea.TabPage_TarifasPromociones_ArticuloEnPromocion.Parent = g_frm_P_ParteLinea.Exferia_TabControl_TarifasPromociones;
                        g_frm_P_ParteLinea.TabPage_LineasTrazabilidad_ArticuloEnPromocion.Parent = g_frm_P_ParteLinea.Exferia_TabControl_LineasTrazabilidad;
                    }
                    //Muestra el Panel de promociones por unidad, pero oculta la parte de 2 Unidad
                    else
                    {
                        //Vaciar el resto
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_PrecioPor.Text = Variables.G_STR_PRECIOPOR_CANTIDAD_DESCRIPCION;
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_PrecioPor.Tag = Variables.G_STR_PRECIOPOR_CANTIDAD_CODIGO;

                        //Relacion 2º unidad
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_RelacionSegundaUnidad.Text = "";

                        //relacion con 2º unidad calculo
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_RelacionSegundaUnidad_Calculo.Text = "";

                        //Tipo Embalaje 2º Unidad
                        g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_TipoEmbalajeRelacionado_Valor.Text = "";

                        //cantidad 2º unidad
                        g_frm_P_ParteLinea.Exferia_TextBox_ArticuloEnPromocion_CantidadRelacional.Text = "";

                        //#########################################################################################################################
                        //Ponerlos oculto el embalaje relacional
                        g_frm_P_ParteLinea.Exferia_Panel_Degradado_PromocionPorUnidad_EmbalajeRelacional.Visible = false;

                        //Mover Panel de Precios
                        g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios_ArticuloEnPromocion.Location = new Point(g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios_ArticuloEnPromocion.Location.X, g_frm_P_ParteLinea.Exferia_Panel_Degradado_PromocionPorUnidad_EmbalajeRelacional.Location.Y);

                        //Mostrar el panel de Articulo en Promocion
                        g_frm_P_ParteLinea.TabPage_TarifasPromociones_ArticuloEnPromocion.Parent = g_frm_P_ParteLinea.Exferia_TabControl_TarifasPromociones;
                        g_frm_P_ParteLinea.TabPage_LineasTrazabilidad_ArticuloEnPromocion.Parent = g_frm_P_ParteLinea.Exferia_TabControl_LineasTrazabilidad;
                    }

                    //Redimencionar el panel CantidadPrecios
                    g_frm_P_ParteLinea.SplitContainer_CantidadPrecios_ArticuloEnPromocion.SplitterDistance = (g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios_ArticuloEnPromocion.Location.Y + g_frm_P_ParteLinea.Exferia_Panel_Degradado_Precios_ArticuloEnPromocion.Size.Height + 6);
                }
                //Oculta el panel de promociones por unidad entero
                else
                {
                    PromocionPorUnidad_Vaciar();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(PromocionPorUnidad_CargarDatos));
            }
        }

        public void PromocionPorUnidad_Desactivar()
        {
            try
            {
                g_obj_VentasCompras_Calculos.Cambio_PromocionPorUnidad_Desactivar();

                PromocionPorUnidad_Vaciar();
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(PromocionPorUnidad_Desactivar));
            }
        }
        #endregion

        public List<MYT_PartesLineas_TarifasPromociones> Obtener_ParteLineas_TarifasPromociones_A_Grabar(long _lng_idParteLinea)
        {
            List<MYT_PartesLineas_TarifasPromociones> lst_MYT_PartesLineas_TarifasPromociones = new List<MYT_PartesLineas_TarifasPromociones>();

            if (g_obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR != null &&
                g_obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR.Count > 0)
            {
                foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in g_obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR)
                {
                    MYT_PartesLineas_TarifasPromociones mdl_MYT_PartesLineas_TarifasPromociones = new MYT_PartesLineas_TarifasPromociones();

                    mdl_MYT_PartesLineas_TarifasPromociones.id = -1;
                    mdl_MYT_PartesLineas_TarifasPromociones.idParteLinea = _lng_idParteLinea;
                    mdl_MYT_PartesLineas_TarifasPromociones.codigo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Codigo;
                    mdl_MYT_PartesLineas_TarifasPromociones.descripcion = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descripcion;
                    mdl_MYT_PartesLineas_TarifasPromociones.descuento_1 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_1;
                    mdl_MYT_PartesLineas_TarifasPromociones.descuento_2 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_2;
                    mdl_MYT_PartesLineas_TarifasPromociones.descuento_3 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_3;
                    mdl_MYT_PartesLineas_TarifasPromociones.descuento_4 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_4;
                    mdl_MYT_PartesLineas_TarifasPromociones.descuento_5 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_5;
                    mdl_MYT_PartesLineas_TarifasPromociones.incremento = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Incremento;
                    mdl_MYT_PartesLineas_TarifasPromociones.numeroRedondeo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NumeroRedondeo;
                    mdl_MYT_PartesLineas_TarifasPromociones.tipo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo;
                    mdl_MYT_PartesLineas_TarifasPromociones.precioFijoDinamico = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico != null ? mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico.Value : Variables.G_INT_TIPOPRECIO_FIJO_CODIGO;
                    mdl_MYT_PartesLineas_TarifasPromociones.precio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio;
                    mdl_MYT_PartesLineas_TarifasPromociones.idNomenclaturaPrecio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id;
                    mdl_MYT_PartesLineas_TarifasPromociones.descuentoMoneda = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_DescuentoMoneda;
                    mdl_MYT_PartesLineas_TarifasPromociones.AB_Cantidad_A = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A;
                    mdl_MYT_PartesLineas_TarifasPromociones.AB_Cantidad_B = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B;
                    mdl_MYT_PartesLineas_TarifasPromociones.AB_Porcentaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje;
                    mdl_MYT_PartesLineas_TarifasPromociones.AB_idArticulo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id;
                    mdl_MYT_PartesLineas_TarifasPromociones.AB_idEmbalaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id;
                    mdl_MYT_PartesLineas_TarifasPromociones.AB_Cancelado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cancelado;
                    mdl_MYT_PartesLineas_TarifasPromociones.orden = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden;
                    mdl_MYT_PartesLineas_TarifasPromociones.mensaje_Error = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Mensaje_Error;
                    mdl_MYT_PartesLineas_TarifasPromociones.desactivado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Desactivado;
                    mdl_MYT_PartesLineas_TarifasPromociones.noAplicarTarifa = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.NoAplicarTarifa;
                    mdl_MYT_PartesLineas_TarifasPromociones.aplicadaEnLinea = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.AplicadaEnLinea;

                    //CONDICIONANTES #############################################################################################################################
                    if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes != null &&
                        mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes.Count > 0)
                    {
                        mdl_MYT_PartesLineas_TarifasPromociones.MYT_PartesLineas_TarifasPromociones_Condicionantes = new List<MYT_PartesLineas_TarifasPromociones_Condicionantes>();

                        foreach (INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo in mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes)
                        {
                            MYT_PartesLineas_TarifasPromociones_Condicionantes mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes = new MYT_PartesLineas_TarifasPromociones_Condicionantes();

                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.id = -1;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.idParteLineaTarifaPromocion = -1;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.condicionante_Y_O = null;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.importe_Desde_Operador = null;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.importe_Desde_Valor = null;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.importe_Hasta_Operador = null;
                            mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes.importe_Hasta_Valor = null;

                            //Añadir al listado e condicionantes
                            mdl_MYT_PartesLineas_TarifasPromociones.MYT_PartesLineas_TarifasPromociones_Condicionantes.Add(mdl_MYT_PartesLineas_TarifasPromociones_Condicionantes);
                        }
                    }
                    else
                    {
                        mdl_MYT_PartesLineas_TarifasPromociones.MYT_PartesLineas_TarifasPromociones_Condicionantes = null;
                    }

                    //Añadir al Listado
                    lst_MYT_PartesLineas_TarifasPromociones.Add(mdl_MYT_PartesLineas_TarifasPromociones);
                }
            }

            return lst_MYT_PartesLineas_TarifasPromociones;
        }

        public MYT_PartesLineas Obtener_ParteLineas_PromocionPorUnidad_Grabar(long _lng_idParteLinea, int _int_NumeroLinea)
        {
            MYT_PartesLineas mdl_MYT_PartesLineas = null;
            long? lng_Nulo = null;
            if (g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Existe)
            {

                mdl_MYT_PartesLineas = new MYT_PartesLineas();

                //id
                mdl_MYT_PartesLineas.id = (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null && g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null) ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.id : -1;

                //idParte
                mdl_MYT_PartesLineas.idParte = g_mdl_INTERNO_MYT_Partes_Modelo.id;

                //fechaHora
                mdl_MYT_PartesLineas.fechaHora = (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null && g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null) ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.fechaHora : g_mdl_INTERNO_MYT_Partes_Modelo.fechaHoraRecepcion.Value;

                //numeroLinea
                if (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null &&
                    g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null)
                {
                    mdl_MYT_PartesLineas.numero = g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.numero;
                }
                //Sino tenia numero de linea, miramos si ya hay alguna linea grabada, para poner la ultima +1
                else
                {
                    mdl_MYT_PartesLineas.numero = _int_NumeroLinea + 1;
                }

                //idTecnico
                mdl_MYT_PartesLineas.idTecnico = (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null && g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null) ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.idTecnico : null;

                //idTerminal
                mdl_MYT_PartesLineas.idTerminal = (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null && g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null) ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.idTerminal : null;

                //TipoCompraVenta 
                mdl_MYT_PartesLineas.idTipoCompraVenta = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_TipoCompraVenta_Id;

                //idPedidoLinea
                mdl_MYT_PartesLineas.idPedidoLinea = null;

                //idArticulo
                mdl_MYT_PartesLineas.idArticulo = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Articulo_Id;

                //idArticuloComodin
                mdl_MYT_PartesLineas.idArticuloComodin = null;

                //cantidad
                mdl_MYT_PartesLineas.cantidad = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal;

                //idEmbalaje
                mdl_MYT_PartesLineas.idEmbalaje = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Id;

                //relacion
                mdl_MYT_PartesLineas.relacion = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion;

                //operacion
                mdl_MYT_PartesLineas.operacion = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Operacion;

                //segundaUnidad_Precio_Cantidad_SegundaUnidad
                mdl_MYT_PartesLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_PrecioPor_SegundaUnidad_Entero;

                //segundaUnidad_relacion
                mdl_MYT_PartesLineas.segundaUnidad_relacion = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Relacion;

                //segundaUnidad_idEmbalaje
                mdl_MYT_PartesLineas.segundaUnidad_idEmbalaje = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Id;

                //segundaUnidad_cantidad
                mdl_MYT_PartesLineas.segundaUnidad_cantidad = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional;

                //idNomenclaturaPrecio
                mdl_MYT_PartesLineas.idNomenclaturaPrecio = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NomenclaturaPrecio_Id;

                //precio
                mdl_MYT_PartesLineas.precio = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Precio;

                //numeroRedondeo
                mdl_MYT_PartesLineas.numeroRedondeo = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NumeroRedondeo;

                //descuentoGeneral
                mdl_MYT_PartesLineas.descuentoGeneral = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_DescuentoGeneral;

                //importe
                mdl_MYT_PartesLineas.importe = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Importe;

                //idImpuestoTipo
                mdl_MYT_PartesLineas.idImpuestoTipo = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Id;

                //id_Padre
                mdl_MYT_PartesLineas.id_Padre = _lng_idParteLinea;

                //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
                //embalajePrincipalDelArticulo_idEmbalaje
                mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_idEmbalaje = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_IdEmbalaje;

                //embalajePrincipalDelArticulo_relacion
                mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_relacion = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                //embalajePrincipalDelArticulo_operacion
                mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_operacion = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                //embalajePrincipalDelArticulo_precio
                mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_precio = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Precio;

                //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                //embalajePrincipalDelArticulo_segundaUnidad_relacion
                mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                mdl_MYT_PartesLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                //guid
                mdl_MYT_PartesLineas.guid = (g_mdl_INTERNO_MYT_PartesLineas_Modelo != null && g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion != null) ? g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.guid : g_mdl_INTERNO_MYT_Partes_Modelo.guid;

                //fechaBorrado
                mdl_MYT_PartesLineas.fechaBorrado = null;

                //idRetencionTipo
                mdl_MYT_PartesLineas.idRetencionTipo = g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_RetencionTipo_Id > -1 ? g_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_RetencionTipo_Id : lng_Nulo;

            }

            return mdl_MYT_PartesLineas;
        }

        #endregion

        #region Tarifas/Promociones
        #region  Rellenar el DataGridView de Tarifas/Promociones
        private void Rellenar_DataGridView_TarifasPromociones()
        {
            try
            {
                if (g_obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado != null)
                {
                    // Si la tarea asincrona esta en marcha la paro
                    if (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones != null)
                    {
                        while (g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.IsBusy)
                            Application.DoEvents();
                    }
                    else
                    {
                        g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones = new BackgroundWorker();
                        g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGridView_TarifasPromociones_DoWork);
                        g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGridView_TarifasPromociones_ProgressChanged);
                        g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGridView_TarifasPromociones_Completed);
                        g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.WorkerReportsProgress = true;
                        g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.WorkerSupportsCancellation = true;
                    }

                    //Vaciar datos
                    g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones.Rows.Clear();
                    g_int_TotalRegistrosInsertados_TarifasPromociones = 0;
                    g_int_TotalRegistros_TarifasPromociones = 0;
                    g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Total = g_int_TotalRegistros_TarifasPromociones;
                    g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_TarifasPromociones;

                    //(Tarea Asincrona) Cargar Datos ##################################################################
                    g_obj_TareaAsincrona_Rellenar_DataGridView_TarifasPromociones.RunWorkerAsync();
                    //#################################################################################################
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Rellenar_DataGridView_TarifasPromociones));
            }
        }
        private void TareaAsincrona_Rellenar_DataGridView_TarifasPromociones_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Total
                g_int_TotalRegistros_TarifasPromociones = g_obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado.Count;

                foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in g_obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado.OrderBy(m => m.Orden))
                {
                    //Se Cancelo la tarea asincrona 
                    if (((BackgroundWorker)sender).CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }

                    //Progreso
                    g_int_TotalRegistrosInsertados_TarifasPromociones += 1;

                    //Añadir al DataGridView
                    ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_TarifaPromocion(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo, null));

                    //Esperar un poco
                    Thread.Sleep(1);
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGridView_TarifasPromociones_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGridView_TarifasPromociones_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGridView_TarifasPromociones_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid 
                g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Total = g_int_TotalRegistros_TarifasPromociones;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_TarifasPromociones.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_TarifasPromociones;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGridView_TarifasPromociones_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        public DataGridViewRow Transformar_Modelo_A_Row_TarifaPromocion(INTERNO_TarifaPromocion_VentasCompras_Modelo _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_ParteLinea.Exferia_DataGridView_TarifasPromociones);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_TarifasPromociones_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                    else
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = null;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                    else
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = null;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }
        #endregion

        #region Tarifas/Promociones Borrar Datos

        public void TarifasPromociones_BorrarDatos(List<long> _lst_IdsABorrar)
        {
            try
            {
                g_frm_P_ParteLinea.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                g_obj_TareaAsincrona_TarifasPromociones_BorrarDatos = new BackgroundWorker();
                g_obj_TareaAsincrona_TarifasPromociones_BorrarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_TarifasPromociones_BorrarDatos_DoWork);
                g_obj_TareaAsincrona_TarifasPromociones_BorrarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_TarifasPromociones_BorrarDatos_Completed);
                g_obj_TareaAsincrona_TarifasPromociones_BorrarDatos.RunWorkerAsync(_lst_IdsABorrar);

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
                g_frm_P_ParteLinea.Enabled = true;

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

            try
            {
                List<long> lst_idsABorrar = (List<long>)e.Argument;

                mdl_ValorDevuelto_Modelo = TarifasPromociones_BorrarDatos_Final(lst_idsABorrar);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_TarifasPromociones_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, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_TarifasPromociones_BorrarDatos_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_TarifasPromociones_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }
            g_frm_P_ParteLinea.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_ParteLinea, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }
                }
                else
                {
                    Cambio_TarifaPromocion();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_TarifasPromociones_BorrarDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo TarifasPromociones_BorrarDatos_Final(List<long> _lst_idsABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Borrar del listado TarifasPromociones
                g_obj_VentasCompras_Calculos.Cambio_TarifaPromocion_Borrar(_lst_idsABorrar);
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TarifasPromociones_BorrarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #endregion

        #endregion

        #region Comentarios
        public void Crear_Comentario_Linea(INTERNO_LineasComentarios_Modelo _mdl_INTERNO_LineasComentarios_Modelo, bool _bol_PonerFoco)
        {
            //Añadir control creado en subproceso en el hilo principal ...................................
            if (g_frm_P_ParteLinea.InvokeRequired)
            {
                g_frm_P_ParteLinea.Invoke((MethodInvoker)delegate
                {
                    Crear_Comentario_Linea(_mdl_INTERNO_LineasComentarios_Modelo, _bol_PonerFoco);
                });
                return;
            }

            g_int_NumeroLineas_Comentarios += 1;

            //Calcular tamaño del panel ##################
            int int_AnchopanelPrincipal = (712 * g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Width) / 722;
            if (g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Controls != null && g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Controls.Count > 0 && g_Array_ListadoLineas_Comentarios.Count > 0)
            {
                int_AnchopanelPrincipal = g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + g_Array_ListadoLineas_Comentarios[0], false).FirstOrDefault().Width;
            }

            //Objeto Personalizado
            CTU_P_ParteLinea_Comentarios controlusuarios_CTU_P_ParteLinea_Comentarios = new CTU_P_ParteLinea_Comentarios(_mdl_INTERNO_LineasComentarios_Modelo, g_int_NumeroLineas_Comentarios);
            controlusuarios_CTU_P_ParteLinea_Comentarios.Name = "controlusuarios_CTU_P_ParteLinea_Comentarios" + g_int_NumeroLineas_Comentarios;
            controlusuarios_CTU_P_ParteLinea_Comentarios.Size = new Size(int_AnchopanelPrincipal, 300);
            controlusuarios_CTU_P_ParteLinea_Comentarios.Location = new Point(5, 5);
            controlusuarios_CTU_P_ParteLinea_Comentarios.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left);
            controlusuarios_CTU_P_ParteLinea_Comentarios.Boton_CTU_P_ParteLinea_Comentarios_Delete_Click += new System.EventHandler<INTERNO_EventArgs>(Boton_P_ParteLinea_Comentarios_Delete_Click);

            //Añadir al panel principal
            g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Controls.Add(controlusuarios_CTU_P_ParteLinea_Comentarios);
            g_Array_ListadoLineas_Comentarios.Add(g_int_NumeroLineas_Comentarios);

            //Se rueda el Resto
            CTU_P_ParteLinea_Comentarios obj_aCambiar;
            int int_PosicionY = controlusuarios_CTU_P_ParteLinea_Comentarios.Location.Y + controlusuarios_CTU_P_ParteLinea_Comentarios.Height + 5;
            foreach (int valoresModificarposicion in g_Array_ListadoLineas_Comentarios.Where(m => m < g_int_NumeroLineas_Comentarios).OrderByDescending(m => m).ToList())
            {
                obj_aCambiar = (CTU_P_ParteLinea_Comentarios)g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + valoresModificarposicion, false).FirstOrDefault();
                obj_aCambiar.Location = new Point(obj_aCambiar.Location.X, int_PosicionY);

                int_PosicionY = obj_aCambiar.Location.Y + obj_aCambiar.Height + 5;
            }

            if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_MYT_PARTELINEA_COMENTARIOS, g_frm_P_ParteLinea.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, false)) == false)
            {
                //Bloqueo los Controles
                SoloLectura.Empezar(controlusuarios_CTU_P_ParteLinea_Comentarios, true);
            }

            //Poner el Foco
            if (_bol_PonerFoco)
            {
                controlusuarios_CTU_P_ParteLinea_Comentarios.Poner_Foco();
            }
        }
        private void Boton_P_ParteLinea_Comentarios_Delete_Click(object sender, INTERNO_EventArgs e)
        {
            if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_MYT_PARTELINEA_COMENTARIOS, g_frm_P_ParteLinea.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Borrar, true)))
            {
                g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = true;

                CTU_P_ParteLinea_Comentarios obj_CTU_Lineas_Comentarios_Borar = (CTU_P_ParteLinea_Comentarios)g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + e.NumeroObjeto, false).FirstOrDefault();
                obj_CTU_Lineas_Comentarios_Borar.Dispose();

                g_Array_ListadoLineas_Comentarios.Remove(e.NumeroObjeto);

                CTU_P_ParteLinea_Comentarios obj_aCambiar;
                foreach (int valoresModificarposicion in g_Array_ListadoLineas_Comentarios.Where(m => m < e.NumeroObjeto).ToList())
                {
                    obj_aCambiar = (CTU_P_ParteLinea_Comentarios)g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + valoresModificarposicion, false).FirstOrDefault();
                    obj_aCambiar.Location = new Point(obj_aCambiar.Location.X, obj_aCambiar.Location.Y - (300 + 5));
                }
            }
        }
        private List<MYT_PartesLineas_Comentarios> Obtener_Comentarios_AGrabar(long _lng_idParteLinea)
        {
            List<MYT_PartesLineas_Comentarios> lst_MYT_PartesLineas_Comentarios = new List<MYT_PartesLineas_Comentarios>();
            CTU_P_ParteLinea_Comentarios obj_CTU_Lineas_Comentarios = null;
            foreach (int int_ValorLinea in g_Array_ListadoLineas_Comentarios)
            {
                obj_CTU_Lineas_Comentarios = (CTU_P_ParteLinea_Comentarios)g_frm_P_ParteLinea.Exferia_Panel_Degradado_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + int_ValorLinea, true).FirstOrDefault();

                if (obj_CTU_Lineas_Comentarios != null)
                {
                    INTERNO_LineasComentarios_Modelo mdl_INTERNO_LineasComentarios_Modelo = obj_CTU_Lineas_Comentarios.Obtener(_lng_idParteLinea);
                    if (mdl_INTERNO_LineasComentarios_Modelo != null)
                    {
                        MYT_PartesLineas_Comentarios mdl_MYT_PartesLineas_Comentarios = new MYT_PartesLineas_Comentarios();
                        mdl_MYT_PartesLineas_Comentarios.id = mdl_INTERNO_LineasComentarios_Modelo.id;
                        mdl_MYT_PartesLineas_Comentarios.idParteLinea = _lng_idParteLinea;
                        mdl_MYT_PartesLineas_Comentarios.comentario = mdl_INTERNO_LineasComentarios_Modelo.comentario;
                        mdl_MYT_PartesLineas_Comentarios.mostrarImpresion = mdl_INTERNO_LineasComentarios_Modelo.mostrarImpresion;

                        //Añadir al Listado
                        lst_MYT_PartesLineas_Comentarios.Add(mdl_MYT_PartesLineas_Comentarios);
                    }
                }
            }
            return lst_MYT_PartesLineas_Comentarios;
        }
        #endregion

        #region Comentarios ArticuloEnPromocion
        public void Crear_ArticuloEnPromocion_Comentario_Linea(INTERNO_LineasComentarios_Modelo _mdl_INTERNO_LineasComentarios_Modelo, bool _bol_PonerFoco)
        {
            //Añadir control creado en subproceso en el hilo principal ...................................
            if (g_frm_P_ParteLinea.InvokeRequired)
            {
                g_frm_P_ParteLinea.Invoke((MethodInvoker)delegate
                {
                    Crear_ArticuloEnPromocion_Comentario_Linea(_mdl_INTERNO_LineasComentarios_Modelo, _bol_PonerFoco);
                });
                return;
            }

            g_int_NumeroLineas_Comentarios_ArticuloEnPromocion += 1;

            //Calcular tamaño del panel ##################
            int int_AnchopanelPrincipal = (712 * g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Width) / 722;
            if (g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Controls != null && g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Controls.Count > 0 && g_Array_ListadoLineas_Comentarios_ArticuloEnPromocion.Count > 0)
            {
                int_AnchopanelPrincipal = g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + g_Array_ListadoLineas_Comentarios_ArticuloEnPromocion[0], false).FirstOrDefault().Width;
            }

            //Objeto Personalizado
            CTU_P_ParteLinea_Comentarios controlusuarios_CTU_P_ParteLinea_Comentarios = new CTU_P_ParteLinea_Comentarios(_mdl_INTERNO_LineasComentarios_Modelo, g_int_NumeroLineas_Comentarios_ArticuloEnPromocion);
            controlusuarios_CTU_P_ParteLinea_Comentarios.Name = "controlusuarios_CTU_P_ParteLinea_Comentarios" + g_int_NumeroLineas_Comentarios_ArticuloEnPromocion;
            controlusuarios_CTU_P_ParteLinea_Comentarios.Size = new Size(int_AnchopanelPrincipal, 300);
            controlusuarios_CTU_P_ParteLinea_Comentarios.Location = new Point(5, 5);
            controlusuarios_CTU_P_ParteLinea_Comentarios.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left);
            controlusuarios_CTU_P_ParteLinea_Comentarios.Boton_CTU_P_ParteLinea_Comentarios_Delete_Click += new System.EventHandler<INTERNO_EventArgs>(Boton_P_ParteLinea_ArticuloEnPromocion_Comentarios_Delete_Click);

            //Añadir al panel principal
            g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Controls.Add(controlusuarios_CTU_P_ParteLinea_Comentarios);
            g_Array_ListadoLineas_Comentarios_ArticuloEnPromocion.Add(g_int_NumeroLineas_Comentarios_ArticuloEnPromocion);

            //Se rueda el Resto
            CTU_P_ParteLinea_Comentarios obj_aCambiar;
            int int_PosicionY = controlusuarios_CTU_P_ParteLinea_Comentarios.Location.Y + controlusuarios_CTU_P_ParteLinea_Comentarios.Height + 5;
            foreach (int valoresModificarposicion in g_Array_ListadoLineas_Comentarios_ArticuloEnPromocion.Where(m => m < g_int_NumeroLineas_Comentarios_ArticuloEnPromocion).OrderByDescending(m => m).ToList())
            {
                obj_aCambiar = (CTU_P_ParteLinea_Comentarios)g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + valoresModificarposicion, false).FirstOrDefault();
                obj_aCambiar.Location = new Point(obj_aCambiar.Location.X, int_PosicionY);

                int_PosicionY = obj_aCambiar.Location.Y + obj_aCambiar.Height + 5;
            }

            if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_MYT_PARTELINEA_COMENTARIOS, g_frm_P_ParteLinea.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, false)) == false)
            {
                //Bloqueo los Controles
                SoloLectura.Empezar(controlusuarios_CTU_P_ParteLinea_Comentarios, true);
            }

            //Poner el Foco
            if (_bol_PonerFoco)
            {
                controlusuarios_CTU_P_ParteLinea_Comentarios.Poner_Foco();
            }
        }
        private void Boton_P_ParteLinea_ArticuloEnPromocion_Comentarios_Delete_Click(object sender, INTERNO_EventArgs e)
        {
            if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_MYT_PARTELINEA_COMENTARIOS, g_frm_P_ParteLinea.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Borrar, true)))
            {
                g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = true;

                CTU_P_ParteLinea_Comentarios obj_CTU_Lineas_Comentarios_Borar = (CTU_P_ParteLinea_Comentarios)g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + e.NumeroObjeto, false).FirstOrDefault();
                obj_CTU_Lineas_Comentarios_Borar.Dispose();

                g_Array_ListadoLineas_Comentarios.Remove(e.NumeroObjeto);

                CTU_P_ParteLinea_Comentarios obj_aCambiar;
                foreach (int valoresModificarposicion in g_Array_ListadoLineas_Comentarios_ArticuloEnPromocion.Where(m => m < e.NumeroObjeto).ToList())
                {
                    obj_aCambiar = (CTU_P_ParteLinea_Comentarios)g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + valoresModificarposicion, false).FirstOrDefault();
                    obj_aCambiar.Location = new Point(obj_aCambiar.Location.X, obj_aCambiar.Location.Y - (300 + 5));
                }
            }
        }
        private List<MYT_PartesLineas_Comentarios> Obtener_ArticuloEnPromocion_Comentarios_AGrabar(long _lng_idParteLinea)
        {
            List<MYT_PartesLineas_Comentarios> lst_MYT_PartesLineas_Comentarios = new List<MYT_PartesLineas_Comentarios>();
            CTU_P_ParteLinea_Comentarios obj_CTU_Lineas_Comentarios = null;
            foreach (int int_ValorLinea in g_Array_ListadoLineas_Comentarios_ArticuloEnPromocion)
            {
                obj_CTU_Lineas_Comentarios = (CTU_P_ParteLinea_Comentarios)g_frm_P_ParteLinea.Exferia_Panel_Degradado_ArticuloEnPromocion_Comentarios.Controls.Find("controlusuarios_CTU_P_ParteLinea_Comentarios" + int_ValorLinea, true).FirstOrDefault();

                if (obj_CTU_Lineas_Comentarios != null)
                {
                    INTERNO_LineasComentarios_Modelo mdl_INTERNO_LineasComentarios_Modelo = obj_CTU_Lineas_Comentarios.Obtener(_lng_idParteLinea);
                    if (mdl_INTERNO_LineasComentarios_Modelo != null)
                    {
                        MYT_PartesLineas_Comentarios mdl_MYT_PartesLineas_Comentarios = new MYT_PartesLineas_Comentarios();
                        mdl_MYT_PartesLineas_Comentarios.id = mdl_INTERNO_LineasComentarios_Modelo.id;
                        mdl_MYT_PartesLineas_Comentarios.idParteLinea = _lng_idParteLinea;
                        mdl_MYT_PartesLineas_Comentarios.comentario = mdl_INTERNO_LineasComentarios_Modelo.comentario;
                        mdl_MYT_PartesLineas_Comentarios.mostrarImpresion = mdl_INTERNO_LineasComentarios_Modelo.mostrarImpresion;

                        //Añadir al Listado
                        lst_MYT_PartesLineas_Comentarios.Add(mdl_MYT_PartesLineas_Comentarios);
                    }
                }
            }
            return lst_MYT_PartesLineas_Comentarios;
        }
        #endregion

        #region Trazabilidad 

        #region Rellenar DataGrid Parte Linea Trazabilidad
        public void Rellenar_DataGrid_ParteLineas_Trazabilidad()
        {
            try
            {
                if (g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad != null)
                {
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad.CancelAsync();
                    while (g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_DoWork);
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ProgressChanged);
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_Completed);
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Clear();
                g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad = 0;
                g_int_TotalRegistros_ParteLineas_Trazabilidad = 0;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total = g_int_TotalRegistros_ParteLineas_Trazabilidad;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Rellenar_DataGrid_ParteLineas_Trazabilidad));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo = Filtrar_ParteLineas_Trazabilidad();

                if (lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo != null && lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_ParteLineas_Trazabilidad = lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Count;

                    //Recorrer campos Long_Text para saber si lo pongo tipo text o tipo long
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ParteLineas_Trazabilidad_Columnas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_MYT_PartesLineas_Trazabilidad.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach (INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo in lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_ParteLineas_Trazabilidad(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de LineasTrazabilidad
                g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total = g_int_TotalRegistros_ParteLineas_Trazabilidad;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_ParteLinea.ParteLineas_Trazabilidad_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_ParteLineas_Trazabilidad(INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo _mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ParteLineas_Trazabilidad_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                    else
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = null;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                    else
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = null;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> Filtrar_ParteLineas_Trazabilidad()
        {
            List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> lst_Devolver = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo;

            //Filtros Avanzados
            if (g_dct_ListadoFiltros_MYT_PartesLineas_Trazabilidad != null && g_dct_ListadoFiltros_MYT_PartesLineas_Trazabilidad.Count > 0)
            {
                lst_Devolver = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo>(g_dct_ListadoFiltros_MYT_PartesLineas_Trazabilidad, g_obj_ABS_Listado_MYT_PartesLineas_Trazabilidad)).ToList();
            }

            return lst_Devolver;
        }
        #endregion

        public void ParteLineas_Trazabilidad_Actualizar_Registro(long _lng_idParteLineaTrazabilidad, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo = g_obj_MYT_PartesLineas_Trazabilidad_Datos.Obtener_Registro_Para_Listado_Por_Id(_lng_idParteLineaTrazabilidad);

                if (mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo != null && g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Count > 0)
                    {
                        INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Where(m => m.id.Equals(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.id)).FirstOrDefault();
                        if (mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo[g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.FindIndex(m => m.id.Equals(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.id))] = mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Add(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo == null)
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo = new List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo>();
                        }

                        g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Add(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo);
                    }

                    //Actualizar el DataGridView #####################################################################################
                    //Modificar
                    if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                    {
                        DataGridViewRow row = g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Rows
                                     .Cast<DataGridViewRow>()
                                     .Where(r => r.Cells[nameof(INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.id)].Value.Equals(_lng_idParteLineaTrazabilidad)).FirstOrDefault();

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_ParteLineas_Trazabilidad(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, row);

                            //Ordenar Listado
                            g_frm_P_ParteLinea.ParteLineas_Trazabilidad_Ordenar_DataGridView();
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Add(Transformar_Modelo_A_Row_ParteLineas_Trazabilidad(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo, null));

                        //Sumar Cantidad de Lineas Insertadas
                        g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total += 1;
                        g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad + 1;

                        //Ordenar Listado
                        g_frm_P_ParteLinea.ParteLineas_Trazabilidad_Ordenar_DataGridView();
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(ParteLineas_Trazabilidad_Actualizar_Registro));
            }

        }
        public void ParteLineas_Trazabilidad_Borrar_Registro(List<long> _lst_idParteLineaTrazabilidad)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo != null && g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Where(m => _lst_idParteLineaTrazabilidad.Contains(m.id)).ToList();
                    if (lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo in lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Remove(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idParteLineaTrazabilidad.Contains(long.Parse(r.Cells[nameof(INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Lineas Borradas
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total -= _lst_idParteLineaTrazabilidad.Count();
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad - _lst_idParteLineaTrazabilidad.Count();

                g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = false;

                //Se pone para que se actualice el listado para el paginado
                Filtrar_ParteLineas_Trazabilidad();
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(ParteLineas_Trazabilidad_Borrar_Registro));
            }
        }

        #region Borrar Datos ParteLineas_Trazabilidad
        public void BorrarDatos_ParteLineas_Trazabilidad(List<long> _lst_idParteLineaTrazabilidad_ABorrar)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_ParteLinea.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idParteLineaTrazabilidad_ABorrar);

                    g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad = new BackgroundWorker();
                    g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_DoWork);
                    g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_Completed);
                    g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad.RunWorkerAsync(lst_Argumentos);

                    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_ParteLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(BorrarDatos_ParteLineas_Trazabilidad));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }

        private void TareaAsincrona_Borrar_ParteLineas_Trazabilidad_DoWork(object sender, DoWorkEventArgs e)
        {
            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, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idParteLineaTrazabilidad_ABorrar = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = BorrarDatos_Final_ParteLineas_Trazabilidad(lst_idParteLineaTrazabilidad_ABorrar);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idParteLineaTrazabilidad_ABorrar;
                        mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_DoWork));

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Control_Errores)
                {
                    transaccion_SQL.Dispose();

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_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_Borrar_ParteLineas_Trazabilidad_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear Formulario
            g_frm_P_ParteLinea.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
                {
                    // Devolver al Listado el Row Borrar En Parte Lineas ..........................................
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(Variables.G_STR_OPCION_MYT_PARTELINEA_TRAZABILIDAD);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);
                    lst_obj.Add(false);

                    g_frm_P_ParteLinea.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //En Parte , se envia el idLinea actual para que recargue las trazabilidades .........................................................
                    List<object> lst_obj_AUX = new List<object>();
                    lst_obj_AUX.Add(Variables.G_STR_OPCION_MYT_PARTELINEA_TRAZABILIDAD);
                    lst_obj_AUX.Add(g_mdl_INTERNO_MYT_PartesLineas_Modelo.id);
                    g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj_AUX, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //Poner que no se ha modificado nada, apra que no vuelva a preguntar para grabar
                    g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_Completed));
            }
            finally
            {
                //Poner el Foco Inicial
                Funciones.Poner_Foco_Objeto(g_frm_P_ParteLinea, g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_TextBox_Codigo);
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final_ParteLineas_Trazabilidad(List<long> _lst_idParteLineaTrazabilidad_ABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_MYT_PartesLineas_Trazabilidad_Datos.Borrar(_lst_idParteLineaTrazabilidad_ABorrar);
            }
            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, nameof(P_ParteLinea_Controladora) + "/" + nameof(BorrarDatos_Final_ParteLineas_Trazabilidad));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Totales
        public void MostrarOcultar_Resumen_Totales_Trazabilidad(bool _bol_MostrarOcultar)
        {
            //Mostrar
            if (_bol_MostrarOcultar)
            {
                g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ResumenTotales_Principal.Location = new Point(g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ResumenTotales_Principal.Location.X, g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ResumenTotales_Relacional.Location.Y - 47);
                g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ResumenTotales_Relacional.Visible = true;
            }
            //Ocultar
            else
            {
                g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ResumenTotales_Relacional.Visible = false;
                g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ResumenTotales_Principal.Location = new Point(g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ResumenTotales_Principal.Location.X, g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ResumenTotales_Relacional.Location.Y);
            }

            g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Size = new Size(g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Size.Width, (g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ResumenTotales_Principal.Location.Y - g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.Location.Y) - 27);

            //Rellenar el Resumen de los Totales de la Trazabilidad
            Rellenar_Resumen_Totales_Trazabilidad();
        }
        public void Rellenar_Resumen_Totales_Trazabilidad()
        {
            try
            {
                string str_TipoEmbalaje_Principal = "";
                decimal dcm_Total_Movimiento_Principal = 0;
                decimal dcm_Total_Trazado_Principal = 0;
                decimal dcm_Total_Diferencia_Principal = 0;

                string str_TipoEmbalaje_Relacionado = "";
                decimal dcm_Total_Movimiento_Relacionado = 0;
                decimal dcm_Total_Trazado_Relacionado = 0;
                decimal dcm_Total_Diferencia_Relacionado = 0;

                //Tipos de Embalajes
                str_TipoEmbalaje_Principal = g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.Text;

                //Principal
                if (g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text.Trim().Length > 0)
                {
                    dcm_Total_Movimiento_Principal = decimal.Parse(g_frm_P_ParteLinea.Exferia_TextBox_Cantidad.Text.Replace(".", ","));
                }
                if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo != null && g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Count > 0)
                {
                    dcm_Total_Trazado_Principal = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Sum(m => m.cantidad);
                }
                dcm_Total_Diferencia_Principal = dcm_Total_Movimiento_Principal - dcm_Total_Trazado_Principal;

                //Relacionado
                if (g_frm_P_ParteLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible)
                {
                    str_TipoEmbalaje_Relacionado = g_frm_P_ParteLinea.Exferia_Label_SinColor_TipoEmbalajeRelacionado_Valor.Text;
                }
                if (g_frm_P_ParteLinea.Exferia_TextBox_SegundaUnidad.Text.Trim().Length > 0)
                {
                    dcm_Total_Movimiento_Relacionado = decimal.Parse(g_frm_P_ParteLinea.Exferia_TextBox_SegundaUnidad.Text.Replace(".", ","));
                }
                if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo != null && g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Count > 0)
                {
                    dcm_Total_Trazado_Relacionado = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.Where(m => m.segundaUnidad_cantidad != null).Sum(m => m.segundaUnidad_cantidad.Value);
                }
                dcm_Total_Diferencia_Relacionado = dcm_Total_Movimiento_Relacionado - dcm_Total_Trazado_Relacionado;

                //Rellenar Etiquetas
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_TipoEmbalaje_Principal.Text = str_TipoEmbalaje_Principal;
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Movimiento_Principal.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Movimiento_Principal, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Trazado_Principal.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Trazado_Principal, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Diferencia_Principal.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Diferencia_Principal, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_TipoEmbalaje_Relacionado.Text = str_TipoEmbalaje_Relacionado;
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Movimiento_Relacionado.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Movimiento_Relacionado, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Trazado_Relacionado.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Trazado_Relacionado, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Diferencia_Relacionado.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Diferencia_Relacionado, 3));
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Rellenar_Resumen_Totales_Trazabilidad));
            }
        }
        #endregion

        #endregion

        #region Trazabilidad Articulo en promocion

        #region Rellenar DataGrid Parte Linea Trazabilidad Articulo en promocion
        public void Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion()
        {
            try
            {
                if (g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion!=null)
                {
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion.CancelAsync();
                    while (g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion_DoWork);
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion_ProgressChanged);
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion_Completed);
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Rows.Clear();
                g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad_ArticuloEnPromocion = 0;
                g_int_TotalRegistros_ParteLineas_Trazabilidad_ArticuloEnPromocion = 0;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Total = g_int_TotalRegistros_ParteLineas_Trazabilidad_ArticuloEnPromocion;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad_ArticuloEnPromocion;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> lst_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo = Filtrar_ParteLineas_Trazabilidad_ArticuloEnPromocion();

                if (lst_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo != null && lst_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_ParteLineas_Trazabilidad_ArticuloEnPromocion = lst_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo.Count;

                    //Recorrer campos Long_Text para saber si lo pongo tipo text o tipo long
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ParteLineas_Trazabilidad_ArticuloEnPromocion_Columnas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

                    foreach (INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo in lst_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad_ArticuloEnPromocion += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_ParteLineas_Trazabilidad_ArticuloEnPromocion(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de LineasTrazabilidad_ArticuloEnPromocion
                g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Total = g_int_TotalRegistros_ParteLineas_Trazabilidad_ArticuloEnPromocion;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad_ArticuloEnPromocion;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ParteLineas_Trazabilidad_ArticuloEnPromocion_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_ParteLinea.ParteLineas_Trazabilidad_ArticuloEnPromocion_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_ParteLineas_Trazabilidad_ArticuloEnPromocion(INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo _mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ParteLineas_Trazabilidad_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                    else
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = null;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                    else
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = null;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> Filtrar_ParteLineas_Trazabilidad_ArticuloEnPromocion()
        {
            List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> lst_Devolver = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion;

            //Filtros Avanzados
            if (g_dct_ListadoFiltros_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion != null && g_dct_ListadoFiltros_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion.Count > 0)
            {
                lst_Devolver = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo>(g_dct_ListadoFiltros_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion, g_obj_ABS_Listado_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion)).ToList();
            }

            return lst_Devolver;
        }
        #endregion

        public void ParteLineas_Trazabilidad_ArticuloEnPromocion_Actualizar_Registro(long _lng_idParteLineaTrazabilidad_ArticuloEnPromocion, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo = g_obj_MYT_PartesLineas_Trazabilidad_Datos.Obtener_Registro_Para_Listado_Por_Id(_lng_idParteLineaTrazabilidad_ArticuloEnPromocion);

                if (mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion != null && g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Count > 0)
                    {
                        INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Where(m => m.id.Equals(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo.id)).FirstOrDefault();
                        if (mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion[g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.FindIndex(m => m.id.Equals(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo.id))] = mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Add(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion == null)
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion = new List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo>();
                        }

                        g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Add(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo);
                    }

                    //Actualizar el DataGridView #####################################################################################
                    //Modificar
                    if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                    {
                        DataGridViewRow row = g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Rows
                                     .Cast<DataGridViewRow>()
                                     .Where(r => r.Cells[nameof(INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.id)].Value.Equals(_lng_idParteLineaTrazabilidad_ArticuloEnPromocion)).FirstOrDefault();

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_ParteLineas_Trazabilidad_ArticuloEnPromocion(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo, row);

                            //Ordenar Listado
                            g_frm_P_ParteLinea.ParteLineas_Trazabilidad_ArticuloEnPromocion_Ordenar_DataGridView();
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Rows.Add(Transformar_Modelo_A_Row_ParteLineas_Trazabilidad_ArticuloEnPromocion(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_ArticuloEnPromocion_Listado_Modelo, null));

                        //Sumar Cantidad de Lineas Insertadas
                        g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Total += 1;
                        g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad_ArticuloEnPromocion + 1;

                        //Ordenar Listado
                        g_frm_P_ParteLinea.ParteLineas_Trazabilidad_ArticuloEnPromocion_Ordenar_DataGridView();
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(ParteLineas_Trazabilidad_ArticuloEnPromocion_Actualizar_Registro));
            }

        }
        public void ParteLineas_Trazabilidad_ArticuloEnPromocion_Borrar_Registro(List<long> _lst_idParteLineaTrazabilidad_ArticuloEnPromocion)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion != null && g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Count > 0)
                {
                    List<INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo> lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Where(m => _lst_idParteLineaTrazabilidad_ArticuloEnPromocion.Contains(m.id)).ToList();
                    if (lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo in lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Remove(mdl_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idParteLineaTrazabilidad_ArticuloEnPromocion.Contains(long.Parse(r.Cells[nameof(INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Lineas Borradas
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Total -= _lst_idParteLineaTrazabilidad_ArticuloEnPromocion.Count();
                g_frm_P_ParteLinea.Exferia_BarraProgreso_LineasTrazabilidad_ArticuloEnPromocion.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ParteLineas_Trazabilidad_ArticuloEnPromocion - _lst_idParteLineaTrazabilidad_ArticuloEnPromocion.Count();

                g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = false;

                //Se pone para que se actualice el listado para el paginado
                Filtrar_ParteLineas_Trazabilidad_ArticuloEnPromocion();
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(ParteLineas_Trazabilidad_ArticuloEnPromocion_Borrar_Registro));
            }
        }

        #region Borrar Datos ParteLineas_Trazabilidad_ArticuloEnPromocion
        public void BorrarDatos_ParteLineas_Trazabilidad_ArticuloEnPromocion(List<long> _lst_idParteLineaTrazabilidad_ArticuloEnPromocion_ABorrar)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_ParteLinea.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idParteLineaTrazabilidad_ArticuloEnPromocion_ABorrar);

                    g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion = new BackgroundWorker();
                    g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion_DoWork);
                    g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion_Completed);
                    g_TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion.RunWorkerAsync(lst_Argumentos);

                    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_ParteLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(BorrarDatos_ParteLineas_Trazabilidad_ArticuloEnPromocion));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }

        private void TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion_DoWork(object sender, DoWorkEventArgs e)
        {
            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, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idParteLineaTrazabilidad_ArticuloEnPromocion_ABorrar = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = BorrarDatos_Final_ParteLineas_Trazabilidad_ArticuloEnPromocion(lst_idParteLineaTrazabilidad_ArticuloEnPromocion_ABorrar);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idParteLineaTrazabilidad_ArticuloEnPromocion_ABorrar;
                        mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion_DoWork));

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Control_Errores)
                {
                    transaccion_SQL.Dispose();

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion_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_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear Formulario
            g_frm_P_ParteLinea.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
                {
                    // Devolver al Listado el Row Borrar En Parte Lineas ..........................................
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(Variables.G_STR_OPCION_MYT_PARTELINEA_TRAZABILIDAD);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);
                    lst_obj.Add(true);

                    g_frm_P_ParteLinea.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //En Parte, se envia el idLinea actual para que recargue las trazabilidades .........................................................
                    List<object> lst_obj_AUX = new List<object>();
                    lst_obj_AUX.Add(Variables.G_STR_OPCION_MYT_PARTELINEA_TRAZABILIDAD);
                    lst_obj_AUX.Add(g_mdl_INTERNO_MYT_PartesLineas_Modelo.Linea_EnPromocion.id);
                    g_frm_P_ParteLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj_AUX, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //Poner que no se ha modificado nada, apra que no vuelva a preguntar para grabar
                    g_frm_P_ParteLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_ParteLineas_Trazabilidad_ArticuloEnPromocion_Completed));
            }
            finally
            {
                //Poner el Foco Inicial
                Funciones.Poner_Foco_Objeto(g_frm_P_ParteLinea, g_frm_P_ParteLinea.Exferia_F3_Articulo_ArticuloComodin.Exferia_F3_PRINCIPAL_TextBox_Codigo);
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final_ParteLineas_Trazabilidad_ArticuloEnPromocion(List<long> _lst_idParteLineaTrazabilidad_ArticuloEnPromocion_ABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_MYT_PartesLineas_Trazabilidad_Datos.Borrar(_lst_idParteLineaTrazabilidad_ArticuloEnPromocion_ABorrar);
            }
            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, nameof(P_ParteLinea_Controladora) + "/" + nameof(BorrarDatos_Final_ParteLineas_Trazabilidad_ArticuloEnPromocion));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Totales
        public void MostrarOcultar_Resumen_Totales_Trazabilidad_ArticuloEnPromocion(bool _bol_MostrarOcultar)
        {
            //Mostrar
            if (_bol_MostrarOcultar)
            {
                g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ArticuloEnPromocion_ResumenTotales_Principal.Location = new Point(g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ArticuloEnPromocion_ResumenTotales_Principal.Location.X, g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ArticuloEnPromocion_ResumenTotales_Relacional.Location.Y - 47);
                g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ArticuloEnPromocion_ResumenTotales_Relacional.Visible = true;
            }
            //Ocultar
            else
            {
                g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ArticuloEnPromocion_ResumenTotales_Relacional.Visible = false;
                g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ArticuloEnPromocion_ResumenTotales_Principal.Location = new Point(g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ArticuloEnPromocion_ResumenTotales_Principal.Location.X, g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ArticuloEnPromocion_ResumenTotales_Relacional.Location.Y);
            }

            g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Size = new Size(g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Size.Width, (g_frm_P_ParteLinea.Panel_LineasTrazabilidad_ArticuloEnPromocion_ResumenTotales_Principal.Location.Y - g_frm_P_ParteLinea.Exferia_DataGridView_LineasTrazabilidad_ArticuloEnPromocion.Location.Y) - 27);

            //Rellenar el Resumen de los Totales de la Trazabilidad_ArticuloEnPromocion
            Rellenar_Resumen_Totales_Trazabilidad_ArticuloEnPromocion();
        }
        public void Rellenar_Resumen_Totales_Trazabilidad_ArticuloEnPromocion()
        {
            try
            {
                string str_TipoEmbalaje_Principal = "";
                decimal dcm_Total_Movimiento_Principal = 0;
                decimal dcm_Total_Trazado_Principal = 0;
                decimal dcm_Total_Diferencia_Principal = 0;

                string str_TipoEmbalaje_Relacionado = "";
                decimal dcm_Total_Movimiento_Relacionado = 0;
                decimal dcm_Total_Trazado_Relacionado = 0;
                decimal dcm_Total_Diferencia_Relacionado = 0;

                //Tipos de Embalajes
                str_TipoEmbalaje_Principal = g_frm_P_ParteLinea.Exferia_ComboBox_TipoEmbalaje.Text;

                //Principal
                if (g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Cantidad.Text.Trim().Length > 0)
                {
                    dcm_Total_Movimiento_Principal = decimal.Parse(g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_Cantidad.Text.Replace(".", ","));
                }
                if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion != null && g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Count > 0)
                {
                    dcm_Total_Trazado_Principal = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Sum(m => m.cantidad);
                }
                dcm_Total_Diferencia_Principal = dcm_Total_Movimiento_Principal - dcm_Total_Trazado_Principal;

                //Relacionado
                if (g_frm_P_ParteLinea.Exferia_Panel_Degradado_PromocionPorUnidad_EmbalajeRelacional.Visible)
                {
                    str_TipoEmbalaje_Relacionado = g_frm_P_ParteLinea.Exferia_Label_SinColor_ArticuloEnPromocion_TipoEmbalajeRelacionado_Valor.Text;
                }
                if (g_frm_P_ParteLinea.Exferia_TextBox_ArticuloEnPromocion_CantidadRelacional.Text.Trim().Length > 0)
                {
                    dcm_Total_Movimiento_Relacionado = decimal.Parse(g_frm_P_ParteLinea.Exferia_TextBox_ArticuloEnPromocion_CantidadRelacional.Text.Replace(".", ","));
                }
                if (g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion != null && g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Count > 0)
                {
                    dcm_Total_Trazado_Relacionado = g_lst_INTERNO_MYT_PartesLineas_Trazabilidad_Listado_Modelo_ArticuloEnPromocion.Where(m => m.segundaUnidad_cantidad != null).Sum(m => m.segundaUnidad_cantidad.Value);
                }
                dcm_Total_Diferencia_Relacionado = dcm_Total_Movimiento_Relacionado - dcm_Total_Trazado_Relacionado;

                //Rellenar Etiquetas
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_TipoEmbalaje_Principal_ArticuloEnPromocion.Text = str_TipoEmbalaje_Principal;
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Movimiento_Principal_ArticuloEnPromocion.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Movimiento_Principal, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Trazado_Principal_ArticuloEnPromocion.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Trazado_Principal, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Diferencia_Principal_ArticuloEnPromocion.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Diferencia_Principal, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_TipoEmbalaje_Relacionado_ArticuloEnPromocion.Text = str_TipoEmbalaje_Relacionado;
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Movimiento_Relacionado_ArticuloEnPromocion.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Movimiento_Relacionado, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Trazado_Relacionado_ArticuloEnPromocion.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Trazado_Relacionado, 3));
                g_frm_P_ParteLinea.Exferia_Label_Total_ResumenTotales_Diferencia_Relacionado_ArticuloEnPromocion.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Diferencia_Relacionado, 3));
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Rellenar_Resumen_Totales_Trazabilidad_ArticuloEnPromocion));
            }
        }
        #endregion

        #endregion

        #region LINEAS

        #region Rellenar Datagrid de LINEAS
        public void Rellenar_DataGrid_Lineas(bool _bol_RecargarDesdeBD)
        {
            try
            {
                if (g_TareaAsincrona_Rellenar_DataGrid_Lineas != null)
                {
                    g_bol_Rellenar_DataGrid_Lineas_CANCELAR = true;
                    while (g_TareaAsincrona_Rellenar_DataGrid_Lineas.IsBusy)
                    {
                        Application.DoEvents();
                    }
                    g_bol_Rellenar_DataGrid_Lineas_CANCELAR = false;
                }
                else
                {
                    g_TareaAsincrona_Rellenar_DataGrid_Lineas = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_DataGrid_Lineas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Lineas_DoWork);
                    g_TareaAsincrona_Rellenar_DataGrid_Lineas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Lineas_ProgressChanged);
                    g_TareaAsincrona_Rellenar_DataGrid_Lineas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Lineas_Completed);
                    g_TareaAsincrona_Rellenar_DataGrid_Lineas.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_DataGrid_Lineas.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_ParteLinea.Exferia_DataGridView_Lineas.Rows.Clear();
                g_int_TotalRegistrosInsertados_Lineas = 0;
                g_int_TotalRegistros_Lineas = 0;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Lineas;
                g_frm_P_ParteLinea.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Lineas;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Lineas.RunWorkerAsync(_bol_RecargarDesdeBD);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ParteLinea_Controladora) + "/" + nameof(Rellenar_DataGrid_Lineas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Lineas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Parametros
                bool bol_Cargar_DesdeBD = (bool)e.Argument;

                //cargar desde base de datos
                if (bol_Cargar_DesdeBD)
                {
                    g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo = g_obj_MYT_PartesLineas_Datos.Obtener_Registros_Para_Listado_Por_IdParte(g_mdl_INTERNO_MYT_Partes_Modelo.id);

                    //Recorrer campos Long_Text para saber si lo pongo tipo text o tipo long
                    if (g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo != null && g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo.Count > 0)
                    {
                        foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_obj_ABS_Listado_Lineas.LISTADO_COLUMNAS().Values.ToList().Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                        {
                            int int_HayTextos = g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                            if (int_HayTextos > 0)
                            {
                                mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                                g_obj_ABS_Listado_Lineas.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                            }
                        }
                    }
                }

                if (g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo != null)
                {
                    List<INTERNO_MYT_PartesLineas_Listado_Modelo> lst_INTERNO_MYT_PartesLineas_Listado_Modelo_FILTRADO = Filtrar_Lineas();

                    if (lst_INTERNO_MYT_PartesLineas_Listado_Modelo_FILTRADO != null && lst_INTERNO_MYT_PartesLineas_Listado_Modelo_FILTRADO.Count > 0)
                    {
                        #region Ordenar el Listado

                        //Nombre del campo
                        string str_Campo = g_obj_ABS_Listado_Lineas.ORDENACION_NOMBRECOLUMNA_PORDEFECTO();
                        if (g_frm_P_ParteLinea.Exferia_ComboBox_Lineas_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_ParteLinea.Exferia_ComboBox_Lineas_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                        {
                            str_Campo = ((INTERNO_ComboBox_Modelo)g_frm_P_ParteLinea.Exferia_ComboBox_Lineas_OrdenListado.SelectedItem).Identificador;
                        }

                        //Descendente
                        if (g_frm_P_ParteLinea.Exferia_Button_Lineas_OrdenListado.Tag.ToString().Equals("1"))
                        {
                            lst_INTERNO_MYT_PartesLineas_Listado_Modelo_FILTRADO = lst_INTERNO_MYT_PartesLineas_Listado_Modelo_FILTRADO.OrderByDescending(m => m.GetType().GetProperty(str_Campo).GetValue(m, null)).ToList();
                        }
                        //Ascendente
                        else
                        {
                            lst_INTERNO_MYT_PartesLineas_Listado_Modelo_FILTRADO = lst_INTERNO_MYT_PartesLineas_Listado_Modelo_FILTRADO.OrderBy(m => m.GetType().GetProperty(str_Campo).GetValue(m, null)).ToList();
                        }
                        #endregion

                        //Total
                        g_int_TotalRegistros_Lineas = lst_INTERNO_MYT_PartesLineas_Listado_Modelo_FILTRADO.Count;

                        foreach (INTERNO_MYT_PartesLineas_Listado_Modelo mdl_INTERNO_MYT_PartesLineas_Listado_Modelo in lst_INTERNO_MYT_PartesLineas_Listado_Modelo_FILTRADO)
                        {
                            //Se Cancelo la tarea asincrona #########################
                            if (g_bol_Rellenar_DataGrid_Lineas_CANCELAR)
                            {
                                e.Cancel = true;
                                return;
                            }

                            //Progreso
                            g_int_TotalRegistrosInsertados_Lineas += 1;

                            //Añadir al DataGridView
                            ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Lineas(mdl_INTERNO_MYT_PartesLineas_Listado_Modelo, null));

                            //Esperar un poco
                            Thread.Sleep(1);
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Lineas_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_ParteLinea.IsDisposed)
                {
                    //Añadir Linea al DataGrid de Lineas
                    g_frm_P_ParteLinea.Exferia_DataGridView_Lineas.Rows.Add((DataGridViewRow)e.UserState);

                    //Barra de Progreso
                    g_frm_P_ParteLinea.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Lineas;
                    g_frm_P_ParteLinea.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Lineas;
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Lineas_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        public DataGridViewRow Transformar_Modelo_A_Row_Lineas(INTERNO_MYT_PartesLineas_Listado_Modelo _mdl_INTERNO_MYT_PartesLineas_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_ParteLinea.Exferia_DataGridView_Lineas.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_ParteLinea.Exferia_DataGridView_Lineas);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_obj_ABS_Listado_Lineas.LISTADO_COLUMNAS().Values.ToList())
            {
                if (!g_frm_P_ParteLinea.IsDisposed)
                {
                    //Segun el Tipo
                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                    {
                        DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo, null);
                        if (dtt_Valor != null)
                        {
                            obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                        }
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                    {
                        bool? bol_Valor = (bool?)_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo, null);
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                    {
                        decimal? dcm_valor = (decimal?)_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo, null);
                        if (dcm_valor != null)
                        {
                            obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                        }
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                    {
                        long? lng_valor = (long?)_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo, null);
                        if (lng_valor != null)
                        {
                            obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                        }
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                    {
                        int? int_valor = (int?)_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo, null);
                        if (int_valor != null)
                        {
                            obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                        }
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                    {
                        string str_Valor = (string)_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo, null);

                        long? lng_valor = long.Parse(str_Valor);
                        if (lng_valor != null)
                        {
                            obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                        }
                    }
                    else
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_MYT_PartesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_PartesLineas_Listado_Modelo, null);
                    }

                    int_ContadorFila += 1;
                }
                else
                {
                    break;
                }
            }

            return obj_DataGridViewRow;
        }
        public List<INTERNO_MYT_PartesLineas_Listado_Modelo> Filtrar_Lineas()
        {
            if (g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo != null && g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo.Count > 0)
            {
                //Filtros Avanzados
                if (g_dct_ListadoFiltros_Lineas != null && g_dct_ListadoFiltros_Lineas.Count > 0)
                {
                    return g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_MYT_PartesLineas_Listado_Modelo>(g_dct_ListadoFiltros_Lineas, g_obj_ABS_Listado_Lineas)).ToList();
                }
                else
                {
                    return g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo;
                }
            }
            else
            {
                return g_lst_INTERNO_MYT_PartesLineas_Listado_Modelo;
            }
        }
        #endregion
        #endregion
    }
}

    

