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.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Linq.Expressions;
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;
using static Exferia_Inventarios.General.Enumerados_Inventarios;

namespace Exferia_Inventarios._3_Vistas.Controladoras
{
    public class P_InventarioCabecera_Controladora
    {
        #region Variables Generales
        private P_InventarioCabecera g_frm_P_InventarioCabecera = 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
        private PE_Esperando_BarraProgreso g_frm_PE_Esperando_BarraProgreso;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc


        //Clases de Datos Necesarias para la carga de datos
        private INV_InventarioCabecera_Datos g_obj_INV_InventarioCabecera_Datos = new INV_InventarioCabecera_Datos();
        private INV_InventarioLineas_Datos g_obj_INV_InventarioLineas_Datos = new INV_InventarioLineas_Datos();
        private INV_InventarioLineas_Detalle_Datos g_obj_INV_InventarioLineas_Detalle_Datos = new INV_InventarioLineas_Detalle_Datos();
        private INV_InventarioLineas_Trazabilidad_Datos g_obj_INV_InventarioLineas_Trazabilidad_Datos = new INV_InventarioLineas_Trazabilidad_Datos();

        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_ModificacionDatosAfectaLineas = true;//Se utiliza para saber si se modificador datos que afecten a la linea, y que se tienen que grabar antes de tocar las lineas

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

        //Recargo segun el ejercicio de la fecha seleccionada
        public GEN_EjerciciosActivos_Empresa g_mdl_GEN_EjerciciosActivos_Empresa_SEGUNFECHA = null;

        //Si se estuviera Modificando el Modelo del Registro seleccionado
        public INTERNO_INV_InventarioCabecera_Modelo g_mdl_INTERNO_INV_InventariosCabecera_Modelo = null;

        public string g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

        #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 Borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;

        //Tarea Asincrona de Grabar de datos
        public BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        public bool g_bol_GrabarDatos_TerminoCorrectamente = true;

        //TareaAsincrona de Cambiar la fecha
        public BackgroundWorker g_obj_TareaAsincrona_Cambio_Fecha;
        public bool g_bol_TareaAsincrona_Cambio_Fecha_PerdioFoco = false;//Esta variables se utiliza, porque el LostFocus de Control de fecha, se ejecuta dos veces cuando se muestra una patanlla de espera

        public BackgroundWorker g_obj_TareaAsincrona_Cambio_Delegacion;
        #endregion

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

        #region Inventario Lineas
        //Tarea Asincrona para la Rellenar DataGridView de InventarioLinea
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea;

        //Tarea Asincrona para la Borrar InventarioLinea
        private BackgroundWorker g_TareaAsincrona_Borrar_InventarioLinea;

        //Tarea Asincrona para Actualizar el Total del Importe
        private BackgroundWorker g_TareaAsincrona_ActualizarTotalImporte_InventarioLinea;

        //Listado de InventarioLineas
        public List<INTERNO_INV_InventarioLineas_Listado_Modelo> g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo = null;

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

        //Listado a Cargar en el Combo de Nomenclaturas Precios
        private List<MAE_NomenclaturasPrecios> g_lst_MAE_NomenclaturasPrecios = null;

        //Filtrado del Listado de InventarioLinea
        public List<string> g_lst_ColumnasAMostrar_INV_InventariosLineas = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_InventarioLinea = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_INV_InventariosLineas = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_InventarioLinea = 0;
        private int g_int_TotalRegistros_InventarioLinea = 0;
        #endregion

        #region Inventario Trazabilidad
        //Tarea Asincrona para la Rellenar DataGridView de InventarioLineaTrazabilidad
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad;

        //Tarea Asincrona para la Borrar InventarioLinea
        private BackgroundWorker g_TareaAsincrona_Borrar_InventarioTrazabilidad;

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

        //Filtrado del Listado de InventarioTrazabilidad
        public List<string> g_lst_ColumnasAMostrar_INV_InventariosTrazabilidad = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_InventarioTrazabilidad = null;
        #endregion

        #endregion

        #region Constructor
        public P_InventarioCabecera_Controladora(P_InventarioCabecera _frm_P_InventarioCabecera)
        {
            g_frm_P_InventarioCabecera = _frm_P_InventarioCabecera;

            //Cargar todos los valores de los combos Estaticos
            Cargar_CombosBox();

            g_obj_ABS_Listado_InventarioLinea = new ABS_Listado_INV_InventarioLineas(g_frm_P_InventarioCabecera.P_Base_ValoresGenerales);
            g_obj_ABS_Listado_InventarioTrazabilidad = new ABS_Listado_INV_InventarioLineas_Trazabilidad(g_frm_P_InventarioCabecera.P_Base_ValoresGenerales);

            //(Tarea Asincrona) Cargar Listado de Lineas ########################################
            g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_InventarioLinea_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_InventarioLinea_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_InventarioLinea_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea.WorkerSupportsCancellation = true;
            //####################################################################################

            //(Tarea Asincrona) Cargar Listado de Trazabilidades ########################################
            g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad.WorkerSupportsCancellation = true;
            //####################################################################################

            //(Tarea Asincrona) Actualizar el Total del importe de las lineas de Inventario ###############
            g_TareaAsincrona_ActualizarTotalImporte_InventarioLinea = new BackgroundWorker();
            g_TareaAsincrona_ActualizarTotalImporte_InventarioLinea.DoWork += new DoWorkEventHandler(TareaAsincrona_InventarioLinea_ActualizarTotalImporte_DoWork);
            g_TareaAsincrona_ActualizarTotalImporte_InventarioLinea.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_InventarioLinea_ActualizarTotalImporte_Completed);
            g_TareaAsincrona_ActualizarTotalImporte_InventarioLinea.WorkerReportsProgress = false;
            g_TareaAsincrona_ActualizarTotalImporte_InventarioLinea.WorkerSupportsCancellation = true;
            //############################################################################################

            //(Tarea Asincrona) Validar Cuando cambia la fecha, los datos ya grabados #####################################################################################################
            g_obj_TareaAsincrona_Cambio_Fecha = new BackgroundWorker();
            g_obj_TareaAsincrona_Cambio_Fecha.DoWork += new DoWorkEventHandler(TareaAsincrona_Cambio_Fecha_DoWork);
            g_obj_TareaAsincrona_Cambio_Fecha.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Cambio_Fecha_ProgressChanged);
            g_obj_TareaAsincrona_Cambio_Fecha.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Cambio_Fecha_Completed);
            g_obj_TareaAsincrona_Cambio_Fecha.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Cambio_Fecha.WorkerSupportsCancellation = true;

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        private void Cargar_CombosBox()
        {
            try
            {
                //Obtenemos la lista de NomenclaturaPrecios y se rellena el combo despues
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAENOMENCLATURASPRECIOS_OBTENERLISTADO, BindingFlags.Instance | BindingFlags.NonPublic);

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

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

                g_frm_P_InventarioCabecera.Exferia_ComboBox_Lineas_PrecioAMostrar.Items.Clear();

                if (g_lst_MAE_NomenclaturasPrecios != null)
                {
                    foreach (MAE_NomenclaturasPrecios mdl_MAE_NomenclaturasPrecios in g_lst_MAE_NomenclaturasPrecios)
                    {
                        g_frm_P_InventarioCabecera.Exferia_ComboBox_Lineas_PrecioAMostrar.Items.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_NomenclaturasPrecios.id.ToString(), mdl_MAE_NomenclaturasPrecios.descripcion.ToString(), mdl_MAE_NomenclaturasPrecios.fechaBorrado));
                    }
                    g_frm_P_InventarioCabecera.Exferia_ComboBox_Lineas_PrecioAMostrar.SelectedIndex=0;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "" + nameof(Cargar_CombosBox));
            }
        }

        public void Datos_Iniciales()
        {
            try
            {
                g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha = Variables.G_DTT_FECHA_INICIAL_PORDEFECTO.ToString("dd/MM/yyyy");
                g_mdl_GEN_EjerciciosActivos_Empresa_SEGUNFECHA = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(Variables.G_DTT_FECHA_INICIAL_PORDEFECTO, g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.lng_idEmpresa);


                //Si el Usuario tiene una delegacion Asociada por Defecto se pone
                if (g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.Delegacion!=null)
                {
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id = g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.Delegacion.id;
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Codigo = g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.Delegacion.codigo;
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Descripcion = g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.Delegacion.descripcion;
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_FechaBorrado = g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.Delegacion.fechaBorrado;
                }

                

                g_frm_P_InventarioCabecera.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "" + nameof(Datos_Iniciales));
            }
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            g_mdl_INTERNO_INV_InventariosCabecera_Modelo = null;
           
            //numero documento
            g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento.Text = "";

            g_obj_ENUM_VALIDACIONFECHAS_TIPOCIERRE = G_ENUM_VALIDACIONFECHAS_TIPOCIERRE.Ninguno;
            Mostrar_CerradoAbierto();

            //Delegacion
            g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_FechaBorrado = null;
            g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Enabled = true;

            //descripcion
            g_frm_P_InventarioCabecera.Exferia_TextBox_Descripcion.Text = "";

            //observaciones
            g_frm_P_InventarioCabecera.Exferia_TextBox_Observaciones.Text = "";

            //fecha
            g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha = Variables.G_DTT_FECHA_INICIAL_PORDEFECTO.ToString("dd/MM/yyyy");

            //Empleado
            g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_FechaBorrado = null;

            //InventarioLineas ..................................................
            g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo = new List<INTERNO_INV_InventarioLineas_Listado_Modelo>();
            g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.Rows.Clear();
            g_int_TotalRegistrosInsertados_InventarioLinea = 0;
            g_int_TotalRegistros_InventarioLinea = 0;
            g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InventarioLinea;
            g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InventarioLinea;
            //....................................................................

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

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

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

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        public bool ComprobarCambios_AfectaLineas()
        {
            if (g_bol_ModificacionDatosAfectaLineas)
            {
                GrabarDatos();

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

                return g_bol_GrabarDatos_TerminoCorrectamente;
            }
            return true;
        }
        #endregion

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

            try
            {
                //Buscar el Ejercicio segun la fecha
                GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(DateTime.ParseExact(g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture), g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.lng_idEmpresa);
                if (mdl_GEN_EjerciciosActivos_Empresa != null)
                {
                    string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente_Numerico(nameof(INV_InventarioCabecera),
                                                                                                nameof(INV_InventarioCabecera.numeroDocumento),
                                                                                                nameof(INV_InventarioCabecera.idEmpresa),
                                                                                                g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.lng_idEmpresa,
                                                                                                nameof(INV_InventarioCabecera.idDelegacion),
                                                                                                g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id,
                                                                                                true,
                                                                                                g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento.Exferia_TextBox_MaxLength,
                                                                                                nameof(INV_InventarioCabecera.fecha),
                                                                                                mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaInicio,
                                                                                                mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin
                                                                                                );

                    if (!str_CodigoSiguiente.Equals("-1"))
                    {
                        g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento.Text = str_CodigoSiguiente;
                    }
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO(g_frm_P_InventarioCabecera.Exferia_Label_NumeroDocumento.Text);
                    }
                }
                //No encontro el ejercicio
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_VALIDACION_FECHASEJERCICIOS_NOTIENEEJERCICIOSCREADOS();
                }

            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Buscar_CodigoSiguiente));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

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

            try
            {
                //Buscar el Ejercicio segun la fecha
                GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(DateTime.ParseExact(g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture), g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.lng_idEmpresa);
                if (mdl_GEN_EjerciciosActivos_Empresa != null)
                {

                    string str_Codigo = g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento.Text.Trim();

                    bool bol_CodigoRepetido = Datos_Generales.Buscar_CodigoRepetido(nameof(INV_InventarioCabecera),
                                                                                    nameof(INV_InventarioCabecera.numeroDocumento),
                                                                                    str_Codigo,
                                                                                    nameof(INV_InventarioCabecera.id),
                                                                                    (g_mdl_INTERNO_INV_InventariosCabecera_Modelo != null ? g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id : -1),
                                                                                    nameof(INV_InventarioCabecera.idEmpresa),
                                                                                    g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.lng_idEmpresa,
                                                                                    nameof(INV_InventarioCabecera.idDelegacion),
                                                                                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id,
                                                                                    true,
                                                                                    nameof(INV_InventarioCabecera.fecha),
                                                                                    mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaInicio,
                                                                                    mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin
                                                                                    );

                    if (bol_CodigoRepetido)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_InventarioCabecera.Exferia_Label_NumeroDocumento.Text);
                    }
                }
                //No encontro el ejercicio
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_VALIDACION_FECHASEJERCICIOS_NOTIENEEJERCICIOSCREADOS();
                }

            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CODIGOVALIDACIONREPETIDO();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Buscar_CodigoRepetido));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CODIGOVALIDACIONREPETIDO();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_InventarioCabecera.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_InventarioCabecera.Enabled = true;
                g_bol_Termino_CargaDatos_Inicial = 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_InventarioCabecera_Controladora) + "/" + nameof(RecargarDatos), true);
            }
        }

        private void TareaAsincrona_CargarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Cargar Valores
                if (CargarDatos(g_frm_P_InventarioCabecera.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_InventariosCabecera_Modelo != null)
                    {
                        //Cargar Listado InventarioLinea ...........................................................
                        if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo.InventarioLineas != null)
                        {
                            g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.InventarioLineas;
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_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_InventarioCabecera_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)
        {
            g_obj_ENUM_VALIDACIONFECHAS_TIPOCIERRE = G_ENUM_VALIDACIONFECHAS_TIPOCIERRE.Ninguno;

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

            //Desbloquear el Formulario
            g_frm_P_InventarioCabecera.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_InventarioCabecera.Salir_P_Base();
                }
                else
                {
                    //Si tiene Lineas Bloqueo la Delegacion (Porque las lineas tiene almacenes que depende de la delegacion)
                    if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null && g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                    {
                        g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Enabled = false;
                    }

                    //Ordenar
                    g_frm_P_InventarioCabecera.InventarioLinea_Ordenar_DataGridView();

                    g_bol_ModificacionDatosAfectaLineas = false;

                    //Si el Ejercicio Tuviera CierreAdministrativo o CierreContable tiene que bloquear todo el Formulario
                    g_obj_ENUM_VALIDACIONFECHAS_TIPOCIERRE = Datos_Generales.ComprobarBloquear_EjercicioCierre(  g_frm_P_InventarioCabecera,
                                                                                                        g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.EjercicioActivo,
                                                                                                        g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.Ejercicios_Listado.ToList(),
                                                                                                        g_frm_P_InventarioCabecera.Exferia_Label_SinColor_Advertencia_Ejercicio,
                                                                                                        g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha,
                                                                                                        0);

                    //Rellenar Grids
                    Rellenar_DataGrid_InventarioLinea();


                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

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

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

                //Hacemos foco al primer control.
                Funciones.Poner_Foco_Objeto(g_frm_P_InventarioCabecera, g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha);
                //Seleccionamos el texto
                Funciones.SeleccionarTexto_Objeto(g_frm_P_InventarioCabecera,g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha);
            }
        }

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

            try
            {
                g_mdl_INTERNO_INV_InventariosCabecera_Modelo = g_obj_INV_InventarioCabecera_Datos.Obtener(_lng_id);

                //Si no es Nulo Cargo los Datos
                if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo != null)
                {

                    //Paginador ..................................................................................
                    if (g_frm_P_InventarioCabecera.P_Base_PantallaOrigen != null &&
                       g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                       g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id;
                        int int_PaginaDelObjeto = g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

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

                    //numeroDocumento
                    g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento.Text = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.numeroDocumento.ToString();
                    //descripcion
                    g_frm_P_InventarioCabecera.Exferia_TextBox_Descripcion.Text = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.descripcion;

                    //observaciones
                    g_frm_P_InventarioCabecera.Exferia_TextBox_Observaciones.Text = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.observaciones;

                    //fecha
                    g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha.ToString("dd/MM/yyyy");
                    g_mdl_GEN_EjerciciosActivos_Empresa_SEGUNFECHA = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha, g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idEmpresa);

                    //Delegaciones 
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.GEN_Delegaciones.id;
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Codigo = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.GEN_Delegaciones.codigo;
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.GEN_Delegaciones.descripcion;
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.GEN_Delegaciones.fechaBorrado;

                    //Empleado
                    if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idEmpleado != null)
                    {
                        g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Id = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.MAE_Empleados.id;
                        g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Codigo = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.MAE_Empleados.codigo;
                        g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.MAE_Empleados.nombre;
                        g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.MAE_Empleados.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Id = -1;
                        g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Codigo = "";
                        g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Descripcion = "";
                        g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_FechaBorrado = null;
                    }

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

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

                            //numeroDocumento
                            if (str_campo.Equals(nameof(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.numeroDocumento)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.numeroDocumento.ToString();
                            }
                            //descripcion
                            else if (str_campo.Equals(nameof(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.descripcion)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.descripcion.ToString();
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_InventarioCabecera.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_InventarioCabecera.Tag.ToString(), str_MenuSuperior_Codigo);

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos()
        {
            try
            {
                g_bol_GrabarDatos_TerminoCorrectamente = true;

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

                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_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)
                {
                    mdl_ValorDevuelto_Modelo = GrabarDatos_Final();
                }
                else
                {
                    mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_InventarioCabecera.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 tuvoel problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_InventarioCabecera,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
                    if (g_frm_P_InventarioCabecera.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_InventarioCabecera.P_Base_F3Origen != null)
                    {
                        g_frm_P_InventarioCabecera.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    //Poner el Foco Inicial
                    Funciones.Poner_Foco_Objeto(g_frm_P_InventarioCabecera,g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo);
                    g_bol_ModificacionDatosAfectaLineas = false;
                    g_frm_P_InventarioCabecera.P_Base_SeModificoDatosPantalla = false;

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

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

            try
            {
                // La Delegacion no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

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

                // La fecha no puede estar vacia y debe ser correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

                    if (int_fechaAlta_Respuesta == 1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha;
                    }
                    else if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha;
                    }
                }

                //Si el Numero documento esta vacio y se intenta buscar el ultimo numerico por delegacion y ejercicio y llego al limite de base de datos
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento.Text.Trim().Length == 0)
                    {
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = Buscar_CodigoSiguiente();

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo.Mensaje;
                            mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento;
                        }
                    }
                }

                // Numero de docmento no puede estar Repetido
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = Buscar_CodigoRepetido();

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo.Mensaje;
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento;
                    }
                }

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

            }
            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_InventarioCabecera_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_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    INV_InventarioCabecera mdl_INV_InventariosCabecera = new INV_InventarioCabecera();
                    mdl_INV_InventariosCabecera.id = g_mdl_INTERNO_INV_InventariosCabecera_Modelo != null ? g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id : -1;

                    //Asignar el idEmpresa...........................................................................................
                    if ((g_mdl_INTERNO_INV_InventariosCabecera_Modelo != null ? g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idEmpresa : -1) != -1)
                    {
                        mdl_INV_InventariosCabecera.idEmpresa = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idEmpresa;
                    }
                    else
                    {
                        //Buscar el idEmpresa que Corresponda
                        mdl_INV_InventariosCabecera.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.lng_idEmpresa, nameof(INV_InventarioCabecera));
                    }

                    //NumeroDocumento 
                    mdl_INV_InventariosCabecera.numeroDocumento = long.Parse(g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento.Text);

                    // observaciones
                    mdl_INV_InventariosCabecera.observaciones = g_frm_P_InventarioCabecera.Exferia_TextBox_Observaciones.Text.Trim();

                    // fecha
                    mdl_INV_InventariosCabecera.fecha = DateTime.ParseExact(g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                    // descripcion (Si no exite nada en descripcion se pone Empresa/Ejercicio/Delegacion/Nº Documento)
                    if (g_frm_P_InventarioCabecera.Exferia_TextBox_Descripcion.Text.Trim().Length == 0)
                    {
                        //Ejercicio Segun la fecha
                        GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa=Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(mdl_INV_InventariosCabecera.fecha, g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.lng_idEmpresa);

                        mdl_INV_InventariosCabecera.descripcion = g_frm_P_InventarioCabecera.P_Base_ValoresGenerales.str_Empresa_Codigo + "/" +
                                                                    (mdl_GEN_EjerciciosActivos_Empresa!=null ? mdl_GEN_EjerciciosActivos_Empresa.anioControl : "") + "/" +
                                                                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Codigo + "/" +
                                                                    g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento.Text;
                    }
                    else
                    {
                        mdl_INV_InventariosCabecera.descripcion = g_frm_P_InventarioCabecera.Exferia_TextBox_Descripcion.Text.Trim();
                    }

                    //Delegacion
                    mdl_INV_InventariosCabecera.idDelegacion = g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id;

                    //Empleado 
                    if (g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Id != -1)
                    { mdl_INV_InventariosCabecera.idEmpleado = g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Id; }
                    else
                    { mdl_INV_InventariosCabecera.idEmpleado = null; }

                    //Estado
                    mdl_INV_InventariosCabecera.estado = g_str_Estado;

                    // Se graba el modelo ya relleno.
                    mdl_ValorDevuelto_Modelo = g_obj_INV_InventarioCabecera_Datos.Grabar(mdl_INV_InventariosCabecera);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        // obtenemos la id del InventariosCabecera
                        long lng_idInventarioCabecera = mdl_ValorDevuelto_Modelo.Id;


                        //Termino Transaccion
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Obtener el modelo que se acaba de grabar
                        g_mdl_INTERNO_INV_InventariosCabecera_Modelo = g_obj_INV_InventarioCabecera_Datos.Obtener(mdl_ValorDevuelto_Modelo.Id);

                        g_frm_P_InventarioCabecera.P_Base_id = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id;

                        //Recargar
                        g_frm_P_InventarioCabecera.Exferia_TextBox_NumeroDocumento.Text = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.numeroDocumento.ToString();
                        g_frm_P_InventarioCabecera.Exferia_TextBox_Descripcion.Text = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.descripcion;

                        //Si tienes Permisos para Borrar
                        g_frm_P_InventarioCabecera.Exferia_Button_Borrar.Enabled = true;
                    }
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }

            return mdl_ValorDevuelto_Modelo;
        }

        #endregion

        #region Borrar Datos
        public void BorrarDatos()
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_InventarioCabecera.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_InventarioCabecera.Enabled = true;

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

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_InventarioCabecera.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
                    if (g_frm_P_InventarioCabecera.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_InventarioCabecera.P_Base_F3Origen != null)
                    {
                        g_frm_P_InventarioCabecera.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    g_frm_P_InventarioCabecera.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_InventarioCabecera.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_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
            {
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_InventarioCabecera_Datos.Borrar(g_mdl_INTERNO_INV_InventariosCabecera_Modelo != null ? g_mdl_INTERNO_INV_InventariosCabecera_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_InventarioCabecera_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 Inventarios Lineas 

        #region Rellenar DataGrid InventarioLinea
        public void Rellenar_DataGrid_InventarioLinea()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.Rows.Clear();
                g_int_TotalRegistrosInsertados_InventarioLinea = 0;
                g_int_TotalRegistros_InventarioLinea = 0;
                g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InventarioLinea;
                g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InventarioLinea;
                g_frm_P_InventarioCabecera.Exferia_Label_SinColor_TotalImporte_Valor.Text = "0,00";

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_InventarioLinea.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("",ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Rellenar_DataGrid_InventarioLinea));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_InventarioLinea_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_INV_InventarioLineas_Listado_Modelo> lst_INTERNO_INV_InventariosLineas_Listado_Modelo_Filtradas = Filtrar_InventarioLinea();

                //Total
                g_int_TotalRegistros_InventarioLinea = lst_INTERNO_INV_InventariosLineas_Listado_Modelo_Filtradas.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_InventarioLineas_Columnas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                {
                    int int_HayTextos= lst_INTERNO_INV_InventariosLineas_Listado_Modelo_Filtradas.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_InventarioLinea.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                    }
                }

               long lng_idNomenclaturaPrecio= long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_InventarioCabecera.Exferia_ComboBox_Lineas_PrecioAMostrar.SelectedItem).Identificador);

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

                    //Progreso
                    g_int_TotalRegistrosInsertados_InventarioLinea += 1;

                    //Asignarle el idNomenclaturaPrecio
                    mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.IdNomenclaturaPrecio = lng_idNomenclaturaPrecio;

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

                    //Esperar un poco
                    Thread.Sleep(1);
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_InventarioLinea_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_InventarioLinea_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_InventarioLinea_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de InventarioLinea
                g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InventarioLinea;
                g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InventarioLinea;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_InventarioLinea_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                InventarioLinea_ActualizarTotalImporte();

                g_frm_P_InventarioCabecera.InventarioLinea_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_InventarioLinea(INTERNO_INV_InventarioLineas_Listado_Modelo _mdl_INTERNO_INV_InventariosLineas_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

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

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_InventarioLineas_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_InventariosLineas_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_InventariosLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_InventariosLineas_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_InventariosLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                {
                    string str_Valor = (string)_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo, null);

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

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_INV_InventarioLineas_Listado_Modelo> Filtrar_InventarioLinea()
        {
            //Filtros Avanzados
            if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null)
            {
                if (g_dct_ListadoFiltros_INV_InventariosLineas != null && g_dct_ListadoFiltros_INV_InventariosLineas.Count > 0)
                {
                    return g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_INV_InventarioLineas_Listado_Modelo>(g_dct_ListadoFiltros_INV_InventariosLineas, g_obj_ABS_Listado_InventarioLinea)).ToList();
                }
                else
                {
                    return g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.AsQueryable().ToList();
                }
            }
            else
            {
                return null;
            }
        }
        #endregion

        public void InventarioLinea_Actualizar_Registro(long _lng_idInventarioLinea, G_ENUM_TIPOACCION _enum_TipoAccion,bool _bol_RecargarTrazabilidad, bool _bol_Recargar_Importes)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventariosLineas_Listado_Modelo = g_obj_INV_InventarioLineas_Datos.Obtener_InventarioLinea(_lng_idInventarioLinea);

                if (mdl_INTERNO_INV_InventariosLineas_Listado_Modelo != null)
                {
                    //Asignarle el idNomenclaturaPrecio
                    mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.IdNomenclaturaPrecio = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_InventarioCabecera.Exferia_ComboBox_Lineas_PrecioAMostrar.SelectedItem).Identificador);

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

                        g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Add(mdl_INTERNO_INV_InventariosLineas_Listado_Modelo);
                    }

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

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_InventarioLinea(mdl_INTERNO_INV_InventariosLineas_Listado_Modelo, row);
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.Rows.Add(Transformar_Modelo_A_Row_InventarioLinea(mdl_INTERNO_INV_InventariosLineas_Listado_Modelo, null));

                        //Sumar Cantidad de Lineas Insertadas
                        g_int_TotalRegistros_InventarioLinea += 1;
                        g_int_TotalRegistrosInsertados_InventarioLinea += 1;

                        g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InventarioLinea;
                        g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InventarioLinea;
                    }

                    if (_bol_Recargar_Importes)
                    {
                        InventarioLinea_ActualizarTotalImporte();
                    }

                    //Actualiazr el listado de las lineas, para poder cogerlas desde la pantalla de InventarioLinea
                    if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null &&
                        g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                    {
                        g_frm_P_InventarioCabecera.P_Base_Objetos_Listado = g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Select(m => new INTERNO_Listado_CamposClave_Modelo
                        {
                            ID = m.id,
                            ID_Aux1 = m.idArticulo,
                            Dato_Auxiliar = (m.Articulo_Codigo + " - " + m.Almacen_Descripcion)
                        }).ToList();
                    }
                    else
                    {
                        g_frm_P_InventarioCabecera.P_Base_Objetos_Listado = null;
                    }

                    if (_bol_RecargarTrazabilidad)
                    {
                        Rellenar_DataGrid_InventarioTrazabilidad(_lng_idInventarioLinea);
                    }
                }

                //Si tiene Lineas Bloqueo la Delegacion (Porque las lineas tiene almacenes que depende de la delegacion)
                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null && g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                {
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Enabled = false;
                }
                else
                {
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Enabled = true;
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(InventarioLinea_Actualizar_Registro));
            }

        }
        public void InventarioLinea_Borrar_Registro(List<long> _lst_idInventarioLinea)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null && g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_INV_InventarioLineas_Listado_Modelo> lst_INTERNO_INV_InventariosLineas_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Where(m => _lst_idInventarioLinea.Contains(m.id)).ToList();
                    if (lst_INTERNO_INV_InventariosLineas_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_INV_InventariosLineas_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventariosLineas_Listado_Modelo in lst_INTERNO_INV_InventariosLineas_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Remove(mdl_INTERNO_INV_InventariosLineas_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idInventarioLinea.Contains(long.Parse(r.Cells[nameof(INTERNO_INV_InventarioLineas_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_InventarioCabecera.Exferia_DataGridView_Lineas.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Lineas Borradas
                g_int_TotalRegistros_InventarioLinea -= _lst_idInventarioLinea.Count();
                g_int_TotalRegistrosInsertados_InventarioLinea = g_int_TotalRegistrosInsertados_InventarioLinea - _lst_idInventarioLinea.Count();

                g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InventarioLinea;
                g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InventarioLinea;

                InventarioLinea_ActualizarTotalImporte();

                //Actualiazr el listado de las lineas, para poder cogerlas desde la pantalla de InventarioLinea
                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null &&
                    g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                {
                    g_frm_P_InventarioCabecera.P_Base_Objetos_Listado = g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Select(m => new INTERNO_Listado_CamposClave_Modelo
                    {
                        ID = m.id,
                        ID_Aux1 = m.idArticulo,
                        Dato_Auxiliar = (m.Articulo_Codigo + " - " + m.Articulo_Descripcion)
                    }).ToList();
                }
                else
                {
                    g_frm_P_InventarioCabecera.P_Base_Objetos_Listado = null;
                }

                //Si tiene Lineas Bloqueo la Delegacion (Porque las lineas tiene almacenes que depende de la delegacion)
                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null && g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                {
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Enabled = false;
                }
                else
                {
                    g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Enabled = true;
                }

                g_frm_P_InventarioCabecera.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(InventarioLinea_Borrar_Registro));
            }
        }

        #region Borrar Datos en Base Datos InventarioLinea
        public void BorrarDatos_InventarioLinea(List<long> _lst_idInventarioLinea_ABorrar)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_InventarioCabecera.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_idInventarioLinea_ABorrar);

                    g_TareaAsincrona_Borrar_InventarioLinea = new BackgroundWorker();
                    g_TareaAsincrona_Borrar_InventarioLinea.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_InventarioLinea_DoWork);
                    g_TareaAsincrona_Borrar_InventarioLinea.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_InventarioLinea_Completed);
                    g_TareaAsincrona_Borrar_InventarioLinea.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_InventarioCabecera.Enabled = true;

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

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

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = BorrarDatos_Final_InventarioLinea(lst_idInventarioLinea_ABorrar);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idInventarioLinea_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_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Borrar_InventarioLinea_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_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Borrar_InventarioLinea_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_InventarioLinea_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_InventarioCabecera.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(Variables.G_STR_OPCION_INV_INVENTARIOLINEA);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    //Primer numero de linea borrado
                    lst_obj.Add(g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Where(m => m.id.Equals(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id.OrderBy(x => x).FirstOrDefault())).FirstOrDefault().numeroLinea);

                    g_frm_P_InventarioCabecera.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_InventarioCabecera.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Borrar_InventarioLinea_Completed));
            }
            finally
            {
                //Poner el Foco Inicial
                Funciones.Poner_Foco_Objeto(g_frm_P_InventarioCabecera,g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo);
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final_InventarioLinea(List<long> _lst_idInventarioLinea_ABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                if (_lst_idInventarioLinea_ABorrar != null && _lst_idInventarioLinea_ABorrar.Count > 0)
                {
                    foreach (long idInventarioLinea_ABorrar in _lst_idInventarioLinea_ABorrar)
                    {
                        INTERNO_INV_InventariosLineas_Modelo mdl_INTERNO_INV_InventariosLineas_Modelo = g_obj_INV_InventarioLineas_Datos.Obtener_Para_Borrar(idInventarioLinea_ABorrar);

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

                            #region Rellenar modelo
                            INTERNO_ArticuloDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo = new INTERNO_ArticuloDiarioActualizar_Documentos_Modelo();

                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_INVENTARIO.Codigo;

                            //Datos Actuales
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idArticulo;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idAlmacen;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idUbicacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Actual = 0;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Actual = 0;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.relacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.operacion;

                            //Datos Anteriores
                            if (mdl_INTERNO_INV_InventariosLineas_Modelo != null)
                            {
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Modificacion = true;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticuloComodin_Anterior =null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idArticulo;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idAlmacen;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idUbicacion;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.cantidad;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.segundaUnidad_cantidad;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.relacion;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.operacion;
                            }
                            else
                            {
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Modificacion = false;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticuloComodin_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = "";
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Anterior = "";
                            }
                            #endregion

                            mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloMovimientosDiario.Actualizar_ArticuloMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo);

                            #endregion
                        }

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            #region ACTUALIZAR ARTICULO TRAZABILIDAD MOVIMIENTOS DIARIO 
                            //Buscar la Linea
                            INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventarioLineas_Listado_Modelo = g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Where(m => m.id.Equals(idInventarioLinea_ABorrar)).FirstOrDefault();

                            if (mdl_INTERNO_INV_InventarioLineas_Listado_Modelo != null &&
                                mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX != null &&
                                mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX.Count > 0)
                            {
                                foreach (INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo in mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX)
                                {
                                    #region Rellenar modelo
                                    INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo = new INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo();

                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_INVENTARIO.Codigo;

                                    //Datos Actuales
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulo_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idArticulo;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulotrazabilidad_Actual = mdl_INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo.idArticulo_Trazabilidad;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Fecha_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdDelegacion_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdAlmacen_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idAlmacen;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdUbicacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idUbicacion;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_Actual = 0;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Actual = 0;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Relacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.relacion;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Operacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.operacion;

                                    //Datos Anteriores
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Modificacion = true;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idArticulo;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulotrazabilidad_Anterior = mdl_INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo.idArticulo_Trazabilidad;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Fecha_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idAlmacen;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idUbicacion;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = mdl_INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo.cantidad;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = mdl_INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo.segundaUnidad_cantidad;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Relacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.relacion;
                                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Operacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.operacion;

                                    #endregion

                                    mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloTrazabilidadMovimientosDiario.Actualizar_ArticuloTrazabilidadMovimientoDiario(mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo);
                                }

                            }
                            #endregion

                            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_InventarioLineas_Datos.Borrar(idInventarioLinea_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_InventarioCabecera_Controladora) + "/" + nameof(BorrarDatos_Final_InventarioLinea));
                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 Actualizar el Total del Importe de las Lineas
        public void InventarioLinea_ActualizarTotalImporte()
        {
            try
            {
                g_TareaAsincrona_ActualizarTotalImporte_InventarioLinea.CancelAsync();
                while (g_TareaAsincrona_ActualizarTotalImporte_InventarioLinea.IsBusy)
                {
                    Application.DoEvents();
                }

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_ActualizarTotalImporte_InventarioLinea.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(InventarioLinea_ActualizarTotalImporte));
            }
        }

        private void TareaAsincrona_InventarioLinea_ActualizarTotalImporte_DoWork(object sender, DoWorkEventArgs e)
        {
            decimal dcm_TotalImporte = 0;
            try
            {
                List<INTERNO_INV_InventarioLineas_Listado_Modelo> lst_INTERNO_INV_InventariosLineas_Listado_Modelo_Filtradas = Filtrar_InventarioLinea();


                if (lst_INTERNO_INV_InventariosLineas_Listado_Modelo_Filtradas != null && lst_INTERNO_INV_InventariosLineas_Listado_Modelo_Filtradas.Count > 0)
                {
                    //Se hace un bucle por si se cancela que salga mas rapido de la tarea asincrona
                    foreach (INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventariosLineas_Listado_Modelo in lst_INTERNO_INV_InventariosLineas_Listado_Modelo_Filtradas)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }


                        //Asignarle el idNomenclaturaPrecio
                        mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.IdNomenclaturaPrecio = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_InventarioCabecera.Exferia_ComboBox_Lineas_PrecioAMostrar.SelectedItem).Identificador);


                        dcm_TotalImporte += mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.Importe;
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_InventarioLinea_ActualizarTotalImporte_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_InventarioLinea_ActualizarTotalImporte_DoWork));
            }
            finally
            {
                e.Result = dcm_TotalImporte;
            }
        }
        private void TareaAsincrona_InventarioLinea_ActualizarTotalImporte_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                try
                {
                    g_frm_P_InventarioCabecera.Exferia_Label_SinColor_TotalImporte_Valor.Text = ((decimal)e.Result).ToString();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_InventarioLinea_ActualizarTotalImporte_Completed));
                }
            }
        }
        #endregion

        #region Reordenar NumeroLinea
        public void Reordenar_NumeroLineas_InventarioLinea(long _lng_idInventarioLinea_Modificada, int _int_NumeroLinea_Modificado)
        {
            try
            {
                //Se usa el dictionary para actualizar los registros en base de datos
                Dictionary<long, int> dct_IdInventarioLinea_NumeroLinea = new Dictionary<long, int>();

                //Ver si hay alguna linea ya creada
                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo!= null && g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                {

                    //Sumarle 1 a todos los registros que sean iguales o superior al numero de linea del registro modificado, sin cogerlo a el
                    g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Where(m => (!m.id.Equals(_lng_idInventarioLinea_Modificada)) && m.numeroLinea >= _int_NumeroLinea_Modificado).ToList().ForEach(x => x.numeroLinea += 1);

                    //Reordenar los registros
                    int int_NumeroLinea = _int_NumeroLinea_Modificado;
                    //El listado no se cogen los registros que esten en promocion
                    foreach (INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventarioLineas_Listado_Modelo in g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Where(x => x.numeroLinea >= _int_NumeroLinea_Modificado).OrderBy(m => m.numeroLinea))
                    {
                        //Linea Principal
                        mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.numeroLinea = int_NumeroLinea;
                        //Actualizar el DataGridView
                        DataGridViewRow row = g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.Rows
                                     .Cast<DataGridViewRow>()
                                     .Where(r => r.Cells[nameof(INTERNO_INV_InventarioLineas_Listado_Modelo.id)].Value.Equals(mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.id)).FirstOrDefault();

                        if (row != null)
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_InventarioLinea(mdl_INTERNO_INV_InventarioLineas_Listado_Modelo, row);
                        }
                        //Rellenar el Diccionario
                        dct_IdInventarioLinea_NumeroLinea.Add(mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.id, int_NumeroLinea);
                        int_NumeroLinea += 1;
                    }


                    //Actualizar base de datos
                    if (dct_IdInventarioLinea_NumeroLinea.Count > 0)
                    {
                        g_obj_INV_InventarioLineas_Datos.Actualizar_NumeroLinea(dct_IdInventarioLinea_NumeroLinea);
                    }


                    //Ordenar el DataGridView InventarioLineas
                    g_frm_P_InventarioCabecera.InventarioLinea_Ordenar_DataGridView();

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

        #region Lineas Actualizar
        private INTERNO_ValorDevuelto_Modelo Actualizar_LineasRecalculadas(DateTime _dtt_FechaSeleccionada,
                                                                           BackgroundWorker _obj_BackgroundWorker)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            try
            {
                List<INV_InventarioLineas_Detalle> lst_INV_InventarioLineas_Detalle_AGRABAR = new List<INV_InventarioLineas_Detalle>();

                //Recorrer linea a linea
                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null &&
                    g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                {
                    //Mensaje de recalculando ............................................................................................................
                    _obj_BackgroundWorker.ReportProgress(3, Mensajes.G_STR_ESPERANDO_RECALCULANDO_REGISTROSLISTADO());
                    //Vaciar el total cargado de lineas
                    _obj_BackgroundWorker.ReportProgress(2, 0);
                    //Total de lineas
                    _obj_BackgroundWorker.ReportProgress(1, g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count);
                    //.....................................................................................................................................

                    int int_Contador = 0;
                    foreach (INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventariosLineas_Listado_Modelo in g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.OrderBy(m => m.numeroLinea))
                    {
                        //Rellenar la Clase para calculos
                        InventariosVariacionExistencias_Calculos obj_InventariosVariacionExistencias_Calculos = new InventariosVariacionExistencias_Calculos(
                                                                                                                                                            _dtt_FechaSeleccionada,
                                                                                                                                                            g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idEmpresa,
                                                                                                                                                            g_lst_MAE_NomenclaturasPrecios,
                                                                                                                                                            0);
                        //Recalcular todo segun fecha nueva
                        obj_InventariosVariacionExistencias_Calculos.Cambio_Fecha(mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.idArticulo,
                                                                                  mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.idEmbalaje,
                                                                                  mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.cantidad,
                                                                                  mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.segundaUnidad_cantidad);

                        //Inventario linea a Grabar
                        List<INV_InventarioLineas_Detalle> lst_INV_InventarioLineas_Detalle_Recalculadas = Obtener_InventariosLineas_Detalles_A_Grabar(obj_InventariosVariacionExistencias_Calculos,
                                                                                                                                                        mdl_INTERNO_INV_InventariosLineas_Listado_Modelo);
                        //Agregar al listado final
                        lst_INV_InventarioLineas_Detalle_AGRABAR.AddRange(lst_INV_InventarioLineas_Detalle_Recalculadas);


                        //Sumar al contador
                        int_Contador += 1;

                        //Añadir linea al progreessbar .............................
                        _obj_BackgroundWorker.ReportProgress(2, int_Contador);
                        //..........................................................
                    }
                }

                
                try
                {

                    // 1º ACTUALIZAMOS la fecha en la Cabecera
                    //Mensaje de recalculando ............................................................................................
                    _obj_BackgroundWorker.ReportProgress(3, Mensajes.G_STR_ESPERANDO_ACTUALIZANDO_REGISTROCABECERA("fecha"));
                    //Vaciar el total cargado de lineas
                    _obj_BackgroundWorker.ReportProgress(2, 0);
                    //Total de lineas
                    _obj_BackgroundWorker.ReportProgress(1, 0);
                    //......................................................................................................................

                    //Actualizamos la fecha
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARCABECERA = g_obj_INV_InventarioCabecera_Datos.Actualizar_Fecha(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, _dtt_FechaSeleccionada);
                    if (mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARCABECERA.TodoCorrecto)
                    {
                        // 2º BORRAMOS LINEAS ANTIGUAS 
                        //Mensaje de recalculando .............................................................................................
                        _obj_BackgroundWorker.ReportProgress(3, Mensajes.G_STR_ESPERANDO_BORRANDO_REGISTROSANTIGUOS());
                        //.....................................................................................................................

                        //Recorrer linea a linea
                        if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null &&
                            g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                        {
                            //Recorrer las lineas a Actualizar
                            foreach (INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventarioLineas_Listado_Modelo in g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo)
                            {
                                INTERNO_INV_InventariosLineas_Modelo mdl_INTERNO_INV_InventariosLineas_Modelo = g_obj_INV_InventarioLineas_Datos.Obtener_Para_Borrar(mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.id);

                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS = new INTERNO_ValorDevuelto_Modelo();
                                mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.TodoCorrecto = true;
                                mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.Mensaje = "";

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

                                    #region Rellenar modelo
                                    INTERNO_ArticuloDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo = new INTERNO_ArticuloDiarioActualizar_Documentos_Modelo();

                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_INVENTARIO.Codigo;

                                    //Datos Actuales
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idArticulo;
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idAlmacen;
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idUbicacion;
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Actual = 0;
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Actual = 0;
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.relacion;
                                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.operacion;

                                    //Datos Anteriores
                                    if (mdl_INTERNO_INV_InventariosLineas_Modelo != null)
                                    {
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Modificacion = true;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticuloComodin_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idArticulo;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idAlmacen;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idUbicacion;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.cantidad;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.segundaUnidad_cantidad;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.relacion;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.operacion;
                                    }
                                    else
                                    {
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Modificacion = false;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticuloComodin_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = "";
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Anterior = null;
                                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Anterior = "";
                                    }
                                    #endregion

                                    mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS = Funciones_ArticuloMovimientosDiario.Actualizar_ArticuloMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo);
                                    #endregion
                                }

                                if (mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.TodoCorrecto)
                                {
                                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_BORRARLINEAS = g_obj_INV_InventarioLineas_Detalle_Datos.Borrar(mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.id);
                                    if (!mdl_INTERNO_ValorDevuelto_Modelo_BORRARLINEAS.TodoCorrecto)
                                    {
                                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo_BORRARLINEAS.Mensaje;

                                        break;
                                    }
                                }
                                else
                                {
                                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.Mensaje;

                                    break;
                                }
                            }

                            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                            {
                                // 3º INSERTAMOS LAS LINEAS NUEVAS
                                //Mensaje de recalculando ....................................................................
                                _obj_BackgroundWorker.ReportProgress(3, Mensajes.G_STR_ESPERANDO_AGREGANDODATOS());
                                //............................................................................................

                                //Insertar lineas
                                if (lst_INV_InventarioLineas_Detalle_AGRABAR != null && lst_INV_InventarioLineas_Detalle_AGRABAR.Count > 0)
                                {
                                    List<long> lst_LineasYaRecalculadas = new List<long>();

                                    foreach (INV_InventarioLineas_Detalle mdl_INV_InventarioLineas_Detalle in lst_INV_InventarioLineas_Detalle_AGRABAR)
                                    {
                                        if (!lst_LineasYaRecalculadas.Contains(mdl_INV_InventarioLineas_Detalle.idInventarioLinea))
                                        {

                                            #region ACTUALIZAR ARTICULO MOVIMIENTOS DIARIO 

                                            INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventarioLineas_Listado_Modelo = g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Where(m => m.id == mdl_INV_InventarioLineas_Detalle.idInventarioLinea).FirstOrDefault();


                                            #region Rellenar modelo
                                            INTERNO_ArticuloDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo = new INTERNO_ArticuloDiarioActualizar_Documentos_Modelo();

                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_INVENTARIO.Codigo;

                                            //Datos Actuales
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idArticulo;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Actual = _dtt_FechaSeleccionada;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idAlmacen;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idUbicacion;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.cantidad;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.segundaUnidad_cantidad;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.relacion;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.operacion;

                                            //Datos Anteriores
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Modificacion = false;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticuloComodin_Anterior = null;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = null;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Anterior = null;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = null;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = null;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = null;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = "";
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = null;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = null;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Anterior = null;
                                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Anterior = "";
                                            #endregion

                                            mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloMovimientosDiario.Actualizar_ArticuloMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo);

                                            lst_LineasYaRecalculadas.Add(mdl_INV_InventarioLineas_Detalle.idInventarioLinea);
                                            #endregion
                                        }

                                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                                        {
                                            //INSERTAR LINEA
                                            mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_InventarioLineas_Detalle_Datos.Insertar(mdl_INV_InventarioLineas_Detalle);
                                            if (!mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                                            {
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }
                                }

                                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                                {
                                    //Terminamos la transaccion
                                    #region Datos Actualizados en el Modelo General
                                    g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha = _dtt_FechaSeleccionada;
                                    #endregion

                                    // 5º OBTENEMOS LOS IDS DE LAS LINEAS INTRODUCIDAS
                                    //Mensaje de recalculando ...................................................................................
                                    _obj_BackgroundWorker.ReportProgress(3, Mensajes.G_STR_ESPERANDO_ACTUALIZANDO_REGISTROSLISTADO());
                                    //...........................................................................................................

                                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Select(m => m.id).ToList();
                                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

                                }
                            }
                        }

                    }
                }
                catch (Control_Errores)
                {}
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Actualizar_LineasRecalculadas));
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Actualizar_LineasRecalculadas));
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private List<INV_InventarioLineas_Detalle> Obtener_InventariosLineas_Detalles_A_Grabar(InventariosVariacionExistencias_Calculos _obj_InventariosVariacionExistencias_Calculos,
                                                                                               INTERNO_INV_InventarioLineas_Listado_Modelo _mdl_INTERNO_INV_InventarioLineas_Listado_Modelo)
        {
            List<INV_InventarioLineas_Detalle> lst_INV_InventarioLineas_Detalle = new List<INV_InventarioLineas_Detalle>();

            //Recorrer los precios
            if (g_lst_MAE_NomenclaturasPrecios != null &&
                g_lst_MAE_NomenclaturasPrecios.Count > 0)
            {
                //Datos de los Precios
                long lng_idInventarioLineaDetalle = -1;
                decimal? dcm_Precio = null;

                foreach (MAE_NomenclaturasPrecios mdl_MAE_NomenclaturasPrecios in g_lst_MAE_NomenclaturasPrecios)
                {
                    lng_idInventarioLineaDetalle += -1;

                    dcm_Precio = _obj_InventariosVariacionExistencias_Calculos.Precio_PorNomenclaturaPrecio(mdl_MAE_NomenclaturasPrecios.id);

                    if (dcm_Precio != null)
                    {
                        INV_InventarioLineas_Detalle mdl_INV_InventariosLineas_Detalles = new INV_InventarioLineas_Detalle();

                        mdl_INV_InventariosLineas_Detalles.id = lng_idInventarioLineaDetalle;
                        mdl_INV_InventariosLineas_Detalles.idInventarioLinea = _mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.id;
                        mdl_INV_InventariosLineas_Detalles.idNomenclaturaPrecio = mdl_MAE_NomenclaturasPrecios.id;
                        mdl_INV_InventariosLineas_Detalles.precio = dcm_Precio.Value;
                        mdl_INV_InventariosLineas_Detalles.importe = _obj_InventariosVariacionExistencias_Calculos.Importe_PorNomenclaturaPrecio(mdl_MAE_NomenclaturasPrecios.id);
                        mdl_INV_InventariosLineas_Detalles.fechaBorrado = null;

                        //Añadir al Listado
                        lst_INV_InventarioLineas_Detalle.Add(mdl_INV_InventariosLineas_Detalles);
                    }
                }
            }

            return lst_INV_InventarioLineas_Detalle;
        }

        #endregion

        #region Inventario Lineas Trazabilidad

        #region Rellenar DataGrid InventarioTrazabilidad
        public void Rellenar_DataGrid_InventarioTrazabilidad(long _lng_idInventarioLinea)
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_InventarioCabecera.Exferia_DataGridView_LineasTrazabilidad.Rows.Clear();

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad.RunWorkerAsync(_lng_idInventarioLinea);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Rellenar_DataGrid_InventarioTrazabilidad));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad_DoWork(object sender, DoWorkEventArgs e)
        {
            long lng_idInventarioLinea = -1;

            try
            {
                lng_idInventarioLinea = (long)e.Argument;

                //Listado de Inventario
                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null &&
                    g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                {
                    //Buscar la Linea
                    INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventariosLineas_Listado_Modelo= g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Where(m => m.id.Equals(lng_idInventarioLinea)).FirstOrDefault();

                    if (mdl_INTERNO_INV_InventariosLineas_Listado_Modelo != null &&
                        mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX != null)
                    {

                        //Obtener las lineas de Trazabilidad
                        List<INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo> lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo = mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX.Where(m=>m.idInventarioLinea.Equals(lng_idInventarioLinea)).ToList();

                        if (lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo != null && lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo.Count > 0)
                        {
                            foreach (INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo mdl_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo in lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo)
                            {
                                //Se Cancelo la tarea asincrona #########################
                                if (((BackgroundWorker)sender).CancellationPending)
                                {
                                    e.Cancel = true;
                                    return;
                                }

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

                                //Esperar un poco
                                Thread.Sleep(1);
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("",ex,nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad_DoWork));
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad_DoWork));
            }
            finally
            {
                e.Result = lng_idInventarioLinea;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de InventarioLinea
                g_frm_P_InventarioCabecera.Exferia_DataGridView_LineasTrazabilidad.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_InventarioCabecera.InventarioTrazabilidad_Ordenar_DataGridView();

                try
                {
                    MostrarOcultar_Resumen_Totales_Trazabilidad((long)e.Result);
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_InventarioTrazabilidad_Completed));
                }
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_InventarioTrazabilidad(INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo _mdl_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

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

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        #endregion

        #region Borrar Datos en Base de Datos InventarioTrazabilidad
        public void BorrarDatos_InventarioTrazabilidad(List<long> _lst_idInventarioTrazabilidad_ABorrar)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_InventarioCabecera.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_idInventarioTrazabilidad_ABorrar);

                    g_TareaAsincrona_Borrar_InventarioTrazabilidad = new BackgroundWorker();
                    g_TareaAsincrona_Borrar_InventarioTrazabilidad.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_InventarioTrazabilidad_DoWork);
                    g_TareaAsincrona_Borrar_InventarioTrazabilidad.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_InventarioTrazabilidad_Completed);
                    g_TareaAsincrona_Borrar_InventarioTrazabilidad.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_InventarioCabecera.Enabled = true;

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

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

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = BorrarDatos_Final_InventarioTrazabilidad(lst_idInventarioTrazabilidad_ABorrar);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idInventarioTrazabilidad_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_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Borrar_InventarioTrazabilidad_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_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Borrar_InventarioTrazabilidad_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_InventarioTrazabilidad_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_InventarioCabecera.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(Variables.G_STR_OPCION_INV_INVENTARIOTRAZABILIDAD);

                    //Enviar el idLineaInventario para que recargue el listado de inventariotrazabilidad
                    if (g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.Rows.Count > 0 &&
                        g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.SelectedRows.Count > 0)
                    {
                        lst_obj.Add(long.Parse(g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.SelectedRows[0].Cells[nameof(INTERNO_INV_InventarioLineas_Listado_Modelo.id)].Value.ToString()));
                    }
                    else
                    {
                        lst_obj.Add(-1);
                    }
                    g_frm_P_InventarioCabecera.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_InventarioCabecera.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Borrar_InventarioTrazabilidad_Completed));
            }
            finally
            {
                //Poner el Foco Inicial
                Funciones.Poner_Foco_Objeto(g_frm_P_InventarioCabecera,g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo);
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final_InventarioTrazabilidad(List<long> _lst_idInventarioTrazabilidad_ABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {


                if (_lst_idInventarioTrazabilidad_ABorrar != null && _lst_idInventarioTrazabilidad_ABorrar.Count > 0)
                {
                    foreach (long lng_idInventarioTrazabilidad_ABorrar in _lst_idInventarioTrazabilidad_ABorrar)
                    {
                        INV_InventarioLineas_Trazabilidad mdl_INV_InventarioLineas_Trazabilidad = g_obj_INV_InventarioLineas_Trazabilidad_Datos.Obtener_Modelo_Por_Id(lng_idInventarioTrazabilidad_ABorrar);

                        if (mdl_INV_InventarioLineas_Trazabilidad != null)
                        {
                            #region ACTUALIZAR ARTICULO TRAZABILIDAD MOVIMIENTOS DIARIO 
                            INTERNO_INV_InventariosLineas_Modelo mdl_INTERNO_INV_InventariosLineas_Modelo = g_obj_INV_InventarioLineas_Datos.Obtener_Para_Borrar(mdl_INV_InventarioLineas_Trazabilidad.idInventarioLinea);

                            #region Rellenar modelo
                            INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo = new INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo();

                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_INVENTARIO.Codigo;

                            //Datos Actuales
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulo_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idArticulo;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulotrazabilidad_Actual = mdl_INV_InventarioLineas_Trazabilidad.idArticulo_Trazabilidad;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Fecha_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdDelegacion_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdAlmacen_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idAlmacen;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdUbicacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.idUbicacion;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_Actual = 0;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Actual = 0;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Relacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.relacion;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Operacion_Actual = mdl_INTERNO_INV_InventariosLineas_Modelo.operacion;

                            //Datos Anteriores
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Modificacion = true;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idArticulo;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulotrazabilidad_Anterior = mdl_INV_InventarioLineas_Trazabilidad.idArticulo_Trazabilidad;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Fecha_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idAlmacen;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.idUbicacion;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = mdl_INV_InventarioLineas_Trazabilidad.cantidad;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = mdl_INV_InventarioLineas_Trazabilidad.segundaUnidad_cantidad;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Relacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.relacion;
                            mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Operacion_Anterior = mdl_INTERNO_INV_InventariosLineas_Modelo.operacion;
                            #endregion

                            mdl_INTERNO_ValorDevuelto_Modelo = Funciones_ArticuloTrazabilidadMovimientosDiario.Actualizar_ArticuloTrazabilidadMovimientoDiario(mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo);

                            #endregion

                        }

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_InventarioLineas_Trazabilidad_Datos.Borrar(lng_idInventarioTrazabilidad_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_InventarioCabecera_Controladora) + "/" + nameof(BorrarDatos_Final_InventarioTrazabilidad));
                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
        private void MostrarOcultar_Resumen_Totales_Trazabilidad(long _lng_idLineaInventario)
        {
            try
            {
                INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventariosLineas_Listado_Modelo = null;
                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null &&
                    g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count>0)
                {
                    mdl_INTERNO_INV_InventariosLineas_Listado_Modelo=g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Where(m => m.id.Equals(_lng_idLineaInventario)).FirstOrDefault();
                }

                bool bol_MostrarOcultar_PanelRelacional = false;
                //Mostrar o no Panel Relacional
                if (mdl_INTERNO_INV_InventariosLineas_Listado_Modelo!=null && mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.EmbalajeRelacional != null && mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.EmbalajeRelacional != "")
                {
                    bol_MostrarOcultar_PanelRelacional = true;
                }

                //Mostrar
                if (bol_MostrarOcultar_PanelRelacional)
                {
                    g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Principal.Location = new Point(g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Principal.Location.X, g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Relacional.Location.Y - 42);
                    g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Relacional.Visible = true;
                }
                //Ocultar
                else
                {
                    g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Relacional.Visible = false;
                    g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Principal.Location = new Point(g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Principal.Location.X, g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Relacional.Location.Y);
                }

                g_frm_P_InventarioCabecera.Exferia_DataGridView_LineasTrazabilidad.Size = new Size(g_frm_P_InventarioCabecera.Exferia_DataGridView_LineasTrazabilidad.Size.Width, (g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Principal.Location.Y - g_frm_P_InventarioCabecera.Exferia_DataGridView_LineasTrazabilidad.Location.Y) - 3);

                //Rellenar el Resumen de los Totales de la Trazabilidad
                Rellenar_Resumen_Totales_Trazabilidad(mdl_INTERNO_INV_InventariosLineas_Listado_Modelo);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "" + nameof(MostrarOcultar_Resumen_Totales_Trazabilidad));
            }
        }
        private void Rellenar_Resumen_Totales_Trazabilidad(INTERNO_INV_InventarioLineas_Listado_Modelo _mdl_INTERNO_INV_InventariosLineas_Listado_Modelo)
        {
            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;

                if (_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo != null)
                {
                    //Lineas de Trazabilidad ...................................................................
                    List<INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo> lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo = null;
                    if (_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo != null &&
                         _mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX != null)
                    {
                        //Obtener las lineas de Trazabilidad
                        lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo = _mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX.Where(m => m.idInventarioLinea.Equals(_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.id)).ToList();
                    }
                    //............................................................................................

                    //Tipos de Embalajes
                    str_TipoEmbalaje_Principal = _mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.Embalaje;

                    //Principal
                    dcm_Total_Movimiento_Principal = _mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.cantidad;
                    
                    if (lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo != null && lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo.Count > 0)
                    {
                        dcm_Total_Trazado_Principal = lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo.Sum(m => m.cantidad);
                    }
                    dcm_Total_Diferencia_Principal = dcm_Total_Movimiento_Principal - dcm_Total_Trazado_Principal;

                    //Relacionado
                    if (g_frm_P_InventarioCabecera.Panel_TrazabilidadResumenTotales_Relacional.Visible)
                    {
                        str_TipoEmbalaje_Relacionado = _mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.EmbalajeRelacional;
                    }
                    
                    dcm_Total_Movimiento_Relacionado = (_mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.segundaUnidad_cantidad !=null ? _mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.segundaUnidad_cantidad.Value : 0m );
                    
                    if (lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo != null && lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo.Count > 0)
                    {
                        dcm_Total_Trazado_Relacionado = lst_INTERNO_INV_InventariosLineas_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_InventarioCabecera.Exferia_Label_Total_TrazabilidadResumenTotales_TipoEmbalaje_Principal.Text = str_TipoEmbalaje_Principal;
                g_frm_P_InventarioCabecera.Exferia_Label_Total_TrazabilidadResumenTotales_Movimiento_Principal.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Movimiento_Principal, 3));
                g_frm_P_InventarioCabecera.Exferia_Label_Total_TrazabilidadResumenTotales_Trazado_Principal.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Trazado_Principal, 3));
                g_frm_P_InventarioCabecera.Exferia_Label_Total_TrazabilidadResumenTotales_Diferencia_Principal.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Diferencia_Principal, 3));
                g_frm_P_InventarioCabecera.Exferia_Label_Total_TrazabilidadResumenTotales_TipoEmbalaje_Relacionado.Text = str_TipoEmbalaje_Relacionado;
                g_frm_P_InventarioCabecera.Exferia_Label_Total_TrazabilidadResumenTotales_Movimiento_Relacionado.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Movimiento_Relacionado, 3));
                g_frm_P_InventarioCabecera.Exferia_Label_Total_TrazabilidadResumenTotales_Trazado_Relacionado.Text = string.Format("{0:0.000}", Funciones.RedondearDecimal(dcm_Total_Trazado_Relacionado, 3));
                g_frm_P_InventarioCabecera.Exferia_Label_Total_TrazabilidadResumenTotales_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_InventarioCabecera_Controladora) + "/" + nameof(Rellenar_Resumen_Totales_Trazabilidad));
            }
        }
        #endregion

        public object[] Obtener_Datos_ParaTrazabilidad(long _lng_IdInventarioLinea)
        {
            object[] arr_ObjetosADevolver = new object[1];
            arr_ObjetosADevolver[0] = null;

            try
            {
                //OBTENEMOS DATOS DE INVENTARIO_LINEA
                INTERNO_INV_InventariosLineas_Modelo mdl_INTERNO_INV_InventariosLineas_Modelo = g_obj_INV_InventarioLineas_Datos.Obtener(_lng_IdInventarioLinea);

                //Rellenar el Modelo a Devolver
                arr_ObjetosADevolver[0] = mdl_INTERNO_INV_InventariosLineas_Modelo;
            }
            catch (Control_Errores)
            {
                arr_ObjetosADevolver = null;
            }
            catch (Exception ex)
            {
                arr_ObjetosADevolver = null;
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Obtener_Datos_ParaTrazabilidad));
            }
            return arr_ObjetosADevolver; 
        }
        public List<INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo> Obtener_InventariosLineas_Trazabilidad_Listado_PorLinea(long _lng_IdInventarioLinea)
        {
            List<INTERNO_INV_InventarioLineas_Trazabilidad_Listado_Modelo> lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo = null;

            try
            {
                INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventariosLineas_Listado_Modelo = g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Where(M => M.id.Equals(_lng_IdInventarioLinea)).FirstOrDefault();
                if (mdl_INTERNO_INV_InventariosLineas_Listado_Modelo != null &&
                    mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX != null &&
                    mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX.Count > 0)
                {
                    //Instanciar el Listado
                    lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo = mdl_INTERNO_INV_InventariosLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX.Where(m=>m.idInventarioLinea.Equals(_lng_IdInventarioLinea)).ToList();
                }
            }
            catch (Exception ex)
            {
                lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo = null;
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Obtener_InventariosLineas_Trazabilidad_Listado_PorLinea));
            }

            return lst_INTERNO_INV_InventariosLineas_Trazabilidad_Listado_Modelo;
        }

        #endregion

        #region Cambio de Fecha
        public void Cambio_Fecha(G_ENUM_CAMBIOFECHA _obj_ENUM_CAMBIOFECHA)
        {
            try
            {
                //## 1º--> CANCELAMOS SI LA TAREA SE ESTUVIERA EJECUTANDO #########################
                g_obj_TareaAsincrona_Cambio_Fecha.CancelAsync();
                while (g_obj_TareaAsincrona_Cambio_Fecha.IsBusy)
                {
                    Application.DoEvents();
                }

                //2º--> SI NO HAY CABECERA NO HACE NADA ###########################################
                if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo == null)
                {
                    return;
                }

                //3--> SI CAMBIO LA FECHA ######################################################
                if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha.ToString("dd/MM/yyyy").Equals(g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha))
                {
                    return;
                }

                //Vaciar los datos del grid si hay que recalcular las lineas
                if (_obj_ENUM_CAMBIOFECHA.Equals(G_ENUM_CAMBIOFECHA.SI_RECALCULARLINEAS))
                {
                    g_frm_P_InventarioCabecera.Exferia_DataGridView_Lineas.Rows.Clear();
                    g_int_TotalRegistrosInsertados_InventarioLinea = 0;
                    g_int_TotalRegistros_InventarioLinea = 0;
                    g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_InventarioLinea;
                    g_frm_P_InventarioCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_InventarioLinea;
                }

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(DateTime.ParseExact(g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture));
                lst_Argumentos.Add(_obj_ENUM_CAMBIOFECHA);

                //(Tarea Asincrona) Cargar Datos .....................................................
                g_obj_TareaAsincrona_Cambio_Fecha.RunWorkerAsync(lst_Argumentos);
                //....................................................................................

                //Mostrar pantalla de espera
                g_bol_TareaAsincrona_Cambio_Fecha_PerdioFoco = true;

                g_frm_PE_Esperando_BarraProgreso = new PE_Esperando_BarraProgreso(Mensajes.G_STR_ESPERANDO_VALIDANDODATOS());
                g_frm_PE_Esperando_BarraProgreso.ShowDialog();

                g_bol_TareaAsincrona_Cambio_Fecha_PerdioFoco = false;
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando_BarraProgreso != null)
                {
                    g_frm_PE_Esperando_BarraProgreso.Close();
                    g_frm_PE_Esperando_BarraProgreso = null;
                }

                g_bol_TareaAsincrona_Cambio_Fecha_PerdioFoco = false;

                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Cambio_Fecha));
            }
        }

        private void TareaAsincrona_Cambio_Fecha_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;
            try
            {
                //Argumentos #################################################################
                List<object> lst_Argumentos = (List<object>)e.Argument;
                //fecha
                DateTime dtt_Fecha = (DateTime)lst_Argumentos[0];
                G_ENUM_CAMBIOFECHA obj_ENUM_CAMBIOFECHA = (G_ENUM_CAMBIOFECHA)lst_Argumentos[1];
                //############################################################################

                // Hay que recalcular las lineas
                if (obj_ENUM_CAMBIOFECHA.Equals(G_ENUM_CAMBIOFECHA.SI_RECALCULARLINEAS))
                {
                    //Recalcular las lineas
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_RECALCULAR = Actualizar_LineasRecalculadas(dtt_Fecha,
                                                                                                                             (BackgroundWorker)sender);

                    List<long> lst_idsLineasModificadas = new List<long>();

                    if (mdl_INTERNO_ValorDevuelto_Modelo_RECALCULAR.TodoCorrecto)
                    {
                        lst_idsLineasModificadas = (List<long>)mdl_INTERNO_ValorDevuelto_Modelo_RECALCULAR.Objeto;

                        //vaciar las antiguas
                        g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo = new List<INTERNO_INV_InventarioLineas_Listado_Modelo>();

                        if (lst_idsLineasModificadas != null)
                        {
                            //Mensaje de recalculando .........................................................................................
                            ((BackgroundWorker)sender).ReportProgress(3, Mensajes.G_STR_ESPERANDO_ACTUALIZANDO_REGISTROSLISTADO());
                            //Vaciar el total cargado de lineas
                            ((BackgroundWorker)sender).ReportProgress(2, 0);
                            //Total de lineas
                            ((BackgroundWorker)sender).ReportProgress(1, lst_idsLineasModificadas.Count);
                            //.................................................................................................................


                            //Actualizarlas en el Grid
                            int int_Contador = 0;
                            foreach (long lng_idInventarioLinea in lst_idsLineasModificadas)
                            {

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

                                //Añadir al DataGridView
                                ((BackgroundWorker)sender).ReportProgress(4, lng_idInventarioLinea);

                                int_Contador += 1;

                                //Añadir linea al progress
                                ((BackgroundWorker)sender).ReportProgress(2, int_Contador);

                                //Esperar un poco
                                Thread.Sleep(1);

                            }
                        }
                    }
                    //Con Errores
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = mdl_INTERNO_ValorDevuelto_Modelo_RECALCULAR;
                    }
                }
                //No recalcula lineas
                else
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS = new INTERNO_ValorDevuelto_Modelo();
                    mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.TodoCorrecto = true;
                    mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.Mensaje = "";

                    if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null && g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                    {
                        foreach (INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventarioLineas_Listado_Modelo in g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo)
                        {

                            if (mdl_INTERNO_INV_InventarioLineas_Listado_Modelo != null)
                            {

                                #region ACTUALIZAR ARTICULO MOVIMIENTOS DIARIO 

                                #region Rellenar modelo
                                INTERNO_ArticuloDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo = new INTERNO_ArticuloDiarioActualizar_Documentos_Modelo();

                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_INVENTARIO.Codigo;

                                //Datos Actuales
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idArticulo;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Actual = dtt_Fecha;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idAlmacen;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idUbicacion;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.cantidad;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.segundaUnidad_cantidad;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.relacion;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.operacion;

                                //Datos Anteriores
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Modificacion = true;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticuloComodin_Anterior = null;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idArticulo;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idAlmacen;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idUbicacion;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.cantidad;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.segundaUnidad_cantidad;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.relacion;
                                mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.operacion;
                                #endregion

                                mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS = Funciones_ArticuloMovimientosDiario.Actualizar_ArticuloMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo);
                                if (!mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.TodoCorrecto)
                                {
                                    break;
                                }
                                #endregion
                            }
                        }
                    }

                    if (mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.TodoCorrecto)
                    {
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZAR = Actualizar_Fecha(dtt_Fecha);
                        if (mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZAR.TodoCorrecto)
                        {
                            g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha = dtt_Fecha;
                        }
                        else
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo = mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZAR;
                        }
                    }
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS;
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();

                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Fecha_DoWork));
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();
            }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();

                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Fecha_DoWork));
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Cambio_Fecha_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage.ToString().Equals("1"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Total = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("2"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Actualizar = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("3"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Mensaje = e.UserState.ToString();
                }
                else
                {
                    InventarioLinea_Actualizar_Registro((long)e.UserState, G_ENUM_TIPOACCION.INT_INSERTAR,true,false);
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Cambio_Fecha_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Cerrar pantalla de espera
            if (g_frm_PE_Esperando_BarraProgreso != null)
            {
                g_frm_PE_Esperando_BarraProgreso.Close();
                g_frm_PE_Esperando_BarraProgreso = null;
            }

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

                //Mostrar si tuviera algun mensaje de Error
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    //Mostrar el mensaje s lo tuviera
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }

                    //VOLVER A PONER LOS VALORES ORIGINALES
                    if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo != null)
                    {
                        //Fecha
                        g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha.ToString("dd/MM/yyyy");

                        //Poner el Foco 
                        Funciones.Poner_Foco_Objeto(g_frm_P_InventarioCabecera, g_frm_P_InventarioCabecera.Exferia_FechaSeleccion_Fecha);
                    }
                }
                else
                {
                    InventarioLinea_ActualizarTotalImporte();

                    //Se actualizan el listado general, solo cuando ya estaba grabado la linea
                    if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo != null)
                    {
                        // Devolver al Listado el Row Añadido/Modificado
                        if (g_frm_P_InventarioCabecera.P_Base_PantallaOrigen != null)
                        {
                            g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, G_ENUM_TIPOACCION.INT_MODIFICAR);
                        }
                        else if (g_frm_P_InventarioCabecera.P_Base_F3Origen != null)
                        {
                            g_frm_P_InventarioCabecera.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, G_ENUM_TIPOACCION.INT_MODIFICAR);
                        }
                    }

                    g_frm_P_InventarioCabecera.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Fecha_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo Actualizar_Fecha(DateTime _dtt_Fecha)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;

            try
            {
                //Actualizar la fecha
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_InventarioCabecera_Datos.Actualizar_Fecha(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, _dtt_Fecha);
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();
            }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Actualizar_Fecha));
            }


            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Cambio de Delegacion
        public void Cambio_Delegacion()
        {
            try
            {
                //## 1º--> CANCELAMOS SI LA TAREA SE ESTUVIERA EJECUTANDO #########################
                if (g_obj_TareaAsincrona_Cambio_Delegacion != null)
                {
                    g_obj_TareaAsincrona_Cambio_Delegacion.CancelAsync();
                    while (g_obj_TareaAsincrona_Cambio_Delegacion.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_obj_TareaAsincrona_Cambio_Delegacion = new BackgroundWorker();
                    g_obj_TareaAsincrona_Cambio_Delegacion.DoWork += new DoWorkEventHandler(TareaAsincrona_Cambio_Delegacion_DoWork);
                    g_obj_TareaAsincrona_Cambio_Delegacion.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Cambio_Delegacion_ProgressChanged);
                    g_obj_TareaAsincrona_Cambio_Delegacion.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Cambio_Delegacion_Completed);
                    g_obj_TareaAsincrona_Cambio_Delegacion.WorkerReportsProgress = true;
                    g_obj_TareaAsincrona_Cambio_Delegacion.WorkerSupportsCancellation = true;
                }

                //1º--> SI NO HAY CABECERA NO HACE NADA ###########################################
                if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo == null)
                {
                    return;
                }

                //2º--> SI CAMBIO LA DELEGACION ######################################################
                if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion.Equals(g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id))
                {
                    return;
                }

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id);

                //(Tarea Asincrona) Cargar Datos .....................................................
                g_obj_TareaAsincrona_Cambio_Delegacion.RunWorkerAsync(lst_Argumentos);
                //....................................................................................

                //Mostrar pantalla de espera
                g_frm_PE_Esperando_BarraProgreso = new PE_Esperando_BarraProgreso(Mensajes.G_STR_ESPERANDO_VALIDANDODATOS());
                g_frm_PE_Esperando_BarraProgreso.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando_BarraProgreso != null)
                {
                    g_frm_PE_Esperando_BarraProgreso.Close();
                    g_frm_PE_Esperando_BarraProgreso = null;
                }

                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Cambio_Delegacion));
            }
        }

        private void TareaAsincrona_Cambio_Delegacion_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;
            try
            {
                //Argumentos #################################################################
                List<object> lst_Argumentos = (List<object>)e.Argument;
                //Delegacon
                long lng_idDelegacion = (long)lst_Argumentos[0];
                //############################################################################


                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS = new INTERNO_ValorDevuelto_Modelo();
                mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.TodoCorrecto = true;
                mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.Mensaje = "";

                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo != null && g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count > 0)
                {
                    foreach (INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventarioLineas_Listado_Modelo in g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo)
                    {
                        if (mdl_INTERNO_INV_InventarioLineas_Listado_Modelo != null)
                        {
                            #region ACTUALIZAR ARTICULO MOVIMIENTOS DIARIO 

                            #region Rellenar modelo
                            INTERNO_ArticuloDiarioActualizar_Documentos_Modelo mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo = new INTERNO_ArticuloDiarioActualizar_Documentos_Modelo();

                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_INVENTARIO.Codigo;

                            //Datos Actuales
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idArticulo;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Actual = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Actual = lng_idDelegacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idAlmacen;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idUbicacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.cantidad;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.segundaUnidad_cantidad;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Actual = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.relacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Actual = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.operacion;

                            //Datos Anteriores
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Modificacion = true;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticuloComodin_Anterior =null;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idArticulo;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.fecha;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idAlmacen;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.idUbicacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_9.Codigo;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.cantidad;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.segundaUnidad_cantidad;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.relacion;
                            mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Anterior = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.operacion;
                            #endregion

                            mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS = Funciones_ArticuloMovimientosDiario.Actualizar_ArticuloMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo);
                            if (!mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.TodoCorrecto)
                            {
                                break;
                            }
                            #endregion
                        }
                    }
                }

                if (mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS.TodoCorrecto)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZAR = Actualizar_Delegacion(lng_idDelegacion);
                    if (mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZAR.TodoCorrecto)
                    {
                        g_mdl_INTERNO_INV_InventariosCabecera_Modelo.idDelegacion = lng_idDelegacion;
                    }
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZAR;
                    }
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo = mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARMOVIMIENTOSDIARIOS;
                }
            }
            catch (ThreadAbortException ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();

                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Delegacion_DoWork));
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();
            }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();

                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Delegacion_DoWork));
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Cambio_Delegacion_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage.ToString().Equals("1"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Total = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("2"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Actualizar = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("3"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Mensaje = e.UserState.ToString();
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Cambio_Delegacion_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Cerrar pantalla de espera
            if (g_frm_PE_Esperando_BarraProgreso != null)
            {
                g_frm_PE_Esperando_BarraProgreso.Close();
                g_frm_PE_Esperando_BarraProgreso = null;
            }

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

                //Mostrar si tuviera algun mensaje de Error
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    //Mostrar el mensaje s lo tuviera
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    //Se actualizan el listado general, solo cuando ya estaba grabado la linea
                    if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo != null)
                    {
                        // Devolver al Listado el Row Añadido/Modificado
                        if (g_frm_P_InventarioCabecera.P_Base_PantallaOrigen != null)
                        {
                            g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, G_ENUM_TIPOACCION.INT_MODIFICAR);
                        }
                        else if (g_frm_P_InventarioCabecera.P_Base_F3Origen != null)
                        {
                            g_frm_P_InventarioCabecera.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, G_ENUM_TIPOACCION.INT_MODIFICAR);
                        }
                    }

                    g_frm_P_InventarioCabecera.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Cambio_Delegacion_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo Actualizar_Delegacion(long _lng_idDelegacion)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;

            try
            {
                //Actualizar la Delegacion
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_INV_InventarioCabecera_Datos.Actualizar_Delegacion(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, _lng_idDelegacion);
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();
            }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_GRABAR();
                Control_Errores.Errores_Log("", ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Actualizar_Delegacion));
            }


            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Cerrar/Abrir
        public void Mostrar_CerradoAbierto()
        {
            //Por Defecto
            g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;
            g_frm_P_InventarioCabecera.Exferia_Button_CerrarAbrir.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_ABIERTO;
            Imagenes.Asignar_Imagen(g_frm_P_InventarioCabecera.Exferia_Button_CerrarAbrir);
            g_frm_P_InventarioCabecera.Exferia_Button_CerrarAbrir.Tag = "0";

            //Buscar el Estado del InventarioCabecera
            if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo != null)
            {
                //Estado
                if (g_mdl_INTERNO_INV_InventariosCabecera_Modelo.estado != null &&
                    g_mdl_INTERNO_INV_InventariosCabecera_Modelo.estado.Trim().Length > 0)
                {
                    g_str_Estado = g_mdl_INTERNO_INV_InventariosCabecera_Modelo.estado;
                }
            }

            //Si esta Cerrado Bloqueo para que no deje hacer nada
            if (g_str_Estado.Equals(Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO))
            {
                g_frm_P_InventarioCabecera.Exferia_Button_CerrarAbrir.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_CERRADO;
                Imagenes.Asignar_Imagen(g_frm_P_InventarioCabecera.Exferia_Button_CerrarAbrir);
                g_frm_P_InventarioCabecera.Exferia_Button_CerrarAbrir.Tag = "1";

                //Bloqueo los Controles
                SoloLectura.Empezar(g_frm_P_InventarioCabecera, true);
            }
            //Abierto
            else
            {
                //Desbloqueo los Controles
                SoloLectura.Empezar(g_frm_P_InventarioCabecera, false);
            }
        }
        #region Cerrar Documento
        public void Cerrar_Documento()
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_CERRANDO_DOCUMENTO());

                BackgroundWorker obj_TareaAsincrona_Cerrar_Documento = new BackgroundWorker();

                obj_TareaAsincrona_Cerrar_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_Cerrar_Documento_DoWork);
                obj_TareaAsincrona_Cerrar_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Cerrar_Documento_Completed);
                obj_TareaAsincrona_Cerrar_Documento.RunWorkerAsync();

                //Mostrar Pantalla de Espera
                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.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Cerrar_Documento));
            }
        }

        private void TareaAsincrona_Cerrar_Documento_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_ValorDevuelto_Modelo.Mensaje = "";

            try
            {

                // Validar Primero
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos_CerrarDocumento();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo =g_obj_INV_InventarioCabecera_Datos.Actualizar_Estado(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO);
                }
                else
                {
                    mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
                    
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Cerrar_Documento_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Cerrar_Documento_DoWork));

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

            //Termino 
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO = (INTERNO_ValorDevuelto_Modelo)e.Result;

            //Termino todo Correctamente
            if (mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.TodoCorrecto)
            {
                g_mdl_INTERNO_INV_InventariosCabecera_Modelo.estado = Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO;

                Mostrar_CerradoAbierto();

                //Actualizar registro en Listado principal
                if (g_frm_P_InventarioCabecera.P_Base_PantallaOrigen != null)
                {
                    List<INTERNO_ActualizarCampoListadoGeneral_Modelo> lst_INTERNO_ActualizarCampoListadoGeneral_Modelo = new List<INTERNO_ActualizarCampoListadoGeneral_Modelo>();
                    lst_INTERNO_ActualizarCampoListadoGeneral_Modelo.Add(new INTERNO_ActualizarCampoListadoGeneral_Modelo(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, nameof(INTERNO_INV_InventarioCabecera_Listado_Modelo.estado), Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO));

                    g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_ActualizarRegistros_Campo(lst_INTERNO_ActualizarCampoListadoGeneral_Modelo, G_ENUM_TIPOACCION.INT_MODIFICAR);
                }
            }
            //Ocurrio un Error
            else
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.Mensaje);
            }
        }

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

            try
            {
                //Tiene que tener LineasInventario
                if (g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo==null ||
                    g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo.Count==0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_INVENTARIOS_VALIDACION_NOHAYLINEAS();
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_InventarioCabecera.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                //Validar las Trazabilidades
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    foreach (INTERNO_INV_InventarioLineas_Listado_Modelo mdl_INTERNO_INV_InventarioLineas_Listado_Modelo in g_lst_INTERNO_INV_InventariosLineas_Listado_Modelo)
                    {
                        if (mdl_INTERNO_INV_InventarioLineas_Listado_Modelo != null)
                        {
                            //PRINCIPAL
                            if (mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Codigo))
                            {
                                //Cantidad trazada
                                decimal dcm_CantidadPrincipal_TotalLineasTrazadas = 0;
                                if (mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX != null &&
                                    mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX.Count > 0)
                                {
                                    dcm_CantidadPrincipal_TotalLineasTrazadas = mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.InventariosLineas_Trazabilidad_AUX.Sum(m => m.cantidad);
                                }

                                //Si no esta trazado completamente
                                if ((mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.cantidad - dcm_CantidadPrincipal_TotalLineasTrazadas) != 0m)
                                {
                                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;

                                    string str_Linea = " linea nº " + mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.numeroLinea + " ( " + mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.Articulo_Codigo + " - " + mdl_INTERNO_INV_InventarioLineas_Listado_Modelo.Articulo_Descripcion + ")";

                                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ADVERTENCIA_CANTIDADMOVIMIENTO_NOTRAZADOCORRECTAMENTE(str_Linea);

                                    break;
                                }
                            }
                        }
                    }
                }
            }
            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_InventarioCabecera_Controladora) + "/" + nameof(ValidarDatos_CerrarDocumento));

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

            return mdl_ValorDevuelto_Modelo;
        }

        #endregion
        #region Abrir Documento
        public void Abrir_Documento()
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_ABRIENNDO_DOCUMENTO());

                BackgroundWorker obj_TareaAsincrona_Abrir_Documento = new BackgroundWorker();

                obj_TareaAsincrona_Abrir_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_Abrir_Documento_DoWork);
                obj_TareaAsincrona_Abrir_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Abrir_Documento_Completed);
                obj_TareaAsincrona_Abrir_Documento.RunWorkerAsync();

                //Mostrar Pantalla de Espera
                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.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(Abrir_Documento));
            }
        }

        private void TareaAsincrona_Abrir_Documento_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_ValorDevuelto_Modelo.Mensaje = "";

            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_INV_InventarioCabecera_Datos.Actualizar_Estado(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Abrir_Documento_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_ABRIR_DOCUMENTO();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_ABRIR_DOCUMENTO();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InventarioCabecera_Controladora) + "/" + nameof(TareaAsincrona_Abrir_Documento_DoWork));

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

            //Termino 
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ABRIR_TERMINO = (INTERNO_ValorDevuelto_Modelo)e.Result;

            //Termino todo Correctamente
            if (mdl_INTERNO_ValorDevuelto_Modelo_ABRIR_TERMINO.TodoCorrecto)
            {
                g_mdl_INTERNO_INV_InventariosCabecera_Modelo.estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

                Mostrar_CerradoAbierto();

                //Actualizar registro en Listado principal
                if (g_frm_P_InventarioCabecera.P_Base_PantallaOrigen != null)
                {
                    List<INTERNO_ActualizarCampoListadoGeneral_Modelo> lst_INTERNO_ActualizarCampoListadoGeneral_Modelo = new List<INTERNO_ActualizarCampoListadoGeneral_Modelo>();
                    lst_INTERNO_ActualizarCampoListadoGeneral_Modelo.Add(new INTERNO_ActualizarCampoListadoGeneral_Modelo(g_mdl_INTERNO_INV_InventariosCabecera_Modelo.id, nameof(INTERNO_INV_InventarioCabecera_Listado_Modelo.estado), Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO));

                    g_frm_P_InventarioCabecera.P_Base_PantallaOrigen.P_Base_ActualizarRegistros_Campo(lst_INTERNO_ActualizarCampoListadoGeneral_Modelo, G_ENUM_TIPOACCION.INT_MODIFICAR);
                }
            }
            //Ocurrio un Error
            else
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_ABRIR_TERMINO.Mensaje);
            }
        }

        #endregion
        #endregion
    }
}
