using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Compras;
using Exferia_Contabilidad;
using Exferia_Contabilidad._0_Modelos;
using Exferia_Contabilidad._3_Vistas.Listados;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_General._0_Modelos;
using Exferia_Informes._0_Modelos;
using Exferia_Informes._3_Vistas;
using Exferia_Ventas;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading;
using System.Transactions;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_CRM._3_Vistas.Controladoras
{
    public class P_Modelo347Cabecera_Controladora
    {
        #region Variables Gnerales
        private P_Modelo347Cabecera g_frm_P_Modelo347Cabecera;//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

        //variable sacada de Obtener_Ejercicio() para usarlo en otros lugares del codigo
        public List<GEN_EjerciciosActivos_Empresa> g_lst_GEN_EjerciciosActivos_Empresa = new List<GEN_EjerciciosActivos_Empresa>();

        //Modelos necesarios
        public INTERNO_CTA_Modelo347Cabecera_Modelo g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo = null;

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

        #region Acciones Lineas
        //Tarea Asincrona para la Rellenar DataGridView de AlbaranLinea
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas = null;

        //Tarea Asincrona para Borrar AlbaranLinea en base de datos
        public bool g_bol_Borrar_Registro_AccionesLineas_EnBaseDatos_TerminoCorrectamente = true;

        //Listado de AccionesLineas
        public List<INTERNO_CTA_Modelo347Lineas_Modelo> g_lst_INTERNO_CTA_Modelo347Lineas_Modelo = new List<INTERNO_CTA_Modelo347Lineas_Modelo>();

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

        //Para el filtrado del listado de AlbaranLinea
        public List<string> g_lst_ColumnasAMostrar_CRM_AccionesLineas = new List<string>();
        public ABS_Listado_CTA_Modelo347Lineas g_obj_ABS_Listado_CRM_AccionesLineas = new ABS_Listado_CTA_Modelo347Lineas();
        public Dictionary<string, object> g_dct_ListadoFiltros_CRM_AccionesLineas = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_AccionLinea = 0;
        private int g_int_TotalRegistros_AlbaranLinea = 0;

        //Datos de de Cerrado y Volcado
        public string g_str_Estado = Variables.G_STR_ESTADO_MODELO347_ABIERTO;

        #region Tareas Asincronas
        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;

        //Tareea Asincrona de grabar de datos
        public BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        public bool g_bol_GrabarDatos_TerminoCorrectamente = true;

        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;

        //Tarea Asincrona de borrar de datos RemesaLinea
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_AccionesLineas;


        public bool g_bol_CampoCodigo_Numerico = false;
        #endregion

        #endregion

        #region Constructor
        public P_Modelo347Cabecera_Controladora(P_Modelo347Cabecera _frm_P_Acciones)
        {
            g_frm_P_Modelo347Cabecera = _frm_P_Acciones;

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //Modelo
            g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo = null;

            //codigo
            g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo.Text = "";

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_Modelo347Cabecera.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_Modelo347Cabecera.P_Base_TituloPantalla = (g_frm_P_Modelo347Cabecera.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
            }

            //Actualizar el Boton de Seleccion de pantalla ####################################################
            Variables.G_EMS_CONTROL_MENUSUPERIOR.Update_Texto_NombrePantalla(g_frm_P_Modelo347Cabecera.Tag.ToString());
            //#################################################################################################
        }
        #endregion

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

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

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        #endregion

        #region Buscar Codigo Siguiente
        public INTERNO_ValorDevuelto_Modelo Buscar_CodigoSiguiente()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente(nameof(CTA_Modelo347Cabecera),
                                                                                    nameof(CTA_Modelo347Cabecera.codigo),
                                                                                    "",
                                                                                    g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo != null ? g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id : Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.lng_idEmpresa, nameof(CTA_Modelo347Cabecera)),
                                                                                    false,
                                                                                    g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo.Text = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO(g_frm_P_Modelo347Cabecera.Exferia_Label_Codigo.Text);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(Buscar_CodigoSiguiente));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Datos por defecto
        public void Datos_PorDefecto()
        {
            g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha = g_frm_P_Modelo347Cabecera.P_Base_FechaTrabajo.ToString("dd/MM/yyyy");
            g_frm_P_Modelo347Cabecera.Exferia_TextBox_Justificante.Text = "3470000000000";
            g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_FechaDesde.Exferia_FechaSeleccion_Fecha = g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.EjercicioActivo.temporadaFechaInicio.ToString("dd/MM/yyyy");
            g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_FechaHasta.Exferia_FechaSeleccion_Fecha = g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.EjercicioActivo.temporadaFechaFin.ToString("dd/MM/yyyy");
        }
        #endregion Datos por defecto
        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Modelo347Cabecera.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos != null)
                {
                    while (g_obj_TareaAsincrona_CargarDatos.IsBusy)
                        Application.DoEvents();

                    //Vaciar
                    VaciarDatos();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = false;
                }

                //Vaciar
                VaciarDatos();

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Modelo347Cabecera.Enabled = true;
                g_bol_Termino_CargaDatos_Inicial = true;

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

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(RecargarDatos), true);
            }
        }
        private void TareaAsincrona_CargarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                // Cargar Valores
                if (CargarDatos(g_frm_P_Modelo347Cabecera.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear el Formulario
            g_frm_P_Modelo347Cabecera.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_Modelo347Cabecera.Salir_P_Base();
                }
                else
                {
                    Rellenar_DataGrid_ModeloLineas();
                }

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

                g_frm_P_Modelo347Cabecera.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo.Exferia_TextBox_Foco();
            }
        }
        public bool CargarDatos(long _lng_id)
        {
            bool bol_ValorDevuelto = true;
            try
            {
                g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo = Datos_Contabilidad.CTA_Modelo347Cabecera_Obtener_Modelo(_lng_id);

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

                        g_frm_P_Modelo347Cabecera.g_obj_Funciones_Paginador.SetPaginaActual(int_PaginaDelObjeto);
                        // Asignando al paginador la pagina actual.
                        g_frm_P_Modelo347Cabecera.Exferia_Paginador_Acciones.PaginaActual = g_frm_P_Modelo347Cabecera.g_obj_Funciones_Paginador.GetPaginaActual();
                    }
                    //...........................................................................................

                    //codigo
                    g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo.Text = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.codigo;

                    //fecha
                    g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.fecha.ToString("dd/MM/yyyy");
                    
                    //ejercicio
                    g_frm_P_Modelo347Cabecera.Exferia_ComboBox_Ejercicio.SelectedItem = g_frm_P_Modelo347Cabecera
                                                                                        .Exferia_ComboBox_Ejercicio
                                                                                        .Items
                                                                                        .OfType<INTERNO_ComboBox_Modelo>()
                                                                                        .ToList()
                                                                                        .Find(el => el.Identificador.Equals(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ejercicio.ToString()));

                    //fechaDesde
                    g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_FechaDesde.Exferia_FechaSeleccion_Fecha = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.fechaDesde.ToString("dd/MM/yyyy");

                    //fechaHasta
                    g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_FechaHasta.Exferia_FechaSeleccion_Fecha = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.fechaHasta.ToString("dd/MM/yyyy");

                    //DECLARACION
                    g_frm_P_Modelo347Cabecera.Exferia_CheckBox_DeclaracionPrimera.Checked =
                        (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.complementaria == Variables.G_MDL_INTERNO_NO.Codigo || String.IsNullOrEmpty(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.complementaria)) &&
                        (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.sustitutiva == Variables.G_MDL_INTERNO_NO.Codigo || String.IsNullOrEmpty(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.sustitutiva));
                    //complementaria
                    g_frm_P_Modelo347Cabecera.Exferia_RB_DeclaracionComplementaria.Checked = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.complementaria == Variables.G_MDL_INTERNO_SI.Codigo || g_frm_P_Modelo347Cabecera.Exferia_CheckBox_DeclaracionPrimera.Checked;

                    //sustitutiva
                    g_frm_P_Modelo347Cabecera.Exferia_RB_DeclaracionSustitutiva.Checked = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.sustitutiva == Variables.G_MDL_INTERNO_SI.Codigo;

                    ActualizarTipoDeclaracionComSus();

                    //tipoSoporte
                    g_frm_P_Modelo347Cabecera.Exferia_RB_SoporteCD.Checked = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.tipoSoporte == Variables.G_MDL_MODELO347_TIPOSOPORTE_C.Codigo;
                    g_frm_P_Modelo347Cabecera.Exferia_RB_SoporteTT.Checked = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.tipoSoporte == Variables.G_MDL_MODELO347_TIPOSOPORTE_T.Codigo;


                    //telefono
                    g_frm_P_Modelo347Cabecera.Exferia_TextBox_Telefono.Text = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.telefono;

                    //contacto
                    g_frm_P_Modelo347Cabecera.Exferia_TextBox_Contacto.Text = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.contacto;

                    //justificante
                    g_frm_P_Modelo347Cabecera.Exferia_TextBox_Justificante.Text = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.justificante;

                    //justificanteAnterior
                    g_frm_P_Modelo347Cabecera.Exferia_TextBox_JustificanteAnterior.Text = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.justificanteAnterior;

                    //limiteTotalCobros
                    g_frm_P_Modelo347Cabecera.Exferia_TextBox_LimiteCobros.Text = string.Format("{0:0.00}", g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.limiteTotalCobros);

                    //limiteTotalFacturas
                    g_frm_P_Modelo347Cabecera.Exferia_TextBox_LimiteFacturas.Text = string.Format("{0:0.00}", g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.limiteTotalFacturas);

                    //Acciones Lineas
                    g_lst_INTERNO_CTA_Modelo347Lineas_Modelo = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas ?? new List<INTERNO_CTA_Modelo347Lineas_Modelo>();

                    // Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior_ADD = "";
                    if (g_frm_P_Modelo347Cabecera.g_mdl_PRV_OpcionesDetalle != null &&
                        g_frm_P_Modelo347Cabecera.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                        g_frm_P_Modelo347Cabecera.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de Campos
                        string[] arr_Campos = g_frm_P_Modelo347Cabecera.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Split(new Char[] { ',' });
                        string str_ValorAMostrarFinal = "";

                        string[] str_Separador = new string[] { " [" };
                        //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
                        if (g_frm_P_Modelo347Cabecera.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_Modelo347Cabecera.P_Base_TituloPantalla = (g_frm_P_Modelo347Cabecera.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

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

                            // codigo
                            if (str_campo.Equals(nameof(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.codigo)))
                            {
                                str_MenuSuperior_ADD += g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.codigo;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Modelo347Cabecera.P_Base_TituloPantalla += " [" + str_ValorAMostrarFinal + "] -Modificar";
                        }
                    }

                    //Actualizar el Boton de Seleccion de pantalla ####################################################
                    Variables.G_EMS_CONTROL_MENUSUPERIOR.Add_Texto_NombrePantalla_Descripciones(g_frm_P_Modelo347Cabecera.Tag.ToString(), str_MenuSuperior_ADD);
                    //#################################################################################################

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

            return bol_ValorDevuelto;
        }

        #endregion

        public void CargarEjercicios()
        {
            g_lst_GEN_EjerciciosActivos_Empresa = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Listado_Por_Empresa(g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.lng_idEmpresa);

            if ((g_lst_GEN_EjerciciosActivos_Empresa?.Count ?? 0) > 0)
            {
                g_lst_GEN_EjerciciosActivos_Empresa = g_lst_GEN_EjerciciosActivos_Empresa.OrderByDescending(e => int.Parse(e.anioControl)).ToList();
                foreach (GEN_EjerciciosActivos_Empresa mdl_INTERNO_ComboBox_Modelo in g_lst_GEN_EjerciciosActivos_Empresa)
                {
                    INTERNO_ComboBox_Modelo item = new INTERNO_ComboBox_Modelo(mdl_INTERNO_ComboBox_Modelo.anioControl, mdl_INTERNO_ComboBox_Modelo.anioControl, null);

                    g_frm_P_Modelo347Cabecera.Exferia_ComboBox_Ejercicio.Items.Add(item);
                }
                g_frm_P_Modelo347Cabecera.Exferia_ComboBox_Ejercicio.SelectedIndex = 0;
            }
        }

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

                g_frm_P_Modelo347Cabecera.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                g_obj_TareaAsincrona_GrabarDatos = new BackgroundWorker();
                g_obj_TareaAsincrona_GrabarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_GrabarDatos_DoWork);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_GrabarDatos_Completed);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerAsync(actualizarPBase);

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_bol_GrabarDatos_TerminoCorrectamente = false;
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Modelo347Cabecera.Enabled = true;

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

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

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                mdl_ValorDevuelto_Modelo.Objeto_Auxiliar_1 = e.Argument;
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Modelo347Cabecera.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);

                        //Poner el Foco en el objeto que tuvoel problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_Modelo347Cabecera, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    var actualizarPBase = (bool)((INTERNO_ValorDevuelto_Modelo)e.Result).Objeto_Auxiliar_1;
                    // Recargar el Listado
                    if (g_frm_P_Modelo347Cabecera.P_Base_PantallaOrigen != null && actualizarPBase)
                    {
                        g_frm_P_Modelo347Cabecera.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    g_frm_P_Modelo347Cabecera.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }
        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Si el codigo esta vacio y se intenta buscar el ultimo numerico y llego al limite de base de datos
                if (g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo.Text.Trim().Length == 0)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_AUX_1 = Buscar_CodigoSiguiente();

                    if (mdl_INTERNO_ValorDevuelto_Modelo_AUX_1.TodoCorrecto == false)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo_AUX_1.Mensaje;
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo;
                    }
                }

                // El codigo no puede estar Repetido
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Codigo = g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo.Text.Trim();
                    if (g_bol_CampoCodigo_Numerico)
                    {
                        int int_Codigo = int.Parse(str_Codigo);
                        str_Codigo = int_Codigo.ToString();
                    }

                    if (Datos_Generales.Buscar_CodigoRepetido(
                            nameof(CRM_AccionesCabecera),
                            nameof(CRM_AccionesCabecera.codigo),
                            str_Codigo,
                            nameof(CRM_AccionesCabecera.id),
                            (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo != null ? g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id : -1),
                            nameof(CRM_AccionesCabecera.idEmpresa),
                            g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.lng_idEmpresa,
                            true)
                        )
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_Modelo347Cabecera.Exferia_Label_Codigo.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo;
                    }
                }

                // La fecha no puede estar vacia y debe ser correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    ValidarFechaObligatoria(mdl_INTERNO_ValorDevuelto_Modelo, g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_Fecha);
                }
                // La fecha desde no puede estar vacia y debe ser correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    ValidarFechaObligatoria(mdl_INTERNO_ValorDevuelto_Modelo, g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_FechaDesde);
                }
                // La fecha hasta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    ValidarFechaObligatoria(mdl_INTERNO_ValorDevuelto_Modelo, g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_FechaHasta);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(ValidarDatos));

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private void ValidarFechaObligatoria(INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo, Exferia_FechaSeleccion ctrl_fecha)
        {
            int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(ctrl_fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

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

        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                CTA_Modelo347Cabecera mdl_CTA_Modelo347Cabecera = new CTA_Modelo347Cabecera();

                //id
                mdl_CTA_Modelo347Cabecera.id = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo != null ? g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id : -1;

                //idEmpresa
                if ((g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo != null ? g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.idEmpresa : -1) != -1)
                {
                    mdl_CTA_Modelo347Cabecera.idEmpresa = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.idEmpresa;
                }
                else
                {
                    //Buscar el idEmpresa que Corresponda
                    mdl_CTA_Modelo347Cabecera.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.lng_idEmpresa, nameof(CRM_Acciones));
                }
                mdl_CTA_Modelo347Cabecera.idEjercicio = g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.EjercicioActivo.id;

                //codigo
                mdl_CTA_Modelo347Cabecera.codigo = g_frm_P_Modelo347Cabecera.Exferia_TextBox_Codigo.Text.Trim();

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

                //complementaria
                mdl_CTA_Modelo347Cabecera.complementaria = !g_frm_P_Modelo347Cabecera.Exferia_CheckBox_DeclaracionPrimera.Checked && g_frm_P_Modelo347Cabecera.Exferia_RB_DeclaracionComplementaria.Checked ? Variables.G_MDL_INTERNO_SI.Codigo : Variables.G_MDL_INTERNO_NO.Codigo;

                //sustitutiva
                mdl_CTA_Modelo347Cabecera.sustitutiva = !g_frm_P_Modelo347Cabecera.Exferia_CheckBox_DeclaracionPrimera.Checked && g_frm_P_Modelo347Cabecera.Exferia_RB_DeclaracionSustitutiva.Checked ? Variables.G_MDL_INTERNO_SI.Codigo : Variables.G_MDL_INTERNO_NO.Codigo;

                //tipoSoporte
                mdl_CTA_Modelo347Cabecera.tipoSoporte = g_frm_P_Modelo347Cabecera.Exferia_RB_SoporteCD.Checked ? Variables.G_MDL_MODELO347_TIPOSOPORTE_C.Codigo : Variables.G_MDL_MODELO347_TIPOSOPORTE_T.Codigo;

                //telefono
                mdl_CTA_Modelo347Cabecera.telefono = g_frm_P_Modelo347Cabecera.Exferia_TextBox_Telefono.Text.Trim();

                //contacto
                mdl_CTA_Modelo347Cabecera.contacto = g_frm_P_Modelo347Cabecera.Exferia_TextBox_Contacto.Text.Trim();

                //justificante
                mdl_CTA_Modelo347Cabecera.justificante = g_frm_P_Modelo347Cabecera.Exferia_TextBox_Justificante.Text.Trim();

                //justificanteAnterior
                mdl_CTA_Modelo347Cabecera.justificanteAnterior = g_frm_P_Modelo347Cabecera.Exferia_TextBox_JustificanteAnterior.Text.Trim();

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

                //fechaDesde
                mdl_CTA_Modelo347Cabecera.fechaDesde = DateTime.ParseExact(g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_FechaDesde.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                //fechaHasta
                mdl_CTA_Modelo347Cabecera.fechaHasta = DateTime.ParseExact(g_frm_P_Modelo347Cabecera.Exferia_FechaSeleccion_FechaHasta.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                //limiteTotalCobros
                mdl_CTA_Modelo347Cabecera.limiteTotalCobros = !String.IsNullOrEmpty(g_frm_P_Modelo347Cabecera.Exferia_TextBox_LimiteCobros.Text) ? decimal.Parse(g_frm_P_Modelo347Cabecera.Exferia_TextBox_LimiteCobros.Text) : 0;

                //limiteTotalFacturas
                mdl_CTA_Modelo347Cabecera.limiteTotalFacturas = !String.IsNullOrEmpty(g_frm_P_Modelo347Cabecera.Exferia_TextBox_LimiteFacturas.Text) ? decimal.Parse(g_frm_P_Modelo347Cabecera.Exferia_TextBox_LimiteFacturas.Text) : 0;

                //ejercicio
                mdl_CTA_Modelo347Cabecera.ejercicio = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_Modelo347Cabecera.Exferia_ComboBox_Ejercicio.SelectedItem).Identificador);

                //estado
                mdl_CTA_Modelo347Cabecera.estado = g_str_Estado;

                mdl_CTA_Modelo347Cabecera.numeroOperaciones = 0;
                mdl_CTA_Modelo347Cabecera.importeOperaciones = 0;
                mdl_CTA_Modelo347Cabecera.numeroInmuebles = 0;
                mdl_CTA_Modelo347Cabecera.importeInmuebles = 0;

                // Se graba el modelo ya relleno.
                mdl_ValorDevuelto_Modelo = Datos_Contabilidad.CTA_Modelo347Cabecera_Grabar(mdl_CTA_Modelo347Cabecera);

                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    //Obtener el modelo que se acaba de grabar
                    g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo = Datos_Contabilidad.CTA_Modelo347Cabecera_Obtener_Modelo(mdl_ValorDevuelto_Modelo.Id);
                    g_frm_P_Modelo347Cabecera.P_Base_id = mdl_ValorDevuelto_Modelo.Id;
                }

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

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Datos
        public void BorrarDatos()
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Modelo347Cabecera.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    g_obj_TareaAsincrona_BorrarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Completed);
                    g_obj_TareaAsincrona_BorrarDatos.RunWorkerAsync();

                    g_frm_PE_Esperando.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                g_frm_P_Modelo347Cabecera.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(BorrarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                //Borrar
                mdl_ValorDevuelto_Modelo = BorrarDatos_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Modelo347Cabecera.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    // Devolver al Listado el Row Borrar
                    if (g_frm_P_Modelo347Cabecera.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Modelo347Cabecera.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Modelo347Cabecera.P_Base_F3Origen != null)
                    {
                        g_frm_P_Modelo347Cabecera.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    g_frm_P_Modelo347Cabecera.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_Modelo347Cabecera.Salir_P_Base();

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

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_INTERNO_ValorDevuelto_Modelo = Datos_Contabilidad.CTA_Modelo347Cabecera_Borrar(new List<long>() { g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo?.id ?? -1 }); //CRM_AccionesCabecera_Datos.Borrar(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo != null ? g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id : -1);
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Rellenar DataGrid ModeloLineas
        public void Rellenar_DataGrid_ModeloLineas()
        {
            try
            {

                if (g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas != null)
                {
                    g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas.CancelAsync();
                    while (g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_AccionesLineas_DoWork);
                    g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_AccionesLineas_ProgressChanged);
                    g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_AccionesLineas_Completed);
                    g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas.WorkerSupportsCancellation = true;
                }


                //Vaciar el Listado
                g_frm_P_Modelo347Cabecera.Exferia_DataGridView_Lineas.Rows.Clear();
                g_int_TotalRegistrosInsertados_AccionLinea = 0;
                g_int_TotalRegistros_AlbaranLinea = 0;
                g_frm_P_Modelo347Cabecera.Exferia_BarraProgreso_AccionesLineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_AlbaranLinea;
                g_frm_P_Modelo347Cabecera.Exferia_BarraProgreso_AccionesLineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_AccionLinea;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_AccionesLineas.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(Rellenar_DataGrid_ModeloLineas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_AccionesLineas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CTA_Modelo347Lineas_Modelo> lst_INTERNO_CTA_Modelo347Lineas_Modelo_Filtradas = Filtrar_Modelo347Lineas();

                if (lst_INTERNO_CTA_Modelo347Lineas_Modelo_Filtradas != null && lst_INTERNO_CTA_Modelo347Lineas_Modelo_Filtradas.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_AlbaranLinea = lst_INTERNO_CTA_Modelo347Lineas_Modelo_Filtradas.Count;

                    //Recorrer campos Long_Text para saber si lo pongo tipo text o tipo long
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_AccionesLineas_Columnas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_CTA_Modelo347Lineas_Modelo_Filtradas.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_obj_ABS_Listado_CRM_AccionesLineas.LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

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

                        //Progreso
                        g_int_TotalRegistrosInsertados_AccionLinea += 1;


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

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

                //Barra de Progreso
                g_frm_P_Modelo347Cabecera.Exferia_BarraProgreso_AccionesLineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_AlbaranLinea;
                g_frm_P_Modelo347Cabecera.Exferia_BarraProgreso_AccionesLineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_AccionLinea;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_AccionesLineas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Modelo347Cabecera.Ordenar_DataGridView_AlbaranLinea();
            }
        }
        public DataGridViewRow Transformar_Modelo_A_Row_AccionLinea(INTERNO_CTA_Modelo347Lineas_Modelo _mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

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

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_AccionesLineas_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                {
                    string str_Valor = (string)_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo, null);

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

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CTA_Modelo347Lineas_Modelo> Filtrar_Modelo347Lineas()
        {
            //Filtros Avanzados
            if (g_lst_INTERNO_CTA_Modelo347Lineas_Modelo != null)
            {
                if (g_dct_ListadoFiltros_CRM_AccionesLineas != null && g_dct_ListadoFiltros_CRM_AccionesLineas.Count > 0)
                {
                    return g_lst_INTERNO_CTA_Modelo347Lineas_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CTA_Modelo347Lineas_Modelo>(g_dct_ListadoFiltros_CRM_AccionesLineas, g_obj_ABS_Listado_CRM_AccionesLineas)).ToList();
                }
                else
                {
                    return g_lst_INTERNO_CTA_Modelo347Lineas_Modelo.AsQueryable().ToList();
                }
            }
            else
            {
                return null;
            }
        }
        #endregion  Rellenar DataGrid ModeloLineas

        #region Borrar Datos AccionesLineas Click
        public void BorrarDatos_CTA_Modelo347Lineas(List<long> _lst_ids)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Modelo347Cabecera.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_ids);

                    g_obj_TareaAsincrona_BorrarDatos_AccionesLineas = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_AccionesLineas.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_AccionesLineas_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_AccionesLineas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_AccionesLineas_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_AccionesLineas.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_Modelo347Cabecera.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(BorrarDatos_CTA_Modelo347Lineas));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_AccionesLineas_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_ids = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = BorrarDatos_Final_AccionesLineas(lst_ids);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_ids;
                        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_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_AccionesLineas_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_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_AccionesLineas_DoWork));

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                finally
                {
                    e.Result = mdl_ValorDevuelto_Modelo;
                }
            }
        }
        private void TareaAsincrona_BorrarDatos_AccionesLineas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Modelo347Cabecera.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
                {
                    g_frm_P_Modelo347Cabecera.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    ActualizaRegistroListadoPrincipal();
                    g_frm_P_Modelo347Cabecera.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_AccionesLineas_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final_AccionesLineas(List<long> _lst_ids)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                mdl_ValorDevuelto_Modelo = Datos_Contabilidad.CTA_Modelo347Lineas_Borrar(_lst_ids);

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

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion Borrar Datos AccionesLineas Click

        #region Acciones Registros

        public void AccionesLineas_Actualizar_Registro(List<long> _lng_idsAccionLinea, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Se da por hecho que solo se puede modificar un registro a la vez
                long _lng_idAccionLinea = _lng_idsAccionLinea.FirstOrDefault();
                //Buscar el Registro en Base de datos
                INTERNO_CTA_Modelo347Lineas_Modelo mdl_INTERNO_CTA_Modelo347Lineas_Modelo = Datos_Contabilidad.CTA_Modelo347Lineas_Obtener_Modelo(_lng_idAccionLinea);

                if (mdl_INTERNO_CTA_Modelo347Lineas_Modelo != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if ((g_lst_INTERNO_CTA_Modelo347Lineas_Modelo?.Count ?? 0) > 0)
                    {
                        if (g_lst_INTERNO_CTA_Modelo347Lineas_Modelo.Any(m => m.id == mdl_INTERNO_CTA_Modelo347Lineas_Modelo.id))
                        {
                            g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas =
                                g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo
                                    .ModeloLineas
                                    .Select(e => e.id != mdl_INTERNO_CTA_Modelo347Lineas_Modelo.id ? e : mdl_INTERNO_CTA_Modelo347Lineas_Modelo)
                                    .ToList();
                        }
                        else
                        {
                            g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas.Add(mdl_INTERNO_CTA_Modelo347Lineas_Modelo);
                        }
                    }
                    else
                    {
                        if (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas == null)
                        {
                            g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas = new List<INTERNO_CTA_Modelo347Lineas_Modelo>();
                        }
                        g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas.Add(mdl_INTERNO_CTA_Modelo347Lineas_Modelo);
                    }

                    g_lst_INTERNO_CTA_Modelo347Lineas_Modelo = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas ?? new List<INTERNO_CTA_Modelo347Lineas_Modelo>();

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

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_AccionLinea(mdl_INTERNO_CTA_Modelo347Lineas_Modelo, row);

                            //Ordenar Listado
                            g_frm_P_Modelo347Cabecera.RemesaLinea_Ordenar_DataGridView();
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_Modelo347Cabecera.Exferia_DataGridView_Lineas.Rows.Add(Transformar_Modelo_A_Row_AccionLinea(mdl_INTERNO_CTA_Modelo347Lineas_Modelo, null));

                        //Ordenar Listado
                        g_frm_P_Modelo347Cabecera.RemesaLinea_Ordenar_DataGridView();
                    }

                    ActualizaRegistroListadoPrincipal();
                }
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(AccionesLineas_Actualizar_Registro));
            }

        }
        public void Modelo347Linea_Borrar_Registro(List<long> _lst_idsModeloLineas)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if ((g_lst_INTERNO_CTA_Modelo347Lineas_Modelo?.Count ?? 0) > 0)
                {
                    List<INTERNO_CTA_Modelo347Lineas_Modelo> lst_INTERNO_CTA_Modelo347Lineas_Modelo_BUSQUEDA = g_lst_INTERNO_CTA_Modelo347Lineas_Modelo.Where(m => _lst_idsModeloLineas.Contains(m.id)).ToList();
                    if (lst_INTERNO_CTA_Modelo347Lineas_Modelo_BUSQUEDA != null && lst_INTERNO_CTA_Modelo347Lineas_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_CTA_Modelo347Lineas_Modelo mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo in lst_INTERNO_CTA_Modelo347Lineas_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_CTA_Modelo347Lineas_Modelo.Remove(mdl_INTERNO_CRM_AccionesLineas_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Modelo347Cabecera.Exferia_DataGridView_Lineas.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idsModeloLineas.Contains(long.Parse(r.Cells[nameof(INTERNO_CTA_Modelo347Lineas_Modelo.id)].Value.ToString()))).ToList();

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

                //Restar Cantidad de Lineas Borradas
                g_frm_P_Modelo347Cabecera.Exferia_BarraProgreso_AccionesLineas.Exferia_BarraProgreso_Total -= _lst_idsModeloLineas.Count();
                g_frm_P_Modelo347Cabecera.Exferia_BarraProgreso_AccionesLineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_AccionLinea - _lst_idsModeloLineas.Count();

                g_frm_P_Modelo347Cabecera.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(Modelo347Linea_Borrar_Registro));
            }

        }
        #endregion Acciones registros

        #region Cerrar Documento
        public void Cerrar_Documento()
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_CERRANDO_DOCUMENTO());

                BackgroundWorker obj_TareaAsincrona_Cerrar_Documento = new BackgroundWorker();

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

                //Mostrar Pantalla de Espera
                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(Cerrar_Documento));
            }
        }

        private void TareaAsincrona_Cerrar_Documento_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_ValorDevuelto_Modelo.Mensaje = "";
            try
            {
                Datos_Generales.Cambiar_Estado_Registro(new List<long> { g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id }, Variables.G_STR_OPCION_CTA_MODELO347CABECERA, Variables.G_STR_ESTADO_MODELO347_CERRADO);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_Cerrar_Documento_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Cerrar_Documento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

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

            //Termino todo Correctamente
            if (mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.TodoCorrecto)
            {
                Mostrar_CerradoAbierto();
                ActualizaRegistroListadoPrincipal();
            }
            //Ocurrio un Error
            else
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.Mensaje);
            }
        }
        #endregion

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

                BackgroundWorker obj_TareaAsincrona_Abrir_Documento = new BackgroundWorker();

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

                //Mostrar Pantalla de Espera
                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(Abrir_Documento));
            }
        }

        private void TareaAsincrona_Abrir_Documento_DoWork(object sender, DoWorkEventArgs e)
        {

            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_ValorDevuelto_Modelo.Mensaje = "";
            try
            {
                Datos_Generales.Cambiar_Estado_Registro(new List<long> { g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id }, Variables.G_STR_OPCION_CTA_MODELO347CABECERA, Variables.G_STR_ESTADO_MODELO347_ABIERTO);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(Cerrar_Documento));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Abrir_Documento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

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

            //Termino todo Correctamente
            if (mdl_INTERNO_ValorDevuelto_Modelo_ABRIR_TERMINO.TodoCorrecto)
            {
                Mostrar_CerradoAbierto();
                ActualizaRegistroListadoPrincipal();
            }
            //Ocurrio un Error
            else
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_ABRIR_TERMINO.Mensaje);
            }
        }

        private void ActualizaRegistroListadoPrincipal()
        {
            g_frm_P_Modelo347Cabecera.P_Base_PantallaOrigen?.P_Base_ActualizarRegistro(new List<long>() { g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id }, G_ENUM_TIPOACCION.INT_MODIFICAR);
        }
        #endregion

        public void Mostrar_CerradoAbierto()
        {
            //Por Defecto
            g_str_Estado = Variables.G_STR_ESTADO_MODELO347_ABIERTO;

            //CERRADO O ABIERTO ##############################################################################################################
            //Buscar si esta Cerrado
            if (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo != null)
            {
                g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo = Datos_Contabilidad.CTA_Modelo347Cabecera_Obtener_Modelo(g_frm_P_Modelo347Cabecera.P_Base_id);
            }

            //Buscar el Estado de la Cabecera
            if (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo != null)
            {
                g_str_Estado = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.estado;

                //Si esta Cerrado Bloqueo para que no deje hacer nada
                if (g_str_Estado.Equals(Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO))
                {
                    //Cambiar Imagen del Boton de Cerrar
                    g_frm_P_Modelo347Cabecera.Exferia_Button_CerrarAbrir.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_CERRADO;
                    Imagenes.Asignar_Imagen(g_frm_P_Modelo347Cabecera.Exferia_Button_CerrarAbrir);
                    g_frm_P_Modelo347Cabecera.Exferia_Button_CerrarAbrir.Tag = "1";

                    //Bloqueo los Controles
                    SoloLectura.Empezar(g_frm_P_Modelo347Cabecera, true);
                }
                //Abierto
                else
                {
                    //Cambiar Imagen del Boton de Abrir
                    g_frm_P_Modelo347Cabecera.Exferia_Button_CerrarAbrir.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_ABIERTO;
                    Imagenes.Asignar_Imagen(g_frm_P_Modelo347Cabecera.Exferia_Button_CerrarAbrir);
                    g_frm_P_Modelo347Cabecera.Exferia_Button_CerrarAbrir.Tag = "0";

                    //Desbloqueo los Controles
                    SoloLectura.Empezar(g_frm_P_Modelo347Cabecera, false);
                }
            }
        }

        #region Proceso Generar Lineas
        public void ProcesoGenerarLineas()
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GENERANDODATOS());

                BackgroundWorker obj_TareaAsincrona_Cerrar_Documento = new BackgroundWorker();

                obj_TareaAsincrona_Cerrar_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_ProgesoGenerarLineas_DoWork);
                obj_TareaAsincrona_Cerrar_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_ProgesoGenerarLineas_Completed);
                obj_TareaAsincrona_Cerrar_Documento.RunWorkerAsync();

                //Mostrar Pantalla de Espera
                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(ProcesoGenerarLineas));
            }
        }

        private void TareaAsincrona_ProgesoGenerarLineas_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_ValorDevuelto_Modelo.Mensaje = "";
            try
            {
                #region Obtencion
                List<GEN_EjerciciosActivos_Empresa> lst_ejerciciosActivos = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Listado_Por_Empresa(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.idEmpresa);
                List<INTERNO_ResultadoDeclaracion> lst_ResultadoDeclaracion_Ventas = Datos_Ventas.VTA_FacturaCabecera_ObtenerDeclaracionClientes(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.fechaDesde, g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.fechaHasta);
                List<INTERNO_ResultadoDeclaracion> lst_ResultadoDeclaracion_Compras = Datos_Compras.COM_FacturaCabecera_ObtenerDeclaracionProveedores(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.fechaDesde, g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.fechaHasta);
                List<INTERNO_ResultadoDeclaracion> lst_ResultadoDeclaracion_Cobros = Datos_Ventas.VTA_Cobros_ObtenerDeclaracionClientes(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.fechaDesde, g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.fechaHasta);
                #endregion Obtencion

                #region Procesado
                Dictionary<string, List<INTERNO_ResultadoDeclaracion>> dic_ComprasPorCif = ObtenerDiccionarioAgrupadoPorCIF(lst_ResultadoDeclaracion_Compras);
                Dictionary<string, List<INTERNO_ResultadoDeclaracion>> dic_VentasPorCif = ObtenerDiccionarioAgrupadoPorCIF(lst_ResultadoDeclaracion_Ventas);
                Dictionary<string, List<INTERNO_ResultadoDeclaracion>> dic_CobrosPorCif = ObtenerDiccionarioAgrupadoPorCIF(lst_ResultadoDeclaracion_Cobros);

                List<CTA_Modelo347Lineas> mdl_ComprasLineas = dic_ComprasPorCif
                    ?.Keys
                    .SelectMany(key => GenerarModelo347Linea(dic_ComprasPorCif[key], Variables.G_STR_CLAVE_MODELO347_COMPRAS.Codigo, lst_ejerciciosActivos, false))
                    .Where(el => el.importeOperaciones >= (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.limiteTotalFacturas ?? 0))
                    .ToList() ?? new List<CTA_Modelo347Lineas>();

                List<CTA_Modelo347Lineas> mdl_VentasLineas = dic_VentasPorCif
                   ?.Keys
                   .SelectMany(key => GenerarModelo347Linea(dic_VentasPorCif[key], Variables.G_STR_CLAVE_MODELO347_VENTAS.Codigo, lst_ejerciciosActivos, false))
                   .Where(el => el.importeOperaciones >= (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.limiteTotalFacturas ?? 0))
                   .ToList() ?? new List<CTA_Modelo347Lineas>();

                List<CTA_Modelo347Lineas> mdl_CobrosLineas = dic_CobrosPorCif
                   ?.Keys
                   .SelectMany(key => GenerarModelo347Linea(dic_CobrosPorCif[key], Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo, lst_ejerciciosActivos, true))
                   .Where(el => el.importeCobroMetalico >= (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.limiteTotalCobros ?? 0))
                   .ToList() ?? new List<CTA_Modelo347Lineas>();

                var lst_ModeloLineas = new List<CTA_Modelo347Lineas>();
                lst_ModeloLineas.AddRange(mdl_ComprasLineas);
                lst_ModeloLineas.AddRange(mdl_VentasLineas);
                lst_ModeloLineas.AddRange(mdl_CobrosLineas);

                long ultimoCodigo = (g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo?.ModeloLineas?.Count ?? 0) > 0 ? g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas.Max(mdl => long.Parse(mdl.codigo)) : 0;

                lst_ModeloLineas.ForEach(mdl => mdl.codigo = (++ultimoCodigo).ToString());
                #endregion Procesado

                #region Guardado
                //foreach (CTA_Modelo347Lineas mdl_ModeloLineas in lst_ModeloLineas)
                //{
                //    var resultadoGrabar = Datos_Contabilidad.CTA_Modelo347Lineas_Grabar(mdl_ModeloLineas);
                //    if (!resultadoGrabar.TodoCorrecto)
                //    {
                //        mdl_ValorDevuelto_Modelo = resultadoGrabar;
                //        break;
                //    }
                //}
                var resultadoGrabar = Datos_Contabilidad.CTA_Modelo347Lineas_Grabar(lst_ModeloLineas);
                if (!resultadoGrabar.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo = resultadoGrabar;
                }
                #endregion Guardado

                #region Actualizar
                //Actualizo el listado
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas = Datos_Contabilidad.CTA_Modelo347Lineas_Obtener_Registros_Para_Listado_Por_Modelo347(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id);


                    g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas.ForEach(linea =>
                    {
                        if (!g_lst_INTERNO_CTA_Modelo347Lineas_Modelo.Any(mdl_linea => mdl_linea.id == linea.id))
                        {
                            g_frm_P_Modelo347Cabecera.Exferia_DataGridView_Lineas.Rows.Add(Transformar_Modelo_A_Row_AccionLinea(linea, null));
                        }
                    });

                    g_lst_INTERNO_CTA_Modelo347Lineas_Modelo = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas ?? new List<INTERNO_CTA_Modelo347Lineas_Modelo>();
                }

                ActualizarOperaciones();
                #endregion
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_ProgesoGenerarLineas_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }

        public void ActualizarOperaciones()
        {
            var _numeroOperaciones = g_lst_INTERNO_CTA_Modelo347Lineas_Modelo?.Count ?? 0;
            var _importeOperaciones = _numeroOperaciones != 0 ? g_lst_INTERNO_CTA_Modelo347Lineas_Modelo
                .Select(elem => elem.importeOperaciones)
                .Aggregate((acc, current) => acc += current) : 0;

            var _inmuebles = g_lst_INTERNO_CTA_Modelo347Lineas_Modelo?
                .Where(e => e.arrendamientoLocal.Equals(Variables.G_MDL_MODELO347_VALOR_X.Codigo))
                .ToList();
            var _numeroInmuebles = _inmuebles?.Count ?? 0;
            var _importeInmuebles = _numeroInmuebles != 0 ? _inmuebles
               .Select(elem => elem.importeOperaciones)
               .Aggregate((acc, current) => acc += current) : 0;
            Datos_Contabilidad.CTA_Modelo347Cabecera_ActualizarOperacionesCabecera(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id, _importeOperaciones, _numeroOperaciones, _importeInmuebles, _numeroInmuebles);
        }

        private Dictionary<string, List<INTERNO_ResultadoDeclaracion>> ObtenerDiccionarioAgrupadoPorCIF(List<INTERNO_ResultadoDeclaracion> lst_Valores)
        {
            return lst_Valores?.Aggregate(new Dictionary<string, List<INTERNO_ResultadoDeclaracion>>(),
            (acc, current) =>
            {
                if (!acc.ContainsKey(current.cif))
                {
                    acc.Add(current.cif, new List<INTERNO_ResultadoDeclaracion> { current });
                }
                else
                {
                    acc[current.cif].Add(current);
                }
                return acc;
            });
        }
        private List<CTA_Modelo347Lineas> GenerarModelo347Linea(List<INTERNO_ResultadoDeclaracion> lst_ResultadoDeclaraciones, string claveOperacion, List<GEN_EjerciciosActivos_Empresa> lst_ejerciciosActivos, bool esCobro)
        {
            if (lst_ResultadoDeclaraciones[0].cif.Equals("B76726645"))
            {
                var a = 1;
            }
            var lst_result = new List<CTA_Modelo347Lineas>();
            lst_ejerciciosActivos.ForEach(_mdlEjercicio =>
            {
                var lst_none = lst_ResultadoDeclaraciones.Where(_mdl =>
                {
                    _mdl.Criterio = INTERNO_Criterio.None;
                    return !_mdl.operacionCriterioCaja && !_mdl.bienesInversion && !_mdl.facturaArrendamiento;
                }).ToList();
                GenerarLineas(lst_none, claveOperacion, _mdlEjercicio, lst_result, esCobro);
                if (!esCobro)
                {
                    //Filtro por criterioCaja
                    var lst_criterioCaja = lst_ResultadoDeclaraciones
                        .Where(_mdl =>
                        {
                            _mdl.Criterio = INTERNO_Criterio.OperacionCriterioCaja;
                            return _mdl.operacionCriterioCaja;
                        })
                        .ToList();
                    GenerarLineas(lst_criterioCaja, claveOperacion, _mdlEjercicio, lst_result, esCobro);

                    //Filtro por bienesInversion
                    var lst_bienesInversion = lst_ResultadoDeclaraciones
                        .Where(_mdl =>
                        {
                            _mdl.Criterio = INTERNO_Criterio.InversionSujetoPasivo;
                            return _mdl.bienesInversion;
                        })
                        .ToList();
                    GenerarLineas(lst_bienesInversion, claveOperacion, _mdlEjercicio, lst_result, esCobro);

                    //Filtro por facturaArrendamiento
                    var lst_facturaArrendamiento = lst_ResultadoDeclaraciones
                        .Where(_mdl =>
                        {
                            _mdl.Criterio = INTERNO_Criterio.ArrendamientoLocal;
                            return _mdl.facturaArrendamiento;
                        })
                        .ToList();
                    GenerarLineas(lst_facturaArrendamiento, claveOperacion, _mdlEjercicio, lst_result, esCobro);
                }
            });
            return lst_result;
        }

        private void GenerarLineas(List<INTERNO_ResultadoDeclaracion> mdl_ResultadoDeclaracions, string claveOperacion, GEN_EjerciciosActivos_Empresa _mdlEjercicio, List<CTA_Modelo347Lineas> lst_result, bool esCobro)
        {
            INTERNO_ResultadoDeclaracion mdl_primero = mdl_ResultadoDeclaracions?.FirstOrDefault();
            // operacionCriterioCaja solo hay en compras
            List<INTERNO_ResultadoDeclaracion> lst_filtroPorEjercicio = mdl_ResultadoDeclaracions.Where(_mdl => _mdl.fecha >= _mdlEjercicio.temporadaFechaInicio && _mdl.fecha <= _mdlEjercicio.temporadaFechaFin).ToList();
            if (lst_filtroPorEjercicio.Count != 0)
            {
                var trimestres = new
                {
                    InicioT1 = new DateTime(int.Parse(_mdlEjercicio.anioControl), 1, 1),
                    FinT1 = new DateTime(int.Parse(_mdlEjercicio.anioControl), 4, 1).AddSeconds(-1),
                    InicioT2 = new DateTime(int.Parse(_mdlEjercicio.anioControl), 4, 1),
                    FinT2 = new DateTime(int.Parse(_mdlEjercicio.anioControl), 7, 1).AddSeconds(-1),
                    InicioT3 = new DateTime(int.Parse(_mdlEjercicio.anioControl), 7, 1),
                    FinT3 = new DateTime(int.Parse(_mdlEjercicio.anioControl), 10, 1).AddSeconds(-1),
                    InicioT4 = new DateTime(int.Parse(_mdlEjercicio.anioControl), 10, 1),
                    FinT4 = new DateTime(int.Parse(_mdlEjercicio.anioControl) + 1, 1, 1).AddSeconds(-1),
                };

                decimal importeTrimestre1 = SumarEntreFechas(lst_filtroPorEjercicio, trimestres.InicioT1, trimestres.FinT1);
                decimal importeTrimestre2 = SumarEntreFechas(lst_filtroPorEjercicio, trimestres.InicioT2, trimestres.FinT2);
                decimal importeTrimestre3 = SumarEntreFechas(lst_filtroPorEjercicio, trimestres.InicioT3, trimestres.FinT3);
                decimal importeTrimestre4 = SumarEntreFechas(lst_filtroPorEjercicio, trimestres.InicioT4, trimestres.FinT4);

                decimal sumaTotalFacturas = lst_filtroPorEjercicio.Sum(elem => elem.totalFinal);
                var _mdl_Linea = new CTA_Modelo347Lineas
                {
                    idModelo347Cabecera = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.id,
                    idCliente = mdl_primero.idCliente,
                    idProveedor = mdl_primero.idProveedor,
                    nifDeclarado = mdl_primero.cif,
                    //ALGO = $"{mdl_primero.cif}{claveOperacion}{_mdlEjercicio.anioControl}",
                    codigoProvincia = mdl_primero.codigoProvincia,
                    codigoPais = mdl_primero.codigoPais,
                    claveOperacion = claveOperacion,
                    ejercicioCobro = _mdlEjercicio.anioControl,
                    importeCriterioCaja = mdl_primero.Criterio == INTERNO_Criterio.OperacionCriterioCaja ? sumaTotalFacturas : 0,
                    importeOperaciones = !esCobro ? sumaTotalFacturas : 0,
                    importeCobroMetalico = esCobro ? sumaTotalFacturas : 0,
                    importeTrimestre1 = !claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo) ? importeTrimestre1 : 0,
                    importeTrimestre2 = !claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo) ? importeTrimestre2 : 0,
                    importeTrimestre3 = !claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo) ? importeTrimestre3 : 0,
                    importeTrimestre4 = !claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo) ? importeTrimestre4 : 0,
                    tipoHoja = Variables.G_MDL_TIPOHOJA_D.Codigo,
                    depositoNoAduanero = "",
                    nifOperadorComunitario = "",
                    nifRepresentanteLegal = "",
                    operacionSeguro = "",
                    importeTransmisiones = 0,
                    importeTransmisiones1 = 0,
                    importeTransmisiones2 = 0,
                    importeTransmisiones3 = 0,
                    importeTransmisiones4 = 0,
                    operacionCriterioCaja = mdl_primero.Criterio == INTERNO_Criterio.OperacionCriterioCaja ? Variables.G_MDL_MODELO347_VALOR_X.Codigo : "",
                    inversionSujetoPasivo = mdl_primero.Criterio == INTERNO_Criterio.InversionSujetoPasivo ? Variables.G_MDL_MODELO347_VALOR_X.Codigo : "",
                    arrendamientoLocal = mdl_primero.Criterio == INTERNO_Criterio.ArrendamientoLocal ? Variables.G_MDL_MODELO347_VALOR_X.Codigo : "",
                };

                lst_result.Add(_mdl_Linea);
            }
        }

        private decimal SumarEntreFechas(List<INTERNO_ResultadoDeclaracion> mdl_ResultadoDeclaracions, DateTime dt_Desde, DateTime dt_hasta)
        {
            return mdl_ResultadoDeclaracions?.Where(el => el.fecha > dt_Desde && el.fecha < dt_hasta).Sum(el => el.totalFinal) ?? 0;
        }

        private void TareaAsincrona_ProgesoGenerarLineas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

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

            //Termino todo Correctamente
            if (mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.TodoCorrecto)
            {
                ActualizaRegistroListadoPrincipal();
            }
            //Ocurrio un Error
            else
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.Mensaje);
            }
        }
        #endregion Proceso Generar Lineas

        #region Estados de Tipos

        public void ActualizarTipoDeclaracionComSus()
        {
            var _checked = g_frm_P_Modelo347Cabecera.Exferia_CheckBox_DeclaracionPrimera.Checked;

            g_frm_P_Modelo347Cabecera.Exferia_RB_DeclaracionComplementaria.Enabled = !_checked;
            g_frm_P_Modelo347Cabecera.Exferia_RB_DeclaracionSustitutiva.Enabled = !_checked;
        }
        #endregion Estados de Tipos


        #region Generar Modelo
        public void GenerarModeloAscii(INTERNO_ModeloTipo tipoModelo)
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GENERANDODATOS());

                BackgroundWorker obj_TareaAsincrona_Cerrar_Documento = new BackgroundWorker();

                obj_TareaAsincrona_Cerrar_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_GenerarModelo_DoWork);
                obj_TareaAsincrona_Cerrar_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_GenerarModelo_Completed);
                obj_TareaAsincrona_Cerrar_Documento.RunWorkerAsync(tipoModelo);

                //Mostrar Pantalla de Espera
                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(GenerarModeloAscii));
            }
        }

        public void TareaAsincrona_GenerarModelo_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ModeloTipo lst_ColumnasAMostrar = (INTERNO_ModeloTipo)e.Argument;
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_ValorDevuelto_Modelo.Mensaje = "";
            try
            {
                string asciiCabecera = lst_ColumnasAMostrar == INTERNO_ModeloTipo.Modelo347 ? GenerarAscii347Cabecera() : GenerarAscii415Cabecera();
                List<string> asciiLineas = lst_ColumnasAMostrar == INTERNO_ModeloTipo.Modelo347 ? GenerarAscii347Lineas() : GenerarAscii415Lineas();

                var lineas = new List<string> { asciiCabecera };
                if (asciiLineas.Count > 0)
                {
                    lineas = lineas.Union(asciiLineas).ToList();
                }

                GenerarFicheroAscii(lineas, lst_ColumnasAMostrar);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Modelo347Cabecera_Controladora) + "/" + nameof(TareaAsincrona_GenerarModelo_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        #endregion Generar Modelo

        #region Generar Modelo 347
        private void GenerarFicheroAscii(List<string> lineas, INTERNO_ModeloTipo tipoModelo)
        {

            INF_Rutas mdl_INF_Rutas = Variables.G_LST_RUTAS.Find(m => m.id == Variables.G_LNG_RUTA_Modelo347);
            string str_Ruta = "";
            if (mdl_INF_Rutas != null)
            {
                List<INTERNO_CodigoDescripcion_Modelo> lst_INTERNO_CodigoDescripcion_Modelo = new List<INTERNO_CodigoDescripcion_Modelo>();
                lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_TIPOMODELO.Codigo, ((int)tipoModelo).ToString()));
                lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_FECHA.Codigo, DateTime.Now.ToString("yyyyMMdd")));
                lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_HORA.Codigo, DateTime.Now.ToString("HHmmss")));

                str_Ruta = Funciones.Transformar_Ruta(mdl_INF_Rutas.rutaFichero, mdl_INF_Rutas.nombreFichero, ".txt", lst_INTERNO_CodigoDescripcion_Modelo, false);
            }

            if (File.Exists(str_Ruta))
            {
                File.Delete(str_Ruta);
            }
            File.WriteAllLines(str_Ruta, lineas);
        }

        private void TareaAsincrona_GenerarModelo_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

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

            //Termino todo Correctamente
            if (!mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.TodoCorrecto)
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.Mensaje);
            }
            else
            {
                Mensajes.MostrarMensaje(Mensajes.G_STR_GENERANDODATOS_CORRECTO());
            }
        }

        private string GenerarAscii347Cabecera()
        {
            var _mdl = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo;
            // 5-8: ejercicio activo
            string ejercicio = ObtenerTexto(_mdl.ejercicio?.ToString(), 4, ' ');
            // 9-17: NIF del declarante(9 caracteres)(si tiene menos caracteres se rellena con 0 a la izquierda alineado a la derecha)
            string nifDeclarante = ObtenerTexto(g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.str_Empresa_CIF, 9, ' ');
            // 18-57: nombre/razon social de la empresa
            string razonSocial = Sustitucion_CaracteresInvalidos(ObtenerTexto(g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.str_Empresa_RazonSocial, 40, ' '));
            // 58: tipo de soporte C/T
            string tipoSoporte = ObtenerTexto(_mdl.tipoSoporte, 1, ' ');
            //59-107: datos y contacto
            string telefono = ObtenerTexto(_mdl.telefono, 9, ' ');
            string contacto = ObtenerTexto(_mdl.contacto, 40, ' ');
            //108-120: justificante
            string nDeclaracion = ObtenerTexto(_mdl.justificante, 13, '0');
            //121: si es complementaria una c
            string complementaria = EqualsOBlanco(_mdl.complementaria, 'S', 'C');
            //122: si es sustitutiva una S
            string sustitutiva = EqualsOBlanco(_mdl.sustitutiva, 'S');
            //123 - 132: Justificante anterior (si hay C S) o ceros
            string nDeclaracionComplementaria = ObtenerTexto(complementaria.Equals("C") || sustitutiva.Equals("S") ? _mdl.complementaria : "", 13, '0');
            //136-144: numero operaciones
            string nOperaciones = ObtenerTexto(_mdl.numeroOperaciones.ToString(), 9, '0', true);
            //145-160: importe anual de operaciones, (pos 1) N o nada, (resto) importeOperaciones sin decimal
            string signoImporteOperaciones = _mdl.importeOperaciones < 0 ? "N" : " ";
            string importeOperaciones = ObtenerTexto(ConvertirNumeroAscii(_mdl.importeOperaciones), 15, '0', true);
            // 161 - 169: numero total de inmuebles, numero total de lineas que tienen marcado como "Arrendamiento local" (facturaArrendamiento)
            string nInmuebles = ObtenerTexto(ConvertirNumeroAscii(_mdl.importeInmuebles), 9, '0', true);
            // 170 - 185: importe total de las operaciones de arrendamiento (mismo formato de campos anteriores), en la creacion de las lineas, las facturas marcadas como arrendamiento total las totalizo aqui
            decimal importeArrendamiento = _mdl.ModeloLineas
                .Where(_linea => _linea.arrendamientoLocal.Equals(Variables.G_MDL_MODELO347_VALOR_X.Codigo))
                .Select(_linea => _linea.importeOperaciones)
                .Aggregate((acc, curr) => acc += curr);
            string signoImporteArrendamiento = importeArrendamiento < 0 ? "N" : " ";
            string valorImporteArrendamiento = ObtenerTexto(ConvertirNumeroAscii(importeArrendamiento), 15, '0', true);
            // 186 - 390: espacios en blanco
            // 391 al 399: NIF del representante legal, no lo tratamos, se pone espacios en blanco
            // 400 - 487: espacios en blanco
            // 488 - 500: sello electronico -> espacios en blanco
            string blancosFinales = ObtenerTexto("", 315, ' ');

            // Primer caracter de todos tipo de registro SIEMPRE 1 en la cabecera
            // siguientes 3 caracteres "347"
            return $"1347{ejercicio}{nifDeclarante}{razonSocial}{tipoSoporte}{telefono}{contacto}{nDeclaracion}{complementaria}{sustitutiva}{nDeclaracionComplementaria}{nOperaciones}" +
                $"{signoImporteOperaciones}{importeOperaciones}{nInmuebles}{signoImporteArrendamiento}{valorImporteArrendamiento}{blancosFinales}";
        }

        private List<string> GenerarAscii347Lineas()
        {
            var lineas = new List<string>();
            g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas.ForEach(_linea =>
            {
                if (ComprobarSiAnnadir(_linea))
                {
                    INTERNO_CTA_Modelo347Lineas_Modelo lineaTipoC = ObtenerLineaTipoC(_linea);
                    //5-8: ejercicio mismo quel acabecera
                    string ejercicio = ObtenerTexto(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ejercicio?.ToString(), 4, ' ');
                    //9-17: nif declarante
                    string nifDeclarante = ObtenerTexto(g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.str_Empresa_CIF, 9, ' ');
                    //18-26 (9): nif declarado -> nif de la linea(con ceros)
                    string nifDeclarado = ObtenerTexto(_linea.nifDeclarado, 9, ' ');
                    //27-35: nif representante legal -> siempre ceros
                    string nifRepresentanteLegal = ObtenerTexto("", 9, ' ');
                    //36 -75: nombre de la linea(idCliente(B o C)/idProveedor(A) -> razon social)
                    string nombreLinea = Sustitucion_CaracteresInvalidos(ObtenerTexto(_linea.claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COMPRAS.Codigo) ? _linea.Proveedor_Descripcion : _linea.Cliente_Descripcion, 40, ' '));
                    //76: tipo de hoja "D"
                    string tipoHoja = Variables.G_MDL_TIPOHOJA_D.Codigo;
                    //77 - 80: codigo provincia -> codigo provincia de la linea , seguido  codigo pais
                    string codigoProvinciaPais = $"{_linea.codigoProvincia}{(_linea.codigoPais.Equals("ES") ? "  " : _linea.codigoPais)}";
                    //81: espacio en blanco
                    //82: clave operacion(A/B/C)
                    string claveOperacion = ObtenerTexto(_linea.claveOperacion, 1, ' ');
                    //83-98: importe anual de operaciones -> impoerteOperaciones , primer digito: N o blanco, resto (15):m importe *100
                    string signoImporteOperaciones = _linea.importeOperaciones < 0 ? "N" : " ";
                    string valorImporteOperaciones = ObtenerTexto(ConvertirNumeroAscii(_linea.importeOperaciones), 15, '0', true);
                    //99: en blanco
                    //100: arrendamientoLocal, X o BLANCO, al crear las lineas si está marcada  como "Factura arrendamiento"
                    string arrendamientoLocal = EqualsOBlanco(_linea.arrendamientoLocal, 'X');
                    //FALTA EN CREACION
                    //101-115: NO HAY NEGATIVO importeCobroMetalico * 100
                    decimal? importeCobroMetalico = lineaTipoC == null ? _linea.importeCobroMetalico : lineaTipoC.importeCobroMetalico;
                    string valorImporteCobroMetalico = ObtenerTexto(ConvertirNumeroAscii(importeCobroMetalico), 15, '0', true);
                    //116 -131: vacio, 116: en blanco, el resto: a ceros
                    string signoCeros = " ";
                    string valorCeros = ObtenerTexto("", 15, '0');
                    //132 -135: ejercicio de la linea -> ejercicioCobro (solo cuando sea una operacion de cobro solo tipo (C)), en otro caso ceros
                    string ejercicioCobro = lineaTipoC == null ? _linea.ejercicioCobro : lineaTipoC.ejercicioCobro;
                    string ejercicioLinea = ObtenerTexto(_linea.claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo) || lineaTipoC != null ? ejercicioCobro : "", 4, '0', true); ;
                    //136-151: importe operaciones primer trimestre -> importe trimestre1, Signo N o blanco, resto (15 posiciones)
                    string signoImporteTrimestre1 = _linea.importeTrimestre1 < 0 ? "N" : " ";
                    string valorImporteTrimestre1 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTrimestre1), 15, '0', true);
                    //152-167: importe transmisiones1, primer digito siempre blanco, resto todos ceros
                    string signoImporteTransmisiones1 = _linea.importeTransmisiones1 < 0 ? "N" : " ";
                    string valorImporteTransmisiones1 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTransmisiones1), 15, '0', true);
                    //168-183: trimestre2
                    string signoImporteTrimestre2 = _linea.importeTrimestre2 < 0 ? "N" : " ";
                    string valorImporteTrimestre2 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTrimestre2), 15, '0', true);
                    //184-199: importeTransmisiones2
                    string signoImporteTransmisiones2 = _linea.importeTransmisiones2 < 0 ? "N" : " ";
                    string valorImporteTransmisiones2 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTransmisiones2), 15, '0', true);
                    //200-215: trimestre3
                    string signoImporteTrimestre3 = _linea.importeTrimestre3 < 0 ? "N" : " ";
                    string valorImporteTrimestre3 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTrimestre3), 15, '0', true);

                    string signoImporteTransmisiones3 = _linea.importeTransmisiones3 < 0 ? "N" : " ";
                    string valorImporteTransmisiones3 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTransmisiones3), 15, '0', true);
                    //232-237: importe trimeostre4
                    string signoImporteTrimestre4 = _linea.importeTrimestre4 < 0 ? "N" : " ";
                    string valorImporteTrimestre4 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTrimestre4), 15, '0', true);
                    //238-263: importetrasmisiones4
                    string signoImporteTransmisiones4 = _linea.importeTransmisiones4 < 0 ? "N" : " ";
                    string valorImporteTransmisiones4 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTransmisiones3), 15, '0', true);
                    //264-280: nifOperadorComunitario
                    string nifOperadorComunitario = ObtenerTexto(_linea.nifOperadorComunitario, 17, ' ');
                    //281: criterio de caja -> operacionCriterioCaja, X o blanco, en la creacion de la linea cuando "Criterio de caja" está check
                    string operacionCriterioCaja = EqualsOBlanco(_linea.operacionCriterioCaja, 'X');
                    //282: operacionConInversionSujetopasivo X (si tiene algo) o blanco, , en la creacion de la linea cuando "Bien de inversion" está check
                    string inversionSujetoPasivo = EqualsOBlanco(_linea.inversionSujetoPasivo, 'X');
                    //283: depositoNoAduanero X o blanco
                    string depositoNoAduanero = EqualsOBlanco(_linea.depositoNoAduanero, 'X');
                    //284-299: importeCriterioCaja,primero N o blanco -> CAMBIAR TIPO DATO EN BD
                    string signoImporteCriterioCaja = _linea.importeCriterioCaja < 0 ? "N" : " ";
                    string valorImporteCriterioCaja = ObtenerTexto(ConvertirNumeroAscii(_linea.importeCriterioCaja), 15, '0', true);
                    //FALTA CALCULAR, CAMBIAR EL TIPO EN BD
                    //300-500: blanco
                    string blancosFinales = ObtenerTexto("", 201, ' ');

                    //1: tiporegistro siempre 2
                    //2-4: 347
                    lineas.Add($"2347{ejercicio}{nifDeclarante}{nifDeclarado}{nifRepresentanteLegal}{nombreLinea}{tipoHoja}" +
                        $"{codigoProvinciaPais} {claveOperacion}{signoImporteOperaciones}{valorImporteOperaciones} {arrendamientoLocal}" +
                        $"{valorImporteCobroMetalico}{signoCeros}{valorCeros}{ejercicioLinea}{signoImporteTrimestre1}{valorImporteTrimestre1}" +
                        $"{signoImporteTransmisiones1}{valorImporteTransmisiones1}{signoImporteTrimestre2}{valorImporteTrimestre2}" +
                        $"{signoImporteTransmisiones2}{valorImporteTransmisiones2}{signoImporteTrimestre3}{valorImporteTrimestre3}" +
                        $"{signoImporteTransmisiones3}{valorImporteTransmisiones3}{signoImporteTrimestre4}{valorImporteTrimestre4}" +
                        $"{signoImporteTransmisiones4}{valorImporteTransmisiones4}{nifOperadorComunitario}{operacionCriterioCaja}" +
                        $"{inversionSujetoPasivo}{depositoNoAduanero}{signoImporteCriterioCaja}{valorImporteCriterioCaja}{blancosFinales}");
                }
            });
            return lineas;
        }

        private INTERNO_CTA_Modelo347Lineas_Modelo ObtenerLineaTipoC(INTERNO_CTA_Modelo347Lineas_Modelo linea)
        {
            return !linea.claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo)
                 ? g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas.Find(e =>
                     (e.Cliente_Descripcion?.Equals(linea.Cliente_Descripcion) ?? false) &&
                     e.ejercicioCobro.Equals(linea.ejercicioCobro) &&
                     e.id != linea.id &&
                     e.claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo)
                     ) :
                 null;
        }

        // Si tipo C, coinciden la razon social (NIF) y el ejercicio con el que estoy declarando a alguna otra linea no añadir
        private bool ComprobarSiAnnadir(INTERNO_CTA_Modelo347Lineas_Modelo linea)
        {
            var lineaNoTipoC = linea.claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo)
                ? g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas.Find(e => (e.Cliente_Descripcion?.Equals(linea.Cliente_Descripcion) ?? false) && e.id != linea.id && e.ejercicioCobro.Equals(linea.ejercicioCobro)) :
                null;
            return lineaNoTipoC == null;
        }

        private string ObtenerTexto(string texto, int tamanno, char textoARellenar, bool desdeIzquierda = false)
        {
            var textoArray = texto?.Take(tamanno).ToArray() ?? new char[] { };
            var arrayValoresRellenos = new char[tamanno >= textoArray.Length ? tamanno - textoArray.Length : 0].ToList().Select(e => textoARellenar).ToArray();
            return String.Join("", desdeIzquierda ? arrayValoresRellenos.Concat(textoArray) : textoArray.Concat(arrayValoresRellenos));
        }

        private string EqualsOBlanco(string texto, char caracterEq, char? caracterDevuelto = null)
        {
            return (texto?.Equals(caracterEq.ToString()) ?? false) ? (caracterDevuelto ?? caracterEq).ToString() : " ";
        }

        private string ConvertirNumeroAscii(decimal? numero)
        {
            return ((long)Math.Abs((numero ?? 0) * 100)).ToString();
        }

        private string Sustitucion_CaracteresInvalidos(string _str_Texto)
        {
            string str_TextoFinal = "";
            if (_str_Texto != null)
            {
                foreach (char c in _str_Texto)
                {
                    //Ascii 42
                    if (c == 42)
                    { }
                    //Ascii >=65 hasta <=90
                    else if (c >= 65 && c <= 90)
                    {
                        str_TextoFinal += Convert.ToString(c);
                    }
                    //Ascii >=97 hasta <=122
                    else if (c >= 97 && c <= 122)
                    {
                        str_TextoFinal += Convert.ToString(c);
                    }
                    //Ascii >=40 hasta <=58
                    else if (c >= 40 && c <= 58)
                    {
                        str_TextoFinal += Convert.ToString(c);
                    }
                    //Ascii 63 
                    else if (c == 63)
                    {
                        str_TextoFinal += Convert.ToString(c);
                    }
                    //Ascii 32 
                    else if (c == 32)
                    {
                        str_TextoFinal += Convert.ToString(c);
                    }
                    //Ascii 164 o 241 ñ
                    else if (c == 164 || c == 241)
                    {
                        str_TextoFinal += "n";
                    }
                    //Ascii 165 o 209 Ñ
                    else if (c == 165 || c == 209)
                    {
                        str_TextoFinal += "N";
                    }
                    //Ascii 135 o 231 ç
                    else if (c == 135 || c == 231)
                    {
                        str_TextoFinal += "c";
                    }
                    //Ascii 128 o 199 Ç
                    else if (c == 128 || c == 199)
                    {
                        str_TextoFinal += "C";
                    }
                    //Ascii 34 "
                    else if (c == 34)
                    {
                        str_TextoFinal += "&quot;";
                    }
                    //Ascii 38 &
                    else if (c == 38)
                    {
                        str_TextoFinal += "&amp;";
                    }
                    //Ascii 39 '
                    else if (c == 39)
                    {
                        str_TextoFinal += "&apos;";
                    }
                    //Ascii 60 <
                    else if (c == 60)
                    {
                        str_TextoFinal += "&lt;";
                    }
                    //Ascii 62 >
                    else if (c == 62)
                    {
                        str_TextoFinal += "&gt;";
                    }
                }
            }
            return str_TextoFinal;
        }


        #endregion Generar Modelo 347

        #region Generar Modelo 415
        private string GenerarAscii415Cabecera()
        {
            var _mdl = g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo;
            // 5-8: ejercicio activo
            string ejercicio = ObtenerTexto(_mdl.ejercicio?.ToString(), 4, ' ');
            // 9-17: NIF del declarante(9 caracteres)(si tiene menos caracteres se rellena con 0 a la izquierda alineado a la derecha)
            string nifDeclarante = ObtenerTexto(g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.str_Empresa_CIF, 9, ' ');
            // 18-57: nombre/razon social de la empresa
            string razonSocial = ObtenerTexto(g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.str_Empresa_RazonSocial, 40, ' ');
            //58-66: Clave A (SOLO LA CLAVE A) total operaciones -> numero de operaciones (numero de registros)
            var operacionesA = ObtenerImportesPorCodigo(_mdl.ModeloLineas, Variables.G_STR_CLAVE_MODELO347_COMPRAS.Codigo);
            var importeOperacionesA = (operacionesA?.Count() ?? 0) != 0 ? operacionesA.Aggregate((acc, importeLinea) => acc += importeLinea) : 0;
            string nOperacionesA = ObtenerTexto(operacionesA.Count().ToString(), 9, '0', true);
            //67-82: el importe: N y resto
            string signoImporteOperacionesA = importeOperacionesA < 0 ? "N" : " ";
            string valorImporteOperacionesA = ObtenerTexto(ConvertirNumeroAscii(importeOperacionesA), 15, '0', true);

            //83-91:  total operaciones  B
            var operacionesB = ObtenerImportesPorCodigo(_mdl.ModeloLineas, Variables.G_STR_CLAVE_MODELO347_VENTAS.Codigo);
            var importeOperacionesB = (operacionesB?.Count() ?? 0) != 0 ? operacionesB.Aggregate((acc, importeLinea) => acc += importeLinea) : 0;
            string nOperacionesB = ObtenerTexto(operacionesB.Count().ToString(), 9, '0', true);
            //92-107: totalizar importes clave B
            string signoImporteOperacionesB = importeOperacionesB < 0 ? "N" : " ";
            string valorImporteOperacionesB = ObtenerTexto(ConvertirNumeroAscii(importeOperacionesB), 15, '0', true);

            //108-116: totalizar numero operaciones clave C
            var operacionesC = ObtenerImportesPorCodigo(_mdl.ModeloLineas, Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo);
            var importeOperacionesC = (operacionesC?.Count() ?? 0) != 0 ? operacionesC.Aggregate((acc, importeLinea) => acc += importeLinea) : 0;
            string nOperacionesC = ObtenerTexto(operacionesC.Count().ToString(), 9, '0', true);
            //117-132: importe de la clave C
            string signoImporteOperacionesC = importeOperacionesC < 0 ? "N" : " ";
            string valorImporteOperacionesC = ObtenerTexto(ConvertirNumeroAscii(importeOperacionesC), 15, '0', true);

            //133-141: n operaciones D: ceros
            string nOperacionesD = ObtenerTexto("", 9, '0', true);
            //142-157: importe total D: espacio blanco y ceros
            string signoImporteOperacionesD = " ";
            string valorImporteOperacionesD = ObtenerTexto("", 15, '0', true);

            //158-166: n operaciones E: ceros
            string nOperacionesE = ObtenerTexto("", 9, '0', true);
            //167-182: importe total E: espacio blanco y ceros
            string signoImporteOperacionesE = " ";
            string valorImporteOperacionesE = ObtenerTexto("", 15, '0', true);

            //183-191: n operaciones  F: ceros
            string nOperacionesF = ObtenerTexto("", 9, '0', true);
            //192-207: importe total F: espacio blanco y ceros
            string signoImporteOperacionesF = " ";
            string valorImporteOperacionesF = ObtenerTexto("", 15, '0', true);
            //208-116: n operaciones  G: ceros
            string nOperacionesG = ObtenerTexto("", 9, '0', true);
            //217-232: importe total G: espacio blanco y ceros
            string signoImporteOperacionesG = " ";
            string valorImporteOperacionesG = ObtenerTexto("", 15, '0', true);
            //233: modalidad declaracion: C si es complementaria, S si es sustitutiva o blanco (SOLO 1 espacio)
            string modalidad = ObtenerTexto(($"{EqualsOBlanco(_mdl.complementaria, 'S', 'C')}{EqualsOBlanco(_mdl.sustitutiva, 'S')}").Trim(), 1, ' ');
            //234-246: justificante
            string nDeclaracion = ObtenerTexto(_mdl.justificante, 13, '0');

            // Primer caracter de todos tipo de registro SIEMPRE 1 en la cabecera
            // siguientes 3 caracteres "415"
            return $"1415{ejercicio}{nifDeclarante}{razonSocial}{nOperacionesA}{signoImporteOperacionesA}{valorImporteOperacionesA}" +
                $"{nOperacionesB}{signoImporteOperacionesB}{valorImporteOperacionesB}{nOperacionesC}{signoImporteOperacionesC}{valorImporteOperacionesC}" +
                $"{nOperacionesD}{signoImporteOperacionesD}{valorImporteOperacionesD}{nOperacionesE}{signoImporteOperacionesE}{valorImporteOperacionesE}" +
                $"{nOperacionesF}{signoImporteOperacionesF}{valorImporteOperacionesF}{nOperacionesG}{signoImporteOperacionesG}{valorImporteOperacionesG}" +
                $"{modalidad}{nDeclaracion}";
        }
        private List<string> GenerarAscii415Lineas()
        {
            var lineas = new List<string>();
            g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ModeloLineas.ForEach(_linea =>
            {
                //5-8: ejercicio mismo quel acabecera
                string ejercicio = ObtenerTexto(g_mdl_INTERNO_CTA_Modelo347Cabecera_Modelo.ejercicio?.ToString(), 4, ' ');
                //9-17: nif declarante
                string nifDeclarante = ObtenerTexto(g_frm_P_Modelo347Cabecera.P_Base_ValoresGenerales.str_Empresa_CIF, 9, ' ');
                //18: clave operacion(A/B/C)
                string claveOperacion = ObtenerTexto(_linea.claveOperacion, 1, ' ');
                //19-27: nif declarado -> nif de la linea(con ceros)
                string nifDeclarado = ObtenerTexto(_linea.nifDeclarado, 9, ' ');
                //28-67:  nombre de la linea(idCliente(B o C)/idProveedor(A) -> razon social)
                string nombreLinea = ObtenerTexto(_linea.claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COMPRAS.Codigo) ? _linea.Proveedor_Descripcion : _linea.Cliente_Descripcion, 40, ' ');
                //68-76: nif representante legal -> siempre ceros
                string nifRepresentanteLegal = ObtenerTexto("", 9, '0');
                //77-78: codigo pais
                string codigoPais = $"{_linea.codigoPais}";
                //79: criterio de caja -> operacionCriterioCaja
                string operacionCriterioCaja = EqualsOBlanco(_linea.operacionCriterioCaja, 'X');
                //80: operacionConInversionSujetopasivo X (si tiene algo) o blanco
                string inversionSujetoPasivo = EqualsOBlanco(_linea.inversionSujetoPasivo, 'X');
                //81: siempre blanco
                string espacio81 = " ";
                //82-97:  importeCriterioCaja,primero N o blanco
                string signoImporteCriterioCaja = _linea.importeCriterioCaja < 0 ? "N" : " ";
                string valorImporteCriterioCaja = ObtenerTexto(ConvertirNumeroAscii(_linea.importeCriterioCaja), 15, '0', true);
                //98-113: importe anual operaciones -> importeOperaciones
                string signoImporteOperaciones = _linea.importeOperaciones < 0 ? "N" : " ";
                string valorImporteOperaciones = ObtenerTexto(ConvertirNumeroAscii(_linea.importeOperaciones), 15, '0', true);
                //114-128: NO HAY NEGATIVO importeCobroMetalico * 100
                string valorImporteCobroMetalico = ObtenerTexto(ConvertirNumeroAscii(_linea.importeCobroMetalico), 15, '0', true);

                var importeArrendamientoLocal = _linea.arrendamientoLocal.Equals(Variables.G_MDL_MODELO347_VALOR_X.Codigo) ? _linea.importeCriterioCaja : 0;
                //128-144: totalizar los que tengan arrendamientoLocal X
                string signoImporteArrendamientoLocal = _linea.importeCriterioCaja < 0 ? "N" : " ";
                string valorImporteArrendamientoLocal = ObtenerTexto(ConvertirNumeroAscii(_linea.importeCriterioCaja), 15, '0', true);

                //145-160: signo blanco y reseto ceros
                string signoBlanco = " ";
                string valorCeros = ObtenerTexto("", 15, '0', true);

                //161-164: ejercicio de la linea -> ejercicioCobro
                string ejercicioLinea = ObtenerTexto(_linea.claveOperacion.Equals(Variables.G_STR_CLAVE_MODELO347_COBROS.Codigo) ? _linea.ejercicioCobro : "", 4, '0', true);
                //165-180: importe operaciones primer trimestre -> importe trimestre1, Signo N o blanco
                string signoImporteTrimestre1 = _linea.importeTrimestre1 < 0 ? "N" : " ";
                string valorImporteTrimestre1 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTrimestre1), 15, '0', true);
                //181-196: totalizar los que tienen arrendamientoLocal X el primer trimestre 1, importeTrimestre1
                var importeArrendamientoLocalT1 = _linea.arrendamientoLocal.Equals(Variables.G_MDL_MODELO347_VALOR_X.Codigo) ? _linea.importeTrimestre1 : 0;
                string signoArrendamientoTrimestre1 = importeArrendamientoLocalT1 < 0 ? "N" : " ";
                string valorArrendamientoTrimestre1 = ObtenerTexto(ConvertirNumeroAscii(importeArrendamientoLocalT1), 15, '0', true);
                //197-212: signo blanco y ceros -> importetransmisiones1, primer digito siempre blanco, resto todos ceros
                string signoImporteTransmisiones1 = _linea.importeTransmisiones1 < 0 ? "N" : " ";
                string valorImporteTransmisiones1 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTransmisiones1), 15, '0', true);

                //213-218: importe operaciones t2
                string signoImporteTrimestre2 = _linea.importeTrimestre2 < 0 ? "N" : " ";
                string valorImporteTrimestre2 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTrimestre2), 15, '0', true);
                //229-244: arrendamiento t2
                var importeArrendamientoLocalT2 = _linea.arrendamientoLocal.Equals(Variables.G_MDL_MODELO347_VALOR_X.Codigo) ? _linea.importeTrimestre2 : 0;
                string signoArrendamientoTrimestre2 = importeArrendamientoLocalT2 < 0 ? "N" : " ";
                string valorArrendamientoTrimestre2 = ObtenerTexto(ConvertirNumeroAscii(importeArrendamientoLocalT2), 15, '0', true);
                //245-260: transmisiones t2
                string signoImporteTransmisiones2 = _linea.importeTransmisiones2 < 0 ? "N" : " ";
                string valorImporteTransmisiones2 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTransmisiones2), 15, '0', true);

                //261-276: importe operaciones t3
                string signoImporteTrimestre3 = _linea.importeTrimestre3 < 0 ? "N" : " ";
                string valorImporteTrimestre3 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTrimestre3), 15, '0', true);
                //277-292: arrendamiento t3
                var importeArrendamientoLocalT3 = _linea.arrendamientoLocal.Equals(Variables.G_MDL_MODELO347_VALOR_X.Codigo) ? _linea.importeTrimestre3 : 0;
                string signoArrendamientoTrimestre3 = importeArrendamientoLocalT3 < 0 ? "N" : " ";
                string valorArrendamientoTrimestre3 = ObtenerTexto(ConvertirNumeroAscii(importeArrendamientoLocalT3), 15, '0', true);
                //293-308: transmisiones t3
                string signoImporteTransmisiones3 = _linea.importeTransmisiones3 < 0 ? "N" : " ";
                string valorImporteTransmisiones3 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTransmisiones3), 15, '0', true);

                //309-324: importe op t4
                string signoImporteTrimestre4 = _linea.importeTrimestre4 < 0 ? "N" : " ";
                string valorImporteTrimestre4 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTrimestre4), 15, '0', true);
                //325-340: arrenda t4
                var importeArrendamientoLocalT4 = _linea.arrendamientoLocal.Equals(Variables.G_MDL_MODELO347_VALOR_X.Codigo) ? _linea.importeTrimestre4 : 0;
                string signoArrendamientoTrimestre4 = importeArrendamientoLocalT4 < 0 ? "N" : " ";
                string valorArrendamientoTrimestre4 = ObtenerTexto(ConvertirNumeroAscii(importeArrendamientoLocalT4), 15, '0', true);
                //341-356: transmision t4
                string signoImporteTransmisiones4 = _linea.importeTransmisiones4 < 0 ? "N" : " ";
                string valorImporteTransmisiones4 = ObtenerTexto(ConvertirNumeroAscii(_linea.importeTransmisiones4), 15, '0', true);

                //1: tiporegistro siempre 2
                //2-4: 415
                lineas.Add($"2415{ejercicio}{nifDeclarante}{claveOperacion}{nifDeclarado}{nombreLinea}{nifRepresentanteLegal}{codigoPais}" +
                    $"{operacionCriterioCaja}{inversionSujetoPasivo}{espacio81}{signoImporteCriterioCaja}{valorImporteCriterioCaja}" +
                    $"{signoImporteOperaciones}{valorImporteOperaciones}{valorImporteCobroMetalico}{signoImporteArrendamientoLocal}{valorImporteArrendamientoLocal}" +
                    $"{signoBlanco}{valorCeros}{ejercicioLinea}{signoImporteTrimestre1}{valorImporteTrimestre1}" +
                    $"{signoArrendamientoTrimestre1}{valorArrendamientoTrimestre1}{signoImporteTransmisiones1}{valorImporteTransmisiones1}" +
                    $"{signoImporteTrimestre2}{valorImporteTrimestre2}{signoArrendamientoTrimestre2}{valorArrendamientoTrimestre2}" +
                    $"{signoImporteTransmisiones2}{valorImporteTransmisiones2}{signoImporteTrimestre3}{valorImporteTrimestre3}" +
                    $"{signoArrendamientoTrimestre3}{valorArrendamientoTrimestre3}{signoImporteTransmisiones3}{valorImporteTransmisiones3}" +
                    $"{signoImporteTrimestre4}{valorImporteTrimestre4}{signoArrendamientoTrimestre4}{valorArrendamientoTrimestre4}" +
                    $"{signoImporteTransmisiones4}{valorImporteTransmisiones4}");
            });
            return lineas;
        }
        private IEnumerable<decimal> ObtenerImportesPorCodigo(List<INTERNO_CTA_Modelo347Lineas_Modelo> list, string codigo)
        {
            return list.Where(_mdlLinea => _mdlLinea.claveOperacion.Equals(codigo)).Select(_linea => _linea.importeOperaciones);
        }
        #endregion Generar Modelo 415
    }
}
