using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Listado_Filtros;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General.General;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exferia_General._1_Datos
{
    public class Compartidas_Datos
    {
        public static bool Comprobar_Conexion_SQLServer()
        {
            bool bol_ValorDevuelto = false;

            if (Conexion.ComprobarConexion(Variables.G_STR_CONEXION_SERVIDOR, Variables.G_STR_CONEXION_BASEDATOS, Variables.G_STR_CONEXION_USUARIO, Variables.G_STR_CONEXION_CLAVE) == false)
            {
                PE_ConexionBD frm_PE_ConexionBD = new PE_ConexionBD(true);
                frm_PE_ConexionBD.ShowDialog();

                if (frm_PE_ConexionBD.g_bol_ConexionCorrecta == false)
                {
                    bol_ValorDevuelto = false;
                }
                else
                {
                    bol_ValorDevuelto = true;
                }
            }
            else
            {
                bol_ValorDevuelto = true;
            }

            return bol_ValorDevuelto;
        }

        /// <summary>
        /// Buscar en la tabla definida si el campo recibido esta ya introducido
        /// </summary>
        /// <param name="_str_Tabla_Nombre"></param>
        /// <param name="_str_Campo_Nombre"></param>
        /// <param name="_str_Campo_Valor"></param>
        /// <param name="_str_CampoID_Nombre"></param>
        /// <param name="_lng_CampoID_Valor"></param>
        /// <param name="_str_CampoEmpresa_Nombre"></param>
        /// <param name="_lng_CampoEmpresa_Valor"></param>
        /// <param name="_bol_TieneFechaBorrado"></param>
        /// <returns></returns>
        public static bool Buscar_CodigoRepetido(string _str_Tabla_Nombre,
                                                 string _str_Campo_Nombre,
                                                 string _str_Campo_Valor,
                                                 string _str_CampoID_Nombre,
                                                 long? _lng_CampoID_Valor,
                                                 string _str_CampoEmpresa_Nombre,
                                                 long _lng_CampoEmpresa_Valor,
                                                 bool _bol_TieneFechaBorrado)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            bool bol_CodigoRepetido = false;

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

                string str_SQL = "SELECT COUNT(*) as Valor FROM " + _str_Tabla_Nombre + " WHERE " + _str_Campo_Nombre + "='" + _str_Campo_Valor + "'";

                //Filtrar si tueviera el Empresa Relacionada
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_SQL += " AND " + _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor;
                }

                //Filtrar que la fecha Borrado sea Nual si la Tuviera
                if (_bol_TieneFechaBorrado)
                {
                    str_SQL += " AND fechaBorrado is null ";
                }

                // Consulta .............................................................
                if (_lng_CampoID_Valor != null && _lng_CampoID_Valor.Value > -1)
                {

                    str_SQL += " AND " + _str_CampoID_Nombre + "<>" + _lng_CampoID_Valor;
                }

                INTERNA_SQLQUERY_INT mdl_INTERNA_SQLQUERY_INT = obj_Exferia_Entities.Database.SqlQuery<INTERNA_SQLQUERY_INT>(str_SQL).FirstOrDefault();

                if (mdl_INTERNA_SQLQUERY_INT != null && mdl_INTERNA_SQLQUERY_INT.Valor > 0)
                {
                    bol_CodigoRepetido = true;
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(Compartidas_Datos) + "/" + nameof(Buscar_CodigoRepetido), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return bol_CodigoRepetido;
        }
        /// <summary>
        /// Buscar en la tabla definida si el campo recibido esta ya introducido
        /// </summary>
        /// <param name="_str_Tabla_Nombre"></param>
        /// <param name="_str_Campo_Nombre"></param>
        /// <param name="_str_Campo_Valor"></param>
        /// <param name="_str_CampoID_Nombre"></param>
        /// <param name="_lng_CampoID_Valor"></param>
        /// <param name="_str_CampoEmpresa_Nombre"></param>
        /// <param name="_lng_CampoEmpresa_Valor"></param>
        /// <param name="_str_CampoAuxiliar_Nombre"></param>
        /// <param name="_lng_CampoAuxiliar_Valor"></param>
        /// <param name="_bol_TieneFechaBorrado"></param>
        /// <returns></returns>
        public static bool Buscar_CodigoRepetido(string _str_Tabla_Nombre,
                                                 string _str_Campo_Nombre,
                                                 string _str_Campo_Valor,
                                                 string _str_CampoID_Nombre,
                                                 long? _lng_CampoID_Valor,
                                                 string _str_CampoEmpresa_Nombre,
                                                 long _lng_CampoEmpresa_Valor,
                                                 string _str_CampoAuxiliar_Nombre,
                                                 long _lng_CampoAuxiliar_Valor,
                                                 bool _bol_TieneFechaBorrado)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            bool bol_CodigoRepetido = false;

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

                string str_SQL = "SELECT COUNT(*) as Valor FROM " + _str_Tabla_Nombre + " WHERE " + _str_Campo_Nombre + "='" + _str_Campo_Valor + "'";

                //Campo Auxiliar
                str_SQL += " AND " + _str_CampoAuxiliar_Nombre + "=" + _lng_CampoAuxiliar_Valor;

                //Filtrar si tueviera el Empresa Relacionada
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_SQL += " AND " + _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor;
                }

                //Filtrar que la fecha Borrado sea Nual si la Tuviera
                if (_bol_TieneFechaBorrado)
                {
                    str_SQL += " AND fechaBorrado is null ";
                }

                // Consulta .............................................................
                if (_lng_CampoID_Valor != null && _lng_CampoID_Valor.Value > -1)
                {

                    str_SQL += " AND " + _str_CampoID_Nombre + "<>" + _lng_CampoID_Valor;
                }

                INTERNA_SQLQUERY_INT mdl_INTERNA_SQLQUERY_INT = obj_Exferia_Entities.Database.SqlQuery<INTERNA_SQLQUERY_INT>(str_SQL).FirstOrDefault();

                if (mdl_INTERNA_SQLQUERY_INT != null && mdl_INTERNA_SQLQUERY_INT.Valor > 0)
                {
                    bol_CodigoRepetido = true;
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(Compartidas_Datos) + "/" + nameof(Buscar_CodigoRepetido), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return bol_CodigoRepetido;
        }

        /// <summary>
        /// Buscar en la tabla definida si el campo recibido esta ya introducido
        /// </summary>
        /// <param name="_str_Tabla_Nombre"></param>
        /// <param name="_str_Campo_Nombre"></param>
        /// <param name="_str_Campo_Valor"></param>
        /// <param name="_str_CampoID_Nombre"></param>
        /// <param name="_lng_CampoID_Valor"></param>
        /// <param name="_str_CampoEmpresa_Nombre"></param>
        /// <param name="_lng_CampoEmpresa_Valor"></param>
        /// <param name="_str_CampoAuxiliar_Nombre"></param>
        /// <param name="_lng_CampoAuxiliar_Valor"></param>
        /// <param name="_bol_TieneFechaBorrado"></param>
        /// <param name="_str_CampoFecha_Nombre"></param>
        /// <param name="_dtt_FechaInicio_Ejercicio"></param>
        /// <param name="_dtt_FechaFin_Ejercicio"></param>
        /// <returns></returns>
        public static bool Buscar_CodigoRepetido(string _str_Tabla_Nombre,
                                                 string _str_Campo_Nombre,
                                                 string _str_Campo_Valor,
                                                 string _str_CampoID_Nombre,
                                                 long? _lng_CampoID_Valor,
                                                 string _str_CampoEmpresa_Nombre,
                                                 long _lng_CampoEmpresa_Valor,
                                                 string _str_CampoAuxiliar_Nombre,
                                                 long _lng_CampoAuxiliar_Valor,
                                                 bool _bol_TieneFechaBorrado,
                                                 string _str_CampoFecha_Nombre,
                                                 DateTime _dtt_FechaInicio_Ejercicio,
                                                 DateTime _dtt_FechaFin_Ejercicio)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            bool bol_CodigoRepetido = false;

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

                string str_SQL = "SELECT COUNT(*) as Valor FROM " + _str_Tabla_Nombre + " WHERE " + _str_Campo_Nombre + "='" + _str_Campo_Valor + "'";

                #region WHERE
                //Campo Auxiliar
                if (_str_CampoAuxiliar_Nombre.Trim().Length > 0)
                {
                    str_SQL += " AND " + _str_CampoAuxiliar_Nombre + "=" + _lng_CampoAuxiliar_Valor ;
                }

                //Filtrar si tueviera el Empresa Relacionada
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_SQL += " AND " + _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor;
                }

                //Filtrar que la fecha Borrado sea Nual si la Tuviera
                if (_bol_TieneFechaBorrado)
                {
                    str_SQL += " AND fechaBorrado is null ";
                }

                //Filtrar si tuviera rango de fechas (Ejercicio)
                if (_str_CampoFecha_Nombre.Trim().Length > 0)
                {
                    str_SQL += " AND " + _str_CampoFecha_Nombre + ">='" + _dtt_FechaInicio_Ejercicio.ToString() + "' AND " + _str_CampoFecha_Nombre + "<='" + _dtt_FechaFin_Ejercicio.ToString() + "' ";
                }

                // Consulta .............................................................
                if (_lng_CampoID_Valor != null && _lng_CampoID_Valor.Value > -1)
                {

                    str_SQL += " AND " + _str_CampoID_Nombre + "<>" + _lng_CampoID_Valor;
                }
                #endregion


                INTERNA_SQLQUERY_INT mdl_INTERNA_SQLQUERY_INT = obj_Exferia_Entities.Database.SqlQuery<INTERNA_SQLQUERY_INT>(str_SQL).FirstOrDefault();

                if (mdl_INTERNA_SQLQUERY_INT != null && mdl_INTERNA_SQLQUERY_INT.Valor > 0)
                {
                    bol_CodigoRepetido = true;
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(Compartidas_Datos) + "/" + nameof(Buscar_CodigoRepetido), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return bol_CodigoRepetido;
        }

        /// <summary>
        /// Buscar en la tabla definida el codigo siguiente
        /// </summary>
        /// <param name="_str_Tabla_Nombre"></param>
        /// <param name="_str_Campo_Nombre"></param>
        /// <param name="_str_CampoEmpresa_Nombre"></param>
        /// <param name="_lng_CampoEmpresa_Valor"></param>
        /// <param name="_bol_TieneFechaBorrado"></param>
        /// <returns></returns>
        public static string Buscar_CodigoSiguiente(string _str_Tabla_Nombre,
                                                    string _str_Campo_Nombre,
                                                    string _str_CampoEmpresa_Nombre,
                                                    long _lng_CampoEmpresa_Valor,
                                                    bool _bol_TieneFechaBorrado,
                                                    int _int_Campo_CaracteresMaximo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            string str_CodigoSiguiente = "1";

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

                string str_SQL = "SELECT convert(bigint," + _str_Campo_Nombre + ") as Valor FROM " + _str_Tabla_Nombre + " WHERE ISNUMERIC(" + _str_Campo_Nombre + " + '.0e0')= 1";

                //Filtrar si tueviera el Empresa Relacionada
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_SQL += " AND " + _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor;
                }

                //Filtrar que la fecha Borrado sea Nula si la Tuviera
                if (_bol_TieneFechaBorrado)
                {
                    str_SQL += " AND fechaBorrado is null ";
                }

                //Orden
                str_SQL += " ORDER BY convert(bigint," + _str_Campo_Nombre + ") DESC ";

                INTERNA_SQLQUERY_LONG mdl_INTERNA_SQLQUERY_LONG = obj_Exferia_Entities.Database.SqlQuery<INTERNA_SQLQUERY_LONG>(str_SQL).FirstOrDefault();

                if (mdl_INTERNA_SQLQUERY_LONG != null && mdl_INTERNA_SQLQUERY_LONG.Valor > 0)
                {
                    str_CodigoSiguiente = (mdl_INTERNA_SQLQUERY_LONG.Valor + 1).ToString();
                }

                //Si el tamaño del campo es menor que el del valor calculado
                if (str_CodigoSiguiente.Length> _int_Campo_CaracteresMaximo)
                {
                    str_CodigoSiguiente = "-1";
                }

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

            return str_CodigoSiguiente;
        }


        /// <summary>
        /// Buscar en la tabla definida el codigo siguiente
        /// </summary>
        /// <param name="_str_Tabla_Nombre"></param>
        /// <param name="_str_Campo_Nombre"></param>
        /// <param name="_str_CampoEmpresa_Nombre"></param>
        /// <param name="_lng_CampoEmpresa_Valor"></param>
        /// <param name="_str_CampoAuxiliar_Nombre"></param>
        /// <param name="_lng_CampoAuxiliar_Valor"></param>
        /// <param name="_bol_TieneFechaBorrado"></param>
        /// <returns></returns>
        public static string Buscar_CodigoSiguiente(string _str_Tabla_Nombre,
                                                    string _str_Campo_Nombre,
                                                    string _str_CampoEmpresa_Nombre,
                                                    long _lng_CampoEmpresa_Valor,
                                                    string _str_CampoAuxiliar_Nombre,
                                                    long _lng_CampoAuxiliar_Valor,
                                                    bool _bol_TieneFechaBorrado,
                                                    int _int_Campo_CaracteresMaximo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            string str_CodigoSiguiente = "1";

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

                string str_SQL = "SELECT convert(bigint," + _str_Campo_Nombre + ") as Valor FROM " + _str_Tabla_Nombre + " WHERE ISNUMERIC(" + _str_Campo_Nombre + " + '.0e0')= 1";

                //Campo Auxiliar
                str_SQL += " AND " + _str_CampoAuxiliar_Nombre + "=" + _lng_CampoAuxiliar_Valor;

                //Filtrar si tueviera el Empresa Relacionada
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_SQL += " AND " + _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor;
                }

                //Filtrar que la fecha Borrado sea Nula si la Tuviera
                if (_bol_TieneFechaBorrado)
                {
                    str_SQL += " AND fechaBorrado is null ";
                }

                //Orden
                str_SQL += " ORDER BY convert(bigint," + _str_Campo_Nombre + ") DESC ";

                INTERNA_SQLQUERY_LONG mdl_INTERNA_SQLQUERY_LONG = obj_Exferia_Entities.Database.SqlQuery<INTERNA_SQLQUERY_LONG>(str_SQL).FirstOrDefault();

                if (mdl_INTERNA_SQLQUERY_LONG != null && mdl_INTERNA_SQLQUERY_LONG.Valor > 0)
                {
                    str_CodigoSiguiente = (mdl_INTERNA_SQLQUERY_LONG.Valor + 1).ToString();
                }

                //Si el tamaño del campo es menor que el del valor calculado
                if (str_CodigoSiguiente.Length > _int_Campo_CaracteresMaximo)
                {
                    str_CodigoSiguiente = "-1";
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE(), ex, nameof(Compartidas_Datos) + "/" + nameof(Buscar_CodigoSiguiente), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return str_CodigoSiguiente;
        }

        public static string Buscar_CodigoSiguiente(string _str_Tabla_Nombre,
                                                    string _str_Campo_Nombre,
                                                    string _str_CampoEmpresa_Nombre,
                                                    long _lng_CampoEmpresa_Valor,
                                                    string _str_CampoAuxiliar_Nombre,
                                                    long _lng_CampoAuxiliar_Valor,
                                                    string _str_Campo_Fecha,
                                                    DateTime _dtt_Fecha_Desde,
                                                    DateTime _dtt_Fecha_Hasta,
                                                    bool _bol_TieneFechaBorrado,
                                                    int _int_Campo_CaracteresMaximo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            string str_CodigoSiguiente = "1";

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

                string str_SQL = "SELECT convert(bigint," + _str_Campo_Nombre + ") as Valor FROM " + _str_Tabla_Nombre + " WHERE ISNUMERIC(" + _str_Campo_Nombre + " + '.0e0')= 1";

                //Campo Auxiliar
                str_SQL += " AND " + _str_CampoAuxiliar_Nombre + "=" + _lng_CampoAuxiliar_Valor;

                //Campo Auxiliar
                str_SQL += " AND " + _str_Campo_Fecha + ">='" + _dtt_Fecha_Desde.ToString() + "' " +
                           " AND " + _str_Campo_Fecha + "<='" + _dtt_Fecha_Hasta.ToString() + "' ";


                //Filtrar si tuviera el Empresa Relacionada
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_SQL += " AND " + _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor;
                }

                //Filtrar que la fecha Borrado sea Nula si la Tuviera
                if (_bol_TieneFechaBorrado)
                {
                    str_SQL += " AND fechaBorrado is null ";
                }

                //Orden
                str_SQL += " ORDER BY convert(bigint," + _str_Campo_Nombre + ") DESC ";

                INTERNA_SQLQUERY_LONG mdl_INTERNA_SQLQUERY_LONG = obj_Exferia_Entities.Database.SqlQuery<INTERNA_SQLQUERY_LONG>(str_SQL).FirstOrDefault();

                if (mdl_INTERNA_SQLQUERY_LONG != null && mdl_INTERNA_SQLQUERY_LONG.Valor > 0)
                {
                    str_CodigoSiguiente = (mdl_INTERNA_SQLQUERY_LONG.Valor + 1).ToString();
                }

                //Si el tamaño del campo es menor que el del valor calculado
                if (str_CodigoSiguiente.Length > _int_Campo_CaracteresMaximo)
                {
                    str_CodigoSiguiente = "-1";
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE(), ex, nameof(Compartidas_Datos) + "/" + nameof(Buscar_CodigoSiguiente), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return str_CodigoSiguiente;
        }

        public static string Buscar_CodigoSiguiente_Numerico(string _str_Tabla_Nombre,
                                                    string _str_Campo_Nombre,
                                                    string _str_CampoEmpresa_Nombre,
                                                    long _lng_CampoEmpresa_Valor,
                                                    bool _bol_TieneFechaBorrado,
                                                    int _int_Campo_CaracteresMaximo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            string str_CodigoSiguiente = "1";

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

                string str_SQL = "SELECT convert(bigint," + _str_Campo_Nombre + ") as Valor FROM " + _str_Tabla_Nombre;

                string str_Where = "";
                //Filtrar si tueviera el Empresa Relacionada
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_Where +=  _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor + " AND ";
                }

                //Filtrar que la fecha Borrado sea Nula si la Tuviera
                if (_bol_TieneFechaBorrado)
                {
                    str_Where += " fechaBorrado is null AND ";
                }

                if (str_Where.Trim().Length > 0)
                {
                    str_Where = str_Where.Substring(0, str_Where.Length-4);
                    str_SQL += " WHERE " + str_Where;
                }

                //Orden
                str_SQL += " ORDER BY " + _str_Campo_Nombre + " DESC ";

                INTERNA_SQLQUERY_LONG mdl_INTERNA_SQLQUERY_LONG = obj_Exferia_Entities.Database.SqlQuery<INTERNA_SQLQUERY_LONG>(str_SQL).FirstOrDefault();

                if (mdl_INTERNA_SQLQUERY_LONG != null && mdl_INTERNA_SQLQUERY_LONG.Valor > 0)
                {
                    str_CodigoSiguiente = (mdl_INTERNA_SQLQUERY_LONG.Valor + 1).ToString();
                }

                //Si el tamaño del campo es menor que el del valor calculado
                if (str_CodigoSiguiente.Length > _int_Campo_CaracteresMaximo)
                {
                    str_CodigoSiguiente = "-1";
                }

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

            return str_CodigoSiguiente;
        }

        public static string Buscar_CodigoSiguiente_Numerico(string _str_Tabla_Nombre,
                                                            string _str_Campo_Nombre,
                                                            string _str_CampoEmpresa_Nombre,
                                                            long _lng_CampoEmpresa_Valor,
                                                            string _str_CampoAuxiliar_Nombre,
                                                            long _lng_CampoAuxiliar_Valor,
                                                            bool _bol_TieneFechaBorrado,
                                                            int _int_Campo_CaracteresMaximo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            string str_CodigoSiguiente = "1";

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

                string str_SQL = "SELECT convert(bigint," + _str_Campo_Nombre + ") as Valor FROM " + _str_Tabla_Nombre + " WHERE " ;

                //Campo Auxiliar
                str_SQL += _str_CampoAuxiliar_Nombre + "=" + _lng_CampoAuxiliar_Valor;

                //Filtrar si tueviera el Empresa Relacionada
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_SQL += " AND " + _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor;
                }

                //Filtrar que la fecha Borrado sea Nula si la Tuviera
                if (_bol_TieneFechaBorrado)
                {
                    str_SQL += " AND fechaBorrado is null ";
                }

                //Orden
                str_SQL += " ORDER BY " + _str_Campo_Nombre + " DESC ";

                INTERNA_SQLQUERY_LONG mdl_INTERNA_SQLQUERY_LONG = obj_Exferia_Entities.Database.SqlQuery<INTERNA_SQLQUERY_LONG>(str_SQL).FirstOrDefault();

                if (mdl_INTERNA_SQLQUERY_LONG != null && mdl_INTERNA_SQLQUERY_LONG.Valor > 0)
                {
                    str_CodigoSiguiente = (mdl_INTERNA_SQLQUERY_LONG.Valor + 1).ToString();
                }

                //Si el tamaño del campo es menor que el del valor calculado
                if (str_CodigoSiguiente.Length > _int_Campo_CaracteresMaximo)
                {
                    str_CodigoSiguiente = "-1";
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE(), ex, nameof(Compartidas_Datos) + "/" + nameof(Buscar_CodigoSiguiente_Numerico), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return str_CodigoSiguiente;
        }

        public static string Buscar_CodigoSiguiente_Numerico(string _str_Tabla_Nombre,
                                                            string _str_Campo_Nombre,
                                                            string _str_CampoEmpresa_Nombre,
                                                            long _lng_CampoEmpresa_Valor,
                                                            string _str_CampoAuxiliar_Nombre,
                                                            long _lng_CampoAuxiliar_Valor,
                                                            bool _bol_TieneFechaBorrado,
                                                            int _int_Campo_CaracteresMaximo,
                                                            string _str_CampoFecha_Nombre,
                                                            DateTime _dtt_FechaInicio_Ejercicio,
                                                            DateTime _dtt_FechaFin_Ejercicio)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            string str_CodigoSiguiente = "1";

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

                string str_SQL = "SELECT convert(bigint," + _str_Campo_Nombre + ") as Valor FROM " + _str_Tabla_Nombre;

                #region WHERE
                string str_Where = "";
                //Campo Auxiliar
                if (_str_CampoAuxiliar_Nombre.Trim().Length > 0)
                {
                    str_Where +=  _str_CampoAuxiliar_Nombre + "=" + _lng_CampoAuxiliar_Valor + " AND ";
                }

                //Filtrar si tueviera el Empresa Relacionada
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_Where += _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor + " AND ";
                }

                //Filtrar que la fecha Borrado sea Nula si la Tuviera
                if (_bol_TieneFechaBorrado)
                {
                    str_Where += " fechaBorrado is null AND ";
                }

                //Filtrar si tuviera rango de fechas (Ejercicio)
                if (_str_CampoFecha_Nombre.Trim().Length > 0)
                {
                    str_Where +=  _str_CampoFecha_Nombre + ">='" + _dtt_FechaInicio_Ejercicio.ToString() + "' AND " + _str_CampoFecha_Nombre + "<='" + _dtt_FechaFin_Ejercicio.ToString() + "' AND ";
                }

                if (str_Where.Trim().Length>0)
                {
                    str_SQL += " WHERE " + str_Where.Substring(0, str_Where.Length - 4);
                }
                #endregion

                //Orden
                str_SQL += " ORDER BY " + _str_Campo_Nombre + " DESC ";

                INTERNA_SQLQUERY_LONG mdl_INTERNA_SQLQUERY_LONG = obj_Exferia_Entities.Database.SqlQuery<INTERNA_SQLQUERY_LONG>(str_SQL).FirstOrDefault();

                if (mdl_INTERNA_SQLQUERY_LONG != null && mdl_INTERNA_SQLQUERY_LONG.Valor > 0)
                {
                    str_CodigoSiguiente = (mdl_INTERNA_SQLQUERY_LONG.Valor + 1).ToString();
                }

                //Si el tamaño del campo es menor que el del valor calculado
                if (str_CodigoSiguiente.Length > _int_Campo_CaracteresMaximo)
                {
                    str_CodigoSiguiente = "-1";
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE(), ex, nameof(Compartidas_Datos) + "/" + nameof(Buscar_CodigoSiguiente_Numerico), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return str_CodigoSiguiente;
        }

        public static bool Cambiar_Estado_Registro(List<long> _lst_idDocumentos,
                                                     string _str_Opcion,
                                                     string _str_Estado)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            bool bol_ValoreDevuelto=true;

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

                string str_Tabla = "";

                //CTA_AMORTIZACIONESCABECERA
                if (_str_Opcion.Equals(Variables.G_STR_OPCION_CTA_AMORTIZACIONESCABECERA))
                {
                    str_Tabla = nameof(CTA_AmortizacionesCabecera);
                }
                //COM_DEVOLUCIONPAGO
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_COM_DEVOLUCIONPAGO))
                {
                    str_Tabla = nameof(COM_DevolucionesPagos);
                }
                //COM_FACTURACABECERA_AUX y COM_FACTURACABECERA_AUX_2 
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_COM_FACTURACABECERA_AUX) ||
                         _str_Opcion.Equals(Variables.G_STR_OPCION_COM_FACTURACABECERA_AUX_2))
                {
                    str_Tabla = nameof(COM_FacturasCabecera);
                }
                //COM_PAGO
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_COM_PAGO))
                {
                    str_Tabla = nameof(COM_Pagos);
                }
                //COM_VENCIMIENTO
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_COM_VENCIMIENTO))
                {
                    str_Tabla = nameof(COM_Vencimientos);
                }
                //PER_NOMINA
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_PER_NOMINA))
                {
                    str_Tabla = nameof(PER_Nominas);
                }
                //PER_NOMINAPAGO
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_PER_NOMINAPAGO))
                {
                    str_Tabla = nameof(PER_NominasPagos);
                }
                //PER_NOMINAVENCIMIENTO
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_PER_NOMINAVENCIMIENTO))
                {
                    str_Tabla = nameof(PER_NominasVencimientos);
                }
                //VTA_COBRO y VTA_COBRO_AUX_1
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_VTA_COBRO) ||
                    _str_Opcion.Equals(Variables.G_STR_OPCION_VTA_COBRO_AUX_1))
                {
                    str_Tabla = nameof(VTA_Cobros);
                }
                //VTA_COBROALBARAN
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_VTA_COBROALBARAN))
                {
                    str_Tabla = nameof(VTA_CobrosAlbaranes);
                }
                //VTA_DEVOLUCIONCOBRO y VTA_DEVOLUCIONCOBRO
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_VTA_DEVOLUCIONCOBRO) ||
                         _str_Opcion.Equals(Variables.G_STR_OPCION_VTA_DEVOLUCIONCOBRO))
                {
                    str_Tabla = nameof(VTA_DevolucionesCobros);
                }
                //VTA_FACTURACABECERA
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_VTA_FACTURACABECERA))
                {
                    str_Tabla = nameof(VTA_FacturasCabecera);
                }
                //VTA_REMESASCABECERA y VTA_REMESASCABECERA_AUX_1
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_VTA_REMESASCABECERA) ||
                        _str_Opcion.Equals(Variables.G_STR_OPCION_VTA_REMESASCABECERA_AUX_1))
                {
                    str_Tabla = nameof(VTA_RemesasCabecera);
                }
                //VTA_VENCIMIENTO y VTA_VENCIMIENTO_AUX_1
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_VTA_VENCIMIENTO) ||
                        _str_Opcion.Equals(Variables.G_STR_OPCION_VTA_VENCIMIENTO_AUX_1))
                {
                    str_Tabla = nameof(VTA_Vencimientos);
                }
                //COM_REMESASCABECERA
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_COM_REMESASCABECERA))
                {
                    str_Tabla = nameof(COM_RemesasCabecera);
                }
                //PER_NOMINASREMEASCABECERA
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_PER_NOMINAREMESASCABECERA))
                {
                    str_Tabla = nameof(PER_NominasRemesasCabecera);
                }
                //PER_NOMINASREMEASCABECERA
                else if (_str_Opcion.Equals(Variables.G_STR_OPCION_CTA_MODELO347CABECERA))
                {
                    str_Tabla = nameof(CTA_Modelo347Cabecera);
                }
                string str_ids = "";
                foreach (long lng_id in _lst_idDocumentos)
                {
                    str_ids += lng_id + ",";
                }
                str_ids = str_ids.Substring(0, str_ids.Length - 1);

                string str_SQL = "UPDATE " + str_Tabla + " SET estado='" + _str_Estado + "' WHERE id in (" + str_ids + ")";

                obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL); 

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

            return bol_ValoreDevuelto;
        }

        public static bool Actualizar_Valor_Campo(long _lng_idDocumento,
                                                  string _str_Tabla,
                                                  string _str_Campo,
                                                  dynamic _dnm_Valor,
                                                  bool _bol_CampoTexto)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            bool bol_ValoreDevuelto = true;

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

                string str_Comillas = "";
                if (_bol_CampoTexto)
                {
                    str_Comillas = "'";
                }

                string str_SQL = "UPDATE " + _str_Tabla + " SET " + _str_Campo + "= " + str_Comillas + _dnm_Valor + str_Comillas +" WHERE id=" + _lng_idDocumento;

                obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL);

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

            return bol_ValoreDevuelto;
        }

        public static List<INTERNO_Listado_Simple_Modelo> Buscar_Datos_Filtros_Relacionados(string _str_Tabla_Nombre,
                                                                                             string _str_Campo_Id,
                                                                                             string _str_Campo_Codigo,
                                                                                             string _str_Campo_Descripcion,
                                                                                             string _str_Campo_FechaBorrado,
                                                                                             string _str_Valor_Auxiliar_1,
                                                                                             string _str_Valor_Auxiliar_2,
                                                                                             string _str_Where,
                                                                                             string _str_CampoEmpresa_Nombre,
                                                                                             long _lng_CampoEmpresa_Valor,
                                                                                             string _str_CampoOrden,
                                                                                             int _int_TipoOrden)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            List<INTERNO_Listado_Simple_Modelo> lst_INTERNO_Listado_Simple_Modelo = null;

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

                //Formar los campos a Devolver ........................................................................
                string str_Campos = "";
                str_Campos += _str_Campo_Id + " as " + nameof(INTERNO_Listado_Simple_Modelo.ID) +",";
                str_Campos += _str_Campo_Codigo + " as " + nameof(INTERNO_Listado_Simple_Modelo.CODIGO) + ",";
                str_Campos += _str_Campo_Descripcion + " as " + nameof(INTERNO_Listado_Simple_Modelo.DESCRIPCION) + ",";

                if (_str_Valor_Auxiliar_1.Trim().Length>0)
                {
                    str_Campos += _str_Valor_Auxiliar_1 + " as " + nameof(INTERNO_Listado_Simple_Modelo.AUXILIAR_1) + ",";
                }

                if (_str_Valor_Auxiliar_2.Trim().Length > 0)
                {
                    str_Campos += _str_Valor_Auxiliar_2 + " as " + nameof(INTERNO_Listado_Simple_Modelo.AUXILIAR_2) + ",";
                }

                if (_str_Campo_FechaBorrado.Trim().Length > 0)
                {
                    str_Campos += _str_Campo_FechaBorrado + " as " + nameof(INTERNO_Listado_Simple_Modelo.FECHABORRADO) + ",";

                    if (_str_Where.Trim().Length > 0)
                    {
                        _str_Where += " AND " + _str_Campo_FechaBorrado + " is null ";
                    }
                    else
                    {
                        _str_Where = _str_Campo_FechaBorrado + " is null ";
                    }
                }

                str_Campos = str_Campos.Substring(0, str_Campos.Length - 1);

                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    if (_str_Where.Trim().Length > 0)
                    {
                        _str_Where += " AND " + _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor;
                    }
                    else
                    {
                        _str_Where = _str_CampoEmpresa_Nombre + "=" + _lng_CampoEmpresa_Valor;
                    }
                }

                if (_str_Where.Trim().Length > 0)
                {
                    _str_Where = " WHERE " + _str_Where;
                }

                string str_Orden = "";
                if (_str_CampoEmpresa_Nombre.Trim().Length > 0)
                {
                    str_Orden = " ORDER BY " + _str_CampoOrden + (_int_TipoOrden == 1 ? " desc "  : " asc ");
                }

                //Formar Consulta SQLServer ....................................................
                string str_SQL = "SELECT " + str_Campos + " FROM " + _str_Tabla_Nombre + _str_Where + str_Orden;

                //Ejecutar COnuslta
                lst_INTERNO_Listado_Simple_Modelo = obj_Exferia_Entities.Database.SqlQuery<INTERNO_Listado_Simple_Modelo>(str_SQL).ToList();

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

            return lst_INTERNO_Listado_Simple_Modelo;
        }

        public static INTERNO_Datos_F3_PadreBusqueda_Modelo Buscar_Datos_F3_Padre(string _str_Tabla_Principal,
                                                                                  long _lng_id,
                                                                                  string _str_Tabla_Nombre_Secundaria,
                                                                                  string _str_Campo_Id_Secundaria_Relacion,
                                                                                  string _str_Campo_Codigo_Secundaria,
                                                                                  string _str_Campo_Descripcion_Secundaria,
                                                                                  string _str_Campo_FechaBorrado_Secundaria, 
                                                                                  string _str_Tabla_Nombre_Terciaria,
                                                                                  string _str_Campo_Id_Terciaria_Relacion,
                                                                                  string _str_Campo_Codigo_Terciaria,
                                                                                  string _str_Campo_Descripcion_Terciaria,
                                                                                  string _str_Campo_FechaBorrado_Terciaria)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            INTERNO_Datos_F3_PadreBusqueda_Modelo mdl_INTERNO_Datos_F3_PadreBusqueda_Modelo = null;

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

                string str_Campos = "";
                string str_Relaciones_InnerJoins = "";

                str_Campos += _str_Tabla_Principal + "." + _str_Campo_Id_Secundaria_Relacion + " as " + nameof(INTERNO_Datos_F3_PadreBusqueda_Modelo.id) + ",";
                str_Campos += _str_Tabla_Nombre_Secundaria + "." + _str_Campo_Codigo_Secundaria + " as " + nameof(INTERNO_Datos_F3_PadreBusqueda_Modelo.codigo) + ",";
                str_Campos += _str_Tabla_Nombre_Secundaria + "." + _str_Campo_Descripcion_Secundaria + " as " + nameof(INTERNO_Datos_F3_PadreBusqueda_Modelo.descripcion) + ",";
                if (_str_Campo_FechaBorrado_Secundaria.Trim().Length > 0)
                {
                    str_Campos += _str_Tabla_Nombre_Secundaria + "." + _str_Campo_FechaBorrado_Secundaria + " as " + nameof(INTERNO_Datos_F3_PadreBusqueda_Modelo.fechaBorrado) + ",";
                }

                str_Relaciones_InnerJoins += " INNER JOIN " + _str_Tabla_Nombre_Secundaria + " ON " + _str_Tabla_Principal + "." + _str_Campo_Id_Secundaria_Relacion + "=" + _str_Tabla_Nombre_Secundaria + ".id ";

                
                //Formar los campos terciaria ........................................................................
                if (_str_Tabla_Nombre_Terciaria.Trim().Length > 0)
                {
                    str_Campos += _str_Tabla_Nombre_Secundaria + "." + _str_Campo_Id_Terciaria_Relacion + " as " + nameof(INTERNO_Datos_F3_PadreBusqueda_Modelo.id_Secundario) + ",";
                    str_Campos += _str_Tabla_Nombre_Terciaria + "." + _str_Campo_Codigo_Terciaria + " as " + nameof(INTERNO_Datos_F3_PadreBusqueda_Modelo.codigo_Secundario) + ",";
                    str_Campos += _str_Tabla_Nombre_Terciaria + "." + _str_Campo_Descripcion_Terciaria + " as " + nameof(INTERNO_Datos_F3_PadreBusqueda_Modelo.descripcion_Secundario) + ",";
                    if (_str_Campo_FechaBorrado_Terciaria.Trim().Length > 0)
                    {
                        str_Campos += _str_Tabla_Nombre_Terciaria + "." + _str_Campo_FechaBorrado_Terciaria + " as " + nameof(INTERNO_Datos_F3_PadreBusqueda_Modelo.fechaBorrado_Secundario) + ",";
                    }

                    str_Relaciones_InnerJoins += " INNER JOIN " + _str_Tabla_Nombre_Terciaria + " ON " + _str_Tabla_Nombre_Secundaria + "." + _str_Campo_Id_Terciaria_Relacion + "=" + _str_Tabla_Nombre_Terciaria + ".id ";
                }

                str_Campos = str_Campos.Substring(0, str_Campos.Length - 1);


                //Formar Consulta SQLServer ....................................................
                string str_SQL = "SELECT " + str_Campos + " FROM " + _str_Tabla_Principal + str_Relaciones_InnerJoins + " WHERE " + _str_Tabla_Principal + ".id=" + _lng_id;

                //Ejecutar Consulta
                mdl_INTERNO_Datos_F3_PadreBusqueda_Modelo = obj_Exferia_Entities.Database.SqlQuery<INTERNO_Datos_F3_PadreBusqueda_Modelo>(str_SQL).FirstOrDefault();

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

            return mdl_INTERNO_Datos_F3_PadreBusqueda_Modelo;
        }

        public static bool Borrar_Registro(List<long> _lst_idRegistros,
                                           string _str_Tabla)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            bool bol_ValoreDevuelto = true;

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

                string str_id = "";
                foreach (long lng_id in _lst_idRegistros)
                {
                    str_id += lng_id.ToString() + ",";
                }
                str_id = str_id.Substring(0, str_id.Length - 1);

                string str_SQL = "DELETE FROM " + _str_Tabla + " id in (" + str_id + ")";

                obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL);

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

            return bol_ValoreDevuelto;
        }

        internal class INTERNA_SQLQUERY_INT
        {
            public int Valor { get; set; }

        }

        internal class INTERNA_SQLQUERY_LONG
        {
            public long Valor { get; set; }

        }
    }
}
