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

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

        //Clases de Negocio Necesarias para la carga de datos ...............................................................
        private MAE_Proveedores_Articulos_Datos g_obj_MAE_Proveedores_Articulos_Datos = new MAE_Proveedores_Articulos_Datos();

        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Columnas;

        public List<dynamic> g_lst_ListadoRegistros = null;
        public List<dynamic> g_lst_ListadoRegistros_Filtrados = null;

        //Obtencion de los valores de los registros desde base de datos 
        private BackgroundWorker g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos;
        public bool g_bol_Obtencion_ListadoCompleto_BaseDatos_Termino = false;

        //Tarea Asincrona para la Rellenar DataGridView 
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid;
        public bool g_bol_CancelarTareaAsincrona_Rellenar_DataGrid = false;

        //Filtrado del Listado 
        public List<string> g_lst_ColumnasAMostrar = new List<string>();
        public ABS_Listado_MAE_Proveedores_Articulos g_obj_ABS_Listado_MAE_Proveedores_Articulos = new ABS_Listado_MAE_Proveedores_Articulos();
        public Dictionary<string, object> g_dct_ListadoFiltros = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados = 0;

        #endregion

        #region Construtor
        public P_Proveedores_Articulos_Controladora(P_Proveedores_Articulos _frm_P_Proveedores_Articulos)
        {
            g_frm_P_Proveedores_Articulos = _frm_P_Proveedores_Articulos;

            //(Tarea Asincrona) Obtener Listado de BaseDatos ####################################################################
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos = new BackgroundWorker();
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_Obtener_ListadoCompleto_BaseDatos_DoWork);
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Obtener_ListadoCompleto_BaseDatos_Completed);
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado DataGrid ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid.WorkerSupportsCancellation = true;
            //#####################################################################################################
        }
        #endregion

        #region Obtener Listado Completo de base de datos
        public void Obtener_ListadoCompleto_BaseDatos()
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando();
                g_frm_PE_Esperando.TopMost = true;
                g_frm_PE_Esperando.Show();

                //Si se estaba ejecutando lo paro
                while (g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.IsBusy)
                    Application.DoEvents();

                g_bol_Obtencion_ListadoCompleto_BaseDatos_Termino = false;

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.RunWorkerAsync(g_lst_ColumnasAMostrar);
            }
            catch (Exception)
            {
                g_bol_Obtencion_ListadoCompleto_BaseDatos_Termino = true;

                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_Obtener_ListadoCompleto_BaseDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            List<dynamic> lst_ValorDevuelto = null;

            try
            {
                List<string> lst_ColumnasAMostrar = (List<string>)e.Argument;

                //Pasamos los parametros al metodo y lo ejecutamos
                lst_ValorDevuelto = g_obj_MAE_Proveedores_Articulos_Datos.Obtener_Listado(g_frm_P_Proveedores_Articulos.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_Proveedores_Articulos.P_Base_ValoresGenerales.EjercicioActivo.id, lst_ColumnasAMostrar, null, null);
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
            finally
            {
                e.Result = lst_ValorDevuelto;
            }
        }
        protected void TareaAsincrona_Obtener_ListadoCompleto_BaseDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            g_bol_Obtencion_ListadoCompleto_BaseDatos_Termino = true;

            if (e.Cancelled == false)
            {
                try
                {
                    g_lst_ListadoRegistros = (List<dynamic>)e.Result;

                    Rellenar_DataGridView();
                }
                catch (Exception)
                { }
            }
        }
        #endregion

        #region Rellenar DataGridView 
        public void Rellenar_DataGridView()
        {
            try
            {
                g_bol_CancelarTareaAsincrona_Rellenar_DataGrid = true;

                while (g_obj_TareaAsincrona_Rellenar_DataGrid.IsBusy)
                    Application.DoEvents();

                g_bol_CancelarTareaAsincrona_Rellenar_DataGrid = false;

                //Vaciar el Listado
                g_frm_P_Proveedores_Articulos.Exferia_DataGridView_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados = 0;
                g_frm_P_Proveedores_Articulos.Exferia_BarraProgreso_Listado.Exferia_BarraProgreso_Total = 0;
                g_frm_P_Proveedores_Articulos.Exferia_BarraProgreso_Listado.Exferia_BarraProgreso_Actualizar = 0;

                //parametros para Filtrar
                List<object> lst_Argumentos = new List<object>();

                //Orden Actual
                if (g_frm_P_Proveedores_Articulos.Exferia_ComboBox_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_Proveedores_Articulos.Exferia_ComboBox_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_Proveedores_Articulos.Exferia_ComboBox_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_obj_ABS_Listado_MAE_Proveedores_Articulos.ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Filtrados
                lst_Argumentos.Add(g_frm_P_Proveedores_Articulos.Exferia_CheckBox_Filtrado_Proveedores.Checked);
                lst_Argumentos.Add(g_frm_P_Proveedores_Articulos.Exferia_CheckBox_Filtrado_AgrupacionesProveedores.Checked);
                lst_Argumentos.Add(g_frm_P_Proveedores_Articulos.Exferia_CheckBox_Filtrado_Articulos.Checked);
                lst_Argumentos.Add(g_frm_P_Proveedores_Articulos.Exferia_CheckBox_Filtrado_AgrupacionesArticulos.Checked);
                lst_Argumentos.Add(g_frm_P_Proveedores_Articulos.Exferia_CheckBox_Filtrado_TarifasPromociones.Checked);
                lst_Argumentos.Add(g_frm_P_Proveedores_Articulos.Exferia_CheckBox_Filtrado_PromocionEsquema.Checked);

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Proveedores_Articulos_Controladora) + "/" + nameof(Rellenar_DataGridView));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Proveedores_Articulos_Controladora) + "/" + nameof(Rellenar_DataGridView));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Datos Recibidos ..................................................
                List<object> lst_Argumentos = (List<object>)e.Argument;
               
                //Orden Actual
                string str_Ordenacion_PorDefecto = (string)lst_Argumentos[0];

                //Filtrado
                bool bol_Filtrado_Proveedor = (bool)lst_Argumentos[1];
                bool bol_Filtrado_AgrupacionProveedor = (bool)lst_Argumentos[2];
                bool bol_Filtrado_Articulo = (bool)lst_Argumentos[3];
                bool bol_Filtrado_AgrupacionArticulo = (bool)lst_Argumentos[4];
                bool bol_Filtrado_TarifasPromociones = (bool)lst_Argumentos[5];
                bool bol_Filtrado_PromocionEsquema = (bool)lst_Argumentos[6];

                //Listado de la tabla
                g_lst_ListadoRegistros_Filtrados = null;

                //Filtrar #############################################
                if (g_dct_ListadoFiltros.Count > 0)
                {
                    g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros;

                    //Filtros Avanzados
                    if (g_dct_ListadoFiltros != null && g_dct_ListadoFiltros.Count > 0)
                    {
                        g_lst_ListadoRegistros_Filtrados = Funciones_Listado.Filtrar_Listado(g_lst_ListadoRegistros_Filtrados, g_obj_ABS_Listado_MAE_Proveedores_Articulos, g_dct_ListadoFiltros);
                    }
                }
                else
                {
                    g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros;
                }
                //#####################################################

                if (g_lst_ListadoRegistros_Filtrados != null)
                {
                    //Añadir los filtros de Proveedor/AgrupacionProveedor 
                    if (bol_Filtrado_Proveedor && !bol_Filtrado_AgrupacionProveedor)
                    {
                        g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(nameof(INTERNO_MAE_Proveedores_Articulos_Listado_Modelo.idProveedor)).GetValue(m, null) != null).ToList();
                    }
                    else if (!bol_Filtrado_Proveedor && bol_Filtrado_AgrupacionProveedor)
                    {
                        g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(nameof(INTERNO_MAE_Proveedores_Articulos_Listado_Modelo.idAgrupacionProveedorLinea)).GetValue(m, null) != null).ToList();
                    }

                    //Añadir los filtros de Articulo/AgrupacionArticulo
                    if (bol_Filtrado_Articulo && !bol_Filtrado_AgrupacionArticulo)
                    {
                        g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(nameof(INTERNO_MAE_Proveedores_Articulos_Listado_Modelo.idArticulo)).GetValue(m, null) != null).ToList();
                    }
                    else if (!bol_Filtrado_Articulo && bol_Filtrado_AgrupacionArticulo)
                    {
                        g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(nameof(INTERNO_MAE_Proveedores_Articulos_Listado_Modelo.idAgrupacionArticuloLinea)).GetValue(m, null) != null).ToList();
                    }

                    //Añadir los filtros de TarifaPromocion/PromocionEsquema
                    if (bol_Filtrado_TarifasPromociones && !bol_Filtrado_PromocionEsquema)
                    {
                        g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(nameof(INTERNO_MAE_Proveedores_Articulos_Listado_Modelo.idTarifaPromocion)).GetValue(m, null) != null).ToList();
                    }
                    else if (!bol_Filtrado_TarifasPromociones && bol_Filtrado_PromocionEsquema)
                    {
                        g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(nameof(INTERNO_MAE_Proveedores_Articulos_Listado_Modelo.idPromocionEsquemaCabecera)).GetValue(m, null) != null).ToList();
                    }

                    //Ordenar el Listado ##################
                    if (str_Ordenacion_PorDefecto.Trim().Length > 0)
                    {
                        //Descendente
                        if (g_frm_P_Proveedores_Articulos.Exferia_Button_OrdenListado.Tag.ToString().Equals("1"))
                        {
                            g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros_Filtrados.OrderByDescending(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                        }
                        //Ascendente
                        else
                        {
                            g_lst_ListadoRegistros_Filtrados = g_lst_ListadoRegistros_Filtrados.OrderBy(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                        }
                    }
                    //#####################################

                    g_frm_P_Proveedores_Articulos.Listado_Ordenar_DataGridView();
                    g_frm_P_Proveedores_Articulos.Exferia_BarraProgreso_Listado.Exferia_BarraProgreso_Total = g_lst_ListadoRegistros_Filtrados.Count;

                    object[] row;
                    foreach (dynamic obj_Dinamico in g_lst_ListadoRegistros_Filtrados)
                    {
                        //Se Cancelo la tarea asincrona ---------------------------
                        if (g_bol_CancelarTareaAsincrona_Rellenar_DataGrid)
                        {
                            return;
                        }

                        //Añadir Fila con Columnas .............................
                        row = Funciones_Listado.Transformar_Dynamic_A_Row(obj_Dinamico, g_obj_ABS_Listado_MAE_Proveedores_Articulos);

                        //Llamar al Progress
                        g_int_TotalRegistrosInsertados += 1;

                        ((BackgroundWorker)sender).ReportProgress(1, row);

                        //Application.DoEvents();
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                g_bol_CancelarTareaAsincrona_Rellenar_DataGrid = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Proveedores_Articulos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_Rellenar_DataGrid = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Proveedores_Articulos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_Rellenar_DataGrid = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Proveedores_Articulos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_Proveedores_Articulos.Exferia_DataGridView_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_Proveedores_Articulos.Exferia_BarraProgreso_Listado.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }
        #endregion

        #region Actualizar registros grabados desde la pantalla de detalles
        public void Linea_Actualizar_Registro(long _lng_idLinea, G_ENUM_TIPOACCION _enum_TipoAccion, bool _bol_RecargarTrazabilidad)
        {
            try
            {
                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_MAE_Proveedores_Articulos.LISTADO_COLUMNAS().Values.Where(m => m.ColumnaClave).FirstOrDefault();
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                {
                    str_NombreCampoClave = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                }

                List<dynamic> lst_Listado_Modelo = g_obj_MAE_Proveedores_Articulos_Datos.Obtener_RegistroListado(((g_frm_P_Proveedores_Articulos.P_Base_ValoresGenerales != null) ? g_frm_P_Proveedores_Articulos.P_Base_ValoresGenerales.lng_idEmpresa : -1),
                                                                                                                            ((g_frm_P_Proveedores_Articulos.P_Base_ValoresGenerales != null && g_frm_P_Proveedores_Articulos.P_Base_ValoresGenerales.EjercicioActivo != null) ? g_frm_P_Proveedores_Articulos.P_Base_ValoresGenerales.EjercicioActivo.id : -1),
                                                                                                                            g_lst_ColumnasAMostrar,
                                                                                                                            null,
                                                                                                                            null,
                                                                                                                            _lng_idLinea,
                                                                                                                            null);

                if (lst_Listado_Modelo != null)
                {
                    dynamic dnm_Listado_Modelo = lst_Listado_Modelo.ToList().FirstOrDefault();

                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_ListadoRegistros != null && g_lst_ListadoRegistros.Count > 0)
                    {
                        dynamic dnm_Listado_Modelo_BUSQUEDA = g_lst_ListadoRegistros.Where(m => m.id.Equals(dnm_Listado_Modelo.GetType().GetProperty(str_NombreCampoClave).GetValue(dnm_Listado_Modelo, null))).FirstOrDefault();
                        if (dnm_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_ListadoRegistros[g_lst_ListadoRegistros.FindIndex(m => m.id.Equals(dnm_Listado_Modelo.GetType().GetProperty(str_NombreCampoClave).GetValue(dnm_Listado_Modelo, null)))] = dnm_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_ListadoRegistros.Add(dnm_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_ListadoRegistros == null)
                        {
                            g_lst_ListadoRegistros = new List<dynamic>();
                        }

                        g_lst_ListadoRegistros.Add(dnm_Listado_Modelo);
                    }

                    //Actualizar el DataGridView #####################################################################################
                    //Modificar
                    if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                    {
                        DataGridViewRow row = g_frm_P_Proveedores_Articulos.Exferia_DataGridView_Listado.Rows
                                     .Cast<DataGridViewRow>()
                                     .Where(r => r.Cells[str_NombreCampoClave].Value.Equals(_lng_idLinea)).FirstOrDefault();

                        if (row != null)//Modificada
                        {
                            //Actualzar grid
                            g_frm_P_Proveedores_Articulos.Exferia_DataGridView_Listado.Rows[row.Index].SetValues(Funciones_Listado.Transformar_Dynamic_A_Row(dnm_Listado_Modelo, g_obj_ABS_Listado_MAE_Proveedores_Articulos));
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_Proveedores_Articulos.Exferia_DataGridView_Listado.Rows.Add(Funciones_Listado.Transformar_Dynamic_A_Row(dnm_Listado_Modelo, g_obj_ABS_Listado_MAE_Proveedores_Articulos));

                        //Sumar Cantidad de Lineas Insertadas
                        g_frm_P_Proveedores_Articulos.Exferia_BarraProgreso_Listado.Exferia_BarraProgreso_Total += 1;
                        g_frm_P_Proveedores_Articulos.Exferia_BarraProgreso_Listado.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados + 1;
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Proveedores_Articulos_Controladora) + "/" + nameof(Linea_Actualizar_Registro));
            }

        }
        public void Linea_Borrar_Registro(List<long> _lst_idLinea)
        {
            try
            {
                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_MAE_Proveedores_Articulos.LISTADO_COLUMNAS().Values.Where(m => m.ColumnaClave).FirstOrDefault();
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                {
                    str_NombreCampoClave = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                }

                //Borrar primero el List<> General ################################################################################
                if (g_lst_ListadoRegistros != null && g_lst_ListadoRegistros.Count > 0)
                {
                    List<dynamic> lst_ListadoRegistros_BUSQUEDA = g_lst_ListadoRegistros.Where(m => _lst_idLinea.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).ToList();
                    if (lst_ListadoRegistros_BUSQUEDA != null && lst_ListadoRegistros_BUSQUEDA.Count > 0)
                    {
                        foreach (dynamic dnm_RegistroABorrar in lst_ListadoRegistros_BUSQUEDA)
                        {
                            g_lst_ListadoRegistros.Remove(dnm_RegistroABorrar);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Proveedores_Articulos.Exferia_DataGridView_Listado.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idLinea.Contains(long.Parse(r.Cells[str_NombreCampoClave].Value.ToString()))).ToList();

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

                //Restar Cantidad de Lineas Borradas
                g_frm_P_Proveedores_Articulos.Exferia_BarraProgreso_Listado.Exferia_BarraProgreso_Total -= _lst_idLinea.Count();
                g_frm_P_Proveedores_Articulos.Exferia_BarraProgreso_Listado.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados - _lst_idLinea.Count();

                g_frm_P_Proveedores_Articulos.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Proveedores_Articulos_Controladora) + "/" + nameof(Linea_Borrar_Registro));
            }
        }
        #endregion

        #region Borrar Datos en Base Datos Linea
        public void BorrarDatos_Linea(List<long> _lst_idLinea_ABorrar)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Proveedores_Articulos.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_idLinea_ABorrar);

                    BackgroundWorker obj_TareaAsincrona_Borrar_Linea = new BackgroundWorker();
                    obj_TareaAsincrona_Borrar_Linea.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_Linea_DoWork);
                    obj_TareaAsincrona_Borrar_Linea.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_Linea_Completed);
                    obj_TareaAsincrona_Borrar_Linea.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_Proveedores_Articulos.Enabled = true;

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

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

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = BorrarDatos_Final_Linea(lst_idLinea_ABorrar);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idLinea_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_Proveedores_Articulos_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Linea_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_Proveedores_Articulos_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Linea_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_Linea_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Proveedores_Articulos.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_obj_ABS_Listado_MAE_Proveedores_Articulos.DATOS_OPCION().opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_Proveedores_Articulos.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Proveedores_Articulos.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Proveedores_Articulos_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Linea_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final_Linea(List<long> _lst_idLinea_ABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_MAE_Proveedores_Articulos_Datos.Borrar(_lst_idLinea_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_Proveedores_Articulos_Controladora) + "/" + nameof(BorrarDatos_Final_Linea));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion
    }
}
