using Exferia_Aplicacion.General;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_GestionDocumental._0_Modelos;
using Exferia_GestionDocumental._1_Datos;
using Exferia_GestionDocumental._3_Vistas.ControlesPersonalizados;
using Exferia_GestionDocumental.General;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Text;
using Exferia_Aplicacion.Modelos_Eventos;
using System.Transactions;

namespace Exferia_GestionDocumental._3_Vistas.Controladoras
{
    public class P_ProcesoRellenarDatosEtiquetas_Controladora
    {
        #region Variables Generales
        private P_ProcesoRellenarDatosEtiquetas g_frm_P_ProcesoRellenarDatosEtiquetas;//Variable que enlaza con la pantalla asociada
        private PE_Esperando_BarraProgreso g_frm_PE_Esperando_BarraProgreso;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        //Clases necesarias
        private GTD_Documentos_Datos g_obj_GTD_Documentos_Datos = new GTD_Documentos_Datos();
        private GTD_Documentos_BusquedaEtiquetas_Datos g_obj_GTD_Documentos_BusquedaEtiquetas_Datos = new GTD_Documentos_BusquedaEtiquetas_Datos();
        private ConexionExterna_Datos g_obj_ConexionExterna_Datos = new ConexionExterna_Datos();
        public GTD_Documentos_Archivos_Datos g_obj_GTD_Documentos_Archivos_Datos = new GTD_Documentos_Archivos_Datos();
        private Encriptador g_obj_Encriptador = new Encriptador();

        public List<INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo> g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL = null;
        public long g_lng_IdDocumento_Seleccionado = -1;

        #region Tareas Asincronas
        //Tareea Asincrona de rellenar Listado Etiquetas
        private BackgroundWorker g_obj_TareaAsincrona_RellenarListadoEtiquetas;

        //Tareea Asincrona de Proceso de Rellenar los datos de las etiquetas de los documentos
        private BackgroundWorker g_obj_TareaAsincrona_ProcesoRellenarDatosEtiquetas;
        #endregion

        #region Posiciones de campos en Listado
        public int g_int_PosicionColumna_Identificador = 0;
        public int g_int_PosicionColumna_Descripcion = 1;
        public int g_int_PosicionColumna_DocumentoTipo = 2;
        public int g_int_PosicionColumna_Extension = 3;
        public int g_int_PosicionColumna_Size = 4;
        public int g_int_PosicionColumna_Boton_Ver =5;
        #endregion

        //Variables para la creacion de los Etiquetas ################
        private int g_int_Etiquetas_PosicionY = 5;
        private int g_int_NumeroLineas_Etiquetas = 0;
        private List<int> g_lst_ListadoLineas_Etiquetas = new List<int>();

        #endregion

        #region Constructor
        public P_ProcesoRellenarDatosEtiquetas_Controladora(P_ProcesoRellenarDatosEtiquetas _frm_P_ProcesoRellenarDatosEtiquetas)
        {
            g_frm_P_ProcesoRellenarDatosEtiquetas = _frm_P_ProcesoRellenarDatosEtiquetas;
        }
        #endregion

        #region Carga Inicial
        public void CargaInicial()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_ProcesoRellenarDatosEtiquetas.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando_BarraProgreso = new PE_Esperando_BarraProgreso();

                BackgroundWorker obj_TareaAsincrona_CargaInicial = new BackgroundWorker();
                obj_TareaAsincrona_CargaInicial.DoWork += new DoWorkEventHandler(TareaAsincrona_CargaInicial_DoWork);
                obj_TareaAsincrona_CargaInicial.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargaInicial_ProgressChanged);
                obj_TareaAsincrona_CargaInicial.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargaInicial_Completed);
                obj_TareaAsincrona_CargaInicial.WorkerReportsProgress = true;

                //Vaciar
                g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_DataGridView_Documentos.Rows.Clear();
                g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL = null;
                Rellenar_Listado_Etiquetas(-1);
                g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Label_SinColor_Total.Text = "Total Documentos : 0";

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

                g_frm_PE_Esperando_BarraProgreso.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_ProcesoRellenarDatosEtiquetas.Enabled = true;

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

                throw new Control_Errores("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(CargaInicial), true);
            }
        }
        private void TareaAsincrona_CargaInicial_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //final
                g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL = new List<INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo>();

                //Buscar los Documentos con los filtros
                List<INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo> lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_INICIAL = g_obj_GTD_Documentos_Datos.Buscar_Documentos_ParaRellenarEtiquetas();
                
                if (lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_INICIAL != null && lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_INICIAL.Count > 0)
                {
                    //Total
                    ((BackgroundWorker)sender).ReportProgress(1, lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_INICIAL.Count);

                    int int_Contador = 0;
                    foreach (INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo in lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_INICIAL)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Tiene que tener campos Relacionales
                        if (mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.CamposRelacionales != null &&
                            mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.CamposRelacionales.Count > 0)
                        {
                            List<long> lst_CamposRelacionales_IdDocumentoTipoEtiqueta = mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.CamposRelacionales.Where(m =>m.fechaBorrado==null && m.tipo.ToString() != Variables_GestionDocumental.G_MDL_TIPOCAMPOBASEDATOSPARACONSULTA_CLAVEPRIMARIA.Codigo).Select(m=>m.idDocumentoTipo_Etiqueta).ToList();
                            //Tiene que tener campos Relacionales que no sea tipo Clave primaria
                            if (lst_CamposRelacionales_IdDocumentoTipoEtiqueta != null &&
                                lst_CamposRelacionales_IdDocumentoTipoEtiqueta.Count > 0)
                            {
                                //Etiquetas Grabadas
                                if (
                                    mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.Exists(m => m.idDocumentoTipoEtiqueta != null) 
                                    &&
                                    !mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.Exists(m => 
                                                                                                                            m.idDocumentoTipoEtiqueta != null && 
                                                                                                                            lst_CamposRelacionales_IdDocumentoTipoEtiqueta.Contains(m.idDocumentoTipoEtiqueta.Value) && 
                                                                                                                            m.valor!=null &&
                                                                                                                            m.valor.Trim().Length>0)
                                )
                                { 
                                    //Añadir al DataGridView
                                    ((BackgroundWorker)sender).ReportProgress(3, Transformar_Modelo_A_Row_LineaListado(mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo, null));

                                    //Añadir al listado final
                                    g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL.Add(mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo);
                                }
                            }
                        }

                        //Progreso
                        int_Contador += 1;
                        ((BackgroundWorker)sender).ReportProgress(2, int_Contador);

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

                    }

                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargaInicial_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage==1)
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Total = (int)e.UserState;
                }
                else if (e.ProgressPercentage == 2)
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Actualizar = (int)e.UserState;
                }
                else
                {
                    //Añadir Linea 
                    g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_DataGridView_Documentos.Rows.Add((DataGridViewRow)e.UserState);
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_CargaInicial_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando_BarraProgreso != null)
            {
                g_frm_PE_Esperando_BarraProgreso.Close();
                g_frm_PE_Esperando_BarraProgreso = null;
            }
            //Desbloquear el Formulario
            g_frm_P_ProcesoRellenarDatosEtiquetas.Enabled = true;

            try
            {
                //Total
                g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Label_SinColor_Total.Text = "Total Documentos : " + g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL!=null ? g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL.Count.ToString() : "0";

                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;
                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje_Y_EsperarRespuesta(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_ProcesoRellenarDatosEtiquetas.Salir_P_Base();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_LineaListado(INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo _mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_DataGridView_Documentos.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_DataGridView_Documentos);
            }

            //idDocumento
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Identificador].Value = _mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Id;

            //Descripcion
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Descripcion].Value = _mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Nombre_SinExtension + _mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Extension;

            //DocumentoTipo
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_DocumentoTipo].Value = _mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.DocumentoTipo;

            //Extension
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Extension].Value = _mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Extension;

            //Tamaño
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Size].Value = _mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Size;

            //Ver
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Boton_Ver].Value = "M";
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Boton_Ver].ToolTipText = "Ver";

            return obj_DataGridViewRow;
        }
        #endregion

        #region Rellenar Listado Etiquetas
        public void Rellenar_Listado_Etiquetas(long _lng_idDocumento)
        {
            try
            {
                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_RellenarListadoEtiquetas != null)
                {
                    while (g_obj_TareaAsincrona_RellenarListadoEtiquetas.IsBusy)
                        System.Windows.Forms.Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas = new BackgroundWorker();
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas.DoWork += new DoWorkEventHandler(TareaAsincrona_RellenarListado_Etiquetas_DoWork);
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_RellenarListado_Etiquetas_ProgressChanged);
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_RellenarListado_Etiquetas_Completed);
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas.WorkerReportsProgress = true;
                }

                //Vaciar el listado
                g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Panel_Degradado_Etiquetas.Controls.Clear();
                g_int_Etiquetas_PosicionY = 5;
                g_int_NumeroLineas_Etiquetas = 0;
                g_lst_ListadoLineas_Etiquetas.Clear();

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

                //(Tarea Asincrona) ##################################################################
                g_obj_TareaAsincrona_RellenarListadoEtiquetas.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(Rellenar_Listado_Etiquetas));
            }
        }
        private void TareaAsincrona_RellenarListado_Etiquetas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<object> lst_Argumentos_Entrada = (List<object>)e.Argument;

                long lng_idDocumento = (long)lst_Argumentos_Entrada[0];

                if (lng_idDocumento > -1)
                {
                    //Buscar  la linea
                    INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo = g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL.Where(m => m.Id == lng_idDocumento).FirstOrDefault();
                    if (mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo != null)
                    {
                        if (mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.CamposRelacionales != null &&
                            mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.CamposRelacionales.Count > 0)
                        {
                            //ListadoCampos
                            List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.ToList();
                            GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = null;
                            foreach (GTD_DocumentosTipos_CamposRelacionales mdl_GTD_DocumentosTipos_CamposRelacionales in mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.CamposRelacionales.Where(m => m.fechaBorrado == null))
                            {
                                //AÑADIR CONTROL
                                List<object> lst_Argumentos = new List<object>();
                                lst_Argumentos.Add(mdl_GTD_DocumentosTipos_CamposRelacionales.idDocumentoTipo_Etiqueta);
                                lst_Argumentos.Add(mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_DocumentosTipos_Etiquetas.codigo);
                                lst_Argumentos.Add(mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_DocumentosTipos_Etiquetas.descripcion);
                                lst_Argumentos.Add(mdl_GTD_Documentos_BusquedaEtiquetas);
                                ((BackgroundWorker)sender).ReportProgress(2, lst_Argumentos);

                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(TareaAsincrona_RellenarListado_Etiquetas_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(TareaAsincrona_RellenarListado_Etiquetas_DoWork));
            }
        }
        private void TareaAsincrona_RellenarListado_Etiquetas_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                List<object> lst_Argumentos = (List<object>)e.UserState;
                Crear_Etiquetas_Linea((long)lst_Argumentos[0],
                                        (string)lst_Argumentos[1],
                                        (string)lst_Argumentos[2],
                                        (GTD_Documentos_BusquedaEtiquetas)lst_Argumentos[3]);


            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_RellenarListado_Etiquetas_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        public void Crear_Etiquetas_Linea(long _lng_idDocumentoTipoEtiqueta, string _str_Codigo, string _str_Descripcion, GTD_Documentos_BusquedaEtiquetas _mdl_GTD_Documentos_BusquedaEtiquetas)
        {
            try
            {
                //Añadir control creado en subproceso en el hilo principal ........................
                if (g_frm_P_ProcesoRellenarDatosEtiquetas.InvokeRequired)
                {
                    g_frm_P_ProcesoRellenarDatosEtiquetas.Invoke((MethodInvoker)delegate
                    {
                        Crear_Etiquetas_Linea(_lng_idDocumentoTipoEtiqueta, _str_Codigo, _str_Descripcion, _mdl_GTD_Documentos_BusquedaEtiquetas);
                    });
                    return;
                }


                g_int_NumeroLineas_Etiquetas += 1;

                //Calcular tamaño del panel ##########################
                int int_AnchopanelPrincipal = (422 * g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Panel_Degradado_Etiquetas.Width) / 428;
                if (g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Panel_Degradado_Etiquetas.Controls != null && g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Panel_Degradado_Etiquetas.Controls.Count > 0 && g_lst_ListadoLineas_Etiquetas.Count > 0)
                {
                    int_AnchopanelPrincipal = g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Panel_Degradado_Etiquetas.Controls.Find("controlusuario_CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas" + g_lst_ListadoLineas_Etiquetas[0], false).FirstOrDefault().Width;
                }


                //Objeto Personalizado ....................................................................................
                int int_posicionRelativa = g_int_Etiquetas_PosicionY + g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Panel_Degradado_Etiquetas.DisplayRectangle.Y;
                CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas controlusuario_CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas = new CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas(g_frm_P_ProcesoRellenarDatosEtiquetas, _lng_idDocumentoTipoEtiqueta, _str_Codigo, _str_Descripcion, _mdl_GTD_Documentos_BusquedaEtiquetas);
                controlusuario_CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas.Name = "controlusuario_CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas" + g_int_NumeroLineas_Etiquetas;
                controlusuario_CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas.Size = new Size(int_AnchopanelPrincipal, 28);
                controlusuario_CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas.Location = new System.Drawing.Point(5, int_posicionRelativa);
                controlusuario_CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left);
                controlusuario_CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas.CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas_ValorActualizado += new System.EventHandler<INTERNO_EventArgs_CuatroValores>(Etiquetas_ValorActualizado_Desde_ControlUsuario);
                //...........................................................................................

                //Añadir al panel Principal
                g_int_Etiquetas_PosicionY += 28 + 5;
                g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Panel_Degradado_Etiquetas.Controls.Add(controlusuario_CTU_P_ProcesoRellenarDatosEtiquetas_Etiquetas);

                g_lst_ListadoLineas_Etiquetas.Add(g_int_NumeroLineas_Etiquetas);

            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(Crear_Etiquetas_Linea));
            }
        }
        private void Etiquetas_ValorActualizado_Desde_ControlUsuario(object sender, INTERNO_EventArgs_CuatroValores _mdl_INTERNO_EventArgs_CuatroValores)
        {
            try
            {
                if (g_lng_IdDocumento_Seleccionado > -1)
                {
                    INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo= g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL.Where(m => m.Id == g_lng_IdDocumento_Seleccionado).FirstOrDefault();
                    if (mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo != null)
                    {
                        GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = null;
                        if (mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas!=null && mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.Count>0)
                        {
                            mdl_GTD_Documentos_BusquedaEtiquetas= mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.Where(m => m.idDocumentoTipoEtiqueta == long.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_1)).FirstOrDefault();
                        }
                        
                        //Almacenar si no lo estuviera ya
                        if (mdl_GTD_Documentos_BusquedaEtiquetas!=null)
                        {
                            //Borrar registro
                            if (_mdl_INTERNO_EventArgs_CuatroValores.AUX_3.Trim().Length == 0)
                            {
                                mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.RemoveAll(m => m.idDocumentoTipoEtiqueta == long.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_1));
                            }
                            //Actualizar valor
                            else
                            {
                                mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas[mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.IndexOf(mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.Where(m => m.idDocumentoTipoEtiqueta != null && m.idDocumentoTipoEtiqueta == long.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_1)).FirstOrDefault())].valor = _mdl_INTERNO_EventArgs_CuatroValores.AUX_3;
                            }
                        }
                        //Añadir
                        else
                        {
                            mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();
                            mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;
                            mdl_GTD_Documentos_BusquedaEtiquetas.idDocumento = mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Id;
                            mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = long.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_1);
                            mdl_GTD_Documentos_BusquedaEtiquetas.valor = _mdl_INTERNO_EventArgs_CuatroValores.AUX_3;
                            mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = bool.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_4);

                            //Añadir al listado
                            if (mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas==null)
                            {
                                mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas = new List<GTD_Documentos_BusquedaEtiquetas>();
                            }
                            mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.Add(mdl_GTD_Documentos_BusquedaEtiquetas);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(Etiquetas_ValorActualizado_Desde_ControlUsuario));
            }
        }

        #endregion

        #region Proceso de Rellenar los Datos de Etiquetas
        private long g_lng_idDocumento_Actualizar=-1;
        public void ProcesoRellenarDatosEtiquetas(long _lng_idDocumento_Actualizar)
        {
            try
            {
                g_lng_idDocumento_Actualizar = _lng_idDocumento_Actualizar;

                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_ProcesoRellenarDatosEtiquetas.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando_BarraProgreso = new PE_Esperando_BarraProgreso();


                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_ProcesoRellenarDatosEtiquetas != null)
                {
                    while (g_obj_TareaAsincrona_ProcesoRellenarDatosEtiquetas.IsBusy)
                        System.Windows.Forms.Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_ProcesoRellenarDatosEtiquetas = new BackgroundWorker();
                    g_obj_TareaAsincrona_ProcesoRellenarDatosEtiquetas.DoWork += new DoWorkEventHandler(TareaAsincrona_ProcesoRellenarDatosEtiquetas_DoWork);
                    g_obj_TareaAsincrona_ProcesoRellenarDatosEtiquetas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_ProcesoRellenarDatosEtiquetas_ProgressChanged);
                    g_obj_TareaAsincrona_ProcesoRellenarDatosEtiquetas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_ProcesoRellenarDatosEtiquetas_Completed);
                    g_obj_TareaAsincrona_ProcesoRellenarDatosEtiquetas.WorkerReportsProgress = true;
                }

                //(Tarea Asincrona) ##################################################################
                g_obj_TareaAsincrona_ProcesoRellenarDatosEtiquetas.RunWorkerAsync();
                //#################################################################################################

                g_frm_PE_Esperando_BarraProgreso.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_ProcesoRellenarDatosEtiquetas.Enabled = true;

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

                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(ProcesoRellenarDatosEtiquetas));
            }
        }
        private void TareaAsincrona_ProcesoRellenarDatosEtiquetas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                if (g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL != null && g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL.Count>0)
                {
                    List<INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo> lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo = g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL;
                    if (g_lng_idDocumento_Actualizar>-1)
                    {
                        lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo = lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Where(m => m.Id == g_lng_idDocumento_Actualizar).ToList();
                    }

                    if (lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo != null && lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Count > 0)
                    {

                        //Total
                        ((BackgroundWorker)sender).ReportProgress(1, lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Count);
                        int int_Contador_Documentos = 0;

                        foreach (INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo in lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo)
                        {
                            //Iniciar transaccion
                            //using (TransactionScope obj_TransactionScope = new TransactionScope(TransactionScopeOption.Required))
                            //{
                                try
                                {
                                    #region Campos Relacionados
                                    List<AUX_EtiquetasCamposRelacionales_Modelo> lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL = new List<AUX_EtiquetasCamposRelacionales_Modelo>();

                                    //Crear Consulta para obtener Valores
                                    string str_Tabla = "";
                                    string str_ServidorBaseDatosTabla_OLD = "";
                                    string str_ServidorBaseDatosTabla = "";

                                    GTD_ConexionBDExterna mdl_GTD_ConexionBDExterna = null;
                                    string str_ClavesPrimarias = "";
                                    long lng_idDocumentoTipo_Etiqueta = -1;
                                    Dictionary<GTD_DocumentosTipos_Etiquetas, AUX_CampoTipo_Modelo> dct_Etiqueta_Campo_CampoRelacionado = new Dictionary<GTD_DocumentosTipos_Etiquetas, AUX_CampoTipo_Modelo>();

                                    bool bol_GraboCamposRelacionados = false;

                                    foreach (GTD_DocumentosTipos_CamposRelacionales mdl_GTD_DocumentosTipos_CamposRelacionales in mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.CamposRelacionales.Where(m => m.fechaBorrado == null).OrderBy(n => n.orden))
                                    {
                                        lng_idDocumentoTipo_Etiqueta = mdl_GTD_DocumentosTipos_CamposRelacionales.idDocumentoTipo_Etiqueta;

                                        if (mdl_GTD_DocumentosTipos_CamposRelacionales.idConexionBDExterna != null)
                                        {
                                            str_ServidorBaseDatosTabla = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.servidor + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.baseDatos + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                        }
                                        else
                                        {
                                            str_ServidorBaseDatosTabla = "ConexionInterna|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                        }

                                        //Si cambio de Tabla
                                        if (str_ServidorBaseDatosTabla_OLD != "" && str_ServidorBaseDatosTabla != str_ServidorBaseDatosTabla_OLD)
                                        {
                                            if (str_ClavesPrimarias.Trim().Length > 0)
                                            {
                                                str_ClavesPrimarias = str_ClavesPrimarias.Substring(0, str_ClavesPrimarias.Length - 4);
                                                AUX_EtiquetasCamposRelacionales_Valores_Modelo mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = null;
                                                //Conexion Externa
                                                if (mdl_GTD_ConexionBDExterna != null)
                                                {
                                                    mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(mdl_GTD_ConexionBDExterna.servidor,
                                                                                                                                                        mdl_GTD_ConexionBDExterna.baseDatos,
                                                                                                                                                        mdl_GTD_ConexionBDExterna.tieneUsuario,
                                                                                                                                                        mdl_GTD_ConexionBDExterna.usuario,
                                                                                                                                                        g_obj_Encriptador.Desencriptar(mdl_GTD_ConexionBDExterna.clave),
                                                                                                                                                        str_Tabla,
                                                                                                                                                        dct_Etiqueta_Campo_CampoRelacionado,
                                                                                                                                                        str_ClavesPrimarias);
                                                }
                                                //Conexion Interna
                                                else
                                                {
                                                    mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(Variables.G_STR_CONEXION_SERVIDOR, Variables.G_STR_CONEXION_BASEDATOS, (Variables.G_STR_CONEXION_USUARIO != null && Variables.G_STR_CONEXION_USUARIO.Trim().Length > 0) ? true : false, Variables.G_STR_CONEXION_USUARIO, Variables.G_STR_CONEXION_CLAVE, str_Tabla, dct_Etiqueta_Campo_CampoRelacionado, str_ClavesPrimarias);
                                                }

                                                if (mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo != null)
                                                {
                                                    //Valores
                                                    List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas;
                                                    if (lst_GTD_Documentos_BusquedaEtiquetas == null)
                                                    {
                                                        lst_GTD_Documentos_BusquedaEtiquetas = new List<GTD_Documentos_BusquedaEtiquetas>();
                                                    }

                                                    long lng_idDocumentoTipo_Etiqueta_AUX = -1;
                                                    string str_Valor = "";

                                                    //Ver que tenga los algun valor
                                                    bool bol_TieneValor = false;
                                                    for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                    {
                                                        str_Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                        if (str_Valor != null && str_Valor.Trim().Length > 0)
                                                        {
                                                            bol_TieneValor = true;
                                                            break;
                                                        }
                                                    }

                                                    if (bol_TieneValor)
                                                    {
                                                        for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                        {
                                                            lng_idDocumentoTipo_Etiqueta_AUX = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                            str_Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                            //INSERTAR O ACTUALIZAR REGISTRO
                                                            GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = lst_GTD_Documentos_BusquedaEtiquetas.Where(M => M.idDocumentoTipoEtiqueta == lng_idDocumentoTipo_Etiqueta_AUX).FirstOrDefault();
                                                            if (mdl_GTD_Documentos_BusquedaEtiquetas != null)
                                                            {
                                                                //valor
                                                                if (str_Valor != null && str_Valor.Trim().Length > 0)
                                                                {
                                                                    mdl_GTD_Documentos_BusquedaEtiquetas.valor = str_Valor;
                                                                }

                                                                if (mdl_GTD_Documentos_BusquedaEtiquetas.id == -1)
                                                                {
                                                                    //Grabar en BD
                                                                    g_obj_GTD_Documentos_BusquedaEtiquetas_Datos.Insertar(mdl_GTD_Documentos_BusquedaEtiquetas);
                                                                }
                                                                else
                                                                {
                                                                    //Grabar en BD
                                                                    g_obj_GTD_Documentos_BusquedaEtiquetas_Datos.Actualizar(mdl_GTD_Documentos_BusquedaEtiquetas);
                                                                }

                                                                bol_GraboCamposRelacionados = true;
                                                            }
                                                            else
                                                            {
                                                                mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();

                                                                //id
                                                                mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;

                                                                //idDocumento
                                                                mdl_GTD_Documentos_BusquedaEtiquetas.idDocumento = mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Id;

                                                                //porPlantilla
                                                                mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = true;

                                                                //valor
                                                                mdl_GTD_Documentos_BusquedaEtiquetas.valor = str_Valor;

                                                                //posicionDocumento_CabeceraPieOtra
                                                                mdl_GTD_Documentos_BusquedaEtiquetas.posicionDocumento_CabeceraPieOtra = 0;

                                                                //idDocumentoTipoEtiqueta
                                                                mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = lng_idDocumentoTipo_Etiqueta_AUX;

                                                                //Grabar en BD
                                                                g_obj_GTD_Documentos_BusquedaEtiquetas_Datos.Insertar(mdl_GTD_Documentos_BusquedaEtiquetas);

                                                                bol_GraboCamposRelacionados = true;
                                                            }
                                                        }
                                                    }

                                                    //Vaciar
                                                    str_ClavesPrimarias = "";
                                                    dct_Etiqueta_Campo_CampoRelacionado.Clear();
                                                    mdl_GTD_ConexionBDExterna = null;
                                                }
                                            }
                                        }

                                        //Clave Primaria
                                        if (mdl_GTD_DocumentosTipos_CamposRelacionales.tipo.ToString() == Variables_GestionDocumental.G_MDL_TIPOCAMPOBASEDATOSPARACONSULTA_CLAVEPRIMARIA.Codigo)
                                        {
                                            if (mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas != null && mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.Count > 0)
                                            {
                                                GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas_CLAVEPRIMARIA = mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas.Where(m => m.idDocumentoTipoEtiqueta == lng_idDocumentoTipo_Etiqueta).FirstOrDefault();
                                                if (mdl_GTD_Documentos_BusquedaEtiquetas_CLAVEPRIMARIA != null)
                                                {
                                                    string str_Valor = mdl_GTD_Documentos_BusquedaEtiquetas_CLAVEPRIMARIA.valor;
                                                    //Ver si tengo que limpiar el valor
                                                    str_Valor = Funciones_GestionDocumental.Limpiar_Valores_Etiquetas(str_Valor);

                                                    //Ver si tengo que quitarEspaciosEnBlanco el valor
                                                    str_Valor = Funciones_GestionDocumental.QuitarEspaciosEnBlanco_Valores_Etiquetas(str_Valor);

                                                    str_ClavesPrimarias += mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo + "='" + str_Valor + "' and ";

                                                    //para grabar tambien la clave, por si es nueva
                                                    dct_Etiqueta_Campo_CampoRelacionado.Add(mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_DocumentosTipos_Etiquetas, new AUX_CampoTipo_Modelo(mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo, mdl_GTD_DocumentosTipos_CamposRelacionales.tipoCampo));
                                                }
                                            }
                                        }
                                        //Consulta
                                        else if (mdl_GTD_DocumentosTipos_CamposRelacionales.tipo.ToString() == Variables_GestionDocumental.G_MDL_TIPOCAMPOBASEDATOSPARACONSULTA_CONSULTA.Codigo)
                                        {
                                            dct_Etiqueta_Campo_CampoRelacionado.Add(mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_DocumentosTipos_Etiquetas, new AUX_CampoTipo_Modelo(mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo, mdl_GTD_DocumentosTipos_CamposRelacionales.tipoCampo));
                                        }

                                        //Almacenar para ver cuando cambia de tabla y se busca en BD ##############################################################
                                        if (mdl_GTD_DocumentosTipos_CamposRelacionales.idConexionBDExterna != null)
                                        {
                                            mdl_GTD_ConexionBDExterna = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna;
                                            str_ServidorBaseDatosTabla_OLD = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.servidor + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.baseDatos + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                        }
                                        else
                                        {
                                            mdl_GTD_ConexionBDExterna = null;
                                            str_ServidorBaseDatosTabla_OLD = "ConexionInterna|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                        }

                                        str_Tabla = mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                    }

                                    #region Si cambio de Tabla
                                    if (str_ServidorBaseDatosTabla_OLD != "")
                                    {
                                        if (str_ClavesPrimarias.Trim().Length > 0)
                                        {
                                            str_ClavesPrimarias = str_ClavesPrimarias.Substring(0, str_ClavesPrimarias.Length - 4);
                                            AUX_EtiquetasCamposRelacionales_Valores_Modelo mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = null;
                                            //Conexion Externa
                                            if (mdl_GTD_ConexionBDExterna != null)
                                            {
                                                mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(mdl_GTD_ConexionBDExterna.servidor,
                                                                                                                                                    mdl_GTD_ConexionBDExterna.baseDatos,
                                                                                                                                                    mdl_GTD_ConexionBDExterna.tieneUsuario,
                                                                                                                                                    mdl_GTD_ConexionBDExterna.usuario,
                                                                                                                                                    g_obj_Encriptador.Desencriptar(mdl_GTD_ConexionBDExterna.clave),
                                                                                                                                                    str_Tabla,
                                                                                                                                                    dct_Etiqueta_Campo_CampoRelacionado,
                                                                                                                                                    str_ClavesPrimarias);
                                            }
                                            //Conexion Interna
                                            else
                                            {
                                                mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(Variables.G_STR_CONEXION_SERVIDOR,
                                                                                                                                                    Variables.G_STR_CONEXION_BASEDATOS,
                                                                                                                                                    (Variables.G_STR_CONEXION_USUARIO != null && Variables.G_STR_CONEXION_USUARIO.Trim().Length > 0) ? true : false,
                                                                                                                                                    Variables.G_STR_CONEXION_USUARIO,
                                                                                                                                                    Variables.G_STR_CONEXION_CLAVE,
                                                                                                                                                    str_Tabla,
                                                                                                                                                    dct_Etiqueta_Campo_CampoRelacionado,
                                                                                                                                                    str_ClavesPrimarias);
                                            }

                                            if (mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo != null)
                                            {
                                                //Valores
                                                List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Etiquetas;
                                                if (lst_GTD_Documentos_BusquedaEtiquetas == null)
                                                {
                                                    lst_GTD_Documentos_BusquedaEtiquetas = new List<GTD_Documentos_BusquedaEtiquetas>();
                                                }

                                                long lng_idDocumentoTipo_Etiqueta_AUX = -1;
                                                string str_Valor = "";

                                                //Ver que tenga los algun valor
                                                bool bol_TieneValor = false;
                                                for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                {
                                                    str_Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                    if (str_Valor!=null && str_Valor.Trim().Length>0)
                                                    {
                                                        bol_TieneValor = true;
                                                        break;
                                                    }
                                                }

                                                if (bol_TieneValor)
                                                {

                                                    for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                    {
                                                        lng_idDocumentoTipo_Etiqueta_AUX = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                        str_Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                        //INSERTAR O ACTUALIZAR REGISTRO
                                                        GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = lst_GTD_Documentos_BusquedaEtiquetas.Where(M => M.idDocumentoTipoEtiqueta == lng_idDocumentoTipo_Etiqueta_AUX).FirstOrDefault();
                                                        if (mdl_GTD_Documentos_BusquedaEtiquetas != null)
                                                        {
                                                            //valor
                                                            if (str_Valor != null && str_Valor.Trim().Length > 0)
                                                            {
                                                                mdl_GTD_Documentos_BusquedaEtiquetas.valor = str_Valor;
                                                            }

                                                            if (mdl_GTD_Documentos_BusquedaEtiquetas.id == -1)
                                                            {
                                                                //Grabar en BD
                                                                g_obj_GTD_Documentos_BusquedaEtiquetas_Datos.Insertar(mdl_GTD_Documentos_BusquedaEtiquetas);
                                                            }
                                                            else
                                                            {
                                                                //Grabar en BD
                                                                g_obj_GTD_Documentos_BusquedaEtiquetas_Datos.Actualizar(mdl_GTD_Documentos_BusquedaEtiquetas);
                                                            }

                                                            bol_GraboCamposRelacionados = true;
                                                        }
                                                        else
                                                        {
                                                            mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();

                                                            //id
                                                            mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;

                                                            //idDocumento
                                                            mdl_GTD_Documentos_BusquedaEtiquetas.idDocumento = mdl_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo.Id;

                                                            //porPlantilla
                                                            mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = true;

                                                            //valor
                                                            mdl_GTD_Documentos_BusquedaEtiquetas.valor = str_Valor;

                                                            //posicionDocumento_CabeceraPieOtra
                                                            mdl_GTD_Documentos_BusquedaEtiquetas.posicionDocumento_CabeceraPieOtra = 0;

                                                            //idDocumentoTipoEtiqueta
                                                            mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = lng_idDocumentoTipo_Etiqueta_AUX;

                                                            //Grabar en BD
                                                            g_obj_GTD_Documentos_BusquedaEtiquetas_Datos.Insertar(mdl_GTD_Documentos_BusquedaEtiquetas);

                                                            bol_GraboCamposRelacionados = true;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    #endregion

                                    //obj_TransactionScope.Complete();
                                    //obj_TransactionScope.Dispose();

                                    //Si fuera un registro solo y se grabo correctamente Borrar del listado y de la memoria
                                    if (g_lng_idDocumento_Actualizar>-1 && bol_GraboCamposRelacionados)
                                    {
                                        //Borrar el DataGridView
                                        DataGridViewRow dgvr_Actualizar = g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_DataGridView_Documentos.Rows
                                        .Cast<DataGridViewRow>()
                                        .Where(r => r.Cells[g_int_PosicionColumna_Identificador].Value.Equals(g_lng_idDocumento_Actualizar)).FirstOrDefault();

                                        if (dgvr_Actualizar != null)//Modificada
                                        {
                                            g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_DataGridView_Documentos.Rows.Remove(dgvr_Actualizar);
                                        }

                                        //Borrar de la Memoria
                                        g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL.RemoveAll(m => m.Id == g_lng_idDocumento_Actualizar);

                                        //Total
                                        g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Label_SinColor_Total.Text = "Total Documentos : " + g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL != null ? g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL.Count.ToString() : "0";
                                    }

                                    #endregion
                                }
                                catch (Control_Errores)
                                {
                                    //obj_TransactionScope.Dispose();
                                }
                                catch (Exception)
                                {
                                    //obj_TransactionScope.Dispose();
                                }
                                finally
                                {
                                    //Liberar transaccion
                                    //obj_TransactionScope.Dispose();
                                }
                            //}

                            //Progreso
                            int_Contador_Documentos += 1;
                            ((BackgroundWorker)sender).ReportProgress(2, int_Contador_Documentos);
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(TareaAsincrona_ProcesoRellenarDatosEtiquetas_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ProcesoRellenarDatosEtiquetas_Controladora) + "/" + nameof(TareaAsincrona_ProcesoRellenarDatosEtiquetas_DoWork));
            }
        }
        private void TareaAsincrona_ProcesoRellenarDatosEtiquetas_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage == 1)
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Total = (int)e.UserState;
                }
                else if (e.ProgressPercentage == 2)
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Actualizar = (int)e.UserState;
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_ProcesoRellenarDatosEtiquetas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando_BarraProgreso != null)
            {
                g_frm_PE_Esperando_BarraProgreso.Close();
                g_frm_PE_Esperando_BarraProgreso = null;
            }
            //Desbloquear el Formulario
            g_frm_P_ProcesoRellenarDatosEtiquetas.Enabled = true;

            if (g_lng_idDocumento_Actualizar == -1)
            {
                CargaInicial();
            }
           
        }
        #endregion


        #region Borrar
        public void Borrar(long _lng_idDocumento)
        {
            try
            {
                //Borrar Documento de BD
                g_obj_GTD_Documentos_Datos.Borrar(_lng_idDocumento);

                g_lng_IdDocumento_Seleccionado = -1;

                //Borrar el DataGridView
                DataGridViewRow dgvr_Actualizar = g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_DataGridView_Documentos.Rows
                .Cast<DataGridViewRow>()
                .Where(r => r.Cells[g_int_PosicionColumna_Identificador].Value.Equals(_lng_idDocumento)).FirstOrDefault();
                if (dgvr_Actualizar != null)//Modificada
                {
                    g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_DataGridView_Documentos.Rows.Remove(dgvr_Actualizar);
                }

                //Borrar de la Memoria
                g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL.RemoveAll(m => m.Id == _lng_idDocumento);

                //Total
                g_frm_P_ProcesoRellenarDatosEtiquetas.Exferia_Label_SinColor_Total.Text = "Total Documentos : " + g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL != null ? g_lst_INTERNO_Documentos_Listado_ProcesoParaRellenarEtiquetasModelo_FINAL.Count.ToString() : "0";

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

    }
}
