using Exferia_Aplicacion.Calculos;
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_Inventarios._0_Modelos;
using Exferia_Inventarios._1_Datos;
using Exferia_Inventarios._3_Vistas.Listados;
using Exferia_Inventarios._3_Vistas.ListadosSeleccion;
using Exferia_Inventarios.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
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_Inventarios._3_Vistas.Controladoras
{
    public class P_MovimientoAlmacenLinea_Controladora
    {
        #region Variables Generales
        private P_MovimientoAlmacenLinea g_frm_P_MovimientoAlmacenLinea = 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 Datos
        private INV_MovimientosAlmacenLineas_Datos g_obj_INV_MovimientosAlmacenLineas_Datos = new INV_MovimientosAlmacenLineas_Datos();
        private INV_MovimientosAlmacenLineas_Trazabilidad_Datos g_obj_INV_MovimientosAlmacenLineas_Trazabilidad_Datos = new INV_MovimientosAlmacenLineas_Trazabilidad_Datos();

        public InventariosVariacionExistencias_Calculos g_obj_InventariosVariacionExistencias_Calculos = 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

        public string g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

        public GEN_EjerciciosActivos_Empresa g_mdl_GEN_EjerciciosActivos_Empresa = null;

        public INTERNO_INV_MovimientosAlmacenCabecera_Modelo g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo = null;

        //Saber si el Ejercicio del Documento tiene CierreAdministrativo o CierreContable
        public G_ENUM_VALIDACIONFECHAS_TIPOCIERRE g_obj_ENUM_VALIDACIONFECHAS_TIPOCIERRE = G_ENUM_VALIDACIONFECHAS_TIPOCIERRE.Ninguno;

        public INTERNO_INV_MovimientosAlmacenLineas_Modelo g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo = null;

        public int g_int_NumeroLinea_Principal_Inicial = -1;

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

        //Tarea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        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;

        //Tarea Asincrona de cambio_Articulo
        private BackgroundWorker g_obj_TareaAsincrona_Cambio_Articulo;
        public bool g_bol_TareaAsincrona_CambioArticulo_Termino = true;
        #endregion

        #region MovimientoAlmacen Trazabilidad
        //Tarea Asincrona para la Rellenar DataGridView de MovimientoAlmacenLinea
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad;

        //Tarea Asincrona para la Borrar MovimientoAlmacenTrazabilidad
        private BackgroundWorker g_TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad;

        //Listado de MovimientoAlmacenTrazabilidad
        public List<INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo> g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo = null;

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

        //Filtrado del Listado de MovimientoAlmacenTrazabilidad
        public List<string> g_lst_ColumnasAMostrar_INV_MovimientosAlmacenLineas_Trazabilidad = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_MovimientoAlmacenTrazabilidad = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_INV_MovimientosAlmacenLineas_Trazabilidad = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad = 0;
        private int g_int_TotalRegistros_MovimientoAlmacenTrazabilidad = 0;
        #endregion

        #endregion

        #region Constructor
        public P_MovimientoAlmacenLinea_Controladora(P_MovimientoAlmacenLinea _frm_P_MovimientoAlmacenLinea, 
                                                        INTERNO_INV_MovimientosAlmacenCabecera_Modelo _mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo)
        {
            g_frm_P_MovimientoAlmacenLinea = _frm_P_MovimientoAlmacenLinea;
            g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo = _mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo;

            Datos_Iniciales();

            g_obj_ABS_Listado_MovimientoAlmacenTrazabilidad = new ABS_Listado_INV_MovimientosAlmacenLineas_Trazabilidad(g_frm_P_MovimientoAlmacenLinea.P_Base_ValoresGenerales);

            //(Tarea Asincrona) Cargar Listado de Lineas ########################################
            g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad.WorkerSupportsCancellation = true;
            //####################################################################################

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        private void Datos_Iniciales()
        {
            try
            {
                //Datos de la Cabecera #########################################################################################
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_Resumen.Text = "▬ Nº de movimientos de almacen: " + g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.numeroDocumento.ToString();

                if (g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.GEN_Delegaciones != null)
                {
                    g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_Resumen.Text += "   ▬ Delegación: (" + g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.GEN_Delegaciones.codigo.ToUpper() + ") " + g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.GEN_Delegaciones.descripcion.ToUpper();
                }
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_Resumen.Text += "   ▬ Fecha: " + g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha.ToString("dd/MM/yyyy");

                //Instanciar la clase de Calculos
                g_obj_InventariosVariacionExistencias_Calculos = new InventariosVariacionExistencias_Calculos(
                                                                                                              g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha,
                                                                                                              g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idEmpresa,
                                                                                                              null,
                                                                                                              1);

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_Controladora) + "" + nameof(Datos_Iniciales));
            }
        }
        #endregion

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

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

                    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 Vaciar datos
        public void VaciarDatos()
        {
            //Numero de linea iniciales
            g_int_NumeroLinea_Principal_Inicial = -1;

            //vaciar Modelos
            g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo = null;
            g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo = null;

            //Articulo
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id = -1;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Codigo = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Descripcion = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_FechaBorrado = null;

            //Almacen origen
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id = -1;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Codigo = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Descripcion = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_FechaBorrado = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_1 = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_2 = null;

            //Almacen destino
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id = -1;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Codigo = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Descripcion = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_FechaBorrado = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_1 = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_2 = null;

            //Ubicacion origen
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id = -1;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Codigo = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Descripcion = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_FechaBorrado = null;

            //Ubicacion destino
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id = -1;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Codigo = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Descripcion = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_FechaBorrado = null;

            //Vacia Todo
            CambioArticulo_VaciarDatos(true);

            //Vaciar el Listado MovimientoAlmacen Trazabilidad
            g_frm_P_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Clear();
            g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad = 0;
            g_int_TotalRegistros_MovimientoAlmacenTrazabilidad = 0;
            g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total = g_int_TotalRegistros_MovimientoAlmacenTrazabilidad;
            g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad;

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

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_MovimientoAlmacenLinea.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.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = false;
                }

                //Vaciar
                VaciarDatos();

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea_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_MovimientoAlmacenLinea.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_INV_MovimientosAlmacenLineas_Modelo != null)
                    {
                        //Cargar Listado MovimientoAlmacenTrazabilidad ...........................................................
                        if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MovimientoAlmacenLineaTrazabilidades != null)
                        {
                            g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MovimientoAlmacenLineaTrazabilidades;
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

            //Desbloquear el Formulario
            g_frm_P_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea.Salir_P_Base();
                    }
                }
                else
                {
                    CargarDatos_EnPantalla();

                    //Habilitar origen
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Enabled = true;
                    if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_2==null ||
                        (
                            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_2!=null &&
                            !((bool?)g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_2).Value)
                        )
                    {
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Enabled = true;
                    }

                    //Habilitar origen
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Enabled = true;
                    if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_2 == null ||
                        (
                            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_2 != null &&
                            !((bool?)g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_2).Value)
                        )
                    {
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Enabled = true;
                    }

                    //Muestra o Oculta el panel de Resumen de Totales de Trazabilidad
                    MostrarOcultar_Resumen_Totales_Trazabilidad(g_frm_P_MovimientoAlmacenLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible);

                    //Rellenar Grids
                    Rellenar_DataGrid_MovimientoAlmacenTrazabilidad();

                    g_bol_ModificacionDatosAfectaTrazabilidad = false;
                    g_frm_P_MovimientoAlmacenLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

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

                //Poner el Foco Inicial
                Funciones.Poner_Foco_Objeto(g_frm_P_MovimientoAlmacenLinea, g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_PRINCIPAL_TextBox_Codigo);

                //Si no tiene Cierre
                if (g_obj_ENUM_VALIDACIONFECHAS_TIPOCIERRE.Equals(G_ENUM_VALIDACIONFECHAS_TIPOCIERRE.Ninguno))
                {
                    //Configurar Cerrar/Abrir
                    Mostrar_CerradoVolcado();
                }
            }
        }

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

            try
            {
                g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo = g_obj_INV_MovimientosAlmacenLineas_Datos.Obtener(_lng_id);

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

                        g_frm_P_MovimientoAlmacenLinea.g_obj_Funciones_Paginador.SetPaginaActual(int_PaginaDelObjeto);
                        //Asignanado al paginador la pagina actual
                        g_frm_P_MovimientoAlmacenLinea.Exferia_Paginador_MovimientoAlmacenLinea.PaginaActual = g_frm_P_MovimientoAlmacenLinea.g_obj_Funciones_Paginador.GetPaginaActual();
                    }
                    //.............................................................................................

                    #region RELLENAR MODELO DE CALCULOS LINEA PRINCIPAL
                    INTERNO_InventariosVariacionExistencias_Calculos_Modelo mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo = new INTERNO_InventariosVariacionExistencias_Calculos_Modelo();

                    //Articulo
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_Articulo_Id = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Articulos.id;
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Articulos.codigo;
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Articulos.descripcion;
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Articulos.tipoTrazabilidad_Salidas;

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

                    #region Articulos_Embalajes
                    //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_INV_MovimientosAlmacenLineas_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);
                    #endregion

                    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_InventariosVariacionExistencias_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));
                        }
                    }

                    //idEmbalaje
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_Embalaje_Id = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idEmbalaje;

                    //Embalaje texto
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Embalajes.descripcion;

                    // Cantidad principal
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.cantidad;

                    //relacion
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;

                    //Operacion
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;

                    //precio_Cantidad_SegundaUnidad
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                    //idEmbalajeRelacional
                    mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.segundaUnidad_idEmbalaje;

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

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

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

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

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

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

                    if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Embalajes3 != null)
                    {
                        mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Embalajes3.descripcion;
                    }

                    #endregion

                    #endregion

                    //Rellenar la clase de calculos
                    g_obj_InventariosVariacionExistencias_Calculos.CargaInicial(mdl_INTERNO_InventariosVariacionExistencias_Calculos_Modelo);

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

                        dynamic dnm_Objeto = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_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_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea.Tag.ToString(), str_MenuSuperior_Codigo);

                    g_frm_P_MovimientoAlmacenLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_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_INV_MovimientosAlmacenLineas_Modelo != null)
                {
                    //Numerolinea Inicial (LINEA PRINCIPAL)
                    g_int_NumeroLinea_Principal_Inicial = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.numeroLinea;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_NumeroLinea.Text = g_int_NumeroLinea_Principal_Inicial.ToString();

                    //Articulo
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Articulos.id;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Codigo = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Articulos.codigo;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Descripcion = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Articulos.descripcion;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_FechaBorrado = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Articulos.fechaBorrado;

                    //Almacen origen
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes.id;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Codigo = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes.codigo;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Descripcion = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes.descripcion;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_FechaBorrado = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes.fechaBorrado;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_1 = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes.idDelegacion;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_2 = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes.sinUbicacion;

                    //Poner Filtros de ubiacion de origen
                    if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes.sinUbicacion == null ||
                            (
                                g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes.sinUbicacion != null &&
                                !g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes.sinUbicacion.Value
                            )
                        )
                    {
                        #region FILTROS PARA UBICACION
                        List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION = new List<INTERNO_Filtro_OpcionPadre_Modelo>();

                        //Delegacion
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_GEN_DELEGACION), g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen));

                        //Almacen
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_GEN_ALMACEN), g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id));

                        //Articulo
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_MAE_ARTICULO), g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id));

                        //Agregar los filtros
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION;
                        #endregion
                    }

                    //Ubicacion origen
                    if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones != null)
                    {
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones.id;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Codigo = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones.codigo;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Descripcion = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones.descripcion;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_FechaBorrado = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones.fechaBorrado;
                    }

                    //Almacen destino
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes1.id;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Codigo = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes1.codigo;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Descripcion = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes1.descripcion;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_FechaBorrado = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes1.fechaBorrado;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_1 = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes1.idDelegacion;
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_2 = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes1.sinUbicacion;

                    //Poner Filtros de ubiacion de origen
                    if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes1.sinUbicacion == null ||
                            (
                                g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes1.sinUbicacion != null &&
                                !g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.GEN_Almacenes1.sinUbicacion.Value
                            )
                        )
                    {
                        #region FILTROS PARA UBICACION
                        List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION = new List<INTERNO_Filtro_OpcionPadre_Modelo>();

                        //Delegacion
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_GEN_DELEGACION), g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino));

                        //Almacen
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_GEN_ALMACEN), g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id));

                        //Articulo
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_MAE_ARTICULO), g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id));

                        //Agregar los filtros
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION;
                        #endregion
                    }

                    //Ubicacion destino
                    if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones1 != null)
                    {
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones1.id;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Codigo = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones1.codigo;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Descripcion = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones1.descripcion;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_FechaBorrado = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.MAE_Ubicaciones1.fechaBorrado;
                    }

                    //Cantidad principal
                    g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_Cantidad.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal_Texto;

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

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

                    //Tipo Trazabilidad
                    g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_TipoTrazabilidad.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Articulo_TipoTrazabilidad_Texto;

                    //Panel Desbloquear
                    g_frm_P_MovimientoAlmacenLinea.SplitContainer_CantidadPrecios.Enabled = true;

                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_Controladora) + "/" + nameof(CargarDatos_EnPantalla));
            }
        }
        #endregion

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

                //La cantidad de la Linea es inferior a la de la Linea de trazabilidad a la que esta relacionada
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_ADVERTENCIAS = Advertencia_CantidadMovimientoAlmacenLinea_Inferior_CantidadMovimientoAlmacenTrazabilidad();
                if (mdl_ValorDevuelto_Modelo_ADVERTENCIAS.TodoCorrecto == false)
                {
                    if (Mensajes.MostrarMensaje_Pregunta(mdl_ValorDevuelto_Modelo_ADVERTENCIAS.Mensaje) == false)
                    {
                        bol_Grabar = false;
                    }
                }
                //..............................................................................................

                if (bol_Grabar)
                {
                    g_bol_GrabarDatos_TerminoCorrectamente = true;

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

                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_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_MovimientoAlmacenLinea_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_MovimientoAlmacenLinea_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_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea, 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
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_MovimientoAlmacenLinea.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    lst_obj.Add(g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null ? g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.numeroLinea : -1);

                    g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //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_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_PRINCIPAL_TextBox_Descripcion.Exferia_TextBox_TabStop_Txt = false;
                            g_frm_P_MovimientoAlmacenLinea.Exferia_ComboBox_TipoEmbalaje.TabStop = false;
                        }
                    }

                    //Poner el Foco Inicial
                    Funciones.Poner_Foco_Objeto(g_frm_P_MovimientoAlmacenLinea, g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_PRINCIPAL_TextBox_Codigo);
                    //Se pone para que no pregunte si se modifico algo
                    g_frm_P_MovimientoAlmacenLinea.P_Base_SeModificoDatosPantalla = false;
                    g_bol_ModificacionDatosAfectaTrazabilidad = false;

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

        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_INV_MovimientosAlmacenLineas_Modelo != null)
                {
                    //PRINCIPAL
                    if (g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Codigo))
                    {
                        //Cantidad trazada
                        decimal dcm_CantidadPrincipal_TotalLineasTrazadas = 0;
                        if (g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo != null &&
                            g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Count > 0)
                        {
                            dcm_CantidadPrincipal_TotalLineasTrazadas = g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Sum(m => m.cantidad);
                        }
                        //Cantidad de la linea
                        decimal dcm_CantidadPrincipal = g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_Cantidad.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea.Exferia_Label_Cantidad.Text) + 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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(Validar_TrazabilidadObligatoria));

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

            return mdl_ValorDevuelto_Modelo;
        }
        public INTERNO_ValorDevuelto_Modelo Advertencia_CantidadMovimientoAlmacenLinea_Inferior_CantidadMovimientoAlmacenTrazabilidad()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                string str_Advertencias = "";

                //PRINCIPAL
                //Si la cantidad de la linea es inferior a el total de las lineas trazadas advierto
                decimal dcm_CantidadPrincipal_TotalLineasTrazadas = 0;
                if (g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo != null &&
                    g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Count > 0)
                {
                    dcm_CantidadPrincipal_TotalLineasTrazadas = g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Sum(m => m.cantidad);
                }
                decimal dcm_CantidadPrincipal = g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_Cantidad.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_Cantidad.Text.Replace(".", ",")) : 0;

                if (dcm_CantidadPrincipal < dcm_CantidadPrincipal_TotalLineasTrazadas)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    str_Advertencias = Mensajes.G_STR_ADVERTENCIA_CANTIDADMOVIMIENTO_INFERIOR(g_frm_P_MovimientoAlmacenLinea.Exferia_Label_Cantidad.Text,"") + System.Environment.NewLine;
                }

                //Se pone la pregunta final
                if (str_Advertencias.Trim().Length > 0)
                {
                    mdl_ValorDevuelto_Modelo.Mensaje = str_Advertencias + Mensajes.G_STR_ADVERTENCIA_DESEACONTINUAR();
                }
            }
            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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(Advertencia_CantidadMovimientoAlmacenLinea_Inferior_CantidadMovimientoAlmacenTrazabilidad));

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

            return mdl_ValorDevuelto_Modelo;
        }

        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_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

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

                // El Almacen origen no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay El Almacen origen validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Ubicacion origen validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // El Almacen Destino no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay El Almacen Destino validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Ubicacion Destino validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //La cantidad no puede ser vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea.Exferia_Label_TipoEmbalaje.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_Cantidad;
                }

                //Si tiene embalaje relacionado, la 2º unidad no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_MovimientoAlmacenLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible)
                {
                    if (g_frm_P_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea.Exferia_Label_SegundaUnidad.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_SegundaUnidad;
                    }
                }
            }
            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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(ValidarDatos));

                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_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    long? lng_Nulo = null;

                    long lng_idMovimientoAlmacenLinea = -1;
                    bool bol_QuitarCantidadRelacionada_ListadoTrazabilidad = false;//Se utiliza para saber si se tiene que borrar la cantidadRelacionada del listado de trazabilidad

                    #region ACTUALIZAR ARTICULO MOVIMIENTOS DIARIO 

                    #region Origen
                    #region Rellenar modelo
                    INTERNO_ArticuloDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN = new INTERNO_ArticuloDiarioActualizar_Documentos_Modelo();

                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_DESCARGAS.Codigo;

                    //Datos Actuales
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Articulo_Id;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Actual = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Actual = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id > -1 ? g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id : lng_Nulo;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalaje_EsRelacional ? g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Relacional : 0m;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalaje_Operacion;

                    //Datos Anteriores
                    if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null)
                    {
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Modificacion = true;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticuloComodin_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Origen;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Origen;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.cantidad;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.segundaUnidad_cantidad;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;
                    }
                    else
                    {
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Modificacion = false;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticuloComodin_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Anterior = "";
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Anterior = "";
                    }
                    #endregion
                    mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloMovimientosDiario.Actualizar_ArticuloMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN);
                    #endregion

                    #region Destino
                    #region Rellenar modelo
                    INTERNO_ArticuloDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO = new INTERNO_ArticuloDiarioActualizar_Documentos_Modelo();

                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_CARGAS.Codigo;

                    //Datos Actuales
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Articulo_Id;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Actual = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Actual = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id > -1 ? g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id : lng_Nulo;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalaje_EsRelacional ? g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Relacional : 0m;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalaje_Operacion;

                    //Datos Anteriores
                    if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null)
                    {
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Modificacion = true;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticuloComodin_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Destino;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Destino;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.cantidad;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.segundaUnidad_cantidad;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;
                    }
                    else
                    {
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Modificacion = false;
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticuloComodin_Anterior = null;
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Anterior = null;
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Anterior = null;
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Anterior = null;
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Anterior = null;
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Anterior = null;
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Anterior = "";
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Anterior = null;
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Anterior = null;
                       mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Anterior = "";
                    }
                    #endregion
                    mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloMovimientosDiario.Actualizar_ArticuloMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO);
                    #endregion
                    #endregion

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        INV_MovimientosAlmacenLineas mdl_INV_MovimientosAlmacenLineas = new INV_MovimientosAlmacenLineas();

                        //id
                        mdl_INV_MovimientosAlmacenLineas.id = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null ? g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.id : -1;

                        //idMovimientoAlmacenCabecera
                        mdl_INV_MovimientosAlmacenLineas.idMovimientoAlmacenCabecera = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.id;

                        //idArticulo
                        mdl_INV_MovimientosAlmacenLineas.idArticulo = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id;

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

                            if (g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen != null &&
                                g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                                g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                            {
                                mdl_INV_MovimientosAlmacenLineas.numeroLinea = g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count + 1;
                            }
                        }

                        //idAlmacen_Origen
                        mdl_INV_MovimientosAlmacenLineas.idAlmacen_Origen = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id;

                        //idAlmacen_Destino
                        mdl_INV_MovimientosAlmacenLineas.idAlmacen_Destino = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id;

                        //idUbicacion_Origen
                        if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id > -1)
                        {
                            mdl_INV_MovimientosAlmacenLineas.idUbicacion_Origen = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id;
                        }
                        else
                        {
                            mdl_INV_MovimientosAlmacenLineas.idUbicacion_Origen = null;
                        }

                        //idUbicacion_Destino
                        if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id > -1)
                        {
                            mdl_INV_MovimientosAlmacenLineas.idUbicacion_Destino = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id;
                        }
                        else
                        {
                            mdl_INV_MovimientosAlmacenLineas.idUbicacion_Destino = null;
                        }

                        //cantidad
                        mdl_INV_MovimientosAlmacenLineas.cantidad = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal;

                        //idEmbalaje
                        mdl_INV_MovimientosAlmacenLineas.idEmbalaje = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalaje_Id;

                        //relacion
                        mdl_INV_MovimientosAlmacenLineas.relacion = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;

                        //operacion
                        mdl_INV_MovimientosAlmacenLineas.operacion = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalaje_Operacion;

                        //segundaUnidad_Precio_Cantidad_SegundaUnidad
                        mdl_INV_MovimientosAlmacenLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_PrecioPor_SegundaUnidad_Entero;

                        //segundaUnidad_relacion
                        mdl_INV_MovimientosAlmacenLineas.segundaUnidad_relacion = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Relacional_Relacion;

                        //segundaUnidad_idEmbalaje
                        mdl_INV_MovimientosAlmacenLineas.segundaUnidad_idEmbalaje = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_EmbalajeRelacionado_Id;

                        //segundaUnidad_cantidad
                        mdl_INV_MovimientosAlmacenLineas.segundaUnidad_cantidad = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Relacional;

                        //embalajePrincipalDelArticulo_idEmbalaje
                        mdl_INV_MovimientosAlmacenLineas.embalajePrincipalDelArticulo_idEmbalaje = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_IdEmbalaje;

                        //embalajePrincipalDelArticulo_relacion
                        mdl_INV_MovimientosAlmacenLineas.embalajePrincipalDelArticulo_relacion = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                        //embalajePrincipalDelArticulo_operacion
                        mdl_INV_MovimientosAlmacenLineas.embalajePrincipalDelArticulo_operacion = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                        //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                        mdl_INV_MovimientosAlmacenLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                        //embalajePrincipalDelArticulo_segundaUnidad_relacion
                        mdl_INV_MovimientosAlmacenLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                        //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                        mdl_INV_MovimientosAlmacenLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                        //fechaBorrado
                        mdl_INV_MovimientosAlmacenLineas.fechaBorrado = null;

                        // GRABAR
                        mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_MovimientosAlmacenLineas_Datos.Grabar(mdl_INV_MovimientosAlmacenLineas);

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            lng_idMovimientoAlmacenLinea = mdl_INTERNO_ValorDevuelto_Modelo.Id;

                            //Actualizar las Lineas de Trazabilidad si se hubiera cambiado de embalaje relacional a unico ..............
                            if (
                                g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null &&
                                g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.segundaUnidad_idEmbalaje != null)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_MovimientosAlmacenLineas_Trazabilidad_Datos.Quitar_CantidadRelacionada(lng_idMovimientoAlmacenLinea);

                                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                                {
                                    transaccion_SQL.Dispose();
                                    return mdl_INTERNO_ValorDevuelto_Modelo;
                                }
                                else
                                {
                                    bol_QuitarCantidadRelacionada_ListadoTrazabilidad = true;
                                }
                            }
                            //...........................................................................................................

                            //Termino Transaccion
                            transaccion_SQL.Complete();
                        }

                        transaccion_SQL.Dispose();

                        //Recargar el Modelo de Linea 
                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo.Id = lng_idMovimientoAlmacenLinea;

                            g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo = g_obj_INV_MovimientosAlmacenLineas_Datos.Obtener(lng_idMovimientoAlmacenLinea);

                            //Si tienes Permisos para Borrar
                            g_frm_P_MovimientoAlmacenLinea.Exferia_Button_Borrar.Enabled = true;

                            //Quitar la cantidad Relacionada del listado de trazabilidad y del DataGridView
                            if (bol_QuitarCantidadRelacionada_ListadoTrazabilidad)
                            {
                                if (g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo != null && g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Count > 0)
                                {
                                    foreach (INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo in g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo)
                                    {
                                        //Modificar el modelo del Listado de Trazabilidad
                                        mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.segundaUnidad_cantidad = null;
                                        mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.EmbalajeRelacional_Modelo = null;

                                        //Modificar el DataGriView
                                        DataGridViewRow row = g_frm_P_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.Rows
                                                 .Cast<DataGridViewRow>()
                                                 .Where(r => r.Cells[nameof(INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.id)].Value.Equals(mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.id)).FirstOrDefault();

                                        if (row != null)
                                        {
                                            //Actualizar el Grid
                                            Transformar_Modelo_A_Row_MovimientoAlmacenTrazabilidad(mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo, row);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        transaccion_SQL.Dispose();
                    }
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }

            return mdl_INTERNO_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_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_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_MovimientoAlmacenLinea_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_MovimientoAlmacenLinea_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_MovimientoAlmacenLinea.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>();
                    lst_obj.Add(g_frm_P_MovimientoAlmacenLinea.g_mdl_PRV_OpcionesDetalle.opcion);

                    List<long> lst_id = new List<long>();
                    lst_id.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    lst_obj.Add(lst_id);
                    lst_obj.Add(g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null ? g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.numeroLinea : -1);

                    g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

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

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                long? lng_Nulo = null;

                if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null)
                {
                    #region ACTUALIZAR ARTICULO MOVIMIENTOS DIARIO 

                    #region ORIGEN
                    #region Rellenar modelo
                    INTERNO_ArticuloDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN = new INTERNO_ArticuloDiarioActualizar_Documentos_Modelo();

                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_DESCARGAS.Codigo;

                    //Datos Actuales
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Articulo_Id;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Actual = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Actual = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id > -1 ? g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id : lng_Nulo;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Actual = 0;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Actual = 0;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalaje_Operacion;

                    //Datos Anteriores
                    if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null)
                    {
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Modificacion = true;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticuloComodin_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Origen;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Origen;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.cantidad;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.segundaUnidad_cantidad;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;
                    }
                    else
                    {
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Modificacion = false;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticuloComodin_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Anterior = "";
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Anterior = null;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Anterior = "";
                    }
                    #endregion
                    mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloMovimientosDiario.Actualizar_ArticuloMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_ORIGEN);
                    #endregion

                    #region DESTINO
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        #region Rellenar modelo

                        INTERNO_ArticuloDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO = new INTERNO_ArticuloDiarioActualizar_Documentos_Modelo();

                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_CARGAS.Codigo;

                        //Datos Actuales
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Articulo_Id;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Actual = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Actual = g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id > -1 ? g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id : lng_Nulo;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Actual = 0;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Actual = 0;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Actual = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalaje_Operacion;

                        //Datos Anteriores
                        if (g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null)
                        {
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Modificacion = true;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticuloComodin_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Destino;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Destino;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.cantidad;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.segundaUnidad_cantidad;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;
                        }
                        else
                        {
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Modificacion = false;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticuloComodin_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Anterior = "";
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Anterior = null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Anterior = "";
                        }
                        #endregion
                        mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloMovimientosDiario.Actualizar_ArticuloMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo_DESTINO);
                    }
                    #endregion

                    #endregion

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        #region ACTUALIZAR ARTICULO TRAZABILIDAD MOVIMIENTOS DIARIO 

                        if (g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo != null && g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Count > 0)
                        {
                            foreach (INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo in g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo)
                            {
                                #region ORIGEN
                                #region Rellenar modelo
                                INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN = new INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo();

                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_DESCARGAS.Codigo;

                                //Datos Actuales
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulotrazabilidad_Actual = mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.idArticulo_Trazabilidad;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Origen;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Origen;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Actual = 0;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Actual = 0;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;

                                //Datos Anteriores
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Modificacion = true;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulotrazabilidad_Anterior = mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.idArticulo_Trazabilidad;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Origen;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Origen;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Anterior = mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.cantidad;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Anterior = mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.segundaUnidad_cantidad;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;

                                #endregion
                                mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloTrazabilidadMovimientosDiario.Actualizar_ArticuloTrazabilidadMovimientoDiario(mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN);
                                #endregion

                                #region DESTINO
                                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                                {
                                    #region Rellenar modelo
                                    INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO = new INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo();

                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_CARGAS.Codigo;

                                    //Datos Actuales
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulotrazabilidad_Actual = mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.idArticulo_Trazabilidad;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Destino;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Destino;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Actual = 0;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Actual = 0;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;

                                    //Datos Anteriores
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Modificacion = true;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulotrazabilidad_Anterior = mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.idArticulo_Trazabilidad;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Destino;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Destino;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Anterior = mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.cantidad;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Anterior = mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.segundaUnidad_cantidad;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;

                                    #endregion
                                    mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloTrazabilidadMovimientosDiario.Actualizar_ArticuloTrazabilidadMovimientoDiario(mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO);
                                }
                                #endregion

                                if (!mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                                {
                                    break;
                                }
                            }
                        }
                        #endregion

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_MovimientosAlmacenLineas_Datos.Borrar(g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo != null ? g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.id : -1);
                        }
                    }
                }
            }
            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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(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

        #region Calculos

        #region Cambio de Articulo
        public void Cambio_Articulo(long _lng_idArticulo, 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;
                }

                //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);

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

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

                    //Argumentos
                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lng_idArticulo);
                    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;
                }

                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_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 = (long)lst_Argumentos[0];
                long? lng_idEmbalaje = (long?)lst_Argumentos[1];

                //Calculos iniciales por cambio de articulo
                g_obj_InventariosVariacionExistencias_Calculos.Cambio_Articulo(lng_idArticulo, lng_idEmbalaje);

                if (lng_idArticulo > -1)
                {
                    #region ALMACEN DE ORIGEN
                    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_MAEUBICACIONES_OBTENERLISTADOPICKING_PORDELEGACION, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros_1 = { lng_idArticulo, g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen };

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

                    //Si tuviera una sola Posicion Picking
                    GEN_Almacenes mdl_GEN_Almacenes_ORIGEN = null;
                    if (lst_MAE_Ubicaciones_Origen != null && lst_MAE_Ubicaciones_Origen.Count == 1)
                    {
                        mdl_GEN_Almacenes_ORIGEN = lst_MAE_Ubicaciones_Origen[0].GEN_Almacenes;
                    }
                    //Sino se buca entre los almacenes de la delegacion
                    else
                    {
                        List<GEN_Almacenes> lst_GEN_Almacenes = Datos_Generales.GEN_Almacenes_Obtener_Modelo_Listado_Por_Delegacion(g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen);
                        if (lst_GEN_Almacenes != null && lst_GEN_Almacenes.Count > 0)
                        {
                            //Si solo tueviera 1 se pone
                            if (lst_GEN_Almacenes.Count == 1)
                            {
                                mdl_GEN_Almacenes_ORIGEN = lst_GEN_Almacenes[0];
                            }
                            //Si tuviera mas de uno se busca el de por defecto
                            else
                            {
                                mdl_GEN_Almacenes_ORIGEN = lst_GEN_Almacenes.Where(m => m.almacenPorDefecto != null && m.almacenPorDefecto.Value).FirstOrDefault();                                
                            }
                        }
                    }

                    if (mdl_GEN_Almacenes_ORIGEN != null)
                    {
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id = mdl_GEN_Almacenes_ORIGEN.id;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Codigo = mdl_GEN_Almacenes_ORIGEN.codigo;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Descripcion = mdl_GEN_Almacenes_ORIGEN.descripcion;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_FechaBorrado = mdl_GEN_Almacenes_ORIGEN.fechaBorrado;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_1 = mdl_GEN_Almacenes_ORIGEN.idDelegacion;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_2 = mdl_GEN_Almacenes_ORIGEN.sinUbicacion;
                    }
                    #endregion

                    #region ALMACEN DE DESTINO
                    Assembly m_assembly_2 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type_2 = m_assembly_2.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                    //creamos la instancia
                    var obj_Clase_2 = Activator.CreateInstance(m_type_2);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo_2 = obj_Clase_2.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEUBICACIONES_OBTENERLISTADOPICKING_PORDELEGACION, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros_2 = { lng_idArticulo, g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino };

                    //Pasamos los parametros al metodo y lo ejecutamos
                    List<MAE_Ubicaciones> lst_MAE_Ubicaciones_Destino = (List<MAE_Ubicaciones>)obj_MethodInfo_2.Invoke(obj_Clase_2, arr_Parametros_2);

                    //Si tuviera una sola Posicion Picking
                    GEN_Almacenes mdl_GEN_Almacenes_DESTINO = null;
                    if (lst_MAE_Ubicaciones_Destino != null && lst_MAE_Ubicaciones_Destino.Count == 1)
                    {
                        mdl_GEN_Almacenes_DESTINO = lst_MAE_Ubicaciones_Destino[0].GEN_Almacenes;
                    }
                    //Sino se buca entre los almacenes de la delegacion
                    else
                    {
                        List<GEN_Almacenes> lst_GEN_Almacenes = Datos_Generales.GEN_Almacenes_Obtener_Modelo_Listado_Por_Delegacion(g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino);
                        if (lst_GEN_Almacenes != null && lst_GEN_Almacenes.Count > 0)
                        {
                            //Si solo tueviera 1 se pone
                            if (lst_GEN_Almacenes.Count == 1)
                            {
                                mdl_GEN_Almacenes_DESTINO = lst_GEN_Almacenes[0];
                            }
                            //Si tuviera mas de uno se busca el de por defecto
                            else
                            {
                                mdl_GEN_Almacenes_DESTINO = lst_GEN_Almacenes.Where(m => m.almacenPorDefecto != null && m.almacenPorDefecto.Value).FirstOrDefault();

                            }
                        }
                    }

                    if (mdl_GEN_Almacenes_DESTINO != null)
                    {
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id = mdl_GEN_Almacenes_DESTINO.id;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Codigo = mdl_GEN_Almacenes_DESTINO.codigo;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Descripcion = mdl_GEN_Almacenes_DESTINO.descripcion;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_FechaBorrado = mdl_GEN_Almacenes_DESTINO.fechaBorrado;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_1 = mdl_GEN_Almacenes_DESTINO.idDelegacion;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_2 = mdl_GEN_Almacenes_DESTINO.sinUbicacion;
                    }
                    #endregion
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Articulo_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_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;
                }


                CambioArticulo_CargarDatos();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_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)
        {
            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_INV_MovimientosAlmacenLineas_Modelo != null &&
                g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo.Equals(_lng_idArticulo))
            {
                int_Respuesta = 1;
            }
            else
            {
                if (g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado != null &&
                    g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado.Count > 0)
                {

                    INTERNO_Listado_CamposClave_Modelo mdl_INTERNO_Listado_CamposClave_Modelo = g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado.Where(m => m.ID_Aux1.Equals(_lng_idArticulo)).FirstOrDefault();
                    if (mdl_INTERNO_Listado_CamposClave_Modelo != null)
                    {
                        int_Respuesta = Mensajes.MostrarMensaje_Pregunta_3Respuesta(Mensajes.G_STR_MENSAJES_GENERAL_ARTICULOEXISTEENLINEA(mdl_INTERNO_Listado_CamposClave_Modelo.Dato_Auxiliar),
                                                                                    "",
                                                                                    Mensajes.G_STR_SOLICITUDOFERTA_ARTICULOREPETIDOENLINEA_NOMBREBOTON_1(),
                                                                                    Mensajes.G_STR_SOLICITUDOFERTA_ARTICULOREPETIDOENLINEA_NOMBREBOTON_2(),
                                                                                    Mensajes.G_STR_SOLICITUDOFERTA_ARTICULOREPETIDOENLINEA_NOMBREBOTON_3());

                    }
                }
                else
                {
                    int_Respuesta = 1;
                }
            }


            return int_Respuesta;
        }
        private void CambioArticulo_Seleccion_LineaAnterior(long _lng_idArticulo)
        {
            try
            {
                long lng_idMovimientoAlmacenLinea = -1;

                //Ver si hay mas de una linea
                List<INTERNO_Listado_CamposClave_Modelo> lst_INTERNO_Listado_CamposClave_Modelo = g_frm_P_MovimientoAlmacenLinea.P_Base_PantallaOrigen.P_Base_Objetos_Listado.Where(m => m.ID_Aux1.Equals(_lng_idArticulo)).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_INV_MovimientosAlmacenLineas obj_ABS_ListadoSeleccion_INV_MovimientosAlmacenLineas = new ABS_ListadoSeleccion_INV_MovimientosAlmacenLineas();
                    obj_ABS_ListadoSeleccion_INV_MovimientosAlmacenLineas.Registros = g_obj_INV_MovimientosAlmacenLineas_Datos.Obtener_Listado_PorIds(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_INV_MovimientosAlmacenLineas, g_frm_P_MovimientoAlmacenLinea.P_Base_ValoresGenerales, g_frm_P_MovimientoAlmacenLinea.P_Base_FechaTrabajo);
                    frm_PE_Listados_SoloSeleccion.ShowDialog();

                    if (frm_PE_Listados_SoloSeleccion.g_dnm_RegistroSeleccionado != null)
                    {
                        INTERNO_INV_MovimientosAlmacenLineas_Listado_Modelo mdl_INTERNO_INV_MovimientosAlmacenLineas_Listado_Modelo = (INTERNO_INV_MovimientosAlmacenLineas_Listado_Modelo)frm_PE_Listados_SoloSeleccion.g_dnm_RegistroSeleccionado;
                        lng_idMovimientoAlmacenLinea = mdl_INTERNO_INV_MovimientosAlmacenLineas_Listado_Modelo.id;
                    }
                }
                else
                {
                    lng_idMovimientoAlmacenLinea = lst_INTERNO_Listado_CamposClave_Modelo.FirstOrDefault().ID;
                }


                if (lng_idMovimientoAlmacenLinea > -1)
                {
                    g_frm_P_MovimientoAlmacenLinea.P_Base_id = lng_idMovimientoAlmacenLinea;

                    //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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(CambioArticulo_Seleccion_LineaAnterior));
            }
        }

        private void CambioArticulo_VaciarDatos(bool _bol_Vaciar_Articulo)
        {
            //Panel Desbloquear
            g_frm_P_MovimientoAlmacenLinea.SplitContainer_CantidadPrecios.Enabled = false;

            // vaciar el F3 de Articulo
            if (_bol_Vaciar_Articulo)
            {
                //Articulo
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id = -1;
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Codigo = "";
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Descripcion = "";
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_FechaBorrado = null;
            }

            //Almacen origen
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id = -1;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Codigo = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Descripcion = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_FechaBorrado = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_1 = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_2 = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Enabled = false;

            //Almacen destino
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id = -1;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Codigo = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Descripcion = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_FechaBorrado = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_1 = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_2 = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Enabled = false;

            //Ubicacion origen
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id = -1;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Codigo = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Descripcion = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_FechaBorrado = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Enabled = false;

            //Ubicacion destino
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id = -1;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Codigo = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Descripcion = "";
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_FechaBorrado = null;
            g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Enabled = false;

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

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

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

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

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

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

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

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

            //Tipo Trazabilidad
            g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_TipoTrazabilidad.Text = "";
        }

        private void CambioArticulo_CargarDatos()
        {
            if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id>-1)
            {
                //Ubicacion
                Ubicacion_Origen_Actualizar(true);

                //Ubicacion
                Ubicacion_Destino_Actualizar(true);

                //Cantidad principal
                g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_Cantidad.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal_Texto;

                //Cargar Embalajes
                if (g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalajes_Listado != null)
                {
                    foreach (INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo in g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Embalajes_Listado)
                    {
                        g_frm_P_MovimientoAlmacenLinea.Exferia_ComboBox_TipoEmbalaje.Items.Add(mdl_INTERNO_ComboBox_Modelo);
                    }

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

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

                //Tipo Trazabilidad
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_TipoTrazabilidad.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Articulo_TipoTrazabilidad_Texto;

                //Panel Desbloquear
                g_frm_P_MovimientoAlmacenLinea.SplitContainer_CantidadPrecios.Enabled = true;
            }
        }
        #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 InventariosMovimientoAlmacens_Calculos
                g_obj_InventariosVariacionExistencias_Calculos.Cambio_CantidadPrincipal(_dcm_Cantidad);

                //Relacion Calculo
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_Relacion_Calculo.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal_Relacion_Calculo_Texto;

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

                    //relacion con 2º unidad calculo
                    g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Relacional_Relacion_Calculo_Texto;

                }

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

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

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

        }
        #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 InventariosMovimientoAlmacens_Calculos
                g_obj_InventariosVariacionExistencias_Calculos.Cambio_Embalaje(_lng_idEmbalaje);

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

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

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

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

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

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

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

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

        }

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

                //Relacion Calculo
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_Relacion_Calculo.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Principal_Relacion_Calculo_Texto;

                //Precio Por 
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_PrecioPor.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_PrecioPor;
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_PrecioPor.Tag = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_PrecioPor_TAG;

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

                    //Tipo de Embalaje Relacionado
                    g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_TipoEmbalajeRelacionado_Valor.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_EmbalajeRelacionado_Tipo_Texto;

                    //2º Unidad
                    g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_SegundaUnidad.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Relacional_Texto;

                    //relacion con 2º unidad
                    g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_RelacionSegundaUnidad.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Relacional_Relacion_Texto;

                    //relacion con 2º unidad calculo
                    g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Relacional_Relacion_Calculo_Texto;

                }
                else
                {
                    //Ocultar panel de Datos del Embalaje relacional
                    g_frm_P_MovimientoAlmacenLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible = false;

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

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

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

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

                }
            }
        }
        #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 InventarioLinea_PreciosImportes
                g_obj_InventariosVariacionExistencias_Calculos.Cambio_CantidadSecundaria(_dcm_CantidadSecundaria);

                //relacion con 2º unidad calculo
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = g_obj_InventariosVariacionExistencias_Calculos.PROPIEDAD_Cantidad_Relacional_Relacion_Calculo_Texto;

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

        private void Cambio_CantidadSecundaria_VaciarDatos()
        {
            //Relacion 2º unidad calculo
            g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_RelacionSegundaUnidad_Calculo.Text = "";
        }
        #endregion

        #endregion

        #region MovimientoAlmacens Trazabilidad 

        #region Rellenar DataGrid MovimientoAlmacenTrazabilidad
        public void Rellenar_DataGrid_MovimientoAlmacenTrazabilidad()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Clear();
                g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad = 0;
                g_int_TotalRegistros_MovimientoAlmacenTrazabilidad = 0;
                g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total = g_int_TotalRegistros_MovimientoAlmacenTrazabilidad;
                g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_Controladora) + "/" + nameof(Rellenar_DataGrid_MovimientoAlmacenTrazabilidad));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo> lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo = Filtrar_MovimientoAlmacenTrazabilidad();

                if (lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo != null && lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_MovimientoAlmacenTrazabilidad = lst_INTERNO_INV_MovimientosAlmacenLineas_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_MovimientoAlmacenTrazabilidad_Columnas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_INV_MovimientosAlmacenLineas_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_MovimientoAlmacenTrazabilidad.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

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

                        //Progreso
                        g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_MovimientoAlmacenTrazabilidad(mdl_INTERNO_INV_MovimientosAlmacenLineas_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_MovimientoAlmacenTrazabilidad_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de MovimientoAlmacenLinea
                g_frm_P_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total = g_int_TotalRegistros_MovimientoAlmacenTrazabilidad;
                g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_MovimientoAlmacenTrazabilidad_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_MovimientoAlmacenLinea.MovimientoAlmacenTrazabilidad_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_MovimientoAlmacenTrazabilidad(INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo _mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_MovimientoAlmacenLinea.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_MovimientoAlmacenTrazabilidad_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_MovimientosAlmacenLineas_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_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_MovimientosAlmacenLineas_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_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_MovimientosAlmacenLineas_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_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_MovimientosAlmacenLineas_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_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_MovimientosAlmacenLineas_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_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo> Filtrar_MovimientoAlmacenTrazabilidad()
        {
            List<INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo> lst_Devolver = g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo;

            //Filtros Avanzados
            if (g_dct_ListadoFiltros_INV_MovimientosAlmacenLineas_Trazabilidad != null && g_dct_ListadoFiltros_INV_MovimientosAlmacenLineas_Trazabilidad.Count > 0)
            {
                lst_Devolver = g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo>(g_dct_ListadoFiltros_INV_MovimientosAlmacenLineas_Trazabilidad, g_obj_ABS_Listado_MovimientoAlmacenTrazabilidad)).ToList();
            }

            return lst_Devolver;
        }
        #endregion

        public void MovimientoAlmacenTrazabilidad_Actualizar_Registro(long _lng_idMovimientoAlmacenTrazabilidad, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo = g_obj_INV_MovimientosAlmacenLineas_Trazabilidad_Datos.Obtener_MovimientoAlmacenTrazabilidad(_lng_idMovimientoAlmacenTrazabilidad);

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

                        g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Add(mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo);
                    }

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

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_MovimientoAlmacenTrazabilidad(mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo, row);

                            //Ordenar Listado
                            g_frm_P_MovimientoAlmacenLinea.MovimientoAlmacenTrazabilidad_Ordenar_DataGridView();
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Add(Transformar_Modelo_A_Row_MovimientoAlmacenTrazabilidad(mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo, null));

                        //Sumar Cantidad de Lineas Insertadas
                        g_int_TotalRegistros_MovimientoAlmacenTrazabilidad += 1;
                        g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad += 1;

                        g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total = g_int_TotalRegistros_MovimientoAlmacenTrazabilidad;
                        g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad;

                        //Ordenar Listado
                        g_frm_P_MovimientoAlmacenLinea.MovimientoAlmacenTrazabilidad_Ordenar_DataGridView();
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenTrazabilidad_Controladora) + "/" + nameof(MovimientoAlmacenTrazabilidad_Actualizar_Registro));
            }

        }
        public void MovimientoAlmacenTrazabilidad_Borrar_Registro(List<long> _lst_idMovimientoAlmacenLineaTrazabilidad)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo != null && g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo> lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Where(m => _lst_idMovimientoAlmacenLineaTrazabilidad.Contains(m.id)).ToList();
                    if (lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo in lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Remove(mdl_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idMovimientoAlmacenLineaTrazabilidad.Contains(long.Parse(r.Cells[nameof(INTERNO_INV_MovimientosAlmacenLineas_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_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Lineas Borradas
                g_int_TotalRegistros_MovimientoAlmacenTrazabilidad -= _lst_idMovimientoAlmacenLineaTrazabilidad.Count();
                g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad = g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad - _lst_idMovimientoAlmacenLineaTrazabilidad.Count();

                g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Total = g_int_TotalRegistros_MovimientoAlmacenTrazabilidad;
                g_frm_P_MovimientoAlmacenLinea.Exferia_BarraProgreso_LineasTrazabilidad.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_MovimientoAlmacenTrazabilidad;

                g_frm_P_MovimientoAlmacenLinea.P_Base_SeModificoDatosPantalla = false;

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

        #region Borrar Datos MovimientoAlmacenTrazabilidad
        public void BorrarDatos_MovimientoAlmacenTrazabilidad(List<long> _lst_idMovimientoAlmacenTrazabilidad_ABorrar)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_MovimientoAlmacenLinea.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_idMovimientoAlmacenTrazabilidad_ABorrar);

                    g_TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad = new BackgroundWorker();
                    g_TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad_DoWork);
                    g_TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad_Completed);
                    g_TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad.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_MovimientoAlmacenLinea.Enabled = true;

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

        private void TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad_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_idMovimientoAlmacenTrazabilidad_ABorrar = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = BorrarDatos_Final_MovimientoAlmacenTrazabilidad(lst_idMovimientoAlmacenTrazabilidad_ABorrar);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idMovimientoAlmacenTrazabilidad_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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad_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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad_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_MovimientoAlmacenTrazabilidad_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_MovimientoAlmacenLinea.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 MovimientoAlmacen Lineas ..........................................
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(Variables.G_STR_OPCION_INV_MOVIMIENTOSALMACENLINEASTRAZABILIDAD);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_MovimientoAlmacenLinea.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //En MovimientoAlmacen Cabecera, 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_INV_MOVIMIENTOSALMACENLINEASTRAZABILIDAD);
                    lst_obj_AUX.Add(g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.id);
                    g_frm_P_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_Controladora) + "/" + nameof(TareaAsincrona_Borrar_MovimientoAlmacenTrazabilidad_Completed));
            }
            finally
            {
                //Poner el Foco Inicial
                Funciones.Poner_Foco_Objeto(g_frm_P_MovimientoAlmacenLinea, g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_PRINCIPAL_TextBox_Codigo);
            }
        }

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

            try
            {

                if (_lst_idMovimientoAlmacenTrazabilidad_ABorrar != null && _lst_idMovimientoAlmacenTrazabilidad_ABorrar.Count > 0)
                {
                    foreach (long lng_idMovimientoAlmacenTrazabilidad_ABorrar in _lst_idMovimientoAlmacenTrazabilidad_ABorrar)
                    {
                        INV_MovimientosAlmacenLineas_Trazabilidad mdl_INV_MovimientosAlmacenLineas_Trazabilidad = g_obj_INV_MovimientosAlmacenLineas_Trazabilidad_Datos.Obtener_Modelo_Por_Id(lng_idMovimientoAlmacenTrazabilidad_ABorrar);

                        if (mdl_INV_MovimientosAlmacenLineas_Trazabilidad != null)
                        {
                            #region ACTUALIZAR ARTICULO TRAZABILIDAD MOVIMIENTOS DIARIO 

                            #region ORIGEN
                            #region Rellenar modelo
                            INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN = new INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo();

                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_DESCARGAS.Codigo;

                            //Datos Actuales
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulotrazabilidad_Actual = mdl_INV_MovimientosAlmacenLineas_Trazabilidad.idArticulo_Trazabilidad;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Origen;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Origen;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Actual = 0;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Actual = 0;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;

                            //Datos Anteriores
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Modificacion = true;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulo_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdArticulotrazabilidad_Anterior = mdl_INV_MovimientosAlmacenLineas_Trazabilidad.idArticulo_Trazabilidad;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Fecha_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdDelegacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdAlmacen_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Origen;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.IdUbicacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Origen;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_Anterior = mdl_INV_MovimientosAlmacenLineas_Trazabilidad.cantidad;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Cantidad_SegundaUnidad_Anterior = mdl_INV_MovimientosAlmacenLineas_Trazabilidad.segundaUnidad_cantidad;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Relacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN.Operacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;
                            #endregion
                            mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloTrazabilidadMovimientosDiario.Actualizar_ArticuloTrazabilidadMovimientoDiario(mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_ORIGEN);
                            #endregion

                            #region DESTINO
                            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                            {
                                #region Rellenar modelo
                                INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO = new INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo();

                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_CARGAS.Codigo;

                                //Datos Actuales
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulotrazabilidad_Actual = mdl_INV_MovimientosAlmacenLineas_Trazabilidad.idArticulo_Trazabilidad;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Destino;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Destino;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Actual = 0;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Actual = 0;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Actual = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;

                                //Datos Anteriores
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Modificacion = true;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulo_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idArticulo;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdArticulotrazabilidad_Anterior = mdl_INV_MovimientosAlmacenLineas_Trazabilidad.idArticulo_Trazabilidad;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Fecha_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.fecha;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdDelegacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdAlmacen_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idAlmacen_Destino;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.IdUbicacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.idUbicacion_Destino;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_Anterior = mdl_INV_MovimientosAlmacenLineas_Trazabilidad.cantidad;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Cantidad_SegundaUnidad_Anterior = mdl_INV_MovimientosAlmacenLineas_Trazabilidad.segundaUnidad_cantidad;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Relacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.relacion;
                                mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO.Operacion_Anterior = g_mdl_INTERNO_INV_MovimientosAlmacenLineas_Modelo.operacion;
                                #endregion
                                mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloTrazabilidadMovimientosDiario.Actualizar_ArticuloTrazabilidadMovimientoDiario(mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo_DESTINO);
                            }
                            #endregion

                            #endregion

                        }

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_MovimientosAlmacenLineas_Trazabilidad_Datos.Borrar(lng_idMovimientoAlmacenTrazabilidad_ABorrar);
                        }
                    }
                }
            }
            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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(BorrarDatos_Final_MovimientoAlmacenTrazabilidad));

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

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

            g_frm_P_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.Size = new Size(g_frm_P_MovimientoAlmacenLinea.Exferia_DataGridView_LineasTrazabilidad.Size.Width, (g_frm_P_MovimientoAlmacenLinea.Panel_ResumenTotales_Principal.Location.Y - g_frm_P_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea.Exferia_ComboBox_TipoEmbalaje.Text;

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

                //Relacionado
                if (g_frm_P_MovimientoAlmacenLinea.Exferia_Panel_Degradado_EmbalajesRelacional.Visible)
                {
                    str_TipoEmbalaje_Relacionado = g_frm_P_MovimientoAlmacenLinea.Exferia_Label_SinColor_TipoEmbalajeRelacionado_Valor.Text;
                }
                if (g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_SegundaUnidad.Text.Trim().Length > 0)
                {
                    dcm_Total_Movimiento_Relacionado = decimal.Parse(g_frm_P_MovimientoAlmacenLinea.Exferia_TextBox_SegundaUnidad.Text.Replace(".", ","));
                }
                if (g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo != null && g_lst_INTERNO_INV_MovimientosAlmacenLineas_Trazabilidad_Listado_Modelo.Count > 0)
                {
                    dcm_Total_Trazado_Relacionado = g_lst_INTERNO_INV_MovimientosAlmacenLineas_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_MovimientoAlmacenLinea.Exferia_Label_Total_ResumenTotales_TipoEmbalaje_Principal.Text = str_TipoEmbalaje_Principal;
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_Total_ResumenTotales_Movimiento_Principal.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Movimiento_Principal, 3));
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_Total_ResumenTotales_Trazado_Principal.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Trazado_Principal, 3));
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_Total_ResumenTotales_Diferencia_Principal.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Diferencia_Principal, 3));
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_Total_ResumenTotales_TipoEmbalaje_Relacionado.Text = str_TipoEmbalaje_Relacionado;
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_Total_ResumenTotales_Movimiento_Relacionado.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Movimiento_Relacionado, 3));
                g_frm_P_MovimientoAlmacenLinea.Exferia_Label_Total_ResumenTotales_Trazado_Relacionado.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Trazado_Relacionado, 3));
                g_frm_P_MovimientoAlmacenLinea.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_MovimientoAlmacenLinea_Controladora) + "/" + nameof(Rellenar_Resumen_Totales_Trazabilidad));
            }
        }
        #endregion

        #endregion

        #region Cerrar/Abrir
        public void Mostrar_CerradoVolcado()
        {
            //Abierto
            bool bol_Bloquear = false;

            //Si esta Cerrado Bloqueo para que no deje hacer nada
            if (g_str_Estado.Equals(Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO))
            {
                bol_Bloquear = true;
            }

            //Bloqueo los Controles
            SoloLectura.Empezar(g_frm_P_MovimientoAlmacenLinea, bol_Bloquear);
        }
        #endregion

        #region Ubicacion
        public void Ubicacion_Origen_Actualizar(bool _bol_Buscar_Picking)
        {
            try
            {
                //Almacen origen
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Enabled = true;

                //Ubicacion Vaciar
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_RELACIONADOS = null;
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id = -1;
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Codigo = "";
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Descripcion = "";
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_FechaBorrado = null;
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Enabled = false;

                if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id > -1)
                {
                    //Ver si tiene que tener ubicacion
                    if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_2!=null &&
                        ((bool?)g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_DatosAuxiliares_2).Value)
                    {
                        //Desbloquear
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Enabled = false;
                    }
                    else if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id > -1)
                    {
                        #region FILTROS PARA UBICACION
                        List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION = new List<INTERNO_Filtro_OpcionPadre_Modelo>();

                        //Delegacion
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_GEN_DELEGACION), g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Origen));

                        //Almacen
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_GEN_ALMACEN), g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id));

                        //Articulo
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_MAE_ARTICULO), g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id));

                        //Agregar los filtros
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION;
                        #endregion

                        //Desbloquear
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Enabled = true;

                        if (_bol_Buscar_Picking)
                        {
                            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_MAEUBICACIONES_OBTENERMODELO_PORDEFECTO, BindingFlags.Instance | BindingFlags.NonPublic);

                            //Obtener valores
                            object[] arr_Parametros_1 = { g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id, g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Origen.Exferia_F3_Id, Variables.G_MDL_TIPOFUNCION_PICKING.Codigo };

                            //Pasamos los parametros al metodo y lo ejecutamos
                            MAE_Ubicaciones mdl_MAE_Ubicaciones = (MAE_Ubicaciones)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                            if (mdl_MAE_Ubicaciones != null)
                            {
                                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Id = mdl_MAE_Ubicaciones.id;
                                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Codigo = mdl_MAE_Ubicaciones.codigo;
                                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_Descripcion = mdl_MAE_Ubicaciones.descripcion;
                                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Origen.Exferia_F3_FechaBorrado = mdl_MAE_Ubicaciones.fechaBorrado;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_Controladora) + "/" + nameof(Ubicacion_Origen_Actualizar));
            }
        }
        public void Ubicacion_Destino_Actualizar(bool _bol_Buscar_Picking)
        {
            try
            {
                //Almacen destino
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Enabled = true;

                //Ubicacion Vaciar
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_RELACIONADOS = null;
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id = -1;
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Codigo = "";
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Descripcion = "";
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_FechaBorrado = null;
                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Enabled = false;

                if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id > -1)
                {
                    //Ver si tiene que tener ubicacion
                    if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_2 != null &&
                        ((bool?)g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_DatosAuxiliares_2).Value)
                    {
                        //Desbloquear
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Enabled = false;
                    }
                    else if (g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id > -1)
                    {

                        #region FILTROS PARA UBICACION
                        List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION = new List<INTERNO_Filtro_OpcionPadre_Modelo>();

                        //Delegacion
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_GEN_DELEGACION), g_mdl_INTERNO_INV_MovimientosAlmacenCabecera_Modelo.idDelegacion_Destino));

                        //Almacen
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_GEN_ALMACEN), g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id));

                        //Articulo
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION.Add(new INTERNO_Filtro_OpcionPadre_Modelo((Variables.G_STR_OPCION_MAE_ARTICULO), g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id));

                        //Agregar los filtros
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo_UBICACION;
                        #endregion

                        //Desbloquear
                        g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Enabled = true;

                        if (_bol_Buscar_Picking)
                        {
                            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_MAEUBICACIONES_OBTENERMODELO_PORDEFECTO, BindingFlags.Instance | BindingFlags.NonPublic);

                            //Obtener valores
                            object[] arr_Parametros_1 = { g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Articulo.Exferia_F3_Id, g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Almacen_Destino.Exferia_F3_Id, Variables.G_MDL_TIPOFUNCION_PICKING.Codigo };

                            //Pasamos los parametros al metodo y lo ejecutamos
                            MAE_Ubicaciones mdl_MAE_Ubicaciones = (MAE_Ubicaciones)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                            if (mdl_MAE_Ubicaciones != null)
                            {
                                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Id = mdl_MAE_Ubicaciones.id;
                                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Codigo = mdl_MAE_Ubicaciones.codigo;
                                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_Descripcion = mdl_MAE_Ubicaciones.descripcion;
                                g_frm_P_MovimientoAlmacenLinea.Exferia_F3_Ubicacion_Destino.Exferia_F3_FechaBorrado = mdl_MAE_Ubicaciones.fechaBorrado;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MovimientoAlmacenLinea_Controladora) + "/" + nameof(Ubicacion_Destino_Actualizar));
            }
        }
        #endregion
    }
}
