using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Generales;
using Exferia_EntityFramework;
using Exferia_General;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Ventas._1_Datos
{
    public class VTA_FacturasCabecera_Resumen_Datos
    {
        #region MODELOS

        #region Modelo Simple
        private VTA_FacturasCabecera_Resumen g_mdl_VTA_FacturasCabecera_Resumen = null;
        public VTA_FacturasCabecera_Resumen Obtener_Modelo_Por_Id(long _lng_id)
        {
            try
            {
                string str_SQL = Obtener_Consulta_Modelo() +
                                 //WHERE
                                 " WHERE " + nameof(VTA_FacturasCabecera_Resumen) + "." + nameof(VTA_FacturasCabecera_Resumen.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);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_FacturasCabecera_Resumen_Datos) + "/" + nameof(Obtener_Modelo_Por_Id), true);
            }

            return g_mdl_VTA_FacturasCabecera_Resumen;
        }
        private void Ejecutar_Consulta_Modelo(string _str_SQL,
                                             object[] _arr_Parametros)
        {
            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_VTA_FacturasCabecera_Resumen = obj_Exferia_Entities.Database.SqlQuery<VTA_FacturasCabecera_Resumen>(_str_SQL, _arr_Parametros).FirstOrDefault();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_FacturasCabecera_Resumen_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }
        #endregion

        #region Modelo Listado
        private List<VTA_FacturasCabecera_Resumen> g_lst_VTA_FacturasCabecera_Resumen = null;

        public List<VTA_FacturasCabecera_Resumen> Obtener_ModeloListado_Por_FacturaCabecera(long _lng_idFacturaCabecera)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " + nameof(VTA_FacturasCabecera_Resumen) + "." + nameof(VTA_FacturasCabecera_Resumen.idFacturaCabecera) + "=@idFacturaCabecera ";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                arr_Parametros);

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

            return g_lst_VTA_FacturasCabecera_Resumen;
        }

        #region Ejecutar Consulta

        //Listado de modelos Relacionados
        private List<GEN_ImpuestosTipos> g_lst_GEN_ImpuestosTipos = null;
        private List<GEN_RetencionesTipos> g_lst_GEN_RetencionesTipos = null;

        //Hilos
        private static int g_int_TotalHilos_Modelo_Listado = 2;
        private bool[] g_bol_Hilos_Terminados_Modelo_Listado = new bool[g_int_TotalHilos_Modelo_Listado];

        private void Ejecutar_Consulta_Modelo_Listado(string _str_SQL,
                                                    object[] _arr_Parametros)
        {
            Exferia_Entities obj_Exferia_Entities = null;

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

                //Rellenar el modelo
                g_lst_VTA_FacturasCabecera_Resumen = obj_Exferia_Entities.Database.SqlQuery<VTA_FacturasCabecera_Resumen>(_str_SQL, _arr_Parametros).ToList();

                #region Rellenar tablas Relacionadas
                if (g_lst_VTA_FacturasCabecera_Resumen != null && g_lst_VTA_FacturasCabecera_Resumen.Count > 0)
                {
                    #region PRIMERO BUSCO LOS DATOS DE LAS TABLAS RELACIONADAS
                    //reiniciar Valores de los hilos
                    for (int int_Contador = 0; int_Contador < g_int_TotalHilos_Modelo_Listado; int_Contador++)
                    {
                        g_bol_Hilos_Terminados_Modelo_Listado[int_Contador] = false;
                    }

                    //GEN_ImpuestosTipos ############################################# 
                    ThreadStart obj_ThreadStart_IMPUESTOSTIPOS = new ThreadStart(Obtener_ImpuestosTipos_Modelo_Listado);
                    Thread obj_Thread_IMPUESTOSTIPOS = new Thread(obj_ThreadStart_IMPUESTOSTIPOS);
                    obj_Thread_IMPUESTOSTIPOS.Start();

                    //GEN_RetencionesTipos ############################################# 
                    ThreadStart obj_ThreadStart_RETENCIONESTIPOS = new ThreadStart(Obtener_RetencionesTipos_Modelo_Listado);
                    Thread obj_Thread_RETENCIONESTIPOS = new Thread(obj_ThreadStart_RETENCIONESTIPOS);
                    obj_Thread_RETENCIONESTIPOS.Start();

                    //Esperando a que terminen todos los hilos .........................................
                    bool bol_Termino = false;
                    while (bol_Termino == false)
                    {
                        bol_Termino = true;
                        foreach (bool bol_Termino_Hilo in g_bol_Hilos_Terminados_Modelo_Listado)
                        {
                            if (bol_Termino_Hilo == false)
                            {
                                bol_Termino = false;
                                break;
                            }
                        }

                        Thread.Sleep(10);
                    }
                    //.................................................................................

                    #endregion

                    #region DESPUES SE LO VOY ASIGNANDO A LOS REGISTRO UNO A UNO
                    foreach (VTA_FacturasCabecera_Resumen mdl_VTA_FacturasCabecera_Resumen in g_lst_VTA_FacturasCabecera_Resumen)
                    {
                        //GEN_ImpuestosTipos #############################################
                        if (mdl_VTA_FacturasCabecera_Resumen.idImpuestoTipo!=null &&
                            g_lst_GEN_ImpuestosTipos != null &&
                            g_lst_GEN_ImpuestosTipos.Count > 0)
                        {
                            mdl_VTA_FacturasCabecera_Resumen.GEN_ImpuestosTipos = g_lst_GEN_ImpuestosTipos.Where(m => m.id == mdl_VTA_FacturasCabecera_Resumen.idImpuestoTipo.Value).FirstOrDefault();
                        }

                        //GEN_RetencionesTipos #############################################
                        if (mdl_VTA_FacturasCabecera_Resumen.idRetencionTipo != null && 
                            g_lst_GEN_RetencionesTipos != null &&
                            g_lst_GEN_RetencionesTipos.Count > 0)
                        {
                            mdl_VTA_FacturasCabecera_Resumen.GEN_RetencionesTipos = g_lst_GEN_RetencionesTipos.Where(m => m.id == mdl_VTA_FacturasCabecera_Resumen.idRetencionTipo.Value).FirstOrDefault();
                        }
                    }
                    #endregion

                }

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

        #region TablasRelacionadas
        private void Obtener_ImpuestosTipos_Modelo_Listado()
        {
            try
            {
                g_lst_GEN_ImpuestosTipos = Datos_Generales.GEN_ImpuestosTipos_Obtener_Modelo_Listado_Por_Ids(g_lst_VTA_FacturasCabecera_Resumen.Where(x=>x.idImpuestoTipo!=null).Select(m=>m.idImpuestoTipo.Value).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[0] = true;
            }
        }
        private void Obtener_RetencionesTipos_Modelo_Listado()
        {
            try
            {
                g_lst_GEN_RetencionesTipos = Datos_Generales.GEN_RetencionesTipos_Obtener_Modelo_Listado_Por_Ids(g_lst_VTA_FacturasCabecera_Resumen.Where(x => x.idRetencionTipo != null).Select(m => m.idRetencionTipo.Value).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[1] = true;
            }
        }

        #endregion

        #endregion

        #endregion

        private string Obtener_Consulta_Modelo()
        {
            return
               " SELECT " +
                    nameof(VTA_FacturasCabecera_Resumen.id) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.idFacturaCabecera) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.idImpuestoTipo) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.idImpuestoLinea) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.bruto) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.descuentoProntoPago_Valor) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.descuentoFinalFactura_Valor) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.baseImponible) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.impuesto_Porcentaje) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.impuesto_Valor) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.recargo_Porcentaje) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.recargo_Valor) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.total) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.retencion_Porcentaje) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.retencion_Valor) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.retencion_Base) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.idAlbaranCabecera) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.descuentoFinalAlbaran) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.descuentoFinalAlbaran_Valor) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.idRetencionTipo) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.idRetencion) + " , " +
                    nameof(VTA_FacturasCabecera_Resumen.total_Final) +
               " FROM " + nameof(VTA_FacturasCabecera_Resumen);
        }
        #endregion

        #region Grabar
        public INTERNO_ValorDevuelto_Modelo Insertar(List<INTERNO_ImportesImpuestos_Modelo> _lst_INTERNO_ImportesImpuestos_Modelo, long _lng_idFacturaCabecera)
        {

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

            try
            {
                //Borrar las Antiguas
                Borrar(_lng_idFacturaCabecera);
               
                //Inserto las nuevas
                if (_lst_INTERNO_ImportesImpuestos_Modelo.Count > 0)
                {
                    foreach (INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo in _lst_INTERNO_ImportesImpuestos_Modelo)
                    {
                        VTA_FacturasCabecera_Resumen mdl_VTA_FacturasCabecera_Resumen = new VTA_FacturasCabecera_Resumen();

                        mdl_VTA_FacturasCabecera_Resumen.id = -1;
                        mdl_VTA_FacturasCabecera_Resumen.idFacturaCabecera = _lng_idFacturaCabecera;
                        mdl_VTA_FacturasCabecera_Resumen.idImpuestoTipo = mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoTipo;
                        mdl_VTA_FacturasCabecera_Resumen.idImpuestoLinea = mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoLinea;
                        mdl_VTA_FacturasCabecera_Resumen.bruto = mdl_INTERNO_ImportesImpuestos_Modelo.Bruto;
                        mdl_VTA_FacturasCabecera_Resumen.descuentoProntoPago_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado;
                        mdl_VTA_FacturasCabecera_Resumen.descuentoFinalFactura_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado;
                        mdl_VTA_FacturasCabecera_Resumen.baseImponible = mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible;
                        mdl_VTA_FacturasCabecera_Resumen.impuesto_Porcentaje = mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje.Value : 0m;
                        mdl_VTA_FacturasCabecera_Resumen.impuesto_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado;
                        mdl_VTA_FacturasCabecera_Resumen.recargo_Porcentaje = mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje.Value : 0m;
                        mdl_VTA_FacturasCabecera_Resumen.recargo_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado;
                        mdl_VTA_FacturasCabecera_Resumen.total = mdl_INTERNO_ImportesImpuestos_Modelo.Total;
                        mdl_VTA_FacturasCabecera_Resumen.retencion_Porcentaje = mdl_INTERNO_ImportesImpuestos_Modelo.Retencion_Porcentaje;
                        mdl_VTA_FacturasCabecera_Resumen.retencion_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Retencion_Calculado;
                        mdl_VTA_FacturasCabecera_Resumen.retencion_Base = mdl_INTERNO_ImportesImpuestos_Modelo.BaseRetencion;
                        mdl_VTA_FacturasCabecera_Resumen.idAlbaranCabecera = mdl_INTERNO_ImportesImpuestos_Modelo.IdAlbaranCabecera;
                        mdl_VTA_FacturasCabecera_Resumen.descuentoFinalAlbaran = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal;
                        mdl_VTA_FacturasCabecera_Resumen.descuentoFinalAlbaran_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado;
                        mdl_VTA_FacturasCabecera_Resumen.idRetencionTipo = mdl_INTERNO_ImportesImpuestos_Modelo.IdRetencionTipo;
                        mdl_VTA_FacturasCabecera_Resumen.idRetencion = mdl_INTERNO_ImportesImpuestos_Modelo.IdRetencion;
                        mdl_VTA_FacturasCabecera_Resumen.total_Final = mdl_INTERNO_ImportesImpuestos_Modelo.Total_Final;



                        //Agregar al listado Final
                        Insertar_Final(mdl_VTA_FacturasCabecera_Resumen);
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_FacturasCabecera_Resumen_Datos) + "/" + nameof(Insertar), true);
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        public INTERNO_ValorDevuelto_Modelo Insertar_AUX(List<VTA_FacturasCabecera_Resumen> _lst_VTA_FacturasCabecera_Resumen, long _lng_idFacturaCabecera)
        {
           
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Borrar las Antiguas
                Borrar(_lng_idFacturaCabecera);

                //Inserto las nuevas
                if (_lst_VTA_FacturasCabecera_Resumen.Count > 0)
                {
                    foreach (VTA_FacturasCabecera_Resumen mdl_VTA_FacturasCabecera_Resumen in _lst_VTA_FacturasCabecera_Resumen)
                    {

                        mdl_VTA_FacturasCabecera_Resumen.id = -1;
                        mdl_VTA_FacturasCabecera_Resumen.idFacturaCabecera = _lng_idFacturaCabecera;

                        //Insertar
                        Insertar_Final(mdl_VTA_FacturasCabecera_Resumen);
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_FacturasCabecera_Resumen_Datos) + "/" + nameof(Insertar_AUX), true);
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public INTERNO_ValorDevuelto_Modelo Insertar_Final(VTA_FacturasCabecera_Resumen _mdl_VTA_FacturasCabecera_Resumen_AGrabar)
        {
            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.ProxyCreationEnabled = true;


                VTA_FacturasCabecera_Resumen mdl_VTA_FacturasCabecera_Resumen_Final = new VTA_FacturasCabecera_Resumen();
                VTA_FacturasCabecera_Resumen mdl_VTA_FacturasCabecera_Resumen_DatosViejos = new VTA_FacturasCabecera_Resumen();

                //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_VTA_FacturasCabecera_Resumen_AGrabar, mdl_VTA_FacturasCabecera_Resumen_Final, false, false);

                #region INSERT
                string str_SQL_Insert = " INSERT INTO " + nameof(VTA_FacturasCabecera_Resumen) +
                                            " (" +
                                                    nameof(VTA_FacturasCabecera_Resumen.idFacturaCabecera) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.idImpuestoTipo) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.idImpuestoLinea) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.bruto) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.descuentoProntoPago_Valor) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.descuentoFinalFactura_Valor) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.baseImponible) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.impuesto_Porcentaje) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.impuesto_Valor) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.recargo_Porcentaje) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.recargo_Valor) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.total) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.retencion_Porcentaje) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.retencion_Valor) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.retencion_Base) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.idAlbaranCabecera) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.descuentoFinalAlbaran) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.descuentoFinalAlbaran_Valor) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.idRetencionTipo) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.idRetencion) + "," +
                                                    nameof(VTA_FacturasCabecera_Resumen.total_Final) +
                                            " ) " +
                                            " OUTPUT INSERTED." + nameof(VTA_FacturasCabecera_Resumen.id) +
                                            " VALUES " +
                                            " ( " +
                                                "@idFacturaCabecera," +
                                                "@idImpuestoTipo," +
                                                "@idImpuestoLinea," +
                                                "@bruto," +
                                                "@descuentoProntoPago_Valor," +
                                                "@descuentoFinalFactura_Valor," +
                                                "@baseImponible," +
                                                "@impuesto_Porcentaje," +
                                                "@impuesto_Valor," +
                                                "@recargo_Porcentaje," +
                                                "@recargo_Valor," +
                                                "@total," +
                                                "@retencion_Porcentaje," +
                                                "@retencion_Valor," +
                                                "@retencion_Base," +
                                                "@idAlbaranCabecera," +
                                                "@descuentoFinalAlbaran," +
                                                "@descuentoFinalAlbaran_Valor," +
                                                "@idRetencionTipo," +
                                                "@idRetencion," +
                                                "@total_Final" +
                                            " ) ";
                //Parametros
                object[] arr_Parametros_Insert = new object[]
                {
                    new SqlParameter("@idFacturaCabecera", mdl_VTA_FacturasCabecera_Resumen_Final.idFacturaCabecera),
                    mdl_VTA_FacturasCabecera_Resumen_Final.idImpuestoTipo != null
                        ?   new SqlParameter("@idImpuestoTipo", mdl_VTA_FacturasCabecera_Resumen_Final.idImpuestoTipo.Value)
                        :   new SqlParameter("@idImpuestoTipo",  DBNull.Value),
                    mdl_VTA_FacturasCabecera_Resumen_Final.idImpuestoLinea != null
                        ?   new SqlParameter("@idImpuestoLinea", mdl_VTA_FacturasCabecera_Resumen_Final.idImpuestoLinea.Value)
                        :   new SqlParameter("@idImpuestoLinea",  DBNull.Value),
                    new SqlParameter("@bruto", mdl_VTA_FacturasCabecera_Resumen_Final.bruto),
                    new SqlParameter("@descuentoProntoPago_Valor", mdl_VTA_FacturasCabecera_Resumen_Final.descuentoProntoPago_Valor),
                    new SqlParameter("@descuentoFinalFactura_Valor", mdl_VTA_FacturasCabecera_Resumen_Final.descuentoFinalFactura_Valor),
                    new SqlParameter("@baseImponible", mdl_VTA_FacturasCabecera_Resumen_Final.baseImponible),
                    new SqlParameter("@impuesto_Porcentaje", mdl_VTA_FacturasCabecera_Resumen_Final.impuesto_Porcentaje),
                    new SqlParameter("@impuesto_Valor", mdl_VTA_FacturasCabecera_Resumen_Final.impuesto_Valor),
                    new SqlParameter("@recargo_Porcentaje", mdl_VTA_FacturasCabecera_Resumen_Final.recargo_Porcentaje),
                    new SqlParameter("@recargo_Valor", mdl_VTA_FacturasCabecera_Resumen_Final.recargo_Valor),
                    new SqlParameter("@total", mdl_VTA_FacturasCabecera_Resumen_Final.total),
                    mdl_VTA_FacturasCabecera_Resumen_Final.retencion_Porcentaje != null
                        ?   new SqlParameter("@retencion_Porcentaje", mdl_VTA_FacturasCabecera_Resumen_Final.retencion_Porcentaje.Value)
                        :   new SqlParameter("@retencion_Porcentaje",  DBNull.Value),
                    mdl_VTA_FacturasCabecera_Resumen_Final.retencion_Valor != null
                        ?   new SqlParameter("@retencion_Valor", mdl_VTA_FacturasCabecera_Resumen_Final.retencion_Valor.Value)
                        :   new SqlParameter("@retencion_Valor",  DBNull.Value),
                    mdl_VTA_FacturasCabecera_Resumen_Final.retencion_Base != null
                        ?   new SqlParameter("@retencion_Base", mdl_VTA_FacturasCabecera_Resumen_Final.retencion_Base.Value)
                        :   new SqlParameter("@retencion_Base",  DBNull.Value),
                    mdl_VTA_FacturasCabecera_Resumen_Final.idAlbaranCabecera != null
                        ?   new SqlParameter("@idAlbaranCabecera", mdl_VTA_FacturasCabecera_Resumen_Final.idAlbaranCabecera.Value)
                        :   new SqlParameter("@idAlbaranCabecera",  DBNull.Value),
                    mdl_VTA_FacturasCabecera_Resumen_Final.descuentoFinalAlbaran != null
                        ?   new SqlParameter("@descuentoFinalAlbaran", mdl_VTA_FacturasCabecera_Resumen_Final.descuentoFinalAlbaran.Value)
                        :   new SqlParameter("@descuentoFinalAlbaran",  DBNull.Value),
                    mdl_VTA_FacturasCabecera_Resumen_Final.descuentoFinalAlbaran_Valor != null
                        ?   new SqlParameter("@descuentoFinalAlbaran_Valor", mdl_VTA_FacturasCabecera_Resumen_Final.descuentoFinalAlbaran_Valor.Value)
                        :   new SqlParameter("@descuentoFinalAlbaran_Valor",  DBNull.Value),
                    mdl_VTA_FacturasCabecera_Resumen_Final.idRetencionTipo != null
                        ?   new SqlParameter("@idRetencionTipo", mdl_VTA_FacturasCabecera_Resumen_Final.idRetencionTipo.Value)
                        :   new SqlParameter("@idRetencionTipo",  DBNull.Value),
                    mdl_VTA_FacturasCabecera_Resumen_Final.idRetencion != null
                        ?   new SqlParameter("@idRetencion", mdl_VTA_FacturasCabecera_Resumen_Final.idRetencion.Value)
                        :   new SqlParameter("@idRetencion",  DBNull.Value),
                     new SqlParameter("@total_Final", mdl_VTA_FacturasCabecera_Resumen_Final.total_Final),
                };
                #endregion

                //Id de la tabla
                mdl_INTERNO_ValorDevuelto_Modelo.Id = obj_Exferia_Entities.Database.SqlQuery<long>(str_SQL_Insert, arr_Parametros_Insert).Single();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_FacturasCabecera_Resumen_Datos) + "/" + nameof(Insertar_Final), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #endregion

        #region Borrar
        public INTERNO_ValorDevuelto_Modelo Borrar(long _lng_idFacturaCabecera)
        {
            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;

            try
            {

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

                #region Delete
                string str_SQL_Delete = " DELETE FROM  " + nameof(VTA_FacturasCabecera_Resumen) +
                                        " WHERE " +
                                            nameof(VTA_FacturasCabecera_Resumen.idFacturaCabecera) + "=@idFacturaCabecera";
                //Parametros
                object[] arr_Parametros_Delete = new object[]
                {
                    new SqlParameter("@idFacturaCabecera", _lng_idFacturaCabecera)
                };
                #endregion

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


            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion
    }
}

