using Exferia_Aplicacion.Herencia.Capas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Exferia_Aplicacion.General;
using Exferia_EntityFramework;
using System.Runtime.CompilerServices;
using Exferia_General;
using Exferia_Contabilidad._0_Modelos;
using Exferia_Aplicacion.Modelos_MantenimientoSimple;
using System.Transactions;
using System.Data.SqlClient;
using static Exferia_Aplicacion.General.Enumerados;
using System.Threading;
using System.Reflection;
using System.IO;

namespace Exferia_Contabilidad._1_Datos
{
    class CTA_Modelo347Lineas_Datos : ABS_Datos
    {
        #region Listado
        private List<INTERNO_CTA_Modelo347Lineas_Modelo> g_lst_INTERNO_CTA_Modelo347Lineas_Modelo = null;

        public override List<dynamic> Obtener_Listado(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            List<dynamic> lst_CTA = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                ConsultaRellenar_Listado(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(CTA_Conceptos).Name), _lst_CamposConRelacionABuscar, -1, null, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);

                lst_CTA = g_lst_INTERNO_CTA_Modelo347Lineas_Modelo?.Cast<dynamic>().ToList();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Conceptos) + "/" + nameof(Obtener_Listado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return lst_CTA;
        }
        public override dynamic Obtener_RegistroListado(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo, long _lng_id, List<long> _lst_ids)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            dynamic dnm_CTA = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                // Consulta .....................................................
                ConsultaRellenar_Listado(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(CTA_Conceptos).Name), _lst_CamposConRelacionABuscar, _lng_id, _lst_ids, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if ((g_lst_INTERNO_CTA_Modelo347Lineas_Modelo != null) && (g_lst_INTERNO_CTA_Modelo347Lineas_Modelo.Count() > 0))
                {
                    dnm_CTA = g_lst_INTERNO_CTA_Modelo347Lineas_Modelo.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Conceptos_Datos) + "/" + nameof(Obtener_RegistroListado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return dnm_CTA;
        }

        protected override void ConsultaRellenar_Listado(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionas, List<string> _lst_CamposConRelacionABuscar, long _lng_id, List<long> _lst_ids, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            try
            {
                string str_SQL = Obtener_Consulta_Para_Listado();

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Rellenar el Modelo
                g_lst_INTERNO_CTA_Modelo347Lineas_Modelo = _obj_Exferia_Entities.Database.SqlQuery<INTERNO_CTA_Modelo347Lineas_Modelo>(str_SQL, arr_Parametros)?.ToList();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Conceptos_Datos) + "/" + nameof(ConsultaRellenar_Listado), true);
            }
        }
        #endregion

        #region Listado Secundario
        public override List<dynamic> Obtener_Listado_Secundario(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            return null;
        }
        public override dynamic Obtener_RegistroListado_Secundario(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo, long _lng_id, List<long> _lst_ids)
        {
            return null;
        }
        protected override void ConsultaRellenar_Listado_Secundario(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionadas, List<string> _lst_CamposConRelacionABuscar, long _lng_id, List<long> _lst_ids, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        { }
        #endregion

        #region F3
        private INTERNO_CTA_Modelo347Lineas_Modelo g_mdl_INTERNO_CTA_Modelo347Lineas_Modelo_F3 = null;

        public override dynamic Obtener_F3(string _str_filtro, string _str_CampoBusqueda, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            dynamic dnm_CTA = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Consulta ......................................................
                ConsultaRellenar_F3(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(CTA_Conceptos).Name), _str_CampoBusqueda, _str_filtro, -1, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if (g_mdl_INTERNO_CTA_Modelo347Lineas_Modelo_F3 != null)
                {
                    dnm_CTA = g_mdl_INTERNO_CTA_Modelo347Lineas_Modelo_F3;
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Conceptos_Datos) + "/" + nameof(Obtener_F3), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return dnm_CTA;
        }
        public override dynamic Obtener_F3_PorId(long _lng_id, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            dynamic dnm_CTA = null;

            try
            {

                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Consulta ......................................................
                ConsultaRellenar_F3(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(CTA_Conceptos).Name), "", "", _lng_id, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if (g_mdl_INTERNO_CTA_Modelo347Lineas_Modelo_F3 != null)
                {
                    dnm_CTA = g_mdl_INTERNO_CTA_Modelo347Lineas_Modelo_F3;
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Conceptos_Datos) + "/" + nameof(Obtener_F3_PorId), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return dnm_CTA;

        }


        protected override void ConsultaRellenar_F3(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionas, string _str_CampoBusqueda, string _str_Filtro, long _lng_id, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            try
            {
                string str_SQL =
                    " SELECT distinct " +
                        nameof(INTERNO_CTA_Modelo347Lineas_Modelo.id) + " = " + nameof(CTA_Conceptos.id) + "," +
                        nameof(INTERNO_CTA_Modelo347Lineas_Modelo.codigo) + " = " + nameof(CTA_Conceptos.codigo) + "," +
                " FROM " + nameof(CTA_Conceptos) +
                " WHERE " + nameof(CTA_Conceptos.fechaBorrado) + " IS null AND " +
                        (
                          _lng_id > -1
                                ? (nameof(CTA_Conceptos.id) + "=" + _lng_id)
                                : (
                                    //Filtrar por Codigo
                                    (_str_CampoBusqueda.Equals(nameof(CTA_Conceptos.codigo)))
                                        ? (nameof(CTA_Conceptos.codigo) + "=@Filtro")
                                        //Filtrar por Descripcion
                                        : (nameof(CTA_Conceptos.descripcion) + "=@Filtro")
                                  )
                        );

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@Filtro",  _str_Filtro)
                };

                //Rellenar el Modelo
                g_mdl_INTERNO_CTA_Modelo347Lineas_Modelo_F3 = _obj_Exferia_Entities.Database.SqlQuery<INTERNO_CTA_Modelo347Lineas_Modelo>(str_SQL, arr_Parametros).FirstOrDefault();

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Conceptos_Datos) + "/" + nameof(ConsultaRellenar_F3), true);
            }
        }
        #endregion

        #region Obtener
        private dynamic g_dnm_Modelo_Obtener = null;
        private static int g_int_TotalHilos_Obtener = 1;
        private bool[] g_bol_Hilos_Terminados_Obtener = new bool[g_int_TotalHilos_Obtener];
        public override dynamic Obtener(long _lng_id)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                string str_columnasListado = $@"{nameof(MAE_Clientes)}.{nameof(MAE_Clientes.codigo)} as Cliente_Codigo
	                                        , {nameof(MAE_Clientes)}.{nameof(MAE_Clientes.id)} as Cliente_Id
	                                        , {nameof(MAE_Clientes)}.{nameof(MAE_Clientes.fechaBorrado)} as Cliente_FechaBorrado
	                                        , {nameof(MAE_Clientes)}.{nameof(MAE_Clientes.razonSocial)} as Cliente_Descripcion

	                                        , {nameof(MAE_Proveedores)}.{nameof(MAE_Proveedores.codigo)} as Proveedor_Codigo
	                                        , {nameof(MAE_Proveedores)}.{nameof(MAE_Proveedores.id)} as Proveedor_Id
	                                        , {nameof(MAE_Proveedores)}.{nameof(MAE_Proveedores.fechaBorrado)} as Proveedor_FechaBorrado
	                                        , {nameof(MAE_Proveedores)}.{nameof(MAE_Proveedores.razonSocial)} as Proveedor_Descripcion

	                                        , {nameof(GEN_Paises)}.{nameof(GEN_Paises.id)} as Pais_Id
	                                        , {nameof(GEN_Paises)}.{nameof(GEN_Paises.codigo_ISO2D)} as Pais_Codigo
	                                        , {nameof(GEN_Paises)}.{nameof(GEN_Paises.descripcion)} as Pais_Descripcion
	                                        , {nameof(GEN_Paises)}.{nameof(GEN_Paises.fechaBorrado)} as Pais_FechaBorrado

                                            , {nameof(GEN_Provincias)}.{nameof(GEN_Provincias.id)} as Provincia_Id
                                            , {nameof(GEN_Provincias)}.{nameof(GEN_Provincias.codigo)} as Provincia_Codigo
                                            , {nameof(GEN_Provincias)}.{nameof(GEN_Provincias.descripcion)} as Provincia_Descripcion
	                                        , {nameof(GEN_Provincias)}.{nameof(GEN_Provincias.fechaBorrado)} as Provincia_FechaBorrado";

                string str_SQL = $@"{Obtener_Consulta_Para_Listado(str_columnasListado)}
                                    LEFT JOIN {nameof(MAE_Clientes)} ON {nameof(MAE_Clientes)}.{nameof(MAE_Clientes.id)} = {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.idCliente)}
                                    LEFT JOIN {nameof(MAE_Proveedores)} ON {nameof(MAE_Proveedores)}.{nameof(MAE_Proveedores.id)} = {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.idProveedor)}
                                    LEFT JOIN {nameof(GEN_Paises)} ON {nameof(GEN_Paises)}.{nameof(GEN_Paises.codigo_ISO2D)} = {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.codigoPais)}
                                    LEFT JOIN {nameof(GEN_Provincias)} ON {nameof(GEN_Provincias)}.{nameof(GEN_Provincias.codigo)} = {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.codigoProvincia)}

                                    WHERE {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.id)} = @id";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Rellenar el Modelo
                g_dnm_Modelo_Obtener = obj_Exferia_Entities.Database.SqlQuery<INTERNO_CTA_Modelo347Lineas_Modelo>(str_SQL, arr_Parametros).FirstOrDefault();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Conceptos_Datos) + "/" + nameof(Obtener), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return g_dnm_Modelo_Obtener;
        }

        #region Tablas Relacionadas
        //private void Obtener_Lineas_Modelo_OBTENER()
        //{
        //    try
        //    {
        //        g_dnm_Modelo_Obtener.GEN_Delegaciones = Datos_Generales.GEN_Delegaciones_Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idDelegacion);
        //    }
        //    catch (Control_Errores)
        //    { }
        //    finally
        //    {
        //        g_bol_Hilos_Terminados_Obtener[0] = true;
        //    }
        //}
        #endregion Tablas Relacionadas


        public override dynamic Obtener_Registro_PorCampo(string _str_Filtro, string _str_CampoBusqueda, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual)
        {
            throw new NotImplementedException();
        }
        #endregion

        #region MODELOS

        #region Modelo Simple
        private CTA_Modelo347Lineas g_mdl_CTA_Modelo347Lineas = null;
        private List<MAE_Clientes> g_lst_MAE_Clientes = null;
        private List<MAE_Proveedores> g_lst_MAE_Proveedores = null;

        private static int g_int_TotalHilos_Modelo = 2;
        private bool[] g_bol_Hilos_Terminados_Modelo = new bool[g_int_TotalHilos_Modelo];
        public CTA_Modelo347Lineas Obtener_Modelo_Por_Id(long _lng_id, bool _bool_Cargar_Cliente, bool _bool_Cargar_Proveedor)
        {
            try
            {
                string str_SQL = $@"{Obtener_Consulta_Para_Listado()}
                                  WHERE {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.id)} = @id";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Ejecutar y rellenar el modelo
                Ejecutar_Consulta_Modelo(str_SQL, arr_Parametros, _bool_Cargar_Cliente, _bool_Cargar_Proveedor);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Modelo347Lineas_Datos) + "/" + nameof(Obtener_Modelo_Por_Id), true);
            }

            return g_mdl_CTA_Modelo347Lineas;
        }

        private void Ejecutar_Consulta_Modelo(string _str_SQL, object[] _arr_Parametros, bool _bool_Cargar_Cliente, bool _bool_Cargar_Proveedor)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                //Conexion
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Rellenar el Modelo
                g_mdl_CTA_Modelo347Lineas = obj_Exferia_Entities.Database.SqlQuery<CTA_Modelo347Lineas>(_str_SQL, _arr_Parametros)?.FirstOrDefault();

                #region Rellenar Tablas Relacionadas
                if (g_mdl_CTA_Modelo347Lineas != null)
                {
                    //reiniciar Valores de los hilos
                    for (int int_Contador = 0; int_Contador < g_int_TotalHilos_Modelo; int_Contador++)
                    {
                        g_bol_Hilos_Terminados_Modelo[int_Contador] = false;
                    }


                    //MAE_Clientes
                    if (_bool_Cargar_Cliente)
                    {
                        ThreadStart obj_ThreadStart_VENCIMIENTO = new ThreadStart(Obtener_Cliente_Modelo);
                        Thread obj_Thread_VENCIMIENTO = new Thread(obj_ThreadStart_VENCIMIENTO);
                        obj_Thread_VENCIMIENTO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo[0] = true;
                    }

                    //MAE_Proveedores
                    if (_bool_Cargar_Proveedor)
                    {
                        ThreadStart obj_ThreadStart_PROVEEDORES = new ThreadStart(Obtener_Proveedore_Modelo);
                        Thread obj_Thread_PROVEEDORES = new Thread(obj_ThreadStart_PROVEEDORES);
                        obj_Thread_PROVEEDORES.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo[1] = true;
                    }


                    bool bol_Termino = false;
                    while (bol_Termino == false)
                    {
                        bol_Termino = true;
                        foreach (bool bol_Termino_Hilo in g_bol_Hilos_Terminados_Modelo)
                        {
                            if (bol_Termino_Hilo == false)
                            {
                                bol_Termino = false;
                                break;
                            }
                        }

                        Thread.Sleep(10);
                    }
                }
                #endregion Rellenar Tablas Relacionadas
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Modelo347Lineas_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }

        #endregion

        #region Rellenar Tablas Relacionadas
        private void Obtener_Cliente_Modelo()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase = Activator.CreateInstance(m_type);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAECLIENTES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_mdl_CTA_Modelo347Lineas.idCliente };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_CTA_Modelo347Lineas.MAE_Clientes = (MAE_Clientes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo[0] = true;
            }
        }

        private void Obtener_Proveedore_Modelo()
        {
            try
            {

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

                //Obtener valores
                object[] arr_Parametros = { g_mdl_CTA_Modelo347Lineas.idProveedor };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_CTA_Modelo347Lineas.MAE_Proveedores = (MAE_Proveedores)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo[1] = true;
            }
        }
        #endregion Rellenar Tablas Relacionadas

        #endregion

        #region Modelo Por Modelo347
        private List<INTERNO_CTA_Modelo347Lineas_Modelo> g_lst_INTERNO_CTA_Modelo347Lineas_Modelo_PARALISTADO = null;

        private static int g_int_TotalHilos_Modelo_Listado_PARALISTADO = 4;
        private bool[] g_bol_Hilos_Terminados_Modelo_Listado_PARALISTADO = new bool[g_int_TotalHilos_Modelo_Listado_PARALISTADO];
        public List<INTERNO_CTA_Modelo347Lineas_Modelo> Obtener_Registros_Para_Listado_Por_Modelo347(long _lng_id, bool _bool_Cargar_Cliente, bool _bool_Cargar_Proveedor)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            try
            {
                string str_columnasListado = $@"{nameof(MAE_Clientes)}.{nameof(MAE_Clientes.codigo)} as Cliente_Codigo
	                                        , {nameof(MAE_Clientes)}.{nameof(MAE_Clientes.razonSocial)} as Cliente_Descripcion
	                                        , {nameof(MAE_Proveedores)}.{nameof(MAE_Proveedores.codigo)} as Proveedor_Codigo
	                                        , {nameof(MAE_Proveedores)}.{nameof(MAE_Proveedores.razonSocial)} as Proveedor_Descripcion";

                string str_SQL = $@"{Obtener_Consulta_Para_Listado(str_columnasListado)}
                                    LEFT JOIN {nameof(MAE_Clientes)} ON {nameof(MAE_Clientes)}.{nameof(MAE_Clientes.id)} = {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.idCliente)}
                                    LEFT JOIN {nameof(MAE_Proveedores)} ON {nameof(MAE_Proveedores)}.{nameof(MAE_Proveedores.id)} = {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.idProveedor)}
                                    WHERE {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.idModelo347Cabecera)} = @id";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Ejecutar y rellenar el modelo
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Rellenar el Modelo
                g_lst_INTERNO_CTA_Modelo347Lineas_Modelo_PARALISTADO = obj_Exferia_Entities.Database.SqlQuery<INTERNO_CTA_Modelo347Lineas_Modelo>(str_SQL, arr_Parametros).ToList();

                #region Tablas Relacionadas

                #endregion Tablas Relacionadas

            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Modelo347Lineas_Datos) + "/" + nameof(Obtener_Modelo_Por_Id), true);
            }

            return g_lst_INTERNO_CTA_Modelo347Lineas_Modelo_PARALISTADO;
        }

        #endregion Modelo Por Modelo347

        #region Grabar
        public override INTERNO_ValorDevuelto_Modelo Grabar(object _mdl_obj)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                CTA_Modelo347Lineas mdl_CTA_Modelo347Lineas_AGrabar = (CTA_Modelo347Lineas)_mdl_obj;
                CTA_Modelo347Lineas mdl_CTA_Modelo347Lineas_DatosViejos = new CTA_Modelo347Lineas();

                // Ver si existe ######################################################################
                CTA_Modelo347Lineas mdl_CTA_Modelo347Lineas_Final = Obtener_Modelo_Por_Id(mdl_CTA_Modelo347Lineas_AGrabar.id, false, false);
                //######################################################################################               

                if (mdl_CTA_Modelo347Lineas_Final != null)
                {
                    //Tipo de Accion que se va a realizar
                    mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_MODIFICAR;

                    //Datos viejos para la trazabilidad
                    Funciones.CopiarPropiedadesObjetos(mdl_CTA_Modelo347Lineas_Final, mdl_CTA_Modelo347Lineas_DatosViejos, false, false);

                    //Cargar los Datos del Modelo
                    Funciones.CopiarPropiedadesObjetos(mdl_CTA_Modelo347Lineas_AGrabar, mdl_CTA_Modelo347Lineas_Final, false, false);

                    #region Update
                    string str_SQL_Update = $@" UPDATE {nameof(CTA_Modelo347Lineas)}
                                            SET 
                                                {nameof(CTA_Modelo347Lineas.idModelo347Cabecera)} = @idModelo347Cabecera,
                                                {nameof(CTA_Modelo347Lineas.codigo)} = @codigo,
                                                {nameof(CTA_Modelo347Lineas.importeCriterioCaja)} = @importeCriterioCaja,
                                                {nameof(CTA_Modelo347Lineas.depositoNoAduanero)} = @depositoNoAduanero,
                                                {nameof(CTA_Modelo347Lineas.inversionSujetoPasivo)} = @inversionSujetoPasivo,
                                                {nameof(CTA_Modelo347Lineas.operacionCriterioCaja)} = @operacionCriterioCaja,
                                                {nameof(CTA_Modelo347Lineas.nifOperadorComunitario)} = @nifOperadorComunitario,

                                                {nameof(CTA_Modelo347Lineas.importeOperaciones)} = @importeOperaciones,
                                                {nameof(CTA_Modelo347Lineas.importeTrimestre1)} = @importeTrimestre1,
                                                {nameof(CTA_Modelo347Lineas.importeTrimestre2)} = @importeTrimestre2,
                                                {nameof(CTA_Modelo347Lineas.importeTrimestre3)} = @importeTrimestre3,
                                                {nameof(CTA_Modelo347Lineas.importeTrimestre4)} = @importeTrimestre4,

                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones)} = @importeTransmisiones,
                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones1)} = @importeTransmisiones1,
                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones2)} = @importeTransmisiones2,
                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones3)} = @importeTransmisiones3,
                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones4)} = @importeTransmisiones4,

                                                {nameof(CTA_Modelo347Lineas.ejercicioCobro)} = @ejercicioCobro,
                                                {nameof(CTA_Modelo347Lineas.importeCobroMetalico)} = @importeCobroMetalico,
                                                {nameof(CTA_Modelo347Lineas.idCliente)} = @idCliente,
                                                {nameof(CTA_Modelo347Lineas.idProveedor)} = @idProveedor,
                                                {nameof(CTA_Modelo347Lineas.nifDeclarado)} = @nifDeclarado,
                                                {nameof(CTA_Modelo347Lineas.nifRepresentanteLegal)} = @nifRepresentanteLegal,
                                                {nameof(CTA_Modelo347Lineas.codigoProvincia)} = @codigoProvincia,
                                                {nameof(CTA_Modelo347Lineas.codigoPais)} = @codigoPais,
                                                {nameof(CTA_Modelo347Lineas.claveOperacion)} = @claveOperacion,
                                                {nameof(CTA_Modelo347Lineas.operacionSeguro)} = @operacionSeguro,
                                                {nameof(CTA_Modelo347Lineas.arrendamientoLocal)} = @arrendamientoLocal,
                                                {nameof(CTA_Modelo347Lineas.tipoHoja)} = @tipoHoja
                                            WHERE {nameof(CTA_Modelo347Lineas.id)} = @id";
                    //Parametros
                    object[] arr_Parametros_Update = new object[]
                    {
                        new SqlParameter("@idModelo347Cabecera",  mdl_CTA_Modelo347Lineas_Final.idModelo347Cabecera),
                        new SqlParameter("@codigo",  mdl_CTA_Modelo347Lineas_Final.codigo),
                        new SqlParameter("@importeCriterioCaja",  mdl_CTA_Modelo347Lineas_Final.importeCriterioCaja ?? (dynamic) DBNull.Value),
                        new SqlParameter("@depositoNoAduanero",  mdl_CTA_Modelo347Lineas_Final.depositoNoAduanero ?? (dynamic) DBNull.Value),
                        new SqlParameter("@inversionSujetoPasivo",  mdl_CTA_Modelo347Lineas_Final.inversionSujetoPasivo ?? (dynamic) DBNull.Value),
                        new SqlParameter("@operacionCriterioCaja",  mdl_CTA_Modelo347Lineas_Final.operacionCriterioCaja ?? (dynamic) DBNull.Value),
                        new SqlParameter("@nifOperadorComunitario",  mdl_CTA_Modelo347Lineas_Final.nifOperadorComunitario ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeOperaciones",  mdl_CTA_Modelo347Lineas_Final.importeOperaciones),
                        new SqlParameter("@importeTrimestre1",  mdl_CTA_Modelo347Lineas_Final.importeTrimestre1 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTrimestre2",  mdl_CTA_Modelo347Lineas_Final.importeTrimestre2 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTrimestre3",  mdl_CTA_Modelo347Lineas_Final.importeTrimestre3 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTrimestre4",  mdl_CTA_Modelo347Lineas_Final.importeTrimestre4 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones1",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones1 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones2",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones2 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones3",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones3 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones4",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones4 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@ejercicioCobro",  mdl_CTA_Modelo347Lineas_Final.ejercicioCobro ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeCobroMetalico",  mdl_CTA_Modelo347Lineas_Final.importeCobroMetalico ?? (dynamic) DBNull.Value),
                        new SqlParameter("@idCliente",  mdl_CTA_Modelo347Lineas_Final.idCliente ?? (dynamic) DBNull.Value),
                        new SqlParameter("@idProveedor",  mdl_CTA_Modelo347Lineas_Final.idProveedor ?? (dynamic) DBNull.Value),
                        new SqlParameter("@nifDeclarado",  mdl_CTA_Modelo347Lineas_Final.nifDeclarado ?? (dynamic) DBNull.Value),
                        new SqlParameter("@nifRepresentanteLegal",  mdl_CTA_Modelo347Lineas_Final.nifRepresentanteLegal ?? (dynamic) DBNull.Value),
                        new SqlParameter("@codigoProvincia",  mdl_CTA_Modelo347Lineas_Final.codigoProvincia ?? (dynamic) DBNull.Value),
                        new SqlParameter("@codigoPais",  mdl_CTA_Modelo347Lineas_Final.codigoPais ?? (dynamic) DBNull.Value),
                        new SqlParameter("@claveOperacion",  mdl_CTA_Modelo347Lineas_Final.claveOperacion ?? (dynamic) DBNull.Value),
                        new SqlParameter("@operacionSeguro",  mdl_CTA_Modelo347Lineas_Final.operacionSeguro ?? (dynamic) DBNull.Value),
                        new SqlParameter("@arrendamientoLocal",  mdl_CTA_Modelo347Lineas_Final.arrendamientoLocal ?? (dynamic) DBNull.Value),
                        new SqlParameter("@tipoHoja",  mdl_CTA_Modelo347Lineas_Final.tipoHoja ?? (dynamic) DBNull.Value),
                        new SqlParameter("@id",  mdl_CTA_Modelo347Lineas_Final.id),
                    };
                    #endregion

                    //Update
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Update, arr_Parametros_Update);

                    //Id de la tabla
                    mdl_INTERNO_ValorDevuelto_Modelo.Id = mdl_CTA_Modelo347Lineas_Final.id;
                }
                else
                {
                    mdl_CTA_Modelo347Lineas_Final = new CTA_Modelo347Lineas();

                    //Tipo de Accion que se va a realizar
                    mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_INSERTAR;

                    //Cargar los Datos del Modelo
                    Funciones.CopiarPropiedadesObjetos(mdl_CTA_Modelo347Lineas_AGrabar, mdl_CTA_Modelo347Lineas_Final, false, false);

                    #region INSERT
                    string str_SQL_Insert = $@" INSERT INTO {nameof(CTA_Modelo347Lineas)}
                                                (
                                                    {nameof(CTA_Modelo347Lineas.idModelo347Cabecera)},
                                                    {nameof(CTA_Modelo347Lineas.codigo)},
                                                    {nameof(CTA_Modelo347Lineas.importeCriterioCaja)},
                                                    {nameof(CTA_Modelo347Lineas.depositoNoAduanero)},
                                                    {nameof(CTA_Modelo347Lineas.inversionSujetoPasivo)},
                                                    {nameof(CTA_Modelo347Lineas.operacionCriterioCaja)},
                                                    {nameof(CTA_Modelo347Lineas.nifOperadorComunitario)},

                                                    {nameof(CTA_Modelo347Lineas.importeOperaciones)},
                                                    {nameof(CTA_Modelo347Lineas.importeTrimestre1)},
                                                    {nameof(CTA_Modelo347Lineas.importeTrimestre2)},
                                                    {nameof(CTA_Modelo347Lineas.importeTrimestre3)},
                                                    {nameof(CTA_Modelo347Lineas.importeTrimestre4)},

                                                    {nameof(CTA_Modelo347Lineas.importeTransmisiones)},
                                                    {nameof(CTA_Modelo347Lineas.importeTransmisiones1)},
                                                    {nameof(CTA_Modelo347Lineas.importeTransmisiones2)},
                                                    {nameof(CTA_Modelo347Lineas.importeTransmisiones3)},
                                                    {nameof(CTA_Modelo347Lineas.importeTransmisiones4)},

                                                    {nameof(CTA_Modelo347Lineas.ejercicioCobro)},
                                                    {nameof(CTA_Modelo347Lineas.importeCobroMetalico)},
                                                    {nameof(CTA_Modelo347Lineas.idCliente)},
                                                    {nameof(CTA_Modelo347Lineas.idProveedor)},
                                                    {nameof(CTA_Modelo347Lineas.nifDeclarado)},
                                                    {nameof(CTA_Modelo347Lineas.nifRepresentanteLegal)},
                                                    {nameof(CTA_Modelo347Lineas.codigoProvincia)},
                                                    {nameof(CTA_Modelo347Lineas.codigoPais)},
                                                    {nameof(CTA_Modelo347Lineas.claveOperacion)},
                                                    {nameof(CTA_Modelo347Lineas.operacionSeguro)},
                                                    {nameof(CTA_Modelo347Lineas.arrendamientoLocal)},
                                                    {nameof(CTA_Modelo347Lineas.tipoHoja)}
                                                )
                                                OUTPUT INSERTED.{nameof(CTA_Modelo347Lineas.id)}
                                                VALUES
                                                (
                                                    @idModelo347Cabecera,
                                                    @codigo,
                                                    @importeCriterioCaja,
                                                    @depositoNoAduanero,
                                                    @inversionSujetoPasivo,
                                                    @operacionCriterioCaja,
                                                    @nifOperadorComunitario,

                                                    @importeOperaciones,
                                                    @importeTrimestre1,
                                                    @importeTrimestre2,
                                                    @importeTrimestre3,
                                                    @importeTrimestre4,

                                                    @importeTransmisiones,
                                                    @importeTransmisiones1,
                                                    @importeTransmisiones2,
                                                    @importeTransmisiones3,
                                                    @importeTransmisiones4,

                                                    @ejercicioCobro,
                                                    @importeCobroMetalico,
                                                    @idCliente,
                                                    @idProveedor,
                                                    @nifDeclarado,
                                                    @nifRepresentanteLegal,
                                                    @codigoProvincia,
                                                    @codigoPais,
                                                    @claveOperacion,
                                                    @operacionSeguro,
                                                    @arrendamientoLocal,
                                                    @tipoHoja
                                                )";
                    //Parametros
                    object[] arr_Parametros_Insert = new object[]
                    {
                        new SqlParameter("@idModelo347Cabecera",  mdl_CTA_Modelo347Lineas_Final.idModelo347Cabecera),
                        new SqlParameter("@codigo",  mdl_CTA_Modelo347Lineas_Final.codigo),
                        new SqlParameter("@importeCriterioCaja",  mdl_CTA_Modelo347Lineas_Final.importeCriterioCaja ?? (dynamic) DBNull.Value),
                        new SqlParameter("@depositoNoAduanero",  mdl_CTA_Modelo347Lineas_Final.depositoNoAduanero ?? (dynamic) DBNull.Value),
                        new SqlParameter("@inversionSujetoPasivo",  mdl_CTA_Modelo347Lineas_Final.inversionSujetoPasivo ?? (dynamic) DBNull.Value),
                        new SqlParameter("@operacionCriterioCaja",  mdl_CTA_Modelo347Lineas_Final.operacionCriterioCaja ?? (dynamic) DBNull.Value),
                        new SqlParameter("@nifOperadorComunitario",  mdl_CTA_Modelo347Lineas_Final.nifOperadorComunitario ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeOperaciones",  mdl_CTA_Modelo347Lineas_Final.importeOperaciones),
                        new SqlParameter("@importeTrimestre1",  mdl_CTA_Modelo347Lineas_Final.importeTrimestre1 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTrimestre2",  mdl_CTA_Modelo347Lineas_Final.importeTrimestre2 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTrimestre3",  mdl_CTA_Modelo347Lineas_Final.importeTrimestre3 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTrimestre4",  mdl_CTA_Modelo347Lineas_Final.importeTrimestre4 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones1",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones1 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones2",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones2 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones3",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones3 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeTransmisiones4",  mdl_CTA_Modelo347Lineas_Final.importeTransmisiones4 ?? (dynamic) DBNull.Value),
                        new SqlParameter("@ejercicioCobro",  mdl_CTA_Modelo347Lineas_Final.ejercicioCobro ?? (dynamic) DBNull.Value),
                        new SqlParameter("@importeCobroMetalico",  mdl_CTA_Modelo347Lineas_Final.importeCobroMetalico ?? (dynamic) DBNull.Value),
                        new SqlParameter("@idCliente",  mdl_CTA_Modelo347Lineas_Final.idCliente ?? (dynamic) DBNull.Value),
                        new SqlParameter("@idProveedor",  mdl_CTA_Modelo347Lineas_Final.idProveedor ?? (dynamic) DBNull.Value),
                        new SqlParameter("@nifDeclarado",  mdl_CTA_Modelo347Lineas_Final.nifDeclarado ?? (dynamic) DBNull.Value),
                        new SqlParameter("@nifRepresentanteLegal",  mdl_CTA_Modelo347Lineas_Final.nifRepresentanteLegal ?? (dynamic) DBNull.Value),
                        new SqlParameter("@codigoProvincia",  mdl_CTA_Modelo347Lineas_Final.codigoProvincia ?? (dynamic) DBNull.Value),
                        new SqlParameter("@codigoPais",  mdl_CTA_Modelo347Lineas_Final.codigoPais ?? (dynamic) DBNull.Value),
                        new SqlParameter("@claveOperacion",  mdl_CTA_Modelo347Lineas_Final.claveOperacion ?? (dynamic) DBNull.Value),
                        new SqlParameter("@operacionSeguro",  mdl_CTA_Modelo347Lineas_Final.operacionSeguro ?? (dynamic) DBNull.Value),
                        new SqlParameter("@arrendamientoLocal",  mdl_CTA_Modelo347Lineas_Final.arrendamientoLocal ?? (dynamic) DBNull.Value),
                        new SqlParameter("@tipoHoja",  mdl_CTA_Modelo347Lineas_Final.tipoHoja ?? (dynamic) DBNull.Value),
                    };
                    #endregion

                    //Id de la tabla
                    mdl_INTERNO_ValorDevuelto_Modelo.Id = obj_Exferia_Entities.Database.SqlQuery<long>(str_SQL_Insert, arr_Parametros_Insert).Single();
                }

                // Grabar un registro de trazabilidad con los datos de la transaccion realizada.
                Datos_Generales.USR_Trazabilidad_Grabar(typeof(CTA_Modelo347Lineas), mdl_CTA_Modelo347Lineas_DatosViejos, mdl_CTA_Modelo347Lineas_Final, mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion, obj_Exferia_Entities);
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Modelo347Lineas_Datos) + "/" + nameof(Grabar), true);
            }
            finally
            {
                //Finalizar transaccion
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public INTERNO_ValorDevuelto_Modelo GrabarMultiple(List<CTA_Modelo347Lineas> _lst)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;


                //Tipo de Accion que se va a realizar
                mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_INSERTAR;
                int chunkSize = 10;
                var q_list = _lst.Select(e => ObtenerInsert(e));
                var str_query = "";
                for (int i = 0; i < q_list.Count(); i += chunkSize)
                {
                    str_query = q_list.Skip(i).Take(chunkSize).Aggregate("", (acc, curr) => acc += $"\n{curr}");
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_query);
                }

                // Grabar un registro de trazabilidad con los datos de la transaccion realizada.
                Datos_Generales.USR_Trazabilidad_Grabar(typeof(string), "", "", mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion, obj_Exferia_Entities);
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTA_Modelo347Lineas_Datos) + "/" + nameof(Grabar), true);
            }
            finally
            {
                //Finalizar transaccion
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private string ObtenerInsert(CTA_Modelo347Lineas mdl)
        {
            return String.Join(" ", $@"INSERT INTO {nameof(CTA_Modelo347Lineas)}
                                            (
                                                {nameof(CTA_Modelo347Lineas.idModelo347Cabecera)},
                                                {nameof(CTA_Modelo347Lineas.codigo)},
                                                {nameof(CTA_Modelo347Lineas.importeCriterioCaja)},
                                                {nameof(CTA_Modelo347Lineas.depositoNoAduanero)},
                                                {nameof(CTA_Modelo347Lineas.inversionSujetoPasivo)},
                                                {nameof(CTA_Modelo347Lineas.operacionCriterioCaja)},
                                                {nameof(CTA_Modelo347Lineas.nifOperadorComunitario)},

                                                {nameof(CTA_Modelo347Lineas.importeOperaciones)},
                                                {nameof(CTA_Modelo347Lineas.importeTrimestre1)},
                                                {nameof(CTA_Modelo347Lineas.importeTrimestre2)},
                                                {nameof(CTA_Modelo347Lineas.importeTrimestre3)},
                                                {nameof(CTA_Modelo347Lineas.importeTrimestre4)},

                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones)},
                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones1)},
                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones2)},
                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones3)},
                                                {nameof(CTA_Modelo347Lineas.importeTransmisiones4)},

                                                {nameof(CTA_Modelo347Lineas.ejercicioCobro)},
                                                {nameof(CTA_Modelo347Lineas.importeCobroMetalico)},
                                                {nameof(CTA_Modelo347Lineas.idCliente)},
                                                {nameof(CTA_Modelo347Lineas.idProveedor)},
                                                {nameof(CTA_Modelo347Lineas.nifDeclarado)},
                                                {nameof(CTA_Modelo347Lineas.nifRepresentanteLegal)},
                                                {nameof(CTA_Modelo347Lineas.codigoProvincia)},
                                                {nameof(CTA_Modelo347Lineas.codigoPais)},
                                                {nameof(CTA_Modelo347Lineas.claveOperacion)},
                                                {nameof(CTA_Modelo347Lineas.operacionSeguro)},
                                                {nameof(CTA_Modelo347Lineas.arrendamientoLocal)},
                                                {nameof(CTA_Modelo347Lineas.tipoHoja)}
                                            )
                                            VALUES
                                            (
                                                {NumSQL(mdl.idModelo347Cabecera)},
                                                {StrSQL(mdl.codigo)},
                                                {NumSQL(mdl.importeCriterioCaja)},
                                                {StrSQL(mdl.depositoNoAduanero)},
                                                {StrSQL(mdl.inversionSujetoPasivo)},
                                                {StrSQL(mdl.operacionCriterioCaja)},
                                                {StrSQL(mdl.nifOperadorComunitario)},

                                                {NumSQL(mdl.importeOperaciones)},
                                                {NumSQL(mdl.importeTrimestre1)},
                                                {NumSQL(mdl.importeTrimestre2)},
                                                {NumSQL(mdl.importeTrimestre3)},
                                                {NumSQL(mdl.importeTrimestre4)},

                                                {NumSQL(mdl.importeTransmisiones)},
                                                {NumSQL(mdl.importeTransmisiones1)},
                                                {NumSQL(mdl.importeTransmisiones2)},
                                                {NumSQL(mdl.importeTransmisiones3)},
                                                {NumSQL(mdl.importeTransmisiones4)},

                                                {StrSQL(mdl.ejercicioCobro)},
                                                {NumSQL(mdl.importeCobroMetalico)},
                                                {NumSQL(mdl.idCliente)},
                                                {NumSQL(mdl.idProveedor)},
                                                {StrSQL(mdl.nifDeclarado)},
                                                {StrSQL(mdl.nifRepresentanteLegal)},
                                                {StrSQL(mdl.codigoProvincia)},
                                                {StrSQL(mdl.codigoPais)},
                                                {StrSQL(mdl.claveOperacion)},
                                                {StrSQL(mdl.operacionSeguro)},
                                                {StrSQL(mdl.arrendamientoLocal)},
                                                {StrSQL(mdl.tipoHoja)}
                                            );".Split(' ').Where(e => !String.IsNullOrEmpty(e))).Replace("\r\n", "").Replace("\n", "").Replace("\r", "");
        }

        private string StrSQL(string valor)
        {
            return valor != null? $"'{valor}'" : "NULL";
        }
        private string NumSQL(decimal? valor)
        {
            return valor != null ? $"{valor.ToString().Replace(",", ".")}" : "NULL";
        }
        private string NumSQL(long? valor)
        {
            return valor != null ? $"{valor.ToString().Replace(",", ".")}" : "NULL";
        }
        #endregion

        #region Borrar
        public override INTERNO_ValorDevuelto_Modelo Borrar(long _lng_id)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            //Tipo de Accion que se va a realizar
            mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;

            bool bol_ActualizarFechaBorrado = false;//Este campo se utiliza por si no se puede borrar, que actualice la fecha de borrado

            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    obj_Exferia_Entities = new Exferia_Entities();
                    obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                    // Ver si existe ######################################################################
                    CTA_Modelo347Lineas mdl_CTA_Modelo347Lineas_Final = Obtener_Modelo_Por_Id(_lng_id, false, false);
                    //######################################################################################

                    if (mdl_CTA_Modelo347Lineas_Final != null)
                    {
                        //Se intenta borrar, si diera un error porque esta relacionado se graba la fecha de baja
                        try
                        {
                            #region Delete
                            string str_SQL_Delete = " DELETE FROM  " + nameof(CTA_Modelo347Lineas) +
                                                    " WHERE " +
                                                        nameof(CTA_Modelo347Lineas.id) + "=@id";
                            //Parametros
                            object[] arr_Parametros_Delete = new object[]
                            {
                                new SqlParameter("@id", _lng_id)
                            };
                            #endregion

                            //Delete
                            obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Delete, arr_Parametros_Delete);

                            //Grabar un registro de trazabailidad con los datos de la transaccion realizada.
                            Datos_Generales.USR_Trazabilidad_Grabar(typeof(CTA_Conceptos), null, mdl_CTA_Modelo347Lineas_Final, G_ENUM_TIPOACCION.INT_ELIMINAR, obj_Exferia_Entities);
                        }
                        catch (Exception ex)
                        {
                            var sqlException = ex.GetBaseException() as SqlException;
                            if (sqlException != null)
                            {
                                if (sqlException.Errors.Count > 0)
                                {
                                    switch (sqlException.Errors[0].Number)
                                    {
                                        case Control_Errores.G_INT_ERRORCONTROLADO_BORRAR_CONFLICTO_CLAVEFORANEA: // Foreign Key violation
                                            bol_ActualizarFechaBorrado = true;
                                            break;
                                        default:
                                            throw;
                                    }
                                }
                            }
                            else
                            {
                                throw;
                            }
                        }

                        //Actualizar la fecha de baja, al no poder borrarlo por tener relaciones
                        if (bol_ActualizarFechaBorrado)
                        {
                            #region Update
                            string str_SQL_Update = " UPDATE " + nameof(CTA_Conceptos) +
                                                        " SET " +
                                                        nameof(CTA_Conceptos.fechaBorrado) + "=@fechaBorrado " +
                                                    " WHERE " +
                                                        nameof(CTA_Conceptos.id) + "=@id";
                            //Parametros
                            object[] arr_Parametros_Update = new object[]
                            {
                                 new SqlParameter("@fechaBorrado",  DateTime.Now),
                                new SqlParameter("@id", _lng_id)
                            };
                            #endregion

                            //Update
                            obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Update, arr_Parametros_Update);

                            //Grabar un registro de trazabilidad con los datos de la trasaccion realizada
                            Datos_Generales.USR_Trazabilidad_Grabar(typeof(CTA_Conceptos), null, mdl_CTA_Modelo347Lineas_Final, G_ENUM_TIPOACCION.INT_ELIMINAR, obj_Exferia_Entities);
                        }
                    }

                    //Devolver tambien el Objeto
                    mdl_INTERNO_ValorDevuelto_Modelo.Id = _lng_id;

                    // se termina la Trasaccion Correctamente
                    transaccion_SQL.Complete();
                }
                catch (Control_Errores)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    throw new Control_Errores("", ex, nameof(CTA_Conceptos_Datos) + "/" + nameof(Borrar), true);
                }
                finally
                {
                    obj_Exferia_Entities.Database.Connection.Close();
                    obj_Exferia_Entities.Dispose();

                    // Finalizar transaccion
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(long _lng_id, long _lng_idAuxiliar)
        {
            throw new NotImplementedException();
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(object _mdl_obj)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            //Tipo de Accion que se va a realizar
            mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;

            List<long> lst_ids_ABorrar = (List<long>)_mdl_obj;
            if (lst_ids_ABorrar != null & lst_ids_ABorrar.Count > 0)
            {
                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(lst_ids_ABorrar);
                using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
                {
                    try
                    {
                        obj_Exferia_Entities = new Exferia_Entities();

                        //Se intenta borrar, si diera un error porque esta relacionado se graba la fecha de baja
                        try
                        {
                            #region Delete
                            string str_SQL_Delete = $@"DELETE FROM {nameof(CTA_Modelo347Lineas)}
                                                    WHERE {nameof(CTA_Modelo347Lineas.id)} in ( {str_Filtro_IDS} )";

                            #endregion

                            //Delete
                            obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Delete);
                        }
                        catch (Exception ex)
                        {
                            throw;
                        }

                        // se termina la Trasaccion Correctamente
                        transaccion_SQL.Complete();
                    }

                    catch (Control_Errores)
                    {
                        throw;
                    }
                    catch (Exception ex)
                    {
                        throw new Control_Errores("", ex, nameof(CTA_Conceptos_Datos) + "/" + nameof(Borrar), true);
                    }
                    finally
                    {
                        obj_Exferia_Entities.Database.Connection.Close();
                        obj_Exferia_Entities.Dispose();

                        // Finalizar transaccion
                        transaccion_SQL.Dispose();
                    }
                }
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public INTERNO_ValorDevuelto_Modelo BorrarPorIdsCabecera(List<long> _lst_ids)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            //Tipo de Accion que se va a realizar
            mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
            if ((_lst_ids?.Count ?? 0) > 0)
            {
                string str_Filtro_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(_lst_ids);
                using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
                {
                    try
                    {
                        obj_Exferia_Entities = new Exferia_Entities();

                        try
                        {
                            string str_SQL_Delete = $@"DELETE FROM {nameof(CTA_Modelo347Lineas)}
                                                WHERE {nameof(CTA_Modelo347Lineas.idModelo347Cabecera)} IN ( {str_Filtro_IDS} )";
                            //Delete
                            obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Delete);
                        }
                        catch (Exception ex)
                        {
                            throw;
                        }

                        // se termina la Trasaccion Correctamente
                        transaccion_SQL.Complete();
                    }

                    catch (Control_Errores)
                    {
                        throw;
                    }
                    catch (Exception ex)
                    {
                        throw new Control_Errores("", ex, nameof(CTA_Conceptos_Datos) + "/" + nameof(Borrar), true);
                    }
                    finally
                    {
                        obj_Exferia_Entities.Database.Connection.Close();
                        obj_Exferia_Entities.Dispose();

                        // Finalizar transaccion
                        transaccion_SQL.Dispose();
                    }
                }
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        private string Obtener_Consulta_Para_Listado(string columnas = null)
        {
            return $@"
                SELECT
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.id)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.idModelo347Cabecera)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.idCliente)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.idProveedor)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.codigo)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.nifDeclarado)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.nifRepresentanteLegal)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.tipoHoja)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.codigoProvincia)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.codigoPais)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.claveOperacion)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeOperaciones)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.arrendamientoLocal)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeCobroMetalico)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeTransmisiones)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.ejercicioCobro)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeTrimestre1)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeTrimestre2)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeTrimestre3)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeTrimestre4)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeTransmisiones1)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeTransmisiones2)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeTransmisiones3)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeTransmisiones4)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.nifOperadorComunitario)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.operacionCriterioCaja)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.inversionSujetoPasivo)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.depositoNoAduanero)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.operacionSeguro)},
                    {nameof(CTA_Modelo347Lineas)}.{nameof(CTA_Modelo347Lineas.importeCriterioCaja)}
                    {(!String.IsNullOrEmpty(columnas) ? $", {columnas}" : "")}
                FROM  {nameof(CTA_Modelo347Lineas)}
            ";

        }
    }
}
