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

namespace Exferia_Compras._3_Vistas.Controladoras
{
    public class P_EntradaMercanciaLinea_Trazabilidad_Controladora
    {
        #region Variables Generales
        private P_EntradaMercanciaLinea_Trazabilidad g_frm_P_EntradaMercanciaLinea_Trazabilidad = 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

        public INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo = null;

        //Clase de Negocio
        private COM_EntradasMercanciaLineas_Trazabilidad_Datos g_obj_COM_EntradasMercanciaLineas_Trazabilidad_Datos = new COM_EntradasMercanciaLineas_Trazabilidad_Datos();
        private COM_EntradasMercanciaLineas_Datos g_obj_COM_EntradasMercanciaLineas_Datos = new COM_EntradasMercanciaLineas_Datos();

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

        public GEN_EjerciciosActivos_Empresa g_mdl_GEN_EjerciciosActivos_Empresa = null;

        public INTERNO_COM_EntradasMercanciaCabecera_Modelo g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo = null;
        public INTERNO_COM_EntradasMercanciaLineas_Modelo g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo = null;
        private List<INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Listado_Modelo> g_lst_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Listado_Modelo = null;
        public MAE_Articulos_Trazabilidad g_mdl_MAE_Articulos_Trazabilidad = null;

        private string g_str_ArticuloEnPromocion_Texto = "";
        private bool g_bol_EsLineaArticuloEnPromocion = false;

        public string g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

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

        private decimal g_dcm_cantidadEmbalajePrincipal = 0;
        private decimal g_dcm_cantidadEmbalajeRelacional = 0;

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

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

        //Tarea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;
        #endregion

        #endregion

        #region Constructor
        public P_EntradaMercanciaLinea_Trazabilidad_Controladora(P_EntradaMercanciaLinea_Trazabilidad _frm_P_EntradaMercanciaLinea_Trazabilidad,
                                                                 INTERNO_COM_EntradasMercanciaCabecera_Modelo _mdl_INTERNO_COM_EntradasMercanciasCabecera_Modelo,
                                                                 INTERNO_COM_EntradasMercanciaLineas_Modelo _mdl_INTERNO_COM_EntradasMercanciasLineas_Modelo,
                                                                 List<INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Listado_Modelo> _lst_INTERNO_COM_EntradasMercanciasLineas_Trazabilidad_Listado_Modelo,
                                                                 bool _bol_EsLineaArticuloEnPromocion)
        {
            //Valores Recibidos
            g_frm_P_EntradaMercanciaLinea_Trazabilidad = _frm_P_EntradaMercanciaLinea_Trazabilidad;
            g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo = _mdl_INTERNO_COM_EntradasMercanciasCabecera_Modelo;
            g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo = _mdl_INTERNO_COM_EntradasMercanciasLineas_Modelo;
            g_lst_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Listado_Modelo = _lst_INTERNO_COM_EntradasMercanciasLineas_Trazabilidad_Listado_Modelo;

            //Estoy Agregando,modificnado un articulo en promocion
            g_bol_EsLineaArticuloEnPromocion = _bol_EsLineaArticuloEnPromocion;
            if (_bol_EsLineaArticuloEnPromocion)
            {
                g_str_ArticuloEnPromocion_Texto="(Artículo en Promoción)";
            }

            //Carga los datos Iniciales
            Datos_Iniciales(false);

            g_bol_Termino_CargaDatos_Inicial = true;
        }

        #endregion

        #region Datos Iniciales
        private void Datos_Iniciales(bool _bol_Buscar_DatosLinea)
        {
            try
            {
                //Atualizar el modelo de la linea
                if (_bol_Buscar_DatosLinea)
                {
                    g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo = g_obj_COM_EntradasMercanciaLineas_Datos.Obtener(g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.id);

                    g_lst_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Listado_Modelo = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.EntradaMercanciaTrazabilidades;
                }

                //Datos de la Cabecera #########################################################################################
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_Resumen.Text = "Nº DE ENTRADA DE MERCANCIA : " + g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.numeroDocumento.ToString();

                if (g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.GEN_Delegaciones != null)
                {
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_Resumen.Text += " - (" + g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.GEN_Delegaciones.codigo.ToUpper() + ") " + g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.GEN_Delegaciones.descripcion.ToUpper();
                }

                if (g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.MAE_Articulos != null)
                {
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_Articulo.Text = "(" + g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.MAE_Articulos.codigo.ToUpper() + ") " + g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.MAE_Articulos.descripcion.ToUpper();
                }

                //Datos de la Linea ############################################################################################
                if (g_lst_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Listado_Modelo != null &&
                    g_lst_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Listado_Modelo.Count > 0)
                {
                    g_dcm_cantidadEmbalajePrincipal = g_lst_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Listado_Modelo.Sum(m => m.cantidad);

                    g_dcm_cantidadEmbalajeRelacional = g_lst_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Listado_Modelo.Where(m => m.segundaUnidad_cantidad != null).Sum(m => m.segundaUnidad_cantidad.Value);
                }

                //Principal ............................................................................................................................................
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_TipoEmbalaje_Valor.Text = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.MAE_Embalajes.descripcion ;
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_MovimientoPrincipal_Valor.Text = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.cantidad.ToString();
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_TrazadoPrincipal_Valor.Text = g_dcm_cantidadEmbalajePrincipal.ToString();
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_DiferenciaPrincipal_Valor.Text = (g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.cantidad - g_dcm_cantidadEmbalajePrincipal).ToString();
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad.Text = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_DiferenciaPrincipal_Valor.Text;

                //Mostrar o no Panel Relacional.........................................................................................................................
                if (g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.MAE_Embalajes1 != null)
                {
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Panel_SegundaUnidad.Visible = true;

                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_TipoEmbalajeRelacionado_Valor.Text = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.MAE_Embalajes1.descripcion;
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_MovimientoRelacionado_Valor.Text = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.segundaUnidad_cantidad.ToString();
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_TrazadoRelacionado_Valor.Text = g_dcm_cantidadEmbalajeRelacional.ToString();
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_DiferenciaRelacionado_Valor.Text = (g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.segundaUnidad_cantidad - g_dcm_cantidadEmbalajeRelacional).ToString();
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_DiferenciaRelacionado_Valor.Text;
                }
                else
                {
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Panel_SegundaUnidad.Visible = false;

                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_TipoEmbalajeRelacionado_Valor.Text = "";
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_MovimientoRelacionado_Valor.Text = "";
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_TrazadoRelacionado_Valor.Text = "";
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_DiferenciaRelacionado_Valor.Text = "";
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text = "";
                }


                Rellenar_ArbolSecundarioSeleccion();
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_EntradaMercanciaLinea_Trazabilidad_Controladora) + "/" + nameof(Datos_Iniciales));
            }
        }

        private void Rellenar_ArbolSecundarioSeleccion()
        {
            try
            {

                List<INTERNO_ArbolSecundarioSeleccion_Modelo> lst_INTERNO_ArbolSecundarioSeleccion_Modelo_FINAL = new List<INTERNO_ArbolSecundarioSeleccion_Modelo>();
                //Proveedor
                lst_INTERNO_ArbolSecundarioSeleccion_Modelo_FINAL.AddRange(Variables.G_LST_ARBOLSECUNDARIOSELECCION_PROVEEDOR);
                //Proveedor-Cartera
                lst_INTERNO_ArbolSecundarioSeleccion_Modelo_FINAL.AddRange(Variables.G_LST_ARBOLSECUNDARIOSELECCION_PROVEEDOR_CARTERA);
                //Proveedor-Contabilidad
                lst_INTERNO_ArbolSecundarioSeleccion_Modelo_FINAL.AddRange(Variables.G_LST_ARBOLSECUNDARIOSELECCION_PROVEEDOR_CONTABILIDAD);
                //Proveedor-Articulo_AUX_1
                lst_INTERNO_ArbolSecundarioSeleccion_Modelo_FINAL.AddRange(Variables.G_LST_ARBOLSECUNDARIOSELECCION_PROVEEDOR_ARTICULO_AUX_1);
                //Proveedor-ProveedorArticulo_AUX_1
                lst_INTERNO_ArbolSecundarioSeleccion_Modelo_FINAL.AddRange(Variables.G_LST_ARBOLSECUNDARIOSELECCION_PROVEEDOR_PROVEEDORARTICULO_AUX_1);

                //Cargar los valores
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_EntradaMercanciaLinea_Trazabilidad.Cargar(lst_INTERNO_ArbolSecundarioSeleccion_Modelo_FINAL, g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_ValoresGenerales, g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_FechaTrabajo, g_frm_P_EntradaMercanciaLinea_Trazabilidad);

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

        #region Arbol Secundario
        public void ArbolSecundario_Cambiar_ProveedorArticuloTrazabilidad(long lng_idProveedor)
        {
            try
            {
                //ArbolSecundarioSeleccion Identificadores Necesarios .......................................
                //idProveedor
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_IDPROVEEDOR = lng_idProveedor;

                //Se añade el id del articulo ara el listado secundario
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_IDARTICULO = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idArticulo;

                //Se añade el id del articulotrazabilidad para el listado secundario
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_IDARTICULOTRAZABILIDAD = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Id;
                
                //Recargar el Arbol Secundario
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_EntradaMercanciaLinea_Trazabilidad.RecargarSeleccionNodo();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_EntradaMercanciaLinea_Trazabilidad_Controladora) + "" + nameof(ArbolSecundario_Cambiar_ProveedorArticuloTrazabilidad));
            }
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //COM_EntradasMercanciaLineas_Trazabilidad_Modelo
            g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo = null;

            //MAE_Articulos_Trazabilidad
            g_mdl_MAE_Articulos_Trazabilidad = null;

            //Cantidad
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad.Text = "";

            //SegundaUnidad
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text = "";

            //Observaciones
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Observaciones.Text = "";

            //ArticuloTrazabilidad
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Id = -1;
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Codigo = "";
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_FechaBorrado = null;

            //FechaCaducidad
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_FechaSeleccion_FechaCaducidad.Exferia_FechaSeleccion_Fecha = "";

            ArbolSecundario_Cambiar_ProveedorArticuloTrazabilidad(-1);

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_TituloPantalla = (g_frm_P_EntradaMercanciaLinea_Trazabilidad.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_EntradaMercanciaLinea_Trazabilidad.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_EntradaMercanciaLinea_Trazabilidad.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(false);

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

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        #endregion

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_EntradaMercanciaLinea_Trazabilidad.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_EntradaMercanciaLinea_Trazabilidad.Enabled = true;
                g_bol_CargarDatos_Termino = true;

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

                //Devuelve el Error para que la pantalla de cierre
                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_EntradaMercanciaLinea_Trazabilidad_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_EntradaMercanciaLinea_Trazabilidad.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_EntradaMercanciaLinea_Trazabilidad_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_EntradaMercanciaLinea_Trazabilidad_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)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

            //Desbloquear el Formulario
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                        g_frm_P_EntradaMercanciaLinea_Trazabilidad.Salir_P_Base();
                    }
                }
                else
                {
                    //Recargar el Arbol Secundario
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_EntradaMercanciaLinea_Trazabilidad.RecargarSeleccionNodo();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_EntradaMercanciaLinea_Trazabilidad_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

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


                //Poner el Foco Inicial
                Funciones.Poner_Foco_Objeto(g_frm_P_EntradaMercanciaLinea_Trazabilidad, g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad);


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

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

            try
            {
                g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo = g_obj_COM_EntradasMercanciaLineas_Trazabilidad_Datos.Obtener(_lng_id);

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

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

                    //ArbolSecundarioSeleccion Identificadores Necesarios .......................................
                    //idProveedor
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_IDPROVEEDOR = g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.idProveedor;

                    //idArticulo
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_IDARTICULO = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idArticulo;

                    //articulotrazabilidad
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_EntradaMercanciaLinea_Trazabilidad.Exferia_ArbolSecundarioSeleccion_IDARTICULOTRAZABILIDAD = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.idArticulo_Trazabilidad;
                    // ..........................................................................................

                    //Lote .......................................................................................................................
                    g_mdl_MAE_Articulos_Trazabilidad = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.MAE_Articulos_Trazabilidad;
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Id = g_mdl_MAE_Articulos_Trazabilidad.id;
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Codigo = g_mdl_MAE_Articulos_Trazabilidad.lote;
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_FechaBorrado = g_mdl_MAE_Articulos_Trazabilidad.fechaBorrado;
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_1 = g_mdl_MAE_Articulos_Trazabilidad.tieneStock;

                    if (g_mdl_MAE_Articulos_Trazabilidad.fechaCaducidad != null)
                    {
                        g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_FechaSeleccion_FechaCaducidad.Exferia_FechaSeleccion_Fecha = g_mdl_MAE_Articulos_Trazabilidad.fechaCaducidad.Value.ToString("dd/MM/yyyy");
                    }
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Observaciones.Text = g_mdl_MAE_Articulos_Trazabilidad.observaciones;
                    //...............................................................................................................................

                    //Cantidad 
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad.Text = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.cantidad.ToString();
                    g_dcm_cantidadEmbalajePrincipal -= g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.cantidad;
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_TrazadoPrincipal_Valor.Text = g_dcm_cantidadEmbalajePrincipal.ToString();
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_DiferenciaPrincipal_Valor.Text = (g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.cantidad - g_dcm_cantidadEmbalajePrincipal).ToString();

                    //Cantidad Relacional
                    if (g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.segundaUnidad_cantidad != null)
                    {
                        g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.segundaUnidad_cantidad.Value.ToString();

                        g_dcm_cantidadEmbalajeRelacional -= g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.segundaUnidad_cantidad.Value;
                        g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_TrazadoRelacionado_Valor.Text = g_dcm_cantidadEmbalajeRelacional.ToString();
                        g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_DiferenciaRelacionado_Valor.Text = (g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.segundaUnidad_cantidad - g_dcm_cantidadEmbalajeRelacional).ToString();
                    }
                    else
                    {
                        g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text = "";
                    }

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

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

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

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_GrabarDatos_VaciarDatos)
        {
            try
            {
                //Comprobacion de Advertencias ............................................................
                bool bol_Grabar = true;
                g_bol_GrabarDatos_VaciarDatos = _bol_GrabarDatos_VaciarDatos;

                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_ADVERTENCIAS = Advertencia_LoteNoExiste();
                if (mdl_ValorDevuelto_Modelo_ADVERTENCIAS.TodoCorrecto == false)
                {
                    if (Mensajes.MostrarMensaje_Pregunta(mdl_ValorDevuelto_Modelo_ADVERTENCIAS.Mensaje) == false)
                    {
                        bol_Grabar = false;
                    }
                }

                //La cantidad de la Linea de trazabilidad es superior a la de la Linea de Entrada de Mercancia a la que esta relacionada
                if (bol_Grabar)
                {
                    mdl_ValorDevuelto_Modelo_ADVERTENCIAS = Advertencia_CantidadEntradaMercanciaLinea_Trazabilidad_Superior_CantidadEntradaMercanciaLinea();
                    if (mdl_ValorDevuelto_Modelo_ADVERTENCIAS.TodoCorrecto == false)
                    {
                        if (Mensajes.MostrarMensaje_Pregunta(mdl_ValorDevuelto_Modelo_ADVERTENCIAS.Mensaje) == false)
                        {
                            bol_Grabar = false;
                        }
                    }
                }
                //..............................................................................................

                if (bol_Grabar)
                {
                    g_bol_GrabarDatos_TerminoCorrectamente = true;

                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.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();

                    //Mostrar Pantalla de Espera
                    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_EntradaMercanciaLinea_Trazabilidad.Enabled = true;

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

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

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

                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear Formulario
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.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_EntradaMercanciaLinea_Trazabilidad, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }
                }
                else
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_EntradaMercanciaLinea_Trazabilidad.g_mdl_PRV_OpcionesDetalle.opcion);

                    //Si se llama desde la pantalla P_EntradaMercanciaLinea se envia el Id del registro que se acaba de grabar
                    if (g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_PantallaOrigen.Name.Equals(nameof(P_EntradaMercanciaLinea)))
                    {
                        lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    }
                    //Si se llama desde la pantalla de P_EntradaMercanciaCabecera se envia el Id de la linea de Entrada de Mercancia para que recargue las trazabilidades
                    else if (g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_PantallaOrigen.Name.Equals(nameof(P_EntradaMercanciaCabecera)))
                    {
                        lst_obj.Add(g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.id);
                    }

                    //Se agrega un parametros para saber si es una linea de articulo en promocion o no
                    lst_obj.Add(g_bol_EsLineaArticuloEnPromocion);
                    
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //Vaciar los datos para que se pueda meter otro linea
                    if (g_bol_GrabarDatos_VaciarDatos)
                    {
                        VaciarDatos();

                        //Rellenar de nuevo el resumen de la linea
                        Datos_Iniciales(true);
                    }

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

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

            try
            {
                // Si hay lote pero no existe en base de datos, advierto pero nada mas
                if (g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Codigo.Trim().Length != 0 &&
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ADVERTENCIA_NOEXISTEREGISTRO_SEVAACREAR(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Titulo);
                }
            }
            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_EntradaMercanciaLinea_Trazabilidad_Controladora) + "/" + nameof(Advertencia_LoteNoExiste));

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

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

            try
            {
                string str_Advertencias = "";

                //PRINCIPAL
                // Si la cantidad de la linea de trazabilidad es superior a la cantidad de la linea de EntradaMercancia, advierto
                decimal dcm_CantidadPrincipal_Diferencia = decimal.Parse(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_DiferenciaPrincipal_Valor.Text.Replace(".", ","));
                decimal dcm_CantidadPrincipal_Trazabilidad = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad.Text.Replace(".", ",")) : 0;

                if (dcm_CantidadPrincipal_Diferencia < dcm_CantidadPrincipal_Trazabilidad)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    str_Advertencias = Mensajes.G_STR_ADVERTENCIA_CANTIDADMOVIMIENTO_SOBREPASADO(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_Cantidad.Text, g_str_ArticuloEnPromocion_Texto) + System.Environment.NewLine;
                }

                //SEGUNDA UNIDAD
                if (g_frm_P_EntradaMercanciaLinea_Trazabilidad.Panel_SegundaUnidad.Visible)
                {
                    // Si la segunda unidad de la linea de trazabilidad es superior a la segunda unidad de la linea de Entrada de mercancia, advierto
                    decimal dcm_CantidadSegundaUnidad_Diferencia = decimal.Parse(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SinColor_DiferenciaRelacionado_Valor.Text.Replace(".", ","));
                    decimal dcm_CantidadSegundaUnidad_Trazabilidad = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text.Trim().Length > 0 ? decimal.Parse(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text.Replace(".", ",")) : 0;

                    if (dcm_CantidadSegundaUnidad_Diferencia < dcm_CantidadSegundaUnidad_Trazabilidad)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        str_Advertencias += Mensajes.G_STR_ADVERTENCIA_CANTIDADMOVIMIENTO_SOBREPASADO(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SegundaUnidad.Text, g_str_ArticuloEnPromocion_Texto) + System.Environment.NewLine;
                    }
                }

                //Se pone la pregunta final
                if (str_Advertencias.Trim().Length > 0)
                {
                    mdl_ValorDevuelto_Modelo.Mensaje = str_Advertencias + Mensajes.G_STR_ADVERTENCIA_DESEACONTINUAR();
                }

            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_EntradaMercanciaLinea_Trazabilidad_Controladora) + "/" + nameof(Advertencia_CantidadEntradaMercanciaLinea_Trazabilidad_Superior_CantidadEntradaMercanciaLinea));

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

            return mdl_ValorDevuelto_Modelo;
        }

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

            try
            {
                // La fecha caducidad debe ser correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_FechaSeleccion_FechaCaducidad.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

                    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_EntradaMercanciaLinea_Trazabilidad.Exferia_FechaSeleccion_FechaCaducidad.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_FechaSeleccion_FechaCaducidad;
                    }
                }

                // La Cantidad no puede estar vacío
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_Cantidad.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad;
                }

                // La 2º Unidad no puede estar vacío si estuviera visible
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && g_frm_P_EntradaMercanciaLinea_Trazabilidad.Panel_SegundaUnidad.Visible && (g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_Label_SegundaUnidad.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad;
                }

                // El lote no puede estar vacio
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Codigo.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_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_EntradaMercanciaLinea_Trazabilidad_Controladora) + "/" + nameof(ValidarDatos));

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

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

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    long lng_id_ArticuloTrazabilidad = -1;
                    DateTime? dtt_fechaNula = null;
                    decimal? dcm_Nulo = null;
                    DateTime? dtt_FechaCaducidad = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_FechaSeleccion_FechaCaducidad.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "" ? DateTime.ParseExact(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_FechaSeleccion_FechaCaducidad.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : dtt_fechaNula;

                    //Sino existe el Lote lo creamos ...........................................................................................................................
                    MAE_Articulos_Trazabilidad mdl_MAE_Articulos_Trazabilidad = new MAE_Articulos_Trazabilidad();
                    if (g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Codigo.Trim().Length != 0 &&
                        g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Id == -1)
                    {
                        mdl_MAE_Articulos_Trazabilidad.id = -1;
                        if (decimal.Parse(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad.Text)>0)
                        {
                            mdl_MAE_Articulos_Trazabilidad.tieneStock = true;
                        }
                        else
                        {
                            mdl_MAE_Articulos_Trazabilidad.tieneStock = false;
                        }
                    }
                    //Si existe el lote, pero la fecha de caducidad es diferente o las observaciones se actualiza
                    else
                    {
                        mdl_MAE_Articulos_Trazabilidad.id = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Id;
                        mdl_MAE_Articulos_Trazabilidad.tieneStock = (bool?)g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_1;
                    }

                    // lote
                    mdl_MAE_Articulos_Trazabilidad.lote = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_F3_SoloSeleccion_Simple_ArticuloTrazabilidad.Exferia_F3_SoloSeleccion_Simple_Codigo;

                    //fechaCaducidad
                    mdl_MAE_Articulos_Trazabilidad.fechaCaducidad = dtt_FechaCaducidad;

                    //observaciones
                    mdl_MAE_Articulos_Trazabilidad.observaciones = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Observaciones.Text;

                    //idArticulo
                    mdl_MAE_Articulos_Trazabilidad.idArticulo = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idArticulo;


                    // Se graba el modelo ya relleno -----------------------------------------------------------------------------------
                    //Cargamos el ensamblado
                    Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type = m_assembly.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                    //creamos la instancia
                    var obj_Clase = Activator.CreateInstance(m_type);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_GRABAR_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros = { Variables.G_STR_OPCION_MAE_ARTICULOS_TRAZABILIDAD, mdl_MAE_Articulos_Trazabilidad };

                    //Pasamos los parametros al metodo y lo ejecutamos
                    mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

                    // Si todo esta correcto cojemos el id para relacionarlo que el EntradaMercanciaLinea_Trazabilidad
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                    {
                        transaccion_SQL.Dispose();
                        return mdl_INTERNO_ValorDevuelto_Modelo;
                    }
                    else
                    {
                        lng_id_ArticuloTrazabilidad = mdl_INTERNO_ValorDevuelto_Modelo.Id;
                    }
                    //............................................................................................................................................................

                    #region ACTUALIZAR ARTICULO MOVIMIENTOS DIARIO 

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

                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoDocumento = Variables.G_MDL_TIPODOCUMENTOS_MOVIMIENTOSARTICULOS_ENTRADASMERCANCIA.Codigo;

                    //Datos Actuales
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulotrazabilidad_Actual = lng_id_ArticuloTrazabilidad;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idArticulo;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Actual = g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.fecha;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Actual = g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.idDelegacion;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idAlmacen;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idUbicacion;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Actual = decimal.Parse(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad.Text);
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Actual = g_frm_P_EntradaMercanciaLinea_Trazabilidad.Panel_SegundaUnidad.Visible ? decimal.Parse(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text) : dcm_Nulo;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.GEN_TiposCompraVenta.opcion;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.relacion;
                    mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.operacion;

                    //Datos Anteriores
                    if (g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo != null)
                    {
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Modificacion = true;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulotrazabilidad_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.idArticulo_Trazabilidad;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idArticulo;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Fecha_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.fecha;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.idDelegacion;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idAlmacen;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idUbicacion;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.GEN_TiposCompraVenta.opcion;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.cantidad;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.segundaUnidad_cantidad;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Relacion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.relacion;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Operacion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.operacion;
                    }
                    else
                    {
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.Modificacion = false;
                        mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo.IdArticulotrazabilidad_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_ArticuloTrazabilidadMovimientosDiario.Actualizar_ArticuloTrazabilidadMovimientoDiario(mdl_INTERNO_ArticuloDiarioActualizar_Documentos_Modelo);

                    #endregion

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        COM_EntradasMercanciaLineas_Trazabilidad mdl_COM_EntradasMercanciaLineas_Trazabilidad = new COM_EntradasMercanciaLineas_Trazabilidad();

                        //id
                        mdl_COM_EntradasMercanciaLineas_Trazabilidad.id = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo != null ? g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.id : -1;

                        //idArticulo_Trazabilidad
                        mdl_COM_EntradasMercanciaLineas_Trazabilidad.idArticulo_Trazabilidad = lng_id_ArticuloTrazabilidad;

                        //cantidad
                        mdl_COM_EntradasMercanciaLineas_Trazabilidad.cantidad = decimal.Parse(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Cantidad.Text);

                        //segundaUnidad_cantidad
                        if (g_frm_P_EntradaMercanciaLinea_Trazabilidad.Panel_SegundaUnidad.Visible)
                        {
                            mdl_COM_EntradasMercanciaLineas_Trazabilidad.segundaUnidad_cantidad = decimal.Parse(g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_SegundaUnidad.Text);
                        }
                        else
                        {
                            mdl_COM_EntradasMercanciaLineas_Trazabilidad.segundaUnidad_cantidad = null;
                        }

                        //fechaBorrado
                        mdl_COM_EntradasMercanciaLineas_Trazabilidad.fechaBorrado = null;

                        //idEntradaMercanciaLinea
                        mdl_COM_EntradasMercanciaLineas_Trazabilidad.idEntradaMercanciaLinea = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.id;

                        // Se graba el modelo ya relleno.
                        mdl_INTERNO_ValorDevuelto_Modelo = g_obj_COM_EntradasMercanciaLineas_Trazabilidad_Datos.Grabar(mdl_COM_EntradasMercanciaLineas_Trazabilidad);

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            //Termino Transaccion
                            transaccion_SQL.Complete();
                        }
                    }

                    transaccion_SQL.Dispose();
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_EntradaMercanciaLinea_Trazabilidad_Controladora) + "/" + nameof(GrabarDatos_Final));

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #endregion

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

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

                g_frm_P_EntradaMercanciaLinea_Trazabilidad.Enabled = true;

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

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

                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear Formulario
            g_frm_P_EntradaMercanciaLinea_Trazabilidad.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    // Devolver al Listado el Row Borrar
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_EntradaMercanciaLinea_Trazabilidad.g_mdl_PRV_OpcionesDetalle.opcion);

                    //Si se llama desde la pantalla P_EntradaMercanciaLinea se envia el Id del registro que se acaba de borrar
                    if (g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_PantallaOrigen.Name.Equals(nameof(P_EntradaMercanciaLinea)))
                    {
                        List<long> lst_id = new List<long>();
                        lst_id.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                        lst_obj.Add(lst_id);
                    }
                    //Si se llama desde la pantalla de P_EntradaMercanciaCabecera se envia el Id de la linea de Entrada de mercancia para que recargue las trazabilidades
                    else if (g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_PantallaOrigen.Name.Equals(nameof(P_EntradaMercanciaCabecera)))
                    {
                        lst_obj.Add(g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.id);
                    }

                    //Se agrega un parametros para saber si es una linea de articulo en promocion o no
                    lst_obj.Add(g_bol_EsLineaArticuloEnPromocion);

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

                    //Se pone para que no pregunte si se modifico algo
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.P_Base_SeModificoDatosPantalla = false;
                    //Salir de la Pantalla
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_EntradaMercanciaLinea_Trazabilidad_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
            {

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

                    #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_ENTRADASMERCANCIA.Codigo;

                    //Datos Actuales
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulo_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idArticulo;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulotrazabilidad_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.idArticulo_Trazabilidad;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Fecha_Actual = g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.fecha;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdDelegacion_Actual = g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.idDelegacion;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdAlmacen_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idAlmacen;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdUbicacion_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_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 = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.GEN_TiposCompraVenta.opcion;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Relacion_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.relacion;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Operacion_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.operacion;

                    //Datos Anteriores
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Modificacion = true;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulo_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idArticulo;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdArticulotrazabilidad_Actual = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.idArticulo_Trazabilidad;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Fecha_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.fecha;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdDelegacion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaCabecera_Modelo.idDelegacion;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdAlmacen_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idAlmacen;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.IdUbicacion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.idUbicacion;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.TipoCompraVentaOpcion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.GEN_TiposCompraVenta.opcion;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.cantidad;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Cantidad_SegundaUnidad_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.segundaUnidad_cantidad;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Relacion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_Modelo.relacion;
                    mdl_INTERNO_ArticuloTrazabilidadDiarioActualizar_Documentos_Modelo.Operacion_Anterior = g_mdl_INTERNO_COM_EntradasMercanciaLineas_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_COM_EntradasMercanciaLineas_Trazabilidad_Datos.Borrar(g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo != null ? g_mdl_INTERNO_COM_EntradasMercanciaLineas_Trazabilidad_Modelo.id : -1);
                    }
                }

                
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_EntradaMercanciaLinea_Trazabilidad_Controladora) + "/" + nameof(BorrarDatos_Final));

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        public void RecargarDatos_TrazabilidadArticulo_Seleccionado(long _lng_idArticulo_Trazabilidad)
        {
            try
            {
                // Se graba el modelo ya relleno -----------------------------------------------------------------------------------
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase = Activator.CreateInstance(m_type);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOSTRAZABILIDAD_OBTENERMODELO_POR_ID_AUX_1, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { _lng_idArticulo_Trazabilidad };

                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_MAE_Articulos_Trazabilidad = (MAE_Articulos_Trazabilidad)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

                if (g_mdl_MAE_Articulos_Trazabilidad != null)
                {
                    //Fecha Caducidad
                    if (g_mdl_MAE_Articulos_Trazabilidad.fechaCaducidad != null)
                    {
                        g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_FechaSeleccion_FechaCaducidad.Exferia_FechaSeleccion_Fecha = g_mdl_MAE_Articulos_Trazabilidad.fechaCaducidad.Value.ToString("dd/MM/yyyy");
                    }

                    //Observaciones
                    g_frm_P_EntradaMercanciaLinea_Trazabilidad.Exferia_TextBox_Observaciones.Text = g_mdl_MAE_Articulos_Trazabilidad.observaciones;
                }

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

        public void Mostrar_CerradoVolcado()
        {
            //Abierto
            bool bol_Bloquear = false;

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

            //Bloqueo los Controles
            SoloLectura.Empezar(g_frm_P_EntradaMercanciaLinea_Trazabilidad, bol_Bloquear);
        }
    }
}
