using Exferia_Aplicacion.Calculos;
using Exferia_Aplicacion.Calculos.VentasCompras;
using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Generales;
using Exferia_Aplicacion.Modelos_Maestros;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_Ventas._0_Modelos;
using Exferia_Ventas._1_Datos;
using Exferia_Ventas._3_Vistas.Bolsa;
using Exferia_Ventas._3_Vistas.Listados;
using Exferia_Ventas.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Ventas._3_Vistas.Controladoras
{
    public class P_PedidoCabecera_Procesos_Controladora
    {
        #region Variables Generales
        private P_PedidoCabecera_Procesos g_frm_P_PedidoCabecera_Procesos = null;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc
        private PE_Esperando_BarraProgreso g_frm_PE_Esperando_BarraProgreso;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc
       
        //Clases de Negocio
        private VTA_PedidosCabecera_Bolsa_Datos g_obj_VTA_PedidosCabecera_Bolsa_Datos = new VTA_PedidosCabecera_Bolsa_Datos();
        private VTA_PedidosCabecera_Datos g_obj_VTA_PedidosCabecera_Datos = new VTA_PedidosCabecera_Datos();
        private VTA_PedidosLineas_Datos g_obj_VTA_PedidosLineas_Datos = new VTA_PedidosLineas_Datos();
        private VTA_AlbaranesCabecera_Datos g_obj_VTA_AlbaranesCabecera_Datos=new VTA_AlbaranesCabecera_Datos();
        private VTA_FacturasCabecera_Datos g_obj_VTA_FacturasCabecera_Datos = new VTA_FacturasCabecera_Datos();
        private VTA_AlbaranesFacturasLineas_Datos g_obj_VTA_AlbaranesFacturasLineas_Datos = new VTA_AlbaranesFacturasLineas_Datos();
        private VTA_Vencimientos_Datos g_obj_VTA_Vencimientos_Datos = new VTA_Vencimientos_Datos();

        //Modelos
        private List<dynamic> g_lst_Pedido_Seleccionados = null;
        private List<INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo> g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo = null;
        private List<INTERNO_VTA_PedidosCabecera_Listado_Modelo> g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo = null;

        public bool g_bol_UtilizarBolsa_Pordefecto = false;

        #region COPIAR
        //Obtencion de los valores de los registros desde base de datos ############################
        private BackgroundWorker g_obj_TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos = null;
        public bool g_bol_Obtencion_Listados_Completo_Clientes_BaseDatos_Termino = false;

        #region Clientes a Seleccionar

        //Tareea Asincrona de Marcar/Desmarcar 
        private BackgroundWorker g_obj_TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR;
        public bool g_bol_CancelarTareaAsincrona_MarcarDesmarca_ClientesASeleccionar_COPIAR = false;

        private List<dynamic> g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = null;
        private List<dynamic> g_lst_ListadoRegistros_Clientes_COPIAR = null;

        //Tarea Asincrona para la Rellenar DataGridView de ClientesASeleccionar
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR;
        public bool g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR = false;

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

        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_ClientesASeleccionar = new List<string>();
        public ABS_Listado_MAE_Clientes_P_PedidoCabecera_Procesos_Copiar_ASeleccionar g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_ASeleccionar = new ABS_Listado_MAE_Clientes_P_PedidoCabecera_Procesos_Copiar_ASeleccionar();
        public Dictionary<string, object> g_dct_ListadoFiltros_ClientesASeleccionar_COPIAR = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_ClientesASeleccionar_COPIAR = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_ClientesASeleccionar_COPIAR = new List<INTERNO_ComboBox_Modelo>();
        #endregion

        #region Clientes Seleccionados
        private List<long> g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR = new List<long>();

        //Tarea Asincrona para la Rellenar DataGridView de ClientesSeleccionados
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR;
        public bool g_bol_CancelarTareaAsincrona_ClientesSeleccionados_COPIAR = false;

        //Tarea Asincrona de Vaciar Clientes Seleccionados
        private BackgroundWorker g_obj_TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR;
        public bool g_bol_CancelarTareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR = false;
        private List<long> g_lst_ClientesSeleccionados_AVaciar_COPIAR = null;

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

        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_ClientesSeleccionados_COPIAR = new List<string>();
        public ABS_Listado_MAE_Clientes_P_PedidoCabecera_Procesos_Copiar_Seleccionados g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_Seleccionados_COPIAR = new ABS_Listado_MAE_Clientes_P_PedidoCabecera_Procesos_Copiar_Seleccionados();
        public Dictionary<string, object> g_dct_ListadoFiltros_ClientesSeleccionados_COPIAR = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_ClientesSeleccionados_COPIAR = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_ClientesSeleccionados_COPIAR = new List<INTERNO_ComboBox_Modelo>();
        #endregion

        //Tarea Asincrona para la proceso de Copiar la Pedido
        private BackgroundWorker g_obj_TareaAsincrona_ProcesoCopia;
        #endregion

        #region CREAR ALBARANES/FACTURAS
        //Tarea Asincrona para la proceso de CONVERTIR A ALBARAN O FACTURA
        private BackgroundWorker g_obj_TareaAsincrona_ProcesoConvertirAAlbaranFactura;
        #endregion

        #region CERRAR
        //Tarea Asincrona para la proceso de Cerrar
        private BackgroundWorker g_obj_TareaAsincrona_ProcesoCerrar;
        #endregion

        #region ABRIR
        //Tarea Asincrona para la proceso de Abrir
        private BackgroundWorker g_obj_TareaAsincrona_ProcesoAbrir;
        #endregion

        #endregion

        #region  Constructor
        public P_PedidoCabecera_Procesos_Controladora(P_PedidoCabecera_Procesos _frm_P_PedidoCabecera_Procesos, List<dynamic> _lst_Pedido_Seleccionados,bool _bol_UtilizarBolsa_Pordefecto)
        {
            g_frm_P_PedidoCabecera_Procesos = _frm_P_PedidoCabecera_Procesos;
            g_lst_Pedido_Seleccionados = _lst_Pedido_Seleccionados;
            g_bol_UtilizarBolsa_Pordefecto = _bol_UtilizarBolsa_Pordefecto;
        }
        #endregion

        #region Carga Inicial
        public void Carga_Inicial()
        {
            try
            {
                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GENERANDODATOS());

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

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

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

                throw new Control_Errores("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Carga_Inicial), true);
            }
        }
        private void TareaAsincrona_CargaInicial_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                #region Listado de Bolsa de Pedidos
                List<string> lst_ColumnasAMostrar = new List<string>();
                List<dynamic> lst_Valores = g_obj_VTA_PedidosCabecera_Bolsa_Datos.Obtener_Listado(g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa,
                                                                                                        ((g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales != null && g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.EjercicioActivo != null) ? g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.EjercicioActivo.id : -1),
                                                                                                        lst_ColumnasAMostrar, 
                                                                                                        null, 
                                                                                                        null);
                if (lst_Valores!=null && lst_Valores.Count>0)
                {
                    g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo = lst_Valores.Cast<INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo>().ToList();
                }
                #endregion

                #region Listado de Pedido Seleccionados

                if (g_lst_Pedido_Seleccionados != null && g_lst_Pedido_Seleccionados.Count > 0)
                {
                    g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo = g_lst_Pedido_Seleccionados.Cast<INTERNO_VTA_PedidosCabecera_Listado_Modelo>().ToList();
                }
                #endregion

                #region COPIAR
                //Cargamos el ensamblado
                Assembly obj_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type obj_type = obj_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                //creamos la instancia
                var obj_clase = Activator.CreateInstance(obj_type);
                //Cargamos el metodo solicitado
                MethodInfo m = obj_clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_OBTENER_LISTADO, BindingFlags.Instance | BindingFlags.NonPublic);

                object[] arr_parametros = {
                    Variables.G_STR_OPCION_MAE_CLIENTE,
                    g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa,
                    ((g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales !=null && g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.EjercicioActivo!=null )? g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.EjercicioActivo.id : -1),
                    g_lst_ColumnasAMostrar_ClientesASeleccionar ,
                    null,
                    null };

                //Pasamos los parametros al metodo y lo ejecutamos
                g_lst_ListadoRegistros_Clientes_COPIAR = (List<dynamic>)m.Invoke(obj_clase, arr_parametros);
                #endregion

                Carga_Inicial_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_DoWork));
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_DoWork));
            }
        }
        private void TareaAsincrona_CargaInicial_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {}
        private void TareaAsincrona_CargaInicial_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

            try
            {
                if (g_bol_UtilizarBolsa_Pordefecto)
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_RadioButton_Registros_Bolsa.Checked = true;
                }
                else
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_RadioButton_Registros_Seleccionados.Checked = true;
                }

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

        private void Carga_Inicial_Final()
        {
            try
            {
                #region COPIAR
                //Fecha Actual
                g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_Copiar_Fecha.Exferia_FechaSeleccion_Fecha = g_frm_P_PedidoCabecera_Procesos.P_Base_FechaTrabajo.ToString("dd/MM/yyyy");

                //Empresa
                if (g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa > -1)
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empresa.Exferia_F3_SoloSeleccion_Id = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa;
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empresa.Exferia_F3_SoloSeleccion_Codigo = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.str_Empresa_Codigo;
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empresa.Exferia_F3_SoloSeleccion_Descripcion = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.str_Empresa_Descripcion;
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empresa.Exferia_F3_SoloSeleccion_FechaBorrado = null;
                }

                //Empleado
                if (Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado != null)
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_Id = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.id;
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_Codigo = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.codigo;
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_Descripcion = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.nombre;
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_FechaBorrado = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.fechaBorrado;
                }
                #endregion

                #region CREAR PEDIDOS
                //Fecha Actual
                g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_CrearAlbaranFactura_Fecha.Exferia_FechaSeleccion_Fecha = g_frm_P_PedidoCabecera_Procesos.P_Base_FechaTrabajo.ToString("dd/MM/yyyy");

                //Empleado
                if (Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado != null)
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Id = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.id;
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Codigo = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.codigo;
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Descripcion = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.nombre;
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_FechaBorrado = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.fechaBorrado;
                }
                #endregion

                //Marcar como que no se modifico nada
                g_frm_P_PedidoCabecera_Procesos.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Carga_Inicial) + "/" + nameof(TareaAsincrona_CargaInicial_Completed));
            }
        }

        #endregion

        public void Mostrar_Registros_Totales(bool _bol_Bolsa)
        {
            try
            {


                //Variables
                int int_Totalregistros = 0;
                int int_Totalregistros_Abiertos = 0;
                int int_Totalregistros_Cerrados = 0;
                int int_Totalregistros_Cancelados = 0;
                int int_Totalregistros_Anulados = 0;
                int int_Totalregistros_PartePendiente = 0;
                int int_Totalregistros_NoAutorizados = 0;
                int int_Totalregistros_Servidos = 0;

                //Bolsa
                if (_bol_Bolsa)
                {
                    //Contar Valores
                    if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo!=null)
                    {
                        int_Totalregistros = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Count;

                        int_Totalregistros_Abiertos = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m=>m.estado==Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO).Count();
                        int_Totalregistros_Cerrados = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.estado == Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO).Count();
                        int_Totalregistros_Cancelados = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.situacion.ToString() == Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_CANCELADO.Codigo).Count();
                        int_Totalregistros_Anulados = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.situacion.ToString() == Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_ANULADO.Codigo).Count();
                        int_Totalregistros_PartePendiente = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.situacion.ToString() == Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_PARTEPENDIENTE.Codigo).Count();
                        int_Totalregistros_NoAutorizados = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.estado != Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO && (m.autorizado==null || m.autorizado.Value==false)).Count();
                        int_Totalregistros_Servidos = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.situacion.ToString() == Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_SERVIDO.Codigo).Count();
                    }
                }
                //Seleccionados
                else
                {
                    //Contar Valores
                    if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo != null)
                    {
                        int_Totalregistros = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Count;
                        int_Totalregistros_Abiertos = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.estado == Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO).Count();
                        int_Totalregistros_Cerrados = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.estado == Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO).Count();
                        int_Totalregistros_Cancelados = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.situacion.ToString() == Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_CANCELADO.Codigo).Count();
                        int_Totalregistros_Anulados = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.situacion.ToString() == Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_ANULADO.Codigo).Count();
                        int_Totalregistros_PartePendiente = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.situacion.ToString() == Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_PARTEPENDIENTE.Codigo).Count();
                        int_Totalregistros_NoAutorizados = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.estado != Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO && (m.autorizado == null || m.autorizado.Value == false)).Count();
                        int_Totalregistros_Servidos = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.situacion.ToString() == Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_SERVIDO.Codigo).Count();
                    }
                }

                //Total
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_Registros_Total.Text = int_Totalregistros.ToString();

                #region Cerrar
                //Cerrados
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_Cerrar_Total_Cerrados.Text = int_Totalregistros_Cerrados.ToString();

                //Abiertos
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_Cerrar_Total_Abiertos.Text = int_Totalregistros_Abiertos.ToString();
                #endregion

                #region Abrir
                //Abiertos
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_Abrir_Total_Abiertos.Text = int_Totalregistros_Abiertos.ToString();

                //Cancelados
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_Abrir_Total_Cancelados.Text = int_Totalregistros_Cancelados.ToString();

                //Servidos
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_Abrir_Total_Servidos.Text = int_Totalregistros_Servidos.ToString();

                //Parte Pendiente
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_Abrir_Total_PartePendiente.Text = int_Totalregistros_PartePendiente.ToString();

                //Cerrados
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_Abrir_Total_Cerrados.Text = (int_Totalregistros - (int_Totalregistros_Abiertos + int_Totalregistros_Cancelados + int_Totalregistros_Servidos + int_Totalregistros_PartePendiente)).ToString();
                #endregion

                #region Crear Albaranes/facturas
                //Abiertos
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_CrearAlbaranFactura_Total_Abiertos.Text = int_Totalregistros_Abiertos.ToString();

                //Cancelados
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_CrearAlbaranFactura_Total_Cancelados.Text = int_Totalregistros_Cancelados.ToString();

                //Anulados
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_CrearAlbaranFactura_Total_Anulados.Text = int_Totalregistros_Anulados.ToString();

                //NoAutorizado
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_CrearAlbaranFactura_Total_NoAutorizado.Text = int_Totalregistros_NoAutorizados.ToString();

                //Servidos
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_CrearAlbaranFactura_Total_Servidos.Text = int_Totalregistros_Servidos.ToString();
                
                //Pendientes
                g_frm_P_PedidoCabecera_Procesos.Exferia_Label_SinColor_CrearAlbaranFactura_Total_Pendientes.Text = (int_Totalregistros - (int_Totalregistros_Abiertos + int_Totalregistros_Cancelados + int_Totalregistros_Anulados + int_Totalregistros_NoAutorizados + int_Totalregistros_Servidos)).ToString();
                #endregion
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Mostrar_Registros_Totales));
            }
        }

        #region COPIAR
        #region Obtener Clientes Completo de base de datos
        public void Obtener_Listados_Completo_Clientes_BaseDatos()
        {
            try
            {
                if (g_obj_TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos != null)
                {
                    //Si se estaba ejecutando lo paro
                    while (g_obj_TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos.IsBusy)
                        Application.DoEvents();

                    g_bol_Obtencion_Listados_Completo_Clientes_BaseDatos_Termino = false;
                }
                else
                {
                    g_obj_TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos_DoWork);
                    g_obj_TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos_Completed);
                    g_obj_TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos.WorkerReportsProgress = false;
                    g_obj_TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos.WorkerSupportsCancellation = true;
                }

                g_frm_PE_Esperando = new PE_Esperando();
                g_frm_PE_Esperando.TopMost = true;
                g_frm_PE_Esperando.Show();

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos.RunWorkerAsync();
            }
            catch (Exception)
            {
                g_bol_Obtencion_Listados_Completo_Clientes_BaseDatos_Termino = true;

                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                Obtener_Cliente_BaseDatos();
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        protected void TareaAsincrona_Obtener_Listados_Completo_Clientes_BaseDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            g_bol_Obtencion_Listados_Completo_Clientes_BaseDatos_Termino = true;

            //Rellenar Grid
            Rellenar_DataGridView_ClientesASeleccionar_COPIAR(g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Copiar_ClientesASeleccionar_Busqueda.Text);
            Rellenar_DataGridView_ClientesSeleccionados_COPIAR(g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Copiar_ClientesSeleccionados_Busqueda.Text);
        }

        private void Obtener_Cliente_BaseDatos()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly obj_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type obj_type = obj_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                //creamos la instancia
                var obj_clase = Activator.CreateInstance(obj_type);
                //Cargamos el metodo solicitado
                MethodInfo m = obj_clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_OBTENER_LISTADO, BindingFlags.Instance | BindingFlags.NonPublic);

                object[] arr_parametros = {
                    Variables.G_STR_OPCION_MAE_CLIENTE,
                    g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa,
                    ((g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales !=null && g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.EjercicioActivo!=null )? g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.EjercicioActivo.id : -1),
                    g_lst_ColumnasAMostrar_ClientesASeleccionar ,
                    null,
                    null };

                //Pasamos los parametros al metodo y lo ejecutamos
                g_lst_ListadoRegistros_Clientes_COPIAR = (List<dynamic>)m.Invoke(obj_clase, arr_parametros);
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Controladora) + "/" + nameof(Obtener_Cliente_BaseDatos));
            }
        }
        #endregion

        #region Clientes A Seleccionar

        #region Rellenar DataGridView Clientes A Seleccionar

        public void Rellenar_DataGridView_ClientesASeleccionar_COPIAR(string _str_filtro)
        {
            try
            {

                if (g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR != null)
                {
                    g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR = true;
                    while (g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR.IsBusy)
                    {
                        Application.DoEvents();
                    }
                    g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR = false;
                }
                else
                {
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR = new BackgroundWorker();
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR_DoWork);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR_ProgressChanged);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR_Completed);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR.WorkerReportsProgress = true;
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_PedidoCabecera_Procesos.Exferia_DataGridView_Copiar_ClientesASeleccionar_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_ClientesASeleccionar_COPIAR = 0;
                g_frm_P_PedidoCabecera_Procesos.Exferia_BarraProgreso_Copiar_ClientesASeleccionar_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                g_frm_P_PedidoCabecera_Procesos.Exferia_BarraProgreso_Copiar_ClientesASeleccionar_BarraProgreso.Exferia_BarraProgreso_Actualizar = 0;

                //parametros para Filtrar
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_filtro);
                lst_Argumentos.Add((INTERNO_ComboBox_Modelo)g_frm_P_PedidoCabecera_Procesos.Exferia_ComboBox_Copiar_ClientesASeleccionar_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_PedidoCabecera_Procesos.Exferia_CheckBox_Copiar_ClientesASeleccionar_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_PedidoCabecera_Procesos.Exferia_CheckBox_Copiar_ClientesASeleccionar_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_PedidoCabecera_Procesos.Exferia_ComboBox_Copiar_ClientesASeleccionar_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_PedidoCabecera_Procesos.Exferia_ComboBox_Copiar_ClientesASeleccionar_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_PedidoCabecera_Procesos.Exferia_ComboBox_Copiar_ClientesASeleccionar_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_ASeleccionar.ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Rellenar_DataGridView_ClientesASeleccionar_COPIAR));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Rellenar_DataGridView_ClientesASeleccionar_COPIAR));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Datos Recibidos ..................................................
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Busqueda = (string)lst_Argumentos[0];
                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado = (INTERNO_ComboBox_Modelo)lst_Argumentos[1];
                bool bol_SensibilidadMayusMin = (bool)lst_Argumentos[2];
                bool bol_PalabraCompleta = (bool)lst_Argumentos[3];

                //Orden Actual
                string str_Ordenacion_PorDefecto = (string)lst_Argumentos[4];

                //Listado de la tabla
                g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = null;

                //Filtrar #############################################
                if (str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_ClientesASeleccionar_COPIAR.Count > 0)
                {
                    g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = g_lst_ListadoRegistros_Clientes_COPIAR;

                    //Hay algo Escrito en busqueda -------------------------------------------------------------------------------------------------------------------
                    if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado != null && str_Busqueda.Trim().Length > 0)
                    {
                        //Todos
                        if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador.Equals("-1"))
                        {
                            List<dynamic> lst_TodosFiltrado = new List<dynamic>();
                            foreach (INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_Filtros in g_lst_INTERNO_ComboBox_Modelo_Filtros_ClientesASeleccionar_COPIAR)
                            {
                                //Palabra Completa
                                if (bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString() == str_Busqueda).ToList());
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().ToUpper() == str_Busqueda.ToUpper()).ToList());
                                    }
                                }
                                //Por Contenido
                                else
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().Contains(str_Busqueda)).ToList());
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().ToUpper().Contains(str_Busqueda.ToUpper())).ToList());
                                    }
                                }
                            }
                            //Añadir al Listado Final
                            g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = lst_TodosFiltrado.Distinct().ToList();
                        }
                        //Campo seleccionado
                        else
                        {
                            //Palabra Completa
                            if (bol_PalabraCompleta)
                            {
                                //Sencible a mayusculas y minusculas
                                if (bol_SensibilidadMayusMin)
                                {
                                    g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString() == str_Busqueda).ToList();
                                }
                                //No tiene en cuenta las mayusculas y las minusculas
                                else
                                {
                                    g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().ToUpper() == str_Busqueda.ToUpper()).ToList();
                                }
                            }
                            //Por Contenido
                            else
                            {
                                //Sencible a mayusculas y minusculas
                                if (bol_SensibilidadMayusMin)
                                {
                                    g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().Contains(str_Busqueda)).ToList();
                                }
                                //No tiene en cuenta las mayusculas y las minusculas
                                else
                                {
                                    g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().ToUpper().Contains(str_Busqueda.ToUpper())).ToList();
                                }
                            }
                        }
                    }

                    //Filtros Avanzados
                    if (g_dct_ListadoFiltros_ClientesASeleccionar_COPIAR != null && g_dct_ListadoFiltros_ClientesASeleccionar_COPIAR.Count > 0)
                    {
                        g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = Funciones_Listado.Filtrar_Listado(g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR, g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_ASeleccionar, g_dct_ListadoFiltros_ClientesASeleccionar_COPIAR);
                    }
                }
                else
                {
                    g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = g_lst_ListadoRegistros_Clientes_COPIAR;
                }
                //#####################################################

                if (g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR != null)
                {
                    //Ordenar el Listado ##################
                    if (str_Ordenacion_PorDefecto.Trim().Length > 0)
                    {
                        //Descendente
                        if (g_frm_P_PedidoCabecera_Procesos.Exferia_Button_Copiar_ClientesASeleccionar_OrdenListado.Tag.ToString().Equals("1"))
                        {
                            g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.OrderByDescending(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                        }
                        //Ascendente
                        else
                        {
                            g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR = g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.OrderBy(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                        }
                    }
                    //#####################################

                    g_frm_P_PedidoCabecera_Procesos.Listado_ClientesASeleccionar_Ordenar_DataGridView_COPIAR();

                    g_frm_P_PedidoCabecera_Procesos.Exferia_BarraProgreso_Copiar_ClientesASeleccionar_BarraProgreso.Exferia_BarraProgreso_Total = g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Count;

                    object[] row;
                    foreach (dynamic obj_Dinamico in g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR)
                    {
                        //Se Cancelo la tarea asincrona ---------------------------
                        if (g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR)
                        {
                            return;
                        }

                        //Añadir Fila con Columnas .............................
                        row = Funciones_Listado.Transformar_Dynamic_A_Row(obj_Dinamico, g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_ASeleccionar);

                        //Llamar al Progress
                        g_int_TotalRegistrosInsertados_ClientesASeleccionar_COPIAR += 1;

                        ((BackgroundWorker)sender).ReportProgress(1, row);

                        //Application.DoEvents();
                        Thread.Sleep(1);
                    }

                }
            }
            catch (ThreadAbortException ex)
            {
                g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR = true;

                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR = true;

                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR = true;

                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_PedidoCabecera_Procesos.IsDisposed)
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_DataGridView_Copiar_ClientesASeleccionar_Listado.Rows.Add((object[])e.UserState);

                    g_frm_P_PedidoCabecera_Procesos.Exferia_BarraProgreso_Copiar_ClientesASeleccionar_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ClientesASeleccionar_COPIAR;
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesASeleccionar_COPIAR_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        #endregion

        #region Marcar/Desmarcar
        public void MarcarDesmarcar_ClientesASeleccionar_COPIAR(bool _bol_Marcar, List<long> _lst_Seleccionados)
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(_bol_Marcar ? Mensajes.G_STR_ESPERANDO_SELECCIONANDO_REGISTROS() : Mensajes.G_STR_ESPERANDO_DESSELECCIONANDO_REGISTROS());
                g_frm_PE_Esperando.TopMost = true;


                if (g_obj_TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR != null)
                {
                    g_bol_CancelarTareaAsincrona_MarcarDesmarca_ClientesASeleccionar_COPIAR = true;
                    while (g_obj_TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR.IsBusy)
                    {
                        Application.DoEvents();
                    }
                    g_bol_CancelarTareaAsincrona_MarcarDesmarca_ClientesASeleccionar_COPIAR = false;
                }
                else
                {
                    g_obj_TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR = new BackgroundWorker();
                    g_obj_TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR.DoWork += new DoWorkEventHandler(TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR_DoWork);
                    g_obj_TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR_Completed);
                    g_obj_TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR.WorkerReportsProgress = false;
                    g_obj_TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR.WorkerSupportsCancellation = true;
                }

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

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR.RunWorkerAsync(lst_Argumentos);

                g_frm_PE_Esperando.Show();
            }
            catch (Exception)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_TerminoCorrectamente = true;

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;
                bool bol_Seleccionar = (bool)lst_Argumentos[0];
                List<long> lst_Seleccionados = (List<long>)lst_Argumentos[1];

                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_ASeleccionar.LISTADO_COLUMNAS().Values.Where(m => m.ColumnaClave).FirstOrDefault();
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                {
                    str_NombreCampoClave = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                }

                //Listado a Marcar/Desmarcar
                List<long> lst_Listado_Auxiliar = new List<long>();

                //Marcar/Desmarcar Seleccionados
                if (lst_Seleccionados != null && lst_Seleccionados.Count > 0)
                {
                    lst_Listado_Auxiliar = g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && lst_Seleccionados.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).Select(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m)).Cast<long>().ToList();
                }
                //Marcar/Desmarcar Todos
                else
                {
                    lst_Listado_Auxiliar = g_lst_ListadoRegistros_Filtrados_ClientesASeleccionar_COPIAR.Select(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m)).Cast<long>().ToList();
                }

                Actualizar_ClientesSeleccionados_Colectivo_COPIAR(lst_Listado_Auxiliar, bol_Seleccionar);
            }
            catch (ThreadAbortException)
            {
                bol_TerminoCorrectamente = false;
            }
            catch (Exception)
            {
                bol_TerminoCorrectamente = false;
            }
            finally
            {
                e.Result = bol_TerminoCorrectamente;
            }
        }
        protected void TareaAsincrona_MarcarDesmarcar_ClientesASeleccionar_COPIAR_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            g_bol_CancelarTareaAsincrona_MarcarDesmarca_ClientesASeleccionar_COPIAR = false;

            if ((bool)e.Result)
            {
                Rellenar_DataGridView_ClientesASeleccionar_COPIAR(g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Copiar_ClientesASeleccionar_Busqueda.Text);
                Rellenar_DataGridView_ClientesSeleccionados_COPIAR(g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Copiar_ClientesSeleccionados_Busqueda.Text);
            }

        }
        #endregion

        public void Actualizar_ClientesSeleccionados_Individual_COPIAR(long _lng_id, bool _bol_Valor)
        {
            try
            {
                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_ASeleccionar.LISTADO_COLUMNAS().Values.Where(m => m.ColumnaClave).FirstOrDefault();
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                {
                    str_NombreCampoClave = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                }

                //Busco registro listado en memoria
                dynamic dnm_Registro = g_lst_ListadoRegistros_Clientes_COPIAR[g_lst_ListadoRegistros_Clientes_COPIAR.IndexOf(g_lst_ListadoRegistros_Clientes_COPIAR.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) == _lng_id).FirstOrDefault())];

                if (dnm_Registro != null)
                {
                    //Actualizar registro dinamico
                    dnm_Registro.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.Seleccionar)).SetValue(dnm_Registro, _bol_Valor, null);


                    //Modificar listado en memoria
                    g_lst_ListadoRegistros_Clientes_COPIAR[g_lst_ListadoRegistros_Clientes_COPIAR.IndexOf(g_lst_ListadoRegistros_Clientes_COPIAR.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) == _lng_id).FirstOrDefault())] = dnm_Registro;
                }


                if (_bol_Valor)
                {
                    if (!g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR.Contains(_lng_id))
                    {
                        g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR.Add(_lng_id);
                    }
                }
                else
                {
                    if (g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR.Contains(_lng_id))
                    {
                        g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR.Remove(_lng_id);
                    }
                }

                Rellenar_DataGridView_ClientesSeleccionados_COPIAR(g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Copiar_ClientesSeleccionados_Busqueda.Text);
            }
            catch (Exception)
            { }
        }
        public void Actualizar_ClientesSeleccionados_Colectivo_COPIAR(List<long> _lst_id, bool _bol_Valor)
        {
            try
            {
                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_ASeleccionar.LISTADO_COLUMNAS().Values.Where(m => m.ColumnaClave).FirstOrDefault();
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                {
                    str_NombreCampoClave = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                }

                //Actualizar el listado de registro general
                g_lst_ListadoRegistros_Clientes_COPIAR.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && _lst_id.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).ToList().ForEach(x => x.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.Seleccionar)).SetValue(x, _bol_Valor, null));

                //Actualizar el Listado de Seleccionados
                if (_bol_Valor)
                {
                    List<long> lst_RegistrosNuevos = _lst_id.Where(m => !g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR.Contains(m)).ToList();

                    if (lst_RegistrosNuevos != null && lst_RegistrosNuevos.Count > 0)
                    {
                        g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR.AddRange(lst_RegistrosNuevos);
                    }
                }
                else
                {
                    g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR.RemoveAll(m => _lst_id.Contains(m));
                }
            }
            catch (Exception)
            { }
        }

        #endregion

        #region Clientes seleccionados

        #region Rellenar DataGridView Clientes Seleccionados

        public void Rellenar_DataGridView_ClientesSeleccionados_COPIAR(string _str_filtro)
        {
            try
            {

                if (g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR != null)
                {
                    g_bol_CancelarTareaAsincrona_ClientesSeleccionados_COPIAR = true;
                    while (g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR.IsBusy)
                    {
                        Application.DoEvents();
                    }
                    g_bol_CancelarTareaAsincrona_ClientesSeleccionados_COPIAR = false;
                }
                else
                {
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR = new BackgroundWorker();
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR_DoWork);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR_ProgressChanged);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR_Completed);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR.WorkerReportsProgress = true;
                    g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_PedidoCabecera_Procesos.Exferia_DataGridView_Copiar_ClientesSeleccionados_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_ClientesSeleccionados_COPIAR = 0;
                g_frm_P_PedidoCabecera_Procesos.Exferia_BarraProgreso_Copiar_ClientesSeleccionados_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                g_frm_P_PedidoCabecera_Procesos.Exferia_BarraProgreso_Copiar_ClientesSeleccionados_BarraProgreso.Exferia_BarraProgreso_Actualizar = 0;

                //parametros para Filtrar
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_filtro);
                lst_Argumentos.Add((INTERNO_ComboBox_Modelo)g_frm_P_PedidoCabecera_Procesos.Exferia_ComboBox_Copiar_ClientesSeleccionados_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_PedidoCabecera_Procesos.Exferia_CheckBox_Copiar_ClientesSeleccionados_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_PedidoCabecera_Procesos.Exferia_CheckBox_Copiar_ClientesSeleccionados_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_PedidoCabecera_Procesos.Exferia_ComboBox_Copiar_ClientesSeleccionados_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_PedidoCabecera_Procesos.Exferia_ComboBox_Copiar_ClientesSeleccionados_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_PedidoCabecera_Procesos.Exferia_ComboBox_Copiar_ClientesSeleccionados_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_Seleccionados_COPIAR.ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Rellenar_DataGridView_ClientesSeleccionados_COPIAR));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Rellenar_DataGridView_ClientesSeleccionados_COPIAR));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_Seleccionados_COPIAR.LISTADO_COLUMNAS().Values.Where(m => m.ColumnaClave).FirstOrDefault();
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                {
                    str_NombreCampoClave = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                }

                //Datos Recibidos ..................................................
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Busqueda = (string)lst_Argumentos[0];
                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado = (INTERNO_ComboBox_Modelo)lst_Argumentos[1];
                bool bol_SensibilidadMayusMin = (bool)lst_Argumentos[2];
                bool bol_PalabraCompleta = (bool)lst_Argumentos[3];

                //Orden Actual
                string str_Ordenacion_PorDefecto = (string)lst_Argumentos[4];

                //Listado de la tabla
                List<dynamic> lst_ListadoRegistros_RegistrosSeleccionados = null;
                if (g_lst_ListadoRegistros_Clientes_COPIAR != null && g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR != null && g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR.Count > 0)
                {
                    //Busco registro listado en memoria
                    lst_ListadoRegistros_RegistrosSeleccionados = g_lst_ListadoRegistros_Clientes_COPIAR.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).ToList();
                }

                List<dynamic> lst_ListadoRegistros_Filtrados = null;

                //Filtrar #############################################
                if (lst_ListadoRegistros_RegistrosSeleccionados != null)
                {
                    if (str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_ClientesSeleccionados_COPIAR.Count > 0)
                    {
                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_RegistrosSeleccionados;

                        //Hay algo Escrito en busqueda -------------------------------------------------------------------------------------------------------------------
                        if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado != null && str_Busqueda.Trim().Length > 0)
                        {
                            //Todos
                            if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador.Equals("-1"))
                            {
                                List<dynamic> lst_TodosFiltrado = new List<dynamic>();
                                foreach (INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_Filtros in g_lst_INTERNO_ComboBox_Modelo_Filtros_ClientesSeleccionados_COPIAR)
                                {
                                    //Palabra Completa
                                    if (bol_PalabraCompleta)
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString() == str_Busqueda).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().ToUpper() == str_Busqueda.ToUpper()).ToList());
                                        }
                                    }
                                    //Por Contenido
                                    else
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().Contains(str_Busqueda)).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().ToUpper().Contains(str_Busqueda.ToUpper())).ToList());
                                        }
                                    }
                                }
                                //Añadir al Listado Final
                                lst_ListadoRegistros_Filtrados = lst_TodosFiltrado.Distinct().ToList();
                            }
                            //Campo seleccionado
                            else
                            {
                                //Palabra Completa
                                if (bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString() == str_Busqueda).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().ToUpper() == str_Busqueda.ToUpper()).ToList();
                                    }
                                }
                                //Por Contenido
                                else
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().Contains(str_Busqueda)).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().ToUpper().Contains(str_Busqueda.ToUpper())).ToList();
                                    }
                                }
                            }
                        }

                        //Filtros Avanzados
                        if (g_dct_ListadoFiltros_ClientesSeleccionados_COPIAR != null && g_dct_ListadoFiltros_ClientesSeleccionados_COPIAR.Count > 0)
                        {
                            lst_ListadoRegistros_Filtrados = Funciones_Listado.Filtrar_Listado(lst_ListadoRegistros_Filtrados, g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_Seleccionados_COPIAR, g_dct_ListadoFiltros_ClientesSeleccionados_COPIAR);
                        }
                    }
                    else
                    {
                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_RegistrosSeleccionados;
                    }
                    //#####################################################

                    if (lst_ListadoRegistros_Filtrados != null)
                    {
                        //Ordenar el Listado ##################
                        if (str_Ordenacion_PorDefecto.Trim().Length > 0)
                        {
                            //Descendente
                            if (g_frm_P_PedidoCabecera_Procesos.Exferia_Button_Copiar_ClientesSeleccionados_OrdenListado.Tag.ToString().Equals("1"))
                            {
                                lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.OrderByDescending(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                            }
                            //Ascendente
                            else
                            {
                                lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.OrderBy(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                            }
                        }
                        //#####################################

                        g_frm_P_PedidoCabecera_Procesos.Listado_ClientesSeleccionados_Ordenar_DataGridView_COPIAR();

                        //Guadar el listado .......................................................................................
                        g_frm_P_PedidoCabecera_Procesos.Exferia_BarraProgreso_Copiar_ClientesSeleccionados_BarraProgreso.Exferia_BarraProgreso_Total = lst_ListadoRegistros_Filtrados.Count;

                        object[] row;
                        foreach (dynamic obj_Dinamico in lst_ListadoRegistros_Filtrados)
                        {
                            //Se Cancelo la tarea asincrona ---------------------------
                            if (g_bol_CancelarTareaAsincrona_ClientesSeleccionados_COPIAR)
                            {
                                return;
                            }

                            //Añadir Fila con Columnas .............................
                            row = Funciones_Listado.Transformar_Dynamic_A_Row(obj_Dinamico, g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_Seleccionados_COPIAR);

                            //Llamar al Progress
                            g_int_TotalRegistrosInsertados_ClientesSeleccionados_COPIAR += 1;

                            ((BackgroundWorker)sender).ReportProgress(1, row);

                            //Application.DoEvents();
                            Thread.Sleep(1);
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                g_bol_CancelarTareaAsincrona_ClientesSeleccionados_COPIAR = true;

                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_ClientesSeleccionados_COPIAR = true;

                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_ClientesSeleccionados_COPIAR = true;

                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_PedidoCabecera_Procesos.Exferia_DataGridView_Copiar_ClientesSeleccionados_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_PedidoCabecera_Procesos.Exferia_BarraProgreso_Copiar_ClientesSeleccionados_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ClientesSeleccionados_COPIAR;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ClientesSeleccionados_COPIAR_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        #endregion

        #region Vaciar Clientes Seleccionados
        public void Vaciar_ClientesSeleccionados_COPIAR(List<long> _lst_ids_ABorrar)
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_DESSELECCIONANDO_REGISTROS());
                g_frm_PE_Esperando.TopMost = true;


                if (g_obj_TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR != null)
                {
                    g_bol_CancelarTareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR = true;
                    while (g_obj_TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR.IsBusy)
                    {
                        Application.DoEvents();
                    }
                    g_bol_CancelarTareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR = false;
                }
                else
                {
                    g_obj_TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR = new BackgroundWorker();
                    g_obj_TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR.DoWork += new DoWorkEventHandler(TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR_DoWork);
                    g_obj_TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR_Completed);
                    g_obj_TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR.WorkerReportsProgress = false;
                    g_obj_TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR.WorkerSupportsCancellation = true;
                }

                g_lst_ClientesSeleccionados_AVaciar_COPIAR = _lst_ids_ABorrar;

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR.RunWorkerAsync();

                g_frm_PE_Esperando.Show();
            }
            catch (Exception)
            {
                g_bol_CancelarTareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR = false;

                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_TerminoCorrectamente = true;

            try
            {
                Actualizar_ClientesSeleccionados_Colectivo_COPIAR(g_lst_ClientesSeleccionados_AVaciar_COPIAR, false);
            }
            catch (ThreadAbortException)
            {
                bol_TerminoCorrectamente = false;
            }
            catch (Exception)
            {
                bol_TerminoCorrectamente = false;
            }
            finally
            {
                e.Result = bol_TerminoCorrectamente;
            }
        }
        protected void TareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_bol_CancelarTareaAsincrona_Vaciar_ClientesSeleccionados_COPIAR = false;

            try
            {
                if ((bool)e.Result)
                {
                    string str_NombreCampoClave = "id";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_MAE_Clientes_P_PedidoCabecera_Copiar_Seleccionados_COPIAR.LISTADO_COLUMNAS().Values.Where(m => m.ColumnaClave).FirstOrDefault();
                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                    {
                        str_NombreCampoClave = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                    }

                    //Borrar los datos del DataGridView
                    g_frm_P_PedidoCabecera_Procesos.Exferia_DataGridView_Copiar_ClientesSeleccionados_Listado.Rows
                            .Cast<DataGridViewRow>()
                            .ToList()
                            .Where(r => g_lst_ClientesSeleccionados_AVaciar_COPIAR.Contains(long.Parse(r.Cells[str_NombreCampoClave].Value.ToString()))).ToList().ForEach(m => g_frm_P_PedidoCabecera_Procesos.Exferia_DataGridView_Copiar_ClientesSeleccionados_Listado.Rows.Remove(m));

                    //Rellenar de Nuevo el Listado de Registros a Incluir
                    Rellenar_DataGridView_ClientesASeleccionar_COPIAR(g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Copiar_ClientesASeleccionar_Busqueda.Text);
                }
            }
            catch (Exception)
            { }
            finally
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }
        }
        #endregion

        #endregion

        #region Proceso de Copiar la Pedido
        public void Proceso_Copia()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_PedidoCabecera_Procesos.Enabled = false;

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

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_ProcesoCopia != null)
                {
                    while (g_obj_TareaAsincrona_ProcesoCopia.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_ProcesoCopia = new BackgroundWorker();
                    g_obj_TareaAsincrona_ProcesoCopia.DoWork += new DoWorkEventHandler(TareaAsincrona_ProcesoCopia_DoWork);
                    g_obj_TareaAsincrona_ProcesoCopia.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_ProcesoCopia_ProgressChanged);
                    g_obj_TareaAsincrona_ProcesoCopia.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_ProcesoCopia_Completed);
                    g_obj_TareaAsincrona_ProcesoCopia.WorkerReportsProgress = true;
                }

                //vaciar Resumen
                g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Copiar_Resumen.Text = "";

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

                g_frm_PE_Esperando_BarraProgreso.Show();
            }
            catch (Exception ex)
            {
                g_frm_P_PedidoCabecera_Procesos.Enabled = true;

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

                throw new Control_Errores("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Proceso_Copia), true);
            }
        }

        private void TareaAsincrona_ProcesoCopia_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            int int_Total_Clientes_Completados_Correctos = 0;
            List<long> lst_ids_registrosCorrectos = new List<long>();
            int int_Total_Clientes_Completados_ConErrores = 0;
            string str_Mensajes = "";
            string str_MensajeError_PorCliente = "";
            GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa = null;

            try
            {
                // ## 1º-> VALIDAR
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos_COPIAR();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    List<dynamic> lst_Pedidos_Seleccionados = null;
                    //Bolsa
                    if (g_frm_P_PedidoCabecera_Procesos.Exferia_RadioButton_Registros_Bolsa.Checked)
                    {
                        if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Count > 0)
                        {
                            lst_Pedidos_Seleccionados = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Cast<dynamic>().ToList();
                        }
                    }
                    //Seleccionados
                    else
                    {
                        if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Count > 0)
                        {
                            lst_Pedidos_Seleccionados = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Cast<dynamic>().ToList();
                        }
                    }

                    if (lst_Pedidos_Seleccionados != null && lst_Pedidos_Seleccionados.Count > 0)
                    {
                        //Total de lineas
                        ((BackgroundWorker)sender).ReportProgress(1, lst_Pedidos_Seleccionados.Count);

                        int int_Contador_Pedidos = 1;

                        //## 2º-> RECORREMOS LoS Pedido Y VAMOS CREANDO LOS REGISTROS
                        foreach (dynamic dnm_PedidoCabecera in lst_Pedidos_Seleccionados)
                        {
                            string str_DatosPedidoCabecera = " ◘ Pedido (" + dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.numeroDocumento)).GetValue(dnm_PedidoCabecera) + ") " + dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.fecha)).GetValue(dnm_PedidoCabecera) + System.Environment.NewLine;
                            str_MensajeError_PorCliente = "";

                            //Mensaje de recalculando ............................................................................................................
                            ((BackgroundWorker)sender).ReportProgress(3, str_DatosPedidoCabecera);
                            //total cargado de lineas
                            ((BackgroundWorker)sender).ReportProgress(2, int_Contador_Pedidos);
                            //.....................................................................................................................................

                            //## 3º-> OBTENER LOS DATOS DE LA PedidoCABECERA SELECCIONADA
                            INTERNO_VTA_PedidosCabecera_Modelo mdl_INTERNO_VTA_PedidossCabecera_Modelo = Obtener_PedidoCabecera_COPIAR(dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.id)).GetValue(dnm_PedidoCabecera));
                            if (mdl_INTERNO_VTA_PedidossCabecera_Modelo != null)
                            {
                                //## 4º-> RECORRER LOS Clientes
                                foreach (long lng_idCliente in g_lst_ListadoRegistros_ClientesSeleccionados_COPIAR)
                                {
                                    mdl_GEN_EjerciciosActivos_Empresa = null;

                                    //## 5º-> BUSCAR LOS DATOS DE CLIENTE
                                    dynamic dnm_Cliente = g_lst_ListadoRegistros_Clientes_COPIAR.Where(m => m.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.id)).GetValue(m, null) != null && m.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.id)).GetValue(m, null) == lng_idCliente).FirstOrDefault();
                                    if (dnm_Cliente != null)
                                    {
                                        //Datos del cliente 
                                        string str_Datos_Cliente = "       ► CLIENTE (" + dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.codigo)).GetValue(dnm_Cliente, null) + ") " +
                                                                                                dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.nombreComercial)).GetValue(dnm_Cliente, null) + System.Environment.NewLine;


                                        //Mensaje de cliente ............................................................................................................
                                        ((BackgroundWorker)sender).ReportProgress(3, str_DatosPedidoCabecera + str_Datos_Cliente);
                                        //.....................................................................................................................................

                                        //## 6º->VALIDAR LOS IMPUESTOSTIPOS DE LAS LINEAS SI ESTAN ACTIVOS SEGUN LA FECHA
                                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_VALIDARIMPUESTOS = Validar_Impuestos_COPIAR(DateTime.ParseExact(g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_Copiar_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture),
                                                                                                                                           mdl_INTERNO_VTA_PedidossCabecera_Modelo.idImpuestoCabecera,
                                                                                                                                           mdl_INTERNO_VTA_PedidossCabecera_Modelo.PedidoLineas,
                                                                                                                                           dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.idImpuestoCabecera)).GetValue(dnm_Cliente, null));
                                        if (mdl_INTERNO_ValorDevuelto_Modelo_VALIDARIMPUESTOS.TodoCorrecto)
                                        {
                                            //## 7º-> BUSCAR EL EJERCICIO SEGUN LA FECHA
                                            mdl_GEN_EjerciciosActivos_Empresa = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(DateTime.ParseExact(g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_Copiar_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture), g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa);
                                            if (mdl_GEN_EjerciciosActivos_Empresa != null)
                                            {
                                                //## 8º-> BUSCAR EL NUMERO DE DOCUMENTO
                                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO = Buscar_CodigoSiguiente_COPIAR(mdl_INTERNO_VTA_PedidossCabecera_Modelo.idDelegacion, mdl_GEN_EjerciciosActivos_Empresa);
                                                if (mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO.TodoCorrecto)
                                                {
                                                    //Modelo de VTA_PedidossCabecera
                                                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CABECERA = PedidoCabecera_AGrabar_COPIAR(mdl_INTERNO_VTA_PedidossCabecera_Modelo, lng_idCliente, mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO.Objeto.ToString(), dnm_Cliente, mdl_GEN_EjerciciosActivos_Empresa);
                                                    if (mdl_INTERNO_ValorDevuelto_Modelo_CABECERA.TodoCorrecto)
                                                    {
                                                        //Modelo de VTA_PedidossCabecera
                                                        VTA_PedidosCabecera mdl_VTA_PedidosCabecera = (VTA_PedidosCabecera)mdl_INTERNO_ValorDevuelto_Modelo_CABECERA.Objeto;

                                                        //## 9º-> RECALCULAR LINEAS
                                                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = Recalcular_TarifasPromociones_PorLineas_COPIAR(dnm_Cliente, mdl_INTERNO_VTA_PedidossCabecera_Modelo);
                                                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                                                        {
                                                            //Agregar las Lineas
                                                            mdl_VTA_PedidosCabecera.VTA_PedidosLineas = (List<VTA_PedidosLineas>)mdl_INTERNO_ValorDevuelto_Modelo.Objeto;

                                                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN = PedidosCabecera_Resumen_AGrabar_COPIAR(mdl_VTA_PedidosCabecera);
                                                            if (mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.TodoCorrecto)
                                                            {
                                                                //Agregar el resumen
                                                                mdl_VTA_PedidosCabecera.VTA_PedidosCabecera_Resumen = (List<VTA_PedidosCabecera_Resumen>)mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.Objeto;

                                                                //Totales
                                                                INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES = (INTERNO_ImportesImpuestos_Modelo)mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.Objeto_Auxiliar_1;
                                                                if (mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES != null)
                                                                {
                                                                    //total_bruto
                                                                    mdl_VTA_PedidosCabecera.total_bruto = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Bruto;

                                                                    //total_descuentoProntoPago
                                                                    mdl_VTA_PedidosCabecera.total_descuentoProntoPago = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.DescuentoProntoPago_Calculado;

                                                                    //total_descuentoFinalFactura
                                                                    mdl_VTA_PedidosCabecera.total_descuentoFinalFactura = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.DescuentoFacturaFinal_Calculado;

                                                                    //total_baseImponible
                                                                    mdl_VTA_PedidosCabecera.total_baseImponible = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.BaseImponible;

                                                                    //total_impuesto
                                                                    mdl_VTA_PedidosCabecera.total_impuesto = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Impuesto_Calculado;

                                                                    //total_recargo
                                                                    mdl_VTA_PedidosCabecera.total_recargo = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Recargo_Calculado;

                                                                    //total_descuentoFinalAlbaran
                                                                    mdl_VTA_PedidosCabecera.total_descuentoFinalAlbaran = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.DescuentoAlbaranFinal_Calculado;

                                                                    //total
                                                                    mdl_VTA_PedidosCabecera.total = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Total;
                                                                }

                                                                //Insertar registro
                                                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_GRABAR = GrabarDatos_COPIAR(mdl_VTA_PedidosCabecera);
                                                                if (mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.TodoCorrecto)
                                                                {
                                                                    //AÑADIR AL LISTADO DE CABECERA CORRECTAS
                                                                    lst_ids_registrosCorrectos.Add(mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.Id);

                                                                    //CORRECTO
                                                                    int_Total_Clientes_Completados_Correctos += 1;

                                                                    #region Cerrar Documento
                                                                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CERRAR = new INTERNO_ValorDevuelto_Modelo();
                                                                    mdl_INTERNO_ValorDevuelto_Modelo_CERRAR.TodoCorrecto = false;

                                                                    if (mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.Objeto != null)
                                                                    {
                                                                        mdl_INTERNO_ValorDevuelto_Modelo_CERRAR = Cerrar_Documento_COPIAR((long)mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.Objeto, mdl_VTA_PedidosCabecera);
                                                                    }

                                                                    //Si no se pudo cerrar se, muestra un mensaje
                                                                    if (mdl_INTERNO_ValorDevuelto_Modelo_CERRAR.TodoCorrecto == false)
                                                                    {
                                                                        str_Mensajes += "    ◘ PEDIDO COPIA (" + mdl_VTA_PedidosCabecera.numeroDocumento + ") no se pudo cerrar " + System.Environment.NewLine;
                                                                    }
                                                                    #endregion
                                                                }
                                                                else
                                                                {
                                                                    //CON ERRORES
                                                                    int_Total_Clientes_Completados_ConErrores += 1;
                                                                    str_MensajeError_PorCliente += str_Datos_Cliente + "             - Error al insertar." + System.Environment.NewLine;
                                                                }
                                                            }
                                                            else
                                                            {
                                                                //CON ERRORES
                                                                int_Total_Clientes_Completados_ConErrores += 1;
                                                                str_MensajeError_PorCliente += str_Datos_Cliente + "             - Error al recalcular los totales e impuestos." + System.Environment.NewLine;
                                                            }
                                                        }
                                                        else
                                                        {
                                                            //CON ERRORES
                                                            int_Total_Clientes_Completados_ConErrores += 1;
                                                            str_MensajeError_PorCliente += str_Datos_Cliente + "             - Error al crear las lineas." + System.Environment.NewLine;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        //CON ERRORES
                                                        int_Total_Clientes_Completados_ConErrores += 1;
                                                        str_MensajeError_PorCliente += str_Datos_Cliente + "             - Error al crear la cabecera." + System.Environment.NewLine;
                                                    }
                                                }
                                                else
                                                {
                                                    //CON ERRORES
                                                    int_Total_Clientes_Completados_ConErrores += 1;
                                                    str_MensajeError_PorCliente += str_Datos_Cliente + "             - No se encontro el nº de documento." + System.Environment.NewLine;
                                                }
                                            }
                                            else
                                            {
                                                //CON ERRORES
                                                int_Total_Clientes_Completados_ConErrores += 1;
                                                str_MensajeError_PorCliente += str_Datos_Cliente + "             - " + Mensajes.G_STR_MENSAJES_VALIDACION_FECHASEJERCICIOS_NOTIENEEJERCICIOSCREADOS() + System.Environment.NewLine;
                                            }
                                        }
                                        else
                                        {
                                            //CON ERRORES
                                            int_Total_Clientes_Completados_ConErrores += 1;
                                            str_MensajeError_PorCliente += str_Datos_Cliente + "             - " + mdl_INTERNO_ValorDevuelto_Modelo_VALIDARIMPUESTOS.Mensaje + System.Environment.NewLine;
                                        }
                                    }
                                    else
                                    {
                                        //CON ERRORES
                                        int_Total_Clientes_Completados_ConErrores += 1;
                                        str_MensajeError_PorCliente += " ► No se encontro el cliente." + System.Environment.NewLine;
                                    }
                                }
                            }
                            else
                            {
                                //CON ERRORES
                                int_Total_Clientes_Completados_ConErrores += 1;
                                str_MensajeError_PorCliente += Mensajes.G_STR_MENSAJES_GENERAL_NOENCUENTRAREGISTRO() + System.Environment.NewLine;
                            }

                            //Si dio un error se guarda la Pedido
                            if (str_MensajeError_PorCliente.Trim().Length > 0)
                            {
                                str_Mensajes += str_DatosPedidoCabecera + str_MensajeError_PorCliente;
                            }

                            int_Contador_Pedidos += 1;

                        }
                    }
                    else
                    {
                        str_Mensajes = Mensajes.G_STR_MENSAJES_LISTADOS_NOHAYREGISTROSSELECCIONADOS();
                    }
                }
                else
                {
                    str_Mensajes = mdl_ValorDevuelto_Modelo_VALIDACION.Mensaje;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoCopia_DoWork));

                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Control_Errores)
            {
                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoCopia_DoWork));
                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            finally
            {
                //Agregar los mensajes
                str_Mensajes = "Con error: " + int_Total_Clientes_Completados_ConErrores + System.Environment.NewLine + str_Mensajes;
                str_Mensajes = "Satisfactorias: " + int_Total_Clientes_Completados_Correctos + System.Environment.NewLine + str_Mensajes;
                mdl_ValorDevuelto_Modelo.Mensaje = str_Mensajes;

                //registros a actualziar emn el listado principal
                mdl_ValorDevuelto_Modelo.Objeto = lst_ids_registrosCorrectos;


                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_ProcesoCopia_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage.ToString().Equals("1"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Total = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("2"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Actualizar = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("3"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Mensaje = e.UserState.ToString();
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_ProcesoCopia_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (g_frm_PE_Esperando_BarraProgreso != null)
                {
                    g_frm_PE_Esperando_BarraProgreso.Close();
                    g_frm_PE_Esperando_BarraProgreso = null;
                }

                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje != null &&
                    mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Copiar_Resumen.Text = mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim();
                }

                //Actualiazr los registro en el listado principal
                if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                {
                    // Devolver al Listado el Row Añadido
                    if (g_frm_P_PedidoCabecera_Procesos.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_PedidoCabecera_Procesos.P_Base_PantallaOrigen.P_Base_ActualizarRegistro((List<long>)mdl_ValorDevuelto_Modelo_Resultado.Objeto, G_ENUM_TIPOACCION.INT_INSERTAR);
                    }
                }

                //Marcar como que no se modifico nada
                g_frm_P_PedidoCabecera_Procesos.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoCopia_Completed));
            }
            finally
            {
                //Desbloquear el Formulario
                g_frm_P_PedidoCabecera_Procesos.Enabled = true;
            }
        }

        private INTERNO_ValorDevuelto_Modelo Validar_Impuestos_COPIAR(DateTime _dtt_Fecha, long _lng_idImpuestoCabecera_Original, List<INTERNO_VTA_PedidosLineas_Listado_Modelo> _lst_INTERNO_VTA_PedidossLineas_Listado_Modelo, long _lng_idImpuestoCabecera_Nuevo)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            try
            {
                if (_lst_INTERNO_VTA_PedidossLineas_Listado_Modelo != null && _lst_INTERNO_VTA_PedidossLineas_Listado_Modelo.Count > 0)
                {
                    // ## 1º--> BUSCAR EL IMPUESTOCABECERA SI NO ES NULO ###############################################################################
                    GEN_ImpuestosCabecera mdl_GEN_ImpuestosCabecera = Datos_Generales.GEN_ImpuestosCabecera_Obtener_Modelo_Por_Id(_lng_idImpuestoCabecera_Nuevo);
                    if (mdl_GEN_ImpuestosCabecera != null)
                    {
                        // ## 2º--> COMPROBAR QUE EL IDIMPUESTOCABECERA ES DIFERENTE AL QUE YA ESTABA
                        if (!_lng_idImpuestoCabecera_Original.Equals(mdl_GEN_ImpuestosCabecera.id))
                        {
                            // ## 3º--> RECORRER LINEAS
                            foreach (INTERNO_VTA_PedidosLineas_Listado_Modelo mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo in _lst_INTERNO_VTA_PedidossLineas_Listado_Modelo)
                            {
                                bool? bol_Existe = Datos_Generales.GEN_ImpuestosLineas_Existe(mdl_GEN_ImpuestosCabecera.id, mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idImpuestoTipo.Value, _dtt_Fecha);
                                if (bol_Existe == null || bol_Existe == false)
                                {
                                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;

                                    string str_ImpuestoCabecera = "(" + mdl_GEN_ImpuestosCabecera.codigo + ") " + mdl_GEN_ImpuestosCabecera.descripcion;

                                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_IMPUESTOTIPO_NOACTIVO_IMPUESTOCABECERAPORDEFECTO(str_ImpuestoCabecera, _dtt_Fecha.ToString("dd/MM/yyyy"));
                                    break;
                                }
                            }
                        }
                    }
                    //Si el ImpuestoCabecera es nulo (error)
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_PEDIDOSVENTA_VALIDACION_NOENCONTRO_IMPUESTOS();
                    }
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Validar_Impuestos_COPIAR));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private INTERNO_VTA_PedidosCabecera_Modelo Obtener_PedidoCabecera_COPIAR(long _lng_idPedidoCabecera)
        {
            INTERNO_VTA_PedidosCabecera_Modelo mdl_INTERNO_VTA_PedidossCabecera_Modelo = null;

            try
            {
                mdl_INTERNO_VTA_PedidossCabecera_Modelo = g_obj_VTA_PedidosCabecera_Datos.Obtener(_lng_idPedidoCabecera);
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Obtener_PedidoCabecera_COPIAR));
            }

            return mdl_INTERNO_VTA_PedidossCabecera_Modelo;
        }


        private INTERNO_ValorDevuelto_Modelo PedidoCabecera_AGrabar_COPIAR(INTERNO_VTA_PedidosCabecera_Modelo _mdl_INTERNO_VTA_PedidossCabecera_Modelo,
                                                                                long _lng_idCliente,
                                                                                string _str_NumeroDocumento,
                                                                                dynamic _dnm_Cliente,
                                                                                GEN_EjerciciosActivos_Empresa _mdl_GEN_EjerciciosActivos_Empresa)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {


                VTA_PedidosCabecera mdl_VTA_PedidosCabecera = new VTA_PedidosCabecera();

                //id
                mdl_VTA_PedidosCabecera.id = -1;

                //NumeroDocumento ............................................................
                mdl_VTA_PedidosCabecera.numeroDocumento = long.Parse(_str_NumeroDocumento);

                //idDelegacion 
                mdl_VTA_PedidosCabecera.idDelegacion = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idDelegacion;

                //idEmpresa
                string str_CodigoEmpresa = "";
                if (g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empresa.Exferia_F3_SoloSeleccion_Id > -1)
                {
                    mdl_VTA_PedidosCabecera.idEmpresa = g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empresa.Exferia_F3_SoloSeleccion_Id;
                    str_CodigoEmpresa = g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empresa.Exferia_F3_SoloSeleccion_Codigo;
                }
                else
                {
                    mdl_VTA_PedidosCabecera.idEmpresa = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idEmpresa;
                    str_CodigoEmpresa = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.str_Empresa_Codigo;
                }

                // fecha
                mdl_VTA_PedidosCabecera.fecha = DateTime.ParseExact(g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_Copiar_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                // descripcion (Se pone Empresa/Ejercicio/Delegacion/Nº Documento)
                mdl_VTA_PedidosCabecera.descripcion = str_CodigoEmpresa + "/" +
                                                            (_mdl_GEN_EjerciciosActivos_Empresa != null ? _mdl_GEN_EjerciciosActivos_Empresa.anioControl : "") + "/" +
                                                            _mdl_INTERNO_VTA_PedidossCabecera_Modelo.GEN_Delegaciones.codigo + "/" +
                                                            _str_NumeroDocumento;

                // guid
                mdl_VTA_PedidosCabecera.guid = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.guid;

                //Estado
                mdl_VTA_PedidosCabecera.estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

                //idCliente ..................................................................................
                mdl_VTA_PedidosCabecera.idCliente = _lng_idCliente;

                //Moneda 
                //Buscar el idMoneda en el cliente
                long? lng_idMoneda = (long?)_dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.idMoneda)).GetValue(_dnm_Cliente, null);
                if (lng_idMoneda != null)
                {
                    mdl_VTA_PedidosCabecera.idMoneda = lng_idMoneda.Value;
                }
                else
                {
                    mdl_VTA_PedidosCabecera.idMoneda = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idMoneda;
                }

                //Impuesto Cabecera 
                //Buscar el idImpuestoCabecera en el cliente
                long? lng_idImpuestoCabecera = _dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.idImpuestoCabecera)).GetValue(_dnm_Cliente, null);
                if (lng_idImpuestoCabecera != null)
                {
                    mdl_VTA_PedidosCabecera.idImpuestoCabecera = lng_idImpuestoCabecera.Value;
                }
                else
                {
                    mdl_VTA_PedidosCabecera.idImpuestoCabecera = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idImpuestoCabecera;
                }

                //idRelacionClienteProveedor
                mdl_VTA_PedidosCabecera.idRelacionClienteProveedor = null;

                //Descuento pronto pago
                mdl_VTA_PedidosCabecera.descuentoProntoPago = (decimal?)_dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.descuentoProntoPago)).GetValue(_dnm_Cliente, null);

                //Descuento final factura
                mdl_VTA_PedidosCabecera.descuentoFinalFactura = (decimal?)_dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.descuentoFinalFactura)).GetValue(_dnm_Cliente, null);

                //Descuento final Albaran
                mdl_VTA_PedidosCabecera.descuentoFinalAlbaran = (decimal?)_dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.descuentoFinalAlbaran)).GetValue(_dnm_Cliente, null);

                //idEmpleado
                if (g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_Id > -1)
                {
                    mdl_VTA_PedidosCabecera.idEmpleado = g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_Id;
                }
                else
                {
                    mdl_VTA_PedidosCabecera.idEmpleado = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idEmpleado;
                }

                //idVendedor_Preventa
                mdl_VTA_PedidosCabecera.idVendedor_Preventa = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idVendedor_Preventa;

                //idVendedor_Preventa habitual
                mdl_VTA_PedidosCabecera.idVendedor_PreventaHabitual = (long?)_dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.idVendedor)).GetValue(_dnm_Cliente, null);

                //idVendedor_Repartidor
                mdl_VTA_PedidosCabecera.idVendedor_Repartidor = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idVendedor_Repartidor;

                //referencia
                mdl_VTA_PedidosCabecera.referencia = "";

                //fechaPrevista
                mdl_VTA_PedidosCabecera.fechaPrevista = mdl_VTA_PedidosCabecera.fecha.AddDays(1);

                //idPredefinidoCabecera_Pedido
                mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Pedido = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idPredefinidoCabecera_Pedido;

                //idPredefinidoCabecera_Cancelacion
                mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Cancelacion = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idPredefinidoCabecera_Cancelacion;

                //idPredefinidoCabecera_Anulacion
                mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Anulacion = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idPredefinidoCabecera_Anulacion;

                //idClaveAnalitica
                mdl_VTA_PedidosCabecera.idClaveAnalitica = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idClaveAnalitica;

                //Recargo por Ejercicio
                if (_mdl_GEN_EjerciciosActivos_Empresa.recargo != null && _mdl_GEN_EjerciciosActivos_Empresa.recargo.Value)
                {
                    //Recargo Segun Cliente
                    bool? bol_Recargo_cliente = (bool?)_dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.recargo)).GetValue(_dnm_Cliente, null);
                    if (bol_Recargo_cliente != null && bol_Recargo_cliente.Value)
                    {
                        mdl_VTA_PedidosCabecera.recargo = true;
                    }
                    else
                    {
                        mdl_VTA_PedidosCabecera.recargo = false;
                    }
                }
                else
                {
                    mdl_VTA_PedidosCabecera.recargo = false;
                }

                //Situacion
                mdl_VTA_PedidosCabecera.situacion = int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_PENDIENTE.Codigo);

                //autorizado
                if (_mdl_GEN_EjerciciosActivos_Empresa.autorizarPedidoVentaAutomatico != null)
                {
                    mdl_VTA_PedidosCabecera.autorizado = _mdl_GEN_EjerciciosActivos_Empresa.autorizarPedidoVentaAutomatico.Value;
                }
                else
                {
                    mdl_VTA_PedidosCabecera.autorizado = false;
                }

                // observaciones
                mdl_VTA_PedidosCabecera.observaciones = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.observaciones;

                //total_bruto
                mdl_VTA_PedidosCabecera.total_bruto = 0;

                //total_descuentoProntoPago
                mdl_VTA_PedidosCabecera.total_descuentoProntoPago = 0;

                //total_descuentoFinalFactura
                mdl_VTA_PedidosCabecera.total_descuentoFinalFactura = 0;

                //total_baseImponible
                mdl_VTA_PedidosCabecera.total_baseImponible = 0;

                //total_impuesto
                mdl_VTA_PedidosCabecera.total_impuesto = 0;

                //total_recargo
                mdl_VTA_PedidosCabecera.total_recargo = 0;

                //total_descuentoFinalAlbaran
                mdl_VTA_PedidosCabecera.total_descuentoFinalAlbaran = 0;

                //total
                mdl_VTA_PedidosCabecera.total = 0;

                //Almacenar en la variables
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = mdl_VTA_PedidosCabecera;

            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;


                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(PedidoCabecera_AGrabar_COPIAR));
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo Recalcular_TarifasPromociones_PorLineas_COPIAR(dynamic _dnm_Cliente,
                                                                                    INTERNO_VTA_PedidosCabecera_Modelo _mdl_INTERNO_VTA_PedidossCabecera_Modelo)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;

            try
            {
                //Recorrer linea a linea
                if (_mdl_INTERNO_VTA_PedidossCabecera_Modelo.PedidoLineas != null &&
                    _mdl_INTERNO_VTA_PedidossCabecera_Modelo.PedidoLineas.Count > 0)
                {
                    int int_NumeroLinea = 1;
                    List<VTA_PedidosLineas> lst_VTA_PedidosLineas_AGRABAR = new List<VTA_PedidosLineas>();
                    List<INTERNO_VTA_PedidosLineas_Listado_Modelo> lst_INTERNO_VTA_PedidossLineas_Listado_Modelo_SINLINEASPROMOCIONES = _mdl_INTERNO_VTA_PedidossCabecera_Modelo.PedidoLineas.Where(m => m.idPedidoLinea_Padre == null).ToList();

                    int int_Contador = 0;
                    foreach (INTERNO_VTA_PedidosLineas_Listado_Modelo mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo in lst_INTERNO_VTA_PedidossLineas_Listado_Modelo_SINLINEASPROMOCIONES.OrderBy(m => m.numeroLinea))
                    {
                        decimal? dcm_DescuentoGeneral = _dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.descuentoGeneral)).GetValue(_dnm_Cliente, null);


                        VentasCompras_Calculos obj_VentasCompras_Calculos = new VentasCompras_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                                                        _dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.id)).GetValue(_dnm_Cliente, null),
                                                                                                        DateTime.ParseExact(g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_Copiar_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture),
                                                                                                        _mdl_INTERNO_VTA_PedidossCabecera_Modelo.idEmpresa,
                                                                                                        (dcm_DescuentoGeneral!=null ? dcm_DescuentoGeneral.Value : 0m)
                                                                                                        );

                        long lng_idArticulo_ArticuloComodin = -1;
                        decimal? dcm_Precio = null;
                        bool bol_EsArticuloComodin = false;
                        if (mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idArticuloComodin != null)
                        {
                            lng_idArticulo_ArticuloComodin = mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idArticuloComodin.Value;
                            dcm_Precio = mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.precio;
                            bol_EsArticuloComodin = true;
                        }
                        else if (mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idArticulo != null)
                        {
                            lng_idArticulo_ArticuloComodin = mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idArticulo.Value;
                        }

                        obj_VentasCompras_Calculos.Cambio_ClienteProveedorFecha(lng_idArticulo_ArticuloComodin,
                                                                                bol_EsArticuloComodin,
                                                                                dcm_Precio,
                                                                                mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idEmbalaje,
                                                                                mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.TipoCompraVenta_Opcion,
                                                                                mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idTipoCompraVenta,
                                                                                mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.cantidad,
                                                                                mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.segundaUnidad_cantidad);

                        //Pedidos linea a Grabar
                        VTA_PedidosLineas mdl_VTA_PedidosLineas = PedidosLineas_AGrabar_COPIAR(_mdl_INTERNO_VTA_PedidossCabecera_Modelo,
                                                                                                        mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo,
                                                                                                        obj_VentasCompras_Calculos,
                                                                                                        _dnm_Cliente.GetType().GetProperty(nameof(INTERNO_MAE_Clientes_Listado_Modelo.id)).GetValue(_dnm_Cliente, null),
                                                                                                        ref int_NumeroLinea);


                        //Agregar al listado final
                        lst_VTA_PedidosLineas_AGRABAR.Add(mdl_VTA_PedidosLineas);


                        //Sumar al contador
                        int_Contador += 1;

                    }

                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_VTA_PedidosLineas_AGRABAR;
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Recalcular_TarifasPromociones_PorLineas_COPIAR));
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        private VTA_PedidosLineas PedidosLineas_AGrabar_COPIAR(INTERNO_VTA_PedidosCabecera_Modelo _mdl_INTERNO_VTA_PedidosCabecera_Modelo,
                                                                  INTERNO_VTA_PedidosLineas_Listado_Modelo _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo,
                                                                  VentasCompras_Calculos _obj_VentasCompras_Calculos,
                                                                  long _lng_idCliente,
                                                                  ref int _int_NumeroLinea)
        {

            //VTA_PedidosLineas #############################################################################################################################################
            VTA_PedidosLineas mdl_VTA_PedidosLineas = new VTA_PedidosLineas();

            //id
            mdl_VTA_PedidosLineas.id = -1;

            //idPedidoCabecera
            mdl_VTA_PedidosLineas.idPedidoCabecera = -1;

            //idArticulo
            mdl_VTA_PedidosLineas.idArticulo = _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idArticulo;

            //idArticuloComodin
            mdl_VTA_PedidosLineas.idArticuloComodin = _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idArticuloComodin;

            //descripcionArticuloComodin
            mdl_VTA_PedidosLineas.descripcionArticuloComodin = _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.descripcionArticuloComodin;

            //Numero de Linea
            mdl_VTA_PedidosLineas.numeroLinea = _int_NumeroLinea;

            //Almacen 
            mdl_VTA_PedidosLineas.idAlmacen = _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idAlmacen;

            //idUbicacion 
            mdl_VTA_PedidosLineas.idUbicacion = _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idUbicacion;

            //cantidad
            mdl_VTA_PedidosLineas.cantidad = _obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal;

            //idEmbalaje
            mdl_VTA_PedidosLineas.idEmbalaje = _obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Id;

            //relacion
            mdl_VTA_PedidosLineas.relacion = _obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;

            //operacion
            mdl_VTA_PedidosLineas.operacion = _obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Operacion;

            //segundaUnidad_Precio_Cantidad_SegundaUnidad
            mdl_VTA_PedidosLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad = _obj_VentasCompras_Calculos.PROPIEDAD_PrecioPor_SegundaUnidad_Entero;

            //segundaUnidad_relacion
            mdl_VTA_PedidosLineas.segundaUnidad_relacion = _obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Relacion;

            //segundaUnidad_idEmbalaje
            mdl_VTA_PedidosLineas.segundaUnidad_idEmbalaje = _obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Id;

            //segundaUnidad_cantidad
            if (_obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional)
            {
                mdl_VTA_PedidosLineas.segundaUnidad_cantidad = _obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional;
            }
            else
            {
                mdl_VTA_PedidosLineas.segundaUnidad_cantidad = null;
            }

            //idNomenclaturaPrecio
            mdl_VTA_PedidosLineas.idNomenclaturaPrecio = _obj_VentasCompras_Calculos.PROPIEDAD_NomenclaturaPrecio_Id;

            //precio
            mdl_VTA_PedidosLineas.precio = _obj_VentasCompras_Calculos.PROPIEDAD_Precio;

            //numeroRedondeo
            mdl_VTA_PedidosLineas.numeroRedondeo = _obj_VentasCompras_Calculos.PROPIEDAD_NumeroRedondeo;

            //descuentoGeneral
            mdl_VTA_PedidosLineas.descuentoGeneral = _obj_VentasCompras_Calculos.PROPIEDAD_DescuentoGeneral;

            //importe
            mdl_VTA_PedidosLineas.importe = _obj_VentasCompras_Calculos.PROPIEDAD_Importe;

            //idImpuestoTipo
            mdl_VTA_PedidosLineas.idImpuestoTipo = _obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Id;

            //idPedidoLinea_Padre
            mdl_VTA_PedidosLineas.idPedidoLinea_Padre = null;

            //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
            //embalajePrincipalDelArticulo_idEmbalaje
            mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_idEmbalaje = _obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_IdEmbalaje;

            //embalajePrincipalDelArticulo_relacion
            mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_relacion = _obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

            //embalajePrincipalDelArticulo_operacion
            mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_operacion = _obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

            //embalajePrincipalDelArticulo_precio
            mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_precio = _obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Precio;

            //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
            mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = _obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

            //embalajePrincipalDelArticulo_segundaUnidad_relacion
            mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion = _obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

            //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
            mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = _obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

            //fecha borrado
            mdl_VTA_PedidosLineas.fechaBorrado = null;

            //idTipoCompraVenta
            mdl_VTA_PedidosLineas.idTipoCompraVenta = _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.idTipoCompraVenta;

            _int_NumeroLinea += 1;

            //COMENTARIOS #############################################################################################################################################
            #region COMENTARIOS
            mdl_VTA_PedidosLineas.VTA_PedidosLineas_Comentarios = Obtener_PedidosLineas_Comentarios_COPIAR(_mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo);
            #endregion

            //TARIFAS/PROMOCIONES #############################################################################################################################################
            #region TARIFAS/PROMOCIONES
            mdl_VTA_PedidosLineas.VTA_PedidosLineas_TarifasPromociones = Obtener_PedidosLineas_TarifasPromociones_Recalculadas_COPIAR(_obj_VentasCompras_Calculos);
            #endregion

            //VTA_PedidossLineas Promocion por Unidad #############################################################################################################################################
            #region LINEA PROMOCION POR UNIDAD (LINEA RELACIONAL)
            mdl_VTA_PedidosLineas.VTA_PedidosLineas1 = null;
            VTA_PedidosLineas mdl_VTA_PedidosLineas_PROMOCIONPORUNIDAD = Obtener_PedidosLineas_PromocionPorUnidad_Recalculadas_COPIAR(_obj_VentasCompras_Calculos, mdl_VTA_PedidosLineas, _lng_idCliente, ref _int_NumeroLinea);

            if (mdl_VTA_PedidosLineas_PROMOCIONPORUNIDAD != null)
            {

                //COMENTARIOS #############################################################################################################################################
                #region COMENTARIOS
                //Buscar en el listado total de lineas si tenia una linea en promocion, s el articulo coincide y si es asi si tenia comentarios
                INTERNO_VTA_PedidosLineas_Listado_Modelo mdl_INTERNO_VTA_PedidosLineas_Listado_Modelo_ENPROMOCION = _mdl_INTERNO_VTA_PedidosCabecera_Modelo.PedidoLineas.Where(m => m.idPedidoLinea_Padre != null &&
                                                                                                                                                                                                        m.idPedidoLinea_Padre.Value.Equals(_mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.id) &&
                                                                                                                                                                                                        m.idArticulo != null &&
                                                                                                                                                                                                        m.idArticulo.Value.Equals(mdl_VTA_PedidosLineas_PROMOCIONPORUNIDAD.idArticulo.Value)
                                                                                                                                                                                                )
                                                                                                                                                                                          .FirstOrDefault();
                if (mdl_INTERNO_VTA_PedidosLineas_Listado_Modelo_ENPROMOCION != null)
                {
                    mdl_VTA_PedidosLineas_PROMOCIONPORUNIDAD.VTA_PedidosLineas_Comentarios = Obtener_PedidosLineas_Comentarios_COPIAR(mdl_INTERNO_VTA_PedidosLineas_Listado_Modelo_ENPROMOCION);
                }
                #endregion


                mdl_VTA_PedidosLineas.VTA_PedidosLineas1 = new List<VTA_PedidosLineas>();
                mdl_VTA_PedidosLineas.VTA_PedidosLineas1.Add(mdl_VTA_PedidosLineas_PROMOCIONPORUNIDAD);

                _int_NumeroLinea += 1;
            }
            #endregion

            return mdl_VTA_PedidosLineas;
        }

        public List<VTA_PedidosLineas_Comentarios> Obtener_PedidosLineas_Comentarios_COPIAR(INTERNO_VTA_PedidosLineas_Listado_Modelo _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo)
        {
            List<VTA_PedidosLineas_Comentarios> lst_VTA_PedidosLineas_Comentarios = new List<VTA_PedidosLineas_Comentarios>();

            if (_mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.PedidosLineas_Comentario_AUX != null &&
                _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.PedidosLineas_Comentario_AUX.Count > 0)
            {
                foreach (VTA_PedidosLineas_Comentarios mdl_VTA_PedidosLineas_Comentarios in _mdl_INTERNO_VTA_PedidossLineas_Listado_Modelo.PedidosLineas_Comentario_AUX)
                {
                    VTA_PedidosLineas_Comentarios mdl_VTA_PedidosLineas_Comentarios_INSERTAR = new VTA_PedidosLineas_Comentarios();

                    //id
                    mdl_VTA_PedidosLineas_Comentarios_INSERTAR.id = -1;

                    //idPedidoLinea
                    mdl_VTA_PedidosLineas_Comentarios_INSERTAR.idPedidoLinea = -1;

                    //comentario
                    mdl_VTA_PedidosLineas_Comentarios_INSERTAR.comentario = mdl_VTA_PedidosLineas_Comentarios.comentario;

                    //mostrarImpresion
                    mdl_VTA_PedidosLineas_Comentarios_INSERTAR.mostrarImpresion = mdl_VTA_PedidosLineas_Comentarios.mostrarImpresion;

                    //Añadir al Listado
                    lst_VTA_PedidosLineas_Comentarios.Add(mdl_VTA_PedidosLineas_Comentarios_INSERTAR);
                }
            }

            return lst_VTA_PedidosLineas_Comentarios;
        }


        public List<VTA_PedidosLineas_TarifasPromociones> Obtener_PedidosLineas_TarifasPromociones_Recalculadas_COPIAR(VentasCompras_Calculos _obj_VentasCompras_Calculos)
        {
            List<VTA_PedidosLineas_TarifasPromociones> lst_VTA_PedidosLineas_TarifasPromociones = new List<VTA_PedidosLineas_TarifasPromociones>();

            if (_obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR != null &&
                _obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR.Count > 0)
            {
                foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in _obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR)
                {
                    VTA_PedidosLineas_TarifasPromociones mdl_VTA_PedidosLineas_TarifasPromociones = new VTA_PedidosLineas_TarifasPromociones();

                    //id
                    mdl_VTA_PedidosLineas_TarifasPromociones.id = -1;
                    //idPedidoLinea
                    mdl_VTA_PedidosLineas_TarifasPromociones.idPedidoLinea = -1;
                    //codigo
                    mdl_VTA_PedidosLineas_TarifasPromociones.codigo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Codigo;
                    //descripcion
                    mdl_VTA_PedidosLineas_TarifasPromociones.descripcion = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descripcion;
                    //descuento_1
                    mdl_VTA_PedidosLineas_TarifasPromociones.descuento_1 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_1;
                    //descuento_2
                    mdl_VTA_PedidosLineas_TarifasPromociones.descuento_2 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_2;
                    //descuento_3
                    mdl_VTA_PedidosLineas_TarifasPromociones.descuento_3 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_3;
                    //descuento_4
                    mdl_VTA_PedidosLineas_TarifasPromociones.descuento_4 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_4;
                    //descuento_5
                    mdl_VTA_PedidosLineas_TarifasPromociones.descuento_5 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_5;
                    //incremento
                    mdl_VTA_PedidosLineas_TarifasPromociones.incremento = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Incremento;
                    //numeroRedondeo
                    mdl_VTA_PedidosLineas_TarifasPromociones.numeroRedondeo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NumeroRedondeo;
                    //tipo
                    mdl_VTA_PedidosLineas_TarifasPromociones.tipo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo;
                    //precioFijoDinamico
                    mdl_VTA_PedidosLineas_TarifasPromociones.precioFijoDinamico = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico != null ? mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico.Value : Variables.G_INT_TIPOPRECIO_FIJO_CODIGO;
                    //precio
                    mdl_VTA_PedidosLineas_TarifasPromociones.precio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio;
                    //idNomenclaturaPrecio
                    mdl_VTA_PedidosLineas_TarifasPromociones.idNomenclaturaPrecio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id;
                    //descuentoMoneda
                    mdl_VTA_PedidosLineas_TarifasPromociones.descuentoMoneda = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_DescuentoMoneda;
                    //AB_Cantidad_A
                    mdl_VTA_PedidosLineas_TarifasPromociones.AB_Cantidad_A = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A;
                    //AB_Cantidad_B
                    mdl_VTA_PedidosLineas_TarifasPromociones.AB_Cantidad_B = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B;
                    //AB_Porcentaje
                    mdl_VTA_PedidosLineas_TarifasPromociones.AB_Porcentaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje;
                    //AB_idArticulo
                    mdl_VTA_PedidosLineas_TarifasPromociones.AB_idArticulo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id;
                    //AB_idEmbalaje
                    mdl_VTA_PedidosLineas_TarifasPromociones.AB_idEmbalaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id;
                    //AB_Cancelado
                    mdl_VTA_PedidosLineas_TarifasPromociones.AB_Cancelado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cancelado;
                    //orden
                    mdl_VTA_PedidosLineas_TarifasPromociones.orden = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden;
                    //mensaje_Error
                    mdl_VTA_PedidosLineas_TarifasPromociones.mensaje_Error = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Mensaje_Error;
                    //desactivado
                    mdl_VTA_PedidosLineas_TarifasPromociones.desactivado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Desactivado;
                    //noAplicarTarifa
                    mdl_VTA_PedidosLineas_TarifasPromociones.noAplicarTarifa = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.NoAplicarTarifa;
                    //aplicadaEnLinea
                    mdl_VTA_PedidosLineas_TarifasPromociones.aplicadaEnLinea = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.AplicadaEnLinea;

                    //CONDICIONANTES #############################################################################################################################
                    if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes != null &&
                        mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes.Count > 0)
                    {
                        mdl_VTA_PedidosLineas_TarifasPromociones.VTA_PedidosLineas_TarifasPromociones_Condicionantes = new List<VTA_PedidosLineas_TarifasPromociones_Condicionantes>();

                        foreach (INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo in mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes)
                        {
                            VTA_PedidosLineas_TarifasPromociones_Condicionantes mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes = new VTA_PedidosLineas_TarifasPromociones_Condicionantes();

                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.id = -1;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.idPedidoLineaTarifaPromocion = -1;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.condicionante_Y_O = null;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.importe_Desde_Operador = null;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.importe_Desde_Valor = null;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.importe_Hasta_Operador = null;
                            mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes.importe_Hasta_Valor = null;

                            //Añadir al listado e condicionantes
                            mdl_VTA_PedidosLineas_TarifasPromociones.VTA_PedidosLineas_TarifasPromociones_Condicionantes.Add(mdl_VTA_PedidosLineas_TarifasPromociones_Condicionantes);
                        }
                    }
                    else
                    {
                        mdl_VTA_PedidosLineas_TarifasPromociones.VTA_PedidosLineas_TarifasPromociones_Condicionantes = null;
                    }

                    //Añadir al Listado
                    lst_VTA_PedidosLineas_TarifasPromociones.Add(mdl_VTA_PedidosLineas_TarifasPromociones);
                }
            }

            return lst_VTA_PedidosLineas_TarifasPromociones;
        }

        public VTA_PedidosLineas Obtener_PedidosLineas_PromocionPorUnidad_Recalculadas_COPIAR(VentasCompras_Calculos _obj_VentasCompras_Calculos, VTA_PedidosLineas _mdl_VTA_PedidosLineas, long _lng_idCliente, ref int _int_NumeroLinea)
        {
            VTA_PedidosLineas mdl_VTA_PedidosLineas = null;

            if (_obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Existe)
            {

                mdl_VTA_PedidosLineas = new VTA_PedidosLineas();

                //id
                mdl_VTA_PedidosLineas.id = -1;

                //idPedidoCabecera
                mdl_VTA_PedidosLineas.idPedidoCabecera = -1;

                //idArticulo
                mdl_VTA_PedidosLineas.idArticulo = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Articulo_Id;

                //idArticuloComodin
                mdl_VTA_PedidosLineas.idArticuloComodin = null;

                //descripcionArticuloComodin
                mdl_VTA_PedidosLineas.descripcionArticuloComodin = null;

                //numeroLinea
                mdl_VTA_PedidosLineas.numeroLinea = _int_NumeroLinea;

                //idAlmacen 
                mdl_VTA_PedidosLineas.idAlmacen = _mdl_VTA_PedidosLineas.idAlmacen;

                //idUbicacion
                mdl_VTA_PedidosLineas.idUbicacion = null;

                //cantidad
                mdl_VTA_PedidosLineas.cantidad = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal;

                //idEmbalaje
                mdl_VTA_PedidosLineas.idEmbalaje = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Id;

                //relacion
                mdl_VTA_PedidosLineas.relacion = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion;

                //operacion
                mdl_VTA_PedidosLineas.operacion = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Operacion;

                //segundaUnidad_Precio_Cantidad_SegundaUnidad
                mdl_VTA_PedidosLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_PrecioPor_SegundaUnidad_Entero;

                //segundaUnidad_relacion
                mdl_VTA_PedidosLineas.segundaUnidad_relacion = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Relacion;

                //segundaUnidad_idEmbalaje
                mdl_VTA_PedidosLineas.segundaUnidad_idEmbalaje = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Id;

                //segundaUnidad_cantidad
                mdl_VTA_PedidosLineas.segundaUnidad_cantidad = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional;

                //idNomenclaturaPrecio
                mdl_VTA_PedidosLineas.idNomenclaturaPrecio = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NomenclaturaPrecio_Id;

                //precio
                mdl_VTA_PedidosLineas.precio = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Precio;

                //numeroRedondeo
                mdl_VTA_PedidosLineas.numeroRedondeo = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NumeroRedondeo;

                //descuentoGeneral
                mdl_VTA_PedidosLineas.descuentoGeneral = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_DescuentoGeneral;

                //importe
                mdl_VTA_PedidosLineas.importe = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Importe;

                //idImpuestoTipo
                mdl_VTA_PedidosLineas.idImpuestoTipo = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Id;

                //idPedidoLinea_Padre
                mdl_VTA_PedidosLineas.idPedidoLinea_Padre = -1;

                //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
                //embalajePrincipalDelArticulo_idEmbalaje
                mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_idEmbalaje = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_IdEmbalaje;

                //embalajePrincipalDelArticulo_relacion
                mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_relacion = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                //embalajePrincipalDelArticulo_operacion
                mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_operacion = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                //embalajePrincipalDelArticulo_precio
                mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_precio = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Precio;

                //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                //embalajePrincipalDelArticulo_segundaUnidad_relacion
                mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                mdl_VTA_PedidosLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                //fechaBorrado
                mdl_VTA_PedidosLineas.fechaBorrado = null;

                //idTipoCompraVenta
                mdl_VTA_PedidosLineas.idTipoCompraVenta = _obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_TipoCompraVenta_Id;
            }

            return mdl_VTA_PedidosLineas;
        }

        private INTERNO_ValorDevuelto_Modelo PedidosCabecera_Resumen_AGrabar_COPIAR(VTA_PedidosCabecera _mdl_VTA_PedidosCabecera)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_1 = null;

            List<VTA_PedidosCabecera_Resumen> lst_VTA_PedidosCabecera_Resumen = new List<VTA_PedidosCabecera_Resumen>();

            try
            {
                //## 1º--> BUSCAR EL IMPUESTOSCABECERA
                GEN_ImpuestosCabecera mdl_GEN_ImpuestosCabecera = Datos_Generales.GEN_ImpuestosCabecera_Obtener_Modelo_Por_Id(_mdl_VTA_PedidosCabecera.idImpuestoCabecera);

                //## 2º--> OBTENER EL LISTADO DE GEN_IMPUESTOSTIPOS QUE HAY
                List<INTERNO_GEN_ImpuestosTipos_Listado_Modelo> lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo = Datos_Generales.GEN_ImpuestosTipos_Obtener_Listado();
                if (lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo != null)
                {
                    List<INTERNO_VentasCompras_Calculo_Lineas_Modelo> lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo = new List<INTERNO_VentasCompras_Calculo_Lineas_Modelo>();
                    VTA_PedidosLineas mdl_VTA_PedidosLineas_ENPROMOCION = null;
                    // ## 3º--> CONVERTIR LISTADO DE LINEAS EN LISTADO DEL MODELO INTERNO_VentasCompras_Calculo_Lineas_Modelo ####################################
                    foreach (VTA_PedidosLineas mdl_VTA_PedidosLineas in _mdl_VTA_PedidosCabecera.VTA_PedidosLineas)
                    {
                        //LINEA PRINCIPAL
                        lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo.Add(new INTERNO_VentasCompras_Calculo_Lineas_Modelo((mdl_VTA_PedidosLineas.idArticulo != null ? mdl_VTA_PedidosLineas.idArticulo.Value : -1),
                                                                                                                             (mdl_VTA_PedidosLineas.idArticuloComodin != null ? mdl_VTA_PedidosLineas.idArticuloComodin.Value : -1),
                                                                                                                             (mdl_VTA_PedidosLineas.idArticuloComodin != null ? true : false),
                                                                                                                             mdl_VTA_PedidosLineas.idImpuestoTipo,
                                                                                                                             (mdl_VTA_PedidosLineas.importe != null ? mdl_VTA_PedidosLineas.importe.Value : 0m)));



                        //LINEA EN PROMOCION
                        if (mdl_VTA_PedidosLineas.VTA_PedidosLineas1 != null &&
                            mdl_VTA_PedidosLineas.VTA_PedidosLineas1.Count > 0)
                        {
                            mdl_VTA_PedidosLineas_ENPROMOCION = mdl_VTA_PedidosLineas.VTA_PedidosLineas1.FirstOrDefault();

                            lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo.Add(new INTERNO_VentasCompras_Calculo_Lineas_Modelo((mdl_VTA_PedidosLineas_ENPROMOCION.idArticulo != null ? mdl_VTA_PedidosLineas_ENPROMOCION.idArticulo.Value : -1),
                                                                                                                                 (mdl_VTA_PedidosLineas_ENPROMOCION.idArticuloComodin != null ? mdl_VTA_PedidosLineas_ENPROMOCION.idArticuloComodin.Value : -1),
                                                                                                                                 (mdl_VTA_PedidosLineas_ENPROMOCION.idArticuloComodin != null ? true : false),
                                                                                                                                 mdl_VTA_PedidosLineas_ENPROMOCION.idImpuestoTipo,
                                                                                                                                 (mdl_VTA_PedidosLineas_ENPROMOCION.importe != null ? mdl_VTA_PedidosLineas_ENPROMOCION.importe.Value : 0m)));
                        }
                    }

                    // ## 4º--> CALCULAR LOS IMPORTE E IMPUESTOS ################################################################################################
                    VentasCompras_Impuestos_Calculos obj_VentasCompras_Impuestos_Calculos = new VentasCompras_Impuestos_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                                                                                _mdl_VTA_PedidosCabecera.idCliente,
                                                                                                                                _mdl_VTA_PedidosCabecera.fecha,
                                                                                                                                _mdl_VTA_PedidosCabecera.idEmpresa);

                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES = obj_VentasCompras_Impuestos_Calculos.Calcular_ImportesImpuestos(mdl_GEN_ImpuestosCabecera,
                                                                                                                                                                                        lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo,
                                                                                                                                                                                        _mdl_VTA_PedidosCabecera.descuentoProntoPago,
                                                                                                                                                                                        _mdl_VTA_PedidosCabecera.descuentoFinalFactura,
                                                                                                                                                                                        _mdl_VTA_PedidosCabecera.descuentoFinalAlbaran,
                                                                                                                                                                                        lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo,
                                                                                                                                                                                        null,
                                                                                                                                                                                        (_mdl_VTA_PedidosCabecera.recargo != null ? _mdl_VTA_PedidosCabecera.recargo.Value : false));
                    // ## 5º--> CONVERTIR A EL MODELO 'VTA_PedidosCabecera_Resumen'
                    if (mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES.TodoCorrecto)
                    {
                        List<INTERNO_ImportesImpuestos_Modelo> lst_INTERNO_ImportesImpuestos_Modelo_FINAL = (List<INTERNO_ImportesImpuestos_Modelo>)mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES.Objeto;

                        if (lst_INTERNO_ImportesImpuestos_Modelo_FINAL != null && lst_INTERNO_ImportesImpuestos_Modelo_FINAL.Count > 0)
                        {
                            //Totales
                            mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_1 = mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES.Objeto_Auxiliar_1;

                            foreach (INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo in lst_INTERNO_ImportesImpuestos_Modelo_FINAL)
                            {
                                VTA_PedidosCabecera_Resumen mdl_VTA_PedidosCabecera_Resumen = new VTA_PedidosCabecera_Resumen();

                                //id
                                mdl_VTA_PedidosCabecera_Resumen.id = -1;

                                //idPedidoCabecera
                                mdl_VTA_PedidosCabecera_Resumen.idPedidoCabecera = -1;

                                //idImpuestoTipo
                                mdl_VTA_PedidosCabecera_Resumen.idImpuestoTipo = mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoTipo.Value;

                                //idImpuestoLinea
                                mdl_VTA_PedidosCabecera_Resumen.idImpuestoLinea = mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoLinea.Value;
                                //bruto
                                mdl_VTA_PedidosCabecera_Resumen.bruto = mdl_INTERNO_ImportesImpuestos_Modelo.Bruto;
                                //descuentoFinalFactura_Valor
                                mdl_VTA_PedidosCabecera_Resumen.descuentoFinalFactura_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado;
                                //DescuentoAlbaranFinal_Calculado
                                mdl_VTA_PedidosCabecera_Resumen.descuentoFinalAlbaran_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado;
                                //descuentoProntoPago_Valor
                                mdl_VTA_PedidosCabecera_Resumen.descuentoProntoPago_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado;
                                //baseImponible
                                mdl_VTA_PedidosCabecera_Resumen.baseImponible = mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible;
                                //impuesto_Porcentaje
                                mdl_VTA_PedidosCabecera_Resumen.impuesto_Porcentaje = mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje.Value : 0m;
                                //impuesto_Valor
                                mdl_VTA_PedidosCabecera_Resumen.impuesto_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado;
                                //recargo_Porcentaje
                                mdl_VTA_PedidosCabecera_Resumen.recargo_Porcentaje = mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje.Value : 0m;
                                //recargo_Valor
                                mdl_VTA_PedidosCabecera_Resumen.recargo_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado;
                                //total
                                mdl_VTA_PedidosCabecera_Resumen.total = mdl_INTERNO_ImportesImpuestos_Modelo.Total;

                                //Añadir al listado
                                lst_VTA_PedidosCabecera_Resumen.Add(mdl_VTA_PedidosCabecera_Resumen);

                            }
                        }
                    }
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES;
                    }
                }

                //TodoCoorrecto
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_VTA_PedidosCabecera_Resumen;

            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(PedidosCabecera_Resumen_AGrabar_COPIAR));
            }


            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public INTERNO_ValorDevuelto_Modelo ValidarDatos_COPIAR()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // La fecha no puede estar vacia y debe ser correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_Copiar_Fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

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

                //Debe tener algun Clientes seleccionado
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (g_frm_P_PedidoCabecera_Procesos.Exferia_DataGridView_Copiar_ClientesSeleccionados_Listado.SelectedRows == null ||
                        g_frm_P_PedidoCabecera_Procesos.Exferia_DataGridView_Copiar_ClientesSeleccionados_Listado.SelectedRows.Count == 0)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_LISTADOS_NOHAYREGISTROSSELECCIONADOS();
                    }
                }

                // Si hay Empleado validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_Copiar_Empleado.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(ValidarDatos_COPIAR));

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

            return mdl_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_COPIAR(VTA_PedidosCabecera _mdl_VTA_PedidosCabecera)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VTA_PedidosCabecera_Datos.Insertar(_mdl_VTA_PedidosCabecera);
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = mdl_INTERNO_ValorDevuelto_Modelo.Id;

                        //Terminamos la transaccion
                        transaccion_SQL.Complete();
                        transaccion_SQL.Dispose();
                    }

                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(GrabarDatos_COPIAR));
                }
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public INTERNO_ValorDevuelto_Modelo Buscar_CodigoSiguiente_COPIAR(long _lng_idDelegacion, GEN_EjerciciosActivos_Empresa _mdl_GEN_EjerciciosActivos_Empresa)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Buscar el Ejercicio segun la fecha
                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente_Numerico(nameof(VTA_PedidosCabecera),
                                                                                            nameof(VTA_PedidosCabecera.numeroDocumento),
                                                                                            nameof(VTA_PedidosCabecera.idEmpresa),
                                                                                            g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa,
                                                                                            nameof(VTA_PedidosCabecera.idDelegacion),
                                                                                            _lng_idDelegacion,
                                                                                            true,
                                                                                            16,
                                                                                            nameof(VTA_PedidosCabecera.fecha),
                                                                                            _mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaInicio,
                                                                                            _mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin
                                                                                            );

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO("Nº Documento");
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Buscar_CodigoSiguiente_COPIAR));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private INTERNO_ValorDevuelto_Modelo Cerrar_Documento_COPIAR(long _lng_idPedidoCabcera, VTA_PedidosCabecera _mdl_VTA_PedidosCabecera)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    //Insertar el idPredefinidoCabecera
                    List<long> lst_idPredefinidoCabecera = new List<long>();

                    /*
                    //Validar que tiene un idPredefinidoCabecera para pedido
                    if (_mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Pedido != null && _mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Pedido.Value > 0)
                    {
                        lst_idPredefinidoCabecera.Add(_mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Pedido.Value);
                    }
                        
                    //Validar que tiene un idPredefinidoCabecera para cancelacion
                    if (_mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Cancelacion != null && _mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Cancelacion.Value > 0)
                    {
                        lst_idPredefinidoCabecera.Add(_mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Cancelacion.Value);
                    }

                    //Validar que tiene un idPredefinidoCabecera para anulacion
                    if (_mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Anulacion != null && _mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Anulacion.Value > 0)
                    {
                        lst_idPredefinidoCabecera.Add(_mdl_VTA_PedidosCabecera.idPredefinidoCabecera_Anulacion.Value);
                    }
                    */

                    //Si esta Todo Correcto
                    if (lst_idPredefinidoCabecera.Count > 0)
                    {
                        //Cargamos el ensamblado #########################################################################################################################################################################
                        Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                        //creamos la instancia
                        var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_ACCIONDOCUMENTO_CERRAR, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros_1 = {   lst_idPredefinidoCabecera,
                                                    _lng_idPedidoCabcera,
                                                    Variables.G_STR_OPCION_VTA_PEDIDOCABECERA,
                                                    null};

                        //Pasamos los parametros al metodo y lo ejecutamos
                        mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                        //########################################################################################################################################################################
                    }
                    //Si no tiene Predefinidos solo se cierra el documento
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VTA_PedidosCabecera_Datos.Actualizar_Estado(_lng_idPedidoCabcera, Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO);
                    }

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Cerrar_Documento_COPIAR));

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
                }
                catch (Control_Errores)
                {
                    transaccion_SQL.Dispose();

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Cerrar_Documento_COPIAR));

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #endregion

        #region CERRAR
        public void Proceso_Cerrar()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_PedidoCabecera_Procesos.Enabled = false;

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

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_ProcesoCerrar != null)
                {
                    while (g_obj_TareaAsincrona_ProcesoCerrar.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_ProcesoCerrar = new BackgroundWorker();
                    g_obj_TareaAsincrona_ProcesoCerrar.DoWork += new DoWorkEventHandler(TareaAsincrona_ProcesoCerrar_DoWork);
                    g_obj_TareaAsincrona_ProcesoCerrar.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_ProcesoCerrar_ProgressChanged);
                    g_obj_TareaAsincrona_ProcesoCerrar.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_ProcesoCerrar_Completed);
                    g_obj_TareaAsincrona_ProcesoCerrar.WorkerReportsProgress = true;
                }

                //vaciar Resumen
                g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Cerrar_Resumen.Text = "";

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

                g_frm_PE_Esperando_BarraProgreso.Show();
            }
            catch (Exception ex)
            {
                g_frm_P_PedidoCabecera_Procesos.Enabled = true;

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

                throw new Control_Errores("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Proceso_Cerrar), true);
            }
        }

        private void TareaAsincrona_ProcesoCerrar_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            int int_Total_Pedido_Cerrados_Correctamente = 0;
            List<long> lst_ids_registrosCorrectos = new List<long>();
            int int_Total_Pedido_ConErrores = 0;

            string str_Mensajes = "";
            string str_DatosPedidoCabecera = "";
            long lng_idPedidoCabecera = -1;

            try
            {
                
                List<dynamic> lst_Pedido_Seleccionados = null;
                //Bolsa
                if (g_frm_P_PedidoCabecera_Procesos.Exferia_RadioButton_Registros_Bolsa.Checked)
                {
                    if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Count > 0)
                    {
                        lst_Pedido_Seleccionados = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Cast<dynamic>().ToList();
                    }
                }
                //Seleccionados
                else
                {
                    if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Count > 0)
                    {
                        lst_Pedido_Seleccionados = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Cast<dynamic>().ToList();
                    }
                }

                if (lst_Pedido_Seleccionados != null && lst_Pedido_Seleccionados.Count > 0)
                {
                    //##2º-> OBTENEMOS LOS IDS DE LOS PedidoCABECERA ABIERTOS
                    List<dynamic> lst_PedidoCabacera_ABIERTOS = lst_Pedido_Seleccionados.Where(m => m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.estado)).GetValue(m, null) != null &&
                                                                                                               m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.estado)).GetValue(m, null) == Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO)
                                                                                                            .ToList();

                    if (lst_PedidoCabacera_ABIERTOS != null && lst_PedidoCabacera_ABIERTOS.Count > 0)
                    {
                        //Total de lineas
                        ((BackgroundWorker)sender).ReportProgress(1, lst_PedidoCabacera_ABIERTOS.Count);

                        int int_Contador_Pedido = 1;

                        //## 2º-> RECORREMOS LAS PedidoCABECERA ABIERTOS Y VAMOS CREANDO LOS REGISTROS
                        foreach (dynamic dnm_PedidoCabecera in lst_PedidoCabacera_ABIERTOS)
                        {
                            str_DatosPedidoCabecera = " ◘ PEDIDO (" + dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.numeroDocumento)).GetValue(dnm_PedidoCabecera) + ") " + dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.fecha)).GetValue(dnm_PedidoCabecera);
                            lng_idPedidoCabecera = dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.id)).GetValue(dnm_PedidoCabecera);

                            //Mensaje de recalculando ............................................................................................................
                            ((BackgroundWorker)sender).ReportProgress(3, str_DatosPedidoCabecera);
                            //total cargado de lineas
                            ((BackgroundWorker)sender).ReportProgress(2, int_Contador_Pedido);
                            //.....................................................................................................................................

                            //Cerrar Documento
                            //Insertar el idPredefinidoCabecera
                            List<long> lst_idPredefinidoCabecera = new List<long>();

                            //Validar que tiene un idPredefinidoCabecera para pedido
                            /*if (g_mdl_INTERNO_VTA_PedidosCabecera_Modelo.idPredefinidoCabecera_Pedido != null && g_mdl_INTERNO_VTA_PedidosCabecera_Modelo.idPredefinidoCabecera_Pedido.Value > 0)
                            {
                                lst_idPredefinidoCabecera.Add(g_mdl_INTERNO_VTA_PedidosCabecera_Modelo.idPredefinidoCabecera_Pedido.Value);
                            }

                            //Validar que tiene un idPredefinidoCabecera para cancelacion
                            if (g_mdl_INTERNO_VTA_PedidosCabecera_Modelo.idPredefinidoCabecera_Cancelacion != null && g_mdl_INTERNO_VTA_PedidosCabecera_Modelo.idPredefinidoCabecera_Cancelacion.Value > 0)
                            {
                                lst_idPredefinidoCabecera.Add(g_mdl_INTERNO_VTA_PedidosCabecera_Modelo.idPredefinidoCabecera_Cancelacion.Value);
                            }

                            //Validar que tiene un idPredefinidoCabecera para anulacion
                            if (g_mdl_INTERNO_VTA_PedidosCabecera_Modelo.idPredefinidoCabecera_Anulacion != null && g_mdl_INTERNO_VTA_PedidosCabecera_Modelo.idPredefinidoCabecera_Anulacion.Value > 0)
                            {
                                lst_idPredefinidoCabecera.Add(g_mdl_INTERNO_VTA_PedidosCabecera_Modelo.idPredefinidoCabecera_Anulacion.Value);
                            }*/

                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CERRAR = null;
                            //Si esta Todo Correcto
                            if (lst_idPredefinidoCabecera.Count > 0)
                            {
                                //Cargamos el ensamblado #########################################################################################################################################################################
                                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                                //Obtenemos el tipo de la clase
                                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                                //creamos la instancia
                                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                                //Cargamos el metodo solicitado
                                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_ACCIONDOCUMENTO_CERRAR, BindingFlags.Instance | BindingFlags.NonPublic);

                                //Obtener valores
                                object[] arr_Parametros_1 = {   lst_idPredefinidoCabecera,
                                                        lng_idPedidoCabecera,
                                                        Variables.G_STR_OPCION_VTA_PEDIDOCABECERA,
                                                        null};

                                //Pasamos los parametros al metodo y lo ejecutamos
                                mdl_INTERNO_ValorDevuelto_Modelo_CERRAR = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                                //########################################################################################################################################################################
                            }
                            //Si no tiene Predefinidos solo se cierra el documento
                            else
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo_CERRAR = g_obj_VTA_PedidosCabecera_Datos.Actualizar_Estado(lng_idPedidoCabecera, Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO);
                            }

                            if (mdl_INTERNO_ValorDevuelto_Modelo_CERRAR.TodoCorrecto)
                            {
                                //CORRECTO
                                int_Total_Pedido_Cerrados_Correctamente += 1;

                                //AÑADIR AL LISTADO DE PEDIDOS CORRECTAS
                                lst_ids_registrosCorrectos.Add(lng_idPedidoCabecera);

                                #region Actualizar en listado
                                //Bolsa
                                if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Count > 0)
                                {
                                    if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Exists(m => m.id == lng_idPedidoCabecera))
                                    {
                                        int int_Indice = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.IndexOf(g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.id == lng_idPedidoCabecera).FirstOrDefault());
                                        g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo[int_Indice].estado = Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO;
                                        
                                    }
                                }

                                //Seleccionados
                                if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Count > 0)
                                {
                                    if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Exists(m => m.id == lng_idPedidoCabecera))
                                    {
                                        int int_Indice = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.IndexOf(g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.id == lng_idPedidoCabecera).FirstOrDefault());
                                        g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo[int_Indice].estado = Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO;
                                    }
                                }
                                #endregion
                            }
                            else
                            {
                                //CON ERRORES
                                int_Total_Pedido_ConErrores += 1;
                                str_Mensajes += str_DatosPedidoCabecera + ", error al cerrar." + System.Environment.NewLine;
                            }

                            int_Contador_Pedido += 1;
                        }
                    }
                    else
                    {
                        str_Mensajes = Mensajes.G_STR_MENSAJES_LISTADOS_NOHAYREGISTROSSELECCIONADOS();
                    }
                }
                else
                {
                    str_Mensajes = Mensajes.G_STR_MENSAJES_LISTADOS_NOHAYREGISTROSSELECCIONADOS();
                }
                
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoCerrar_DoWork));

                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Control_Errores)
            {
                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoCerrar_DoWork));
                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            finally
            {
                //Agregar los mensajes
                str_Mensajes = "Con error: " + int_Total_Pedido_ConErrores + System.Environment.NewLine + str_Mensajes;
                str_Mensajes = "Satisfactorias: " + int_Total_Pedido_Cerrados_Correctamente + System.Environment.NewLine + str_Mensajes;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = str_Mensajes;

                //registros a actualziar emn el listado principal
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_ids_registrosCorrectos;

                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_ProcesoCerrar_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage.ToString().Equals("1"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Total = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("2"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Actualizar = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("3"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Mensaje = e.UserState.ToString();
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_ProcesoCerrar_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (g_frm_PE_Esperando_BarraProgreso != null)
                {
                    g_frm_PE_Esperando_BarraProgreso.Close();
                    g_frm_PE_Esperando_BarraProgreso = null;
                }

                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje != null &&
                    mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Cerrar_Resumen.Text = mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim();
                }

                //Actualizar los registro en el listado principal
                if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                {
                    // Devolver al Listado el Row Añadido
                    if (g_frm_P_PedidoCabecera_Procesos.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_PedidoCabecera_Procesos.P_Base_PantallaOrigen.P_Base_ActualizarRegistro((List<long>)mdl_ValorDevuelto_Modelo_Resultado.Objeto, G_ENUM_TIPOACCION.INT_MODIFICAR);
                    }
                }

                Mostrar_Registros_Totales(g_frm_P_PedidoCabecera_Procesos.Exferia_RadioButton_Registros_Bolsa.Checked);

                //Marcar como que no se modifico nada
                g_frm_P_PedidoCabecera_Procesos.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoCerrar_Completed));
            }
            finally
            {
                //Desbloquear el Formulario
                g_frm_P_PedidoCabecera_Procesos.Enabled = true;
            }
        }
        #endregion

        #region ABRIR
        public void Proceso_Abrir()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_PedidoCabecera_Procesos.Enabled = false;

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

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_ProcesoAbrir != null)
                {
                    while (g_obj_TareaAsincrona_ProcesoAbrir.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_ProcesoAbrir = new BackgroundWorker();
                    g_obj_TareaAsincrona_ProcesoAbrir.DoWork += new DoWorkEventHandler(TareaAsincrona_ProcesoAbrir_DoWork);
                    g_obj_TareaAsincrona_ProcesoAbrir.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_ProcesoAbrir_ProgressChanged);
                    g_obj_TareaAsincrona_ProcesoAbrir.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_ProcesoAbrir_Completed);
                    g_obj_TareaAsincrona_ProcesoAbrir.WorkerReportsProgress = true;
                }

                //vaciar Resumen
                g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Abrir_Resumen.Text = "";

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

                g_frm_PE_Esperando_BarraProgreso.Show();
            }
            catch (Exception ex)
            {
                g_frm_P_PedidoCabecera_Procesos.Enabled = true;

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

                throw new Control_Errores("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Proceso_Abrir), true);
            }
        }

        private void TareaAsincrona_ProcesoAbrir_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            int int_Total_Pedido_Abiertos_Correctamente = 0;
            List<long> lst_ids_registrosCorrectos = new List<long>();
            int int_Total_Pedido_ConErrores = 0;

            string str_Mensajes = "";
            string str_DatosPedidoCabecera = "";
            long lng_idPedidoCabecera = -1;

            try
            {

                List<dynamic> lst_Pedido_Seleccionados = null;
                //Bolsa
                if (g_frm_P_PedidoCabecera_Procesos.Exferia_RadioButton_Registros_Bolsa.Checked)
                {
                    if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Count > 0)
                    {
                        lst_Pedido_Seleccionados = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Cast<dynamic>().ToList();
                    }
                }
                //Seleccionados
                else
                {
                    if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Count > 0)
                    {
                        lst_Pedido_Seleccionados = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Cast<dynamic>().ToList();
                    }
                }

                if (lst_Pedido_Seleccionados != null && lst_Pedido_Seleccionados.Count > 0)
                {
                    //##2º-> OBTENEMOS LOS IDS DE LOS PedidoCABECERA CERRADOS
                    List<dynamic> lst_PedidosCabacera_CERRADOS = lst_Pedido_Seleccionados.Where(m => m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.estado)).GetValue(m, null) != null &&
                                                                                                    m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.estado)).GetValue(m, null) == Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO &&
                                                                                                    (
                                                                                                        m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.situacion)).GetValue(m, null) == int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_PENDIENTE.Codigo) ||
                                                                                                        m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.situacion)).GetValue(m, null) == int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_ANULADO.Codigo)
                                                                                                    )
                                                                                                    )
                                                                                                .ToList();

                    if (lst_PedidosCabacera_CERRADOS != null && lst_PedidosCabacera_CERRADOS.Count > 0)
                    {
                        //Total de lineas
                        ((BackgroundWorker)sender).ReportProgress(1, lst_PedidosCabacera_CERRADOS.Count);

                        int int_Contador_Pedido = 1;

                        //## 2º-> RECORREMOS LAS PedidoCABECERA CERRADOS Y VAMOS CREANDO LOS REGISTROS
                        foreach (dynamic dnm_PedidoCabecera in lst_PedidosCabacera_CERRADOS)
                        {
                            str_DatosPedidoCabecera = " ◘ PEDIDO (" + dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.numeroDocumento)).GetValue(dnm_PedidoCabecera) + ") " + dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.fecha)).GetValue(dnm_PedidoCabecera);
                            lng_idPedidoCabecera = dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.id)).GetValue(dnm_PedidoCabecera);

                            //Mensaje de recalculando ............................................................................................................
                            ((BackgroundWorker)sender).ReportProgress(3, str_DatosPedidoCabecera);
                            //total cargado de lineas
                            ((BackgroundWorker)sender).ReportProgress(2, int_Contador_Pedido);
                            //.....................................................................................................................................

                            //Abrir Documento
                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ABRIR = g_obj_VTA_PedidosCabecera_Datos.Actualizar_Estado(lng_idPedidoCabecera, Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO);
                            if (mdl_INTERNO_ValorDevuelto_Modelo_ABRIR.TodoCorrecto)
                            {
                                //CORRECTO
                                int_Total_Pedido_Abiertos_Correctamente += 1;

                                //AÑADIR AL LISTADO DE PEDIDOS CORRECTAS
                                lst_ids_registrosCorrectos.Add(lng_idPedidoCabecera);

                                #region Actualizar en listado
                                //Bolsa
                                if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Count > 0)
                                {
                                    if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Exists(m => m.id == lng_idPedidoCabecera))
                                    {
                                        int int_Indice = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.IndexOf(g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.id == lng_idPedidoCabecera).FirstOrDefault());
                                        g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo[int_Indice].estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

                                    }
                                }

                                //Seleccionados
                                if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Count > 0)
                                {
                                    if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Exists(m => m.id == lng_idPedidoCabecera))
                                    {
                                        int int_Indice = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.IndexOf(g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.id == lng_idPedidoCabecera).FirstOrDefault());
                                        g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo[int_Indice].estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;
                                    }
                                }
                                #endregion
                            }
                            else
                            {
                                //CON ERRORES
                                int_Total_Pedido_ConErrores += 1;
                                str_Mensajes += str_DatosPedidoCabecera + ", error al abrir." + System.Environment.NewLine;
                            }

                            int_Contador_Pedido += 1;
                        }
                    }
                    else
                    {
                        str_Mensajes = Mensajes.G_STR_MENSAJES_LISTADOS_NOHAYREGISTROSSELECCIONADOS();
                    }
                }
                else
                {
                    str_Mensajes = Mensajes.G_STR_MENSAJES_LISTADOS_NOHAYREGISTROSSELECCIONADOS();
                }

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoAbrir_DoWork));

                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Control_Errores)
            {
                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoAbrir_DoWork));
                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            finally
            {
                //Agregar los mensajes
                str_Mensajes = "Con error: " + int_Total_Pedido_ConErrores + System.Environment.NewLine + str_Mensajes;
                str_Mensajes = "Satisfactorias: " + int_Total_Pedido_Abiertos_Correctamente + System.Environment.NewLine + str_Mensajes;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = str_Mensajes;

                //registros a actualziar emn el listado principal
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_ids_registrosCorrectos;

                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_ProcesoAbrir_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage.ToString().Equals("1"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Total = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("2"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Actualizar = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("3"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Mensaje = e.UserState.ToString();
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_ProcesoAbrir_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (g_frm_PE_Esperando_BarraProgreso != null)
                {
                    g_frm_PE_Esperando_BarraProgreso.Close();
                    g_frm_PE_Esperando_BarraProgreso = null;
                }

                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje != null &&
                    mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_Abrir_Resumen.Text = mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim();
                }

                //Actualizar los registro en el listado principal
                if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                {
                    // Devolver al Listado el Row Añadido
                    if (g_frm_P_PedidoCabecera_Procesos.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_PedidoCabecera_Procesos.P_Base_PantallaOrigen.P_Base_ActualizarRegistro((List<long>)mdl_ValorDevuelto_Modelo_Resultado.Objeto, G_ENUM_TIPOACCION.INT_MODIFICAR);
                    }
                }

                Mostrar_Registros_Totales(g_frm_P_PedidoCabecera_Procesos.Exferia_RadioButton_Registros_Bolsa.Checked);

                //Marcar como que no se modifico nada
                g_frm_P_PedidoCabecera_Procesos.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoAbrir_Completed));
            }
            finally
            {
                //Desbloquear el Formulario
                g_frm_P_PedidoCabecera_Procesos.Enabled = true;
            }
        }
        #endregion

        #region CREAR ALBARANES/FACTURAS
        public void Proceso_ConvertirAAlbaranFactura()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_PedidoCabecera_Procesos.Enabled = false;

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

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_ProcesoConvertirAAlbaranFactura != null)
                {
                    while (g_obj_TareaAsincrona_ProcesoConvertirAAlbaranFactura.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_ProcesoConvertirAAlbaranFactura = new BackgroundWorker();
                    g_obj_TareaAsincrona_ProcesoConvertirAAlbaranFactura.DoWork += new DoWorkEventHandler(TareaAsincrona_ProcesoConvertirAAlbaranFactura_DoWork);
                    g_obj_TareaAsincrona_ProcesoConvertirAAlbaranFactura.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_ProcesoConvertirAAlbaranFactura_ProgressChanged);
                    g_obj_TareaAsincrona_ProcesoConvertirAAlbaranFactura.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_ProcesoConvertirAAlbaranFactura_Completed);
                    g_obj_TareaAsincrona_ProcesoConvertirAAlbaranFactura.WorkerReportsProgress = true;
                }

                //vaciar Resumen
                g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_CrearAlbaranFactura_Resumen.Text = "";

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

                g_frm_PE_Esperando_BarraProgreso.Show();
            }
            catch (Exception ex)
            {
                g_frm_P_PedidoCabecera_Procesos.Enabled = true;

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

                throw new Control_Errores("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Proceso_ConvertirAAlbaranFactura), true);
            }
        }

        private void TareaAsincrona_ProcesoConvertirAAlbaranFactura_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            int int_Total_Pedidos_Convertidas_Correctamente = 0;
            List<long> lst_ids_registrosCorrectos = new List<long>();
            int int_Total_Pedidos_ConErrores = 0;
            string str_Mensajes = "";
            string str_DatosPedidosCabecera = "";

            try
            {
                // ## 1º-> VALIDAR
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    List<dynamic> lst_Pedidos_Seleccionados = null;
                    //Bolsa
                    if (g_frm_P_PedidoCabecera_Procesos.Exferia_RadioButton_Registros_Bolsa.Checked)
                    {
                        if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Count > 0)
                        {
                            lst_Pedidos_Seleccionados = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Cast<dynamic>().ToList();
                        }
                    }
                    //Seleccionados
                    else
                    {
                        if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Count > 0)
                        {
                            lst_Pedidos_Seleccionados = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Cast<dynamic>().ToList();
                        }
                    }

                    if (lst_Pedidos_Seleccionados != null && lst_Pedidos_Seleccionados.Count > 0)
                    {
                        //##2º-> OBTENEMOS LOS IDS DE LOS PEDIDOSCABECERA PENDIENTES
                        List<dynamic> lst_PedidosCabacera_PENDIENTES = lst_Pedidos_Seleccionados.Where(m => m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.estado)).GetValue(m, null) != null &&
                                                                                                            (
                                                                                                                m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.estado)).GetValue(m, null) == Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO ||
                                                                                                                m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.estado)).GetValue(m, null) == Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO
                                                                                                            )
                                                                                                            &&
                                                                                                                m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.situacion)).GetValue(m, null) != null &&
                                                                                                                (m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.situacion)).GetValue(m, null) == int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_PENDIENTE.Codigo) ||
                                                                                                                m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.situacion)).GetValue(m, null) == int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_PARTEPENDIENTE.Codigo)
                                                                                                            )
                                                                                                            &&
                                                                                                                (m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.autorizado)).GetValue(m, null) != null &&
                                                                                                                m.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.autorizado)).GetValue(m, null))
                                                                                                    )
                                                                                                               .ToList();

                        //Mensaje de recalculando ............................................................................................................
                        ((BackgroundWorker)sender).ReportProgress(3, Mensajes.G_STR_ESPERANDO_GENERANDODATOS());
                        //Vaciar el total cargado de lineas
                        ((BackgroundWorker)sender).ReportProgress(2, 0);
                        //Total de lineas
                        ((BackgroundWorker)sender).ReportProgress(1, 0);
                        //.....................................................................................................................................

                        //## 2º-> RECORREMOS LOS PEDIDOSCABECERA PENDIENTES Y VAMOS CREANDO LOS REGISTROS

                        //AGRUPAMOS LOS ALBARANES POR CLIENTES
                        Dictionary<string, List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo>> dct_PEDIDOS_PENDIENTES_AGRUPADOS_PORCLIENTE = new Dictionary<string, List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo>>();
                        foreach (dynamic dnm_PedidoCabecera in lst_PedidosCabacera_PENDIENTES)
                        {
                            INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo = g_obj_VTA_PedidosCabecera_Datos.Obtener_ParaConversion_Por_Id(dnm_PedidoCabecera.GetType().GetProperty(nameof(INTERNO_VTA_PedidosCabecera_Listado_Modelo.id)).GetValue(dnm_PedidoCabecera));

                            if (mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo != null)
                            {
                                string str_key = mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idCliente + "_" + (mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idRelacionClienteProveedor != null ? mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idRelacionClienteProveedor.Value.ToString() : "-1");

                                //ACTUALIZR DICCIONARIO
                                if (dct_PEDIDOS_PENDIENTES_AGRUPADOS_PORCLIENTE.Count > 0 && dct_PEDIDOS_PENDIENTES_AGRUPADOS_PORCLIENTE.ContainsKey(str_key))
                                {
                                    dct_PEDIDOS_PENDIENTES_AGRUPADOS_PORCLIENTE[str_key].Add(mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo);
                                }
                                else
                                {
                                    List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo> lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo = new List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo>();
                                    lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Add(mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo);
                                    dct_PEDIDOS_PENDIENTES_AGRUPADOS_PORCLIENTE.Add(str_key, lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo);
                                }
                            }
                        }

                        //Mensaje de recalculando ............................................................................................................
                        ((BackgroundWorker)sender).ReportProgress(1, dct_PEDIDOS_PENDIENTES_AGRUPADOS_PORCLIENTE.Count);
                        //.....................................................................................................................................
                        int int_Contador_Pedidos = 1;

                        foreach (KeyValuePair<string, List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo>> kvp_PedidosPorCliente in dct_PEDIDOS_PENDIENTES_AGRUPADOS_PORCLIENTE)
                        {
                            List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo> lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo = kvp_PedidosPorCliente.Value;

                            str_DatosPedidosCabecera = " ◘ PEDIDO/S ";
                            foreach (INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo_AUX_1 in lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo)
                            {
                                str_DatosPedidosCabecera += " # (" + mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo_AUX_1.numeroDocumento + " - " + mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo_AUX_1.fecha.ToString("dd/MM/yyyy") + " ) ";
                            }

                            //Mensaje de recalculando ............................................................................................................
                            ((BackgroundWorker)sender).ReportProgress(3, str_DatosPedidosCabecera);
                            //total cargado de lineas
                            ((BackgroundWorker)sender).ReportProgress(2, int_Contador_Pedidos);
                            //.....................................................................................................................................


                            DateTime dtt_Fecha = DateTime.ParseExact(g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_CrearAlbaranFactura_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                            GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(dtt_Fecha, g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa);

                            if (mdl_GEN_EjerciciosActivos_Empresa != null)
                            {
                                //## 2º-> VALIDAR QUE LOS IMPUESTOS PARA LA FECHA SELCCIONADA ESTEN VIGENTES
                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_VALIDARIMPUESTOS = Validar_Impuestos(dtt_Fecha, lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo);
                                if (mdl_INTERNO_ValorDevuelto_Modelo_VALIDARIMPUESTOS.TodoCorrecto)
                                {

                                    //## 4º-> CONVERTIR Pedido A ALBARAN
                                    if (
                                        (
                                            lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.tipoDocumento!=null &&
                                            lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.tipoDocumento.Equals(Variables.G_MDL_TIPODOCUMENTOS_VENTA_ALBARAN.Codigo)
                                        )
                                        ||
                                        lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Exists(m => m.idRelacionClienteProveedor != null))
                                    {
                                        VTA_AlbaranesCabecera mdl_VTA_AlbaranesCabecera = null;

                                        //Albaran de Servicio
                                        if (lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count == 1 &&
                                            lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.FirstOrDefault().idRelacionClienteProveedor != null)
                                        {
                                            mdl_VTA_AlbaranesCabecera = Convertir_Pedido_A_Albaran_Servicios(lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idCliente, lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.FirstOrDefault(), mdl_GEN_EjerciciosActivos_Empresa, dtt_Fecha);
                                        }
                                        //Albaran
                                        else
                                        {
                                            mdl_VTA_AlbaranesCabecera = Convertir_Pedido_A_Albaran(lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idCliente, lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo, mdl_GEN_EjerciciosActivos_Empresa, dtt_Fecha);
                                        }

                                        if (mdl_VTA_AlbaranesCabecera != null)
                                        {

                                            //Buscar el numero de Documento
                                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO = Buscar_CodigoSiguiente_Albaran(mdl_VTA_AlbaranesCabecera.idDelegacion, mdl_VTA_AlbaranesCabecera.idEmpresa, mdl_GEN_EjerciciosActivos_Empresa);
                                            if (mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO.TodoCorrecto)
                                            {
                                                //Agregar el numero de Albaran
                                                mdl_VTA_AlbaranesCabecera.numeroAlbaran = long.Parse((string)mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO.Objeto);

                                                //Sustituir en descripcion en Numero de Albaran que se habia puesto como XXXXXXX
                                                mdl_VTA_AlbaranesCabecera.descripcion = mdl_VTA_AlbaranesCabecera.descripcion.Replace("XXXXXXXX", (string)mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO.Objeto);

                                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_ModeloGRABAR = GrabarDatos(mdl_VTA_AlbaranesCabecera, lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo);
                                                if (mdl_INTERNO_ValorDevuelto_ModeloGRABAR.TodoCorrecto)
                                                {
                                                    //CORRECTO
                                                    int_Total_Pedidos_Convertidas_Correctamente += 1;

                                                    //AÑADIR AL LISTADO DE PEDIDOS CORRECTAS
                                                    if (mdl_INTERNO_ValorDevuelto_ModeloGRABAR.Listado_Id != null)
                                                    {
                                                        lst_ids_registrosCorrectos.AddRange(mdl_INTERNO_ValorDevuelto_ModeloGRABAR.Listado_Id);
                                                    }

                                                    #region Cerrar Documento
                                                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CERRAR = new INTERNO_ValorDevuelto_Modelo();
                                                    mdl_INTERNO_ValorDevuelto_Modelo_CERRAR.TodoCorrecto = false;

                                                    if (mdl_INTERNO_ValorDevuelto_ModeloGRABAR.Objeto != null)
                                                    {
                                                        mdl_INTERNO_ValorDevuelto_Modelo_CERRAR = Albaran_Cerrar_Documento((long)mdl_INTERNO_ValorDevuelto_ModeloGRABAR.Objeto, mdl_VTA_AlbaranesCabecera);
                                                    }

                                                    //Si no se pudo cerrar se, muestra un mensaje
                                                    if (mdl_INTERNO_ValorDevuelto_Modelo_CERRAR.TodoCorrecto == false)
                                                    {
                                                        str_Mensajes += "    ◘ ALBARAN (" + mdl_VTA_AlbaranesCabecera.numeroAlbaran + ") no se pudo cerrar " + System.Environment.NewLine;
                                                    }
                                                    #endregion

                                                    #region Actualizar en listado

                                                    if (lst_ids_registrosCorrectos!=null && lst_ids_registrosCorrectos.Count>0)
                                                    {
                                                        foreach(long lng_idPedidoCabecera_GrabadoCorrectamente in lst_ids_registrosCorrectos)
                                                        {
                                                            //Bolsa
                                                            if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Count > 0)
                                                            {
                                                                if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Exists(m => m.id == lng_idPedidoCabecera_GrabadoCorrectamente))
                                                                {
                                                                    int int_Indice = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.IndexOf(g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.id == lng_idPedidoCabecera_GrabadoCorrectamente).FirstOrDefault());
                                                                    g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo[int_Indice].situacion = int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_SERVIDO.Codigo);
                                                                }
                                                            }

                                                            //Seleccionados
                                                            if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Count > 0)
                                                            {
                                                                if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Exists(m => m.id == lng_idPedidoCabecera_GrabadoCorrectamente))
                                                                {
                                                                    int int_Indice = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.IndexOf(g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.id == lng_idPedidoCabecera_GrabadoCorrectamente).FirstOrDefault());
                                                                    g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo[int_Indice].situacion = int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_SERVIDO.Codigo);
                                                                }
                                                            }
                                                        }
                                                    }
                                                    #endregion
                                                }
                                                else
                                                {
                                                    //CON ERRORES
                                                    int_Total_Pedidos_ConErrores += 1;
                                                    str_Mensajes += str_DatosPedidosCabecera + ", error al insertar." + System.Environment.NewLine;
                                                }
                                            }
                                            else
                                            {
                                                //CON ERRORES
                                                int_Total_Pedidos_ConErrores += 1;
                                                str_Mensajes += str_DatosPedidosCabecera + ", no se encontro el nº de albaran." + System.Environment.NewLine;
                                            }
                                        }
                                        else
                                        {
                                            //CON ERRORES
                                            int_Total_Pedidos_ConErrores += 1;
                                            str_Mensajes += str_DatosPedidosCabecera + ", no se pudo crear el albaran de ." + System.Environment.NewLine;
                                        }
                                    }
                                    //## 4º-> CONVERTIR Pedido A FACTURA
                                    else
                                    {
                                        VTA_FacturasCabecera mdl_VTA_FacturasCabecera = Convertir_Pedido_A_Factura(lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idCliente, lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo, mdl_GEN_EjerciciosActivos_Empresa, dtt_Fecha);
                                        if (mdl_VTA_FacturasCabecera != null)
                                        {

                                            //Buscar el numero de Documento
                                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO = Buscar_CodigoSiguiente_Factura(mdl_VTA_FacturasCabecera.idDelegacion, mdl_VTA_FacturasCabecera.idEmpresa, mdl_GEN_EjerciciosActivos_Empresa);
                                            if (mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO.TodoCorrecto)
                                            {
                                                //Agregar el numero de factura
                                                mdl_VTA_FacturasCabecera.numeroFactura = long.Parse((string)mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO.Objeto);

                                                //Sustituir en descripcion en Numero de Factura que se habia puesto como XXXXXXX
                                                mdl_VTA_FacturasCabecera.descripcion = mdl_VTA_FacturasCabecera.descripcion.Replace("XXXXXXXX", (string)mdl_INTERNO_ValorDevuelto_Modelo_NUMERODOCUMENTO.Objeto);

                                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_ModeloGRABAR = GrabarDatos(mdl_VTA_FacturasCabecera, lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo);
                                                if (mdl_INTERNO_ValorDevuelto_ModeloGRABAR.TodoCorrecto)
                                                {
                                                    //CORRECTO
                                                    int_Total_Pedidos_Convertidas_Correctamente += 1;

                                                    //AÑADIR AL LISTADO DE PEDIDOS CORRECTAS
                                                    if (mdl_INTERNO_ValorDevuelto_ModeloGRABAR.Listado_Id != null)
                                                    {
                                                        lst_ids_registrosCorrectos.AddRange(mdl_INTERNO_ValorDevuelto_ModeloGRABAR.Listado_Id);
                                                    }

                                                    #region Cerrar Documento
                                                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CERRAR = new INTERNO_ValorDevuelto_Modelo();
                                                    mdl_INTERNO_ValorDevuelto_Modelo_CERRAR.TodoCorrecto = false;

                                                    if (mdl_INTERNO_ValorDevuelto_ModeloGRABAR.Objeto != null)
                                                    {
                                                        mdl_INTERNO_ValorDevuelto_Modelo_CERRAR = Factura_Cerrar_Documento((long)mdl_INTERNO_ValorDevuelto_ModeloGRABAR.Objeto, mdl_VTA_FacturasCabecera);
                                                    }

                                                    //Si no se pudo cerrar se, muestra un mensaje
                                                    if (mdl_INTERNO_ValorDevuelto_Modelo_CERRAR.TodoCorrecto == false)
                                                    {
                                                        str_Mensajes += "    ◘ FACTURA (" + mdl_VTA_FacturasCabecera.numeroFactura + ") no se pudo cerrar " + System.Environment.NewLine;
                                                    }
                                                    #endregion

                                                    #region Actualizar en listado

                                                    if (lst_ids_registrosCorrectos != null && lst_ids_registrosCorrectos.Count > 0)
                                                    {
                                                        foreach (long lng_idPedidoCabecera_GrabadoCorrectamente in lst_ids_registrosCorrectos)
                                                        {
                                                            //Bolsa
                                                            if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Count > 0)
                                                            {
                                                                if (g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Exists(m => m.id == lng_idPedidoCabecera_GrabadoCorrectamente))
                                                                {
                                                                    int int_Indice = g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.IndexOf(g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo.Where(m => m.id == lng_idPedidoCabecera_GrabadoCorrectamente).FirstOrDefault());
                                                                    g_lst_INTERNO_VTA_PedidosCabecera_Bolsa_Listado_Modelo[int_Indice].situacion = int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_SERVIDO.Codigo);
                                                                }
                                                            }

                                                            //Seleccionados
                                                            if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo != null && g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Count > 0)
                                                            {
                                                                if (g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Exists(m => m.id == lng_idPedidoCabecera_GrabadoCorrectamente))
                                                                {
                                                                    int int_Indice = g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.IndexOf(g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo.Where(m => m.id == lng_idPedidoCabecera_GrabadoCorrectamente).FirstOrDefault());
                                                                    g_lst_INTERNO_VTA_PedidosCabecera_Listado_Modelo[int_Indice].situacion = int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_SERVIDO.Codigo);
                                                                }
                                                            }
                                                        }
                                                    }
                                                    #endregion
                                                }
                                                else
                                                {
                                                    //CON ERRORES
                                                    int_Total_Pedidos_ConErrores += 1;
                                                    str_Mensajes += str_DatosPedidosCabecera + ", error al insertar." + System.Environment.NewLine;
                                                }
                                            }
                                            else
                                            {
                                                //CON ERRORES
                                                int_Total_Pedidos_ConErrores += 1;
                                                str_Mensajes += str_DatosPedidosCabecera + ", no se encontro el nº de factura." + System.Environment.NewLine;
                                            }
                                        }
                                        else
                                        {
                                            //CON ERRORES
                                            int_Total_Pedidos_ConErrores += 1;
                                            str_Mensajes += str_DatosPedidosCabecera + ", no se pudo crear la factura de ." + System.Environment.NewLine;
                                        }
                                    }

                                }
                                else
                                {
                                    //CON ERRORES
                                    int_Total_Pedidos_ConErrores += 1;
                                    str_Mensajes += str_DatosPedidosCabecera + "             - " + mdl_INTERNO_ValorDevuelto_Modelo_VALIDARIMPUESTOS.Mensaje + System.Environment.NewLine;
                                }
                            }
                            else
                            {
                                //CON ERRORES
                                int_Total_Pedidos_ConErrores += 1;
                                str_Mensajes += str_DatosPedidosCabecera + ", " + Mensajes.G_STR_MENSAJES_VALIDACION_FECHASEJERCICIOS_NOTIENEEJERCICIOSCREADOS() + System.Environment.NewLine;
                            }

                            int_Contador_Pedidos += 1;
                        }
                    }
                    else
                    {
                        str_Mensajes = Mensajes.G_STR_MENSAJES_LISTADOS_NOHAYREGISTROSSELECCIONADOS();
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoConvertirAAlbaranFactura_DoWork));

                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Control_Errores)
            {
                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoConvertirAAlbaranFactura_DoWork));
                str_Mensajes = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            finally
            {
                //Agregar los mensajes
                str_Mensajes = "Con error: " + int_Total_Pedidos_ConErrores + System.Environment.NewLine + str_Mensajes;
                str_Mensajes = "Satisfactorias: " + int_Total_Pedidos_Convertidas_Correctamente + System.Environment.NewLine + str_Mensajes;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = str_Mensajes;

                //registros a actualziar emn el listado principal
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_ids_registrosCorrectos;


                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_ProcesoConvertirAAlbaranFactura_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage.ToString().Equals("1"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Total = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("2"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Actualizar = int.Parse(e.UserState.ToString());
                }
                else if (e.ProgressPercentage.ToString().Equals("3"))
                {
                    g_frm_PE_Esperando_BarraProgreso.PE_Esperando_BarraProgreso_Mensaje = e.UserState.ToString();
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_ProcesoConvertirAAlbaranFactura_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (g_frm_PE_Esperando_BarraProgreso != null)
                {
                    g_frm_PE_Esperando_BarraProgreso.Close();
                    g_frm_PE_Esperando_BarraProgreso = null;
                }

                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje != null &&
                    mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                {
                    g_frm_P_PedidoCabecera_Procesos.Exferia_TextBox_CrearAlbaranFactura_Resumen.Text = mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim();
                }

                //Actualiazr los registro en el listado principal
                if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                {
                    // Devolver al Listado el Row Añadido
                    if (g_frm_P_PedidoCabecera_Procesos.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_PedidoCabecera_Procesos.P_Base_PantallaOrigen.P_Base_ActualizarRegistro((List<long>)mdl_ValorDevuelto_Modelo_Resultado.Objeto, G_ENUM_TIPOACCION.INT_MODIFICAR);
                    }
                }

                Mostrar_Registros_Totales(g_frm_P_PedidoCabecera_Procesos.Exferia_RadioButton_Registros_Bolsa.Checked);

                //Marcar como que no se modifico nada
                g_frm_P_PedidoCabecera_Procesos.P_Base_SeModificoDatosPantalla = false;

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(TareaAsincrona_ProcesoConvertirAAlbaranFactura_Completed));
            }
            finally
            {
                //Desbloquear el Formulario
                g_frm_P_PedidoCabecera_Procesos.Enabled = true;
                g_frm_P_PedidoCabecera_Procesos.P_Base_SeModificoDatosPantalla = false;
            }
        }

        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // La fecha no puede estar vacia y debe ser correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_CrearAlbaranFactura_Fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

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

                // Si hay Empleado validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(ValidarDatos));

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

            return mdl_ValorDevuelto_Modelo;
        }

        private INTERNO_ValorDevuelto_Modelo Validar_Impuestos(DateTime _dtt_Fecha, List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo> _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            try
            {
                foreach (INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo in _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo)
                {
                    if (mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas != null &&
                        mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas.Count > 0)
                    {
                        // ## 1º--> BUSCAR EL IMPUESTOCABECERA SI NO ES NULO ###############################################################################
                        GEN_ImpuestosCabecera mdl_GEN_ImpuestosCabecera = Datos_Generales.GEN_ImpuestosCabecera_Obtener_Modelo_Por_Id(mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idImpuestoCabecera);
                        if (mdl_GEN_ImpuestosCabecera != null)
                        {
                            // ## 2º--> RECORRER LINEAS
                            foreach (INTERNO_VTA_PedidosLineas_Modelo mdl_INTERNO_VTA_PedidosLineas_Modelo in mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas)
                            {
                                bool? bol_Existe = Datos_Generales.GEN_ImpuestosLineas_Existe(mdl_GEN_ImpuestosCabecera.id, mdl_INTERNO_VTA_PedidosLineas_Modelo.idImpuestoTipo.Value, _dtt_Fecha);
                                if (bol_Existe == null || bol_Existe == false)
                                {
                                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;

                                    string str_ImpuestoCabecera = "(" + mdl_GEN_ImpuestosCabecera.codigo + ") " + mdl_GEN_ImpuestosCabecera.descripcion;

                                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_IMPUESTOTIPO_NOACTIVO_IMPUESTOCABECERAPORDEFECTO(str_ImpuestoCabecera, _dtt_Fecha.ToString("dd/MM/yyyy"));
                                    break;
                                }
                            }
                        }
                        //Si el ImpuestoCabecera es nulo (error)
                        else
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_PEDIDOSVENTA_VALIDACION_NOENCONTRO_IMPUESTOS();
                            break;
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Validar_Impuestos));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #region Albaran
        private VTA_AlbaranesCabecera Convertir_Pedido_A_Albaran(long _lng_idCliente,
                                                                 List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo> _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo,
                                                                 GEN_EjerciciosActivos_Empresa _mdl_GEN_EjerciciosActivos_Empresa,
                                                                 DateTime _dtt_Fecha)
        {
            VTA_AlbaranesCabecera mdl_VTA_AlbaranesCabecera = null;
            try
            {
                long? lng_Nulo = null;

                mdl_VTA_AlbaranesCabecera = new VTA_AlbaranesCabecera();

                // ## 1º--> VTA_AlbaranesCabecera ############################################################################################
                //id
                mdl_VTA_AlbaranesCabecera.id = -1;

                //numeroAlbaran
                mdl_VTA_AlbaranesCabecera.numeroAlbaran = -1;

                // descripcion (Se pone Empresa/Ejercicio/Delegacion/Nº Documento)
                mdl_VTA_AlbaranesCabecera.descripcion = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.str_Empresa_Codigo + "/" +
                                                        (_mdl_GEN_EjerciciosActivos_Empresa != null ? _mdl_GEN_EjerciciosActivos_Empresa.anioControl : "") + "/" +
                                                        (g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion != null ? g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion.codigo : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].GEN_Delegaciones.codigo + "/") +
                                                        "XXXXXXXX";

                //Delegacion
                GEN_Delegaciones mdl_GEN_Delegaciones = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].GEN_Delegaciones;
                if (g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion != null)
                {
                    mdl_GEN_Delegaciones = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion;
                }
                mdl_VTA_AlbaranesCabecera.idDelegacion = mdl_GEN_Delegaciones.id;

                //idEmpresa
                mdl_VTA_AlbaranesCabecera.idEmpresa = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa;

                //fecha
                mdl_VTA_AlbaranesCabecera.fecha = _dtt_Fecha;

                //guid
                mdl_VTA_AlbaranesCabecera.guid = null;

                //Estado
                mdl_VTA_AlbaranesCabecera.estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

                //idCliente
                mdl_VTA_AlbaranesCabecera.idCliente = _lng_idCliente;

                //idMoneda
                mdl_VTA_AlbaranesCabecera.idMoneda = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idMoneda : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idMoneda;

                //idImpuestoCabecera
                mdl_VTA_AlbaranesCabecera.idImpuestoCabecera = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idImpuestoCabecera : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idImpuestoCabecera;

                //idRelacionClienteProveedor
                mdl_VTA_AlbaranesCabecera.idRelacionClienteProveedor = null;

                //descuentoFinalAlbaran
                mdl_VTA_AlbaranesCabecera.descuentoFinalAlbaran = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.descuentoFinalAlbaran;

                //Empleado
                if (g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Id > -1)
                {
                    mdl_VTA_AlbaranesCabecera.idEmpleado = g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Id;
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.idEmpleado = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado != null ? Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.id : lng_Nulo;
                }

                //idFormaPago
                mdl_VTA_AlbaranesCabecera.idFormaPago = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idFormaPago;

                //idVendedor_Preventa
                mdl_VTA_AlbaranesCabecera.idVendedor_Preventa = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idVendedor_Preventa;

                //idVendedor_PreventaHabitual
                mdl_VTA_AlbaranesCabecera.idVendedor_PreventaHabitual = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idVendedor_PreventaHabitual;

                //idVendedor_Repartidor
                mdl_VTA_AlbaranesCabecera.idVendedor_Repartidor = null;

                //idVendedor_Cobrador
                if (mdl_GEN_Delegaciones != null)
                {
                    //Preventa
                    if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Preventa).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idVendedor_PreventaHabitual;
                    }
                    //Autoventa
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Autoventa).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = null;
                    }
                    //Repartidor
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Repartidor).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idVendedor_Repartidor;
                    }
                    //Rutero
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Rutero).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = null;
                    }
                    //Habitual
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Habitual).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor_Cobrador;
                    }
                    //Fijo
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Fijo).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = mdl_GEN_Delegaciones.idVendedorCobrador;
                    }
                    //Ninguno
                    else
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = null;
                    }
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = null;
                }

                //idVendedor_CobradorHabitual
                mdl_VTA_AlbaranesCabecera.idVendedor_CobradorHabitual = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor_Cobrador;

                //idVendedor_Autoventa
                mdl_VTA_AlbaranesCabecera.idVendedor_Autoventa = null;

                //referencia
                mdl_VTA_AlbaranesCabecera.referencia = null;

                //PredefinidosCabeceras_Albaran ....................................................................................................................
                //Cargamos el ensamblado 
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAPREDEFINIDOCABECERA_OBTENERMODELO_POR_DEFECTO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { Variables.G_PREDEFINIDOFICHEROS_ALBARANDEVENTA.Id };

                //Pasamos los parametros al metodo y lo ejecutamos
                CTA_PredefinidosCabeceras mdl_CTA_PredefinidosCabeceras_Albaran = (CTA_PredefinidosCabeceras)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);

                if (mdl_CTA_PredefinidosCabeceras_Albaran != null &&
                    mdl_CTA_PredefinidosCabeceras_Albaran.idPredefinidoFichero != null &&
                    mdl_CTA_PredefinidosCabeceras_Albaran.idPredefinidoFichero.Value.Equals(Variables.G_PREDEFINIDOFICHEROS_ALBARANDEVENTA.Id))
                {
                    mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Albaran = mdl_CTA_PredefinidosCabeceras_Albaran.id;
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Albaran = null;
                }

                //PredefinidosCabeceras_Servicio ....................................................................................................................
                //Cargamos el ensamblado 
                Assembly m_assembly_2 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_2 = m_assembly_2.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                //creamos la instancia
                var obj_Clase_2 = Activator.CreateInstance(m_type_2);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_2 = obj_Clase_2.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAPREDEFINIDOCABECERA_OBTENERMODELO_POR_DEFECTO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_2 = { Variables.G_PREDEFINIDOFICHEROS_ALBARANDESERVICIOS.Id };

                //Pasamos los parametros al metodo y lo ejecutamos
                CTA_PredefinidosCabeceras mdl_CTA_PredefinidosCabeceras_Servicio = (CTA_PredefinidosCabeceras)obj_MethodInfo_2.Invoke(obj_Clase_2, arr_Parametros_2);

                if (mdl_CTA_PredefinidosCabeceras_Servicio != null &&
                    mdl_CTA_PredefinidosCabeceras_Servicio.idPredefinidoFichero != null &&
                    mdl_CTA_PredefinidosCabeceras_Servicio.idPredefinidoFichero.Value.Equals(Variables.G_PREDEFINIDOFICHEROS_ALBARANDESERVICIOS.Id))
                {
                    mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Servicios = mdl_CTA_PredefinidosCabeceras_Servicio.id;
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Servicios = null;
                }

                //Recargo por Ejercicio
                if (_mdl_GEN_EjerciciosActivos_Empresa.recargo != null && _mdl_GEN_EjerciciosActivos_Empresa.recargo.Value)
                {
                    //Recargo Segun Cliente
                    bool? bol_Recargo_Cliente = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.recargo;
                    if (bol_Recargo_Cliente != null && bol_Recargo_Cliente.Value)
                    {
                        mdl_VTA_AlbaranesCabecera.recargo = true;
                    }
                    else
                    {
                        mdl_VTA_AlbaranesCabecera.recargo = false;
                    }
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.recargo = false;
                }

                //situacionPago
                mdl_VTA_AlbaranesCabecera.situacionPago = int.Parse(Variables.G_MDL_TIPOSITUACIONPAGO_ALBARAN_PENDIENTE.Codigo);

                //idFacturaCabecera
                mdl_VTA_AlbaranesCabecera.idFacturaCabecera = null;

                //fechaBorrado
                mdl_VTA_AlbaranesCabecera.fechaBorrado = null;

                // observaciones
                mdl_VTA_AlbaranesCabecera.observaciones = "";

                //total_bruto
                mdl_VTA_AlbaranesCabecera.total_bruto = 0;

                //total_baseImponible
                mdl_VTA_AlbaranesCabecera.total_baseImponible = 0;

                //total_impuesto
                mdl_VTA_AlbaranesCabecera.total_impuesto = 0;

                //total_recargo
                mdl_VTA_AlbaranesCabecera.total_recargo = 0;

                //total_descuentoFinalAlbaran
                mdl_VTA_AlbaranesCabecera.total_descuentoFinalAlbaran = 0;

                //total
                mdl_VTA_AlbaranesCabecera.total = 0;

                // ## 3º--> VTA_AlbaranesFacturasLineas #######################################################################################
                int int_NumeroLinea = 1;
                //Instanciar la parte de pedidos
                mdl_VTA_AlbaranesCabecera.VTA_AlbaranesFacturasLineas = new List<VTA_AlbaranesFacturasLineas>();

                foreach (INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo in _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo)
                {
                    if (mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas != null &&
                        mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas.Count > 0)
                    {
                        //Recorrer las lineas de la Pedido que no son LineasEnPromociones
                        foreach (INTERNO_VTA_PedidosLineas_Modelo mdl_INTERNO_VTA_PedidosLineas_Modelo in mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas.Where(m => m.idPedidoLinea_Padre == null))
                        {
                            if (mdl_INTERNO_VTA_PedidosLineas_Modelo.fechaBorrado == null)
                            {
                                VentasCompras_Calculos obj_VentasCompras_Calculos = new VentasCompras_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                                                                mdl_VTA_AlbaranesCabecera.idCliente.Value,
                                                                                                                mdl_VTA_AlbaranesCabecera.fecha,
                                                                                                                mdl_VTA_AlbaranesCabecera.idEmpresa,
                                                                                                                (mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral.Value : 0m)
                                                                                                                );
                                #region Ventas/Compras Calculos

                                #region RELLENAR MODELO DE CALCULOS LINEA PRINCIPAL
                                INTERNO_VentasCompras_Calculos_Modelo mdl_INTERNO_VentasCompras_Calculos_Modelo = new INTERNO_VentasCompras_Calculos_Modelo();

                                //Tipo de Compra Venta
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_TiposCompraVenta.opcion;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.idTipoCompraVenta;

                                //Articulo
                                if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos != null)
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.id;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.codigo;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.descripcion;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.tipoTrazabilidad_Salidas;
                                }
                                else
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = -1;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = "";
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = "";
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = "";
                                }


                                //ArticuloComodin
                                if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin != null)
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.id;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.codigo;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.descripcion;
                                }
                                else
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = -1;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = "";
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = "";
                                }

                                //Impuesto Tipo
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_ImpuestosTipos.id;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_ImpuestosTipos.codigo;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_ImpuestosTipos.descripcion;

                                //NomenclaturaPrecio
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_NomenclaturasPrecios;

                                //Rellenar el listado de Embalajes
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();
                                #region Articulos_Embalajes
                                //Cargamos el ensamblado
                                Assembly m_assembly3 = Assembly.LoadFrom(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                                //Obtenemos el tipo de la clase
                                Type m_type3 = m_assembly3.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                                //creamos la instancia
                                var obj_Clase3 = Activator.CreateInstance(m_type3);
                                //Cargamos el metodo solicitado
                                MethodInfo obj_MethodInfo3 = obj_Clase3.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOSEMBALAJES_OBTENERMODELOLISTADO_POR_ARTICULO, BindingFlags.Instance | BindingFlags.NonPublic);

                                //Obtener valores
                                object[] arr_Parametros3 = { mdl_INTERNO_VTA_PedidosLineas_Modelo.idArticulo };
                                //Pasamos los parametros al metodo y lo ejecutamos
                                List<MAE_Articulos_Embalajes> lst_MAE_Articulos_Embalajes = (List<MAE_Articulos_Embalajes>)obj_MethodInfo3.Invoke(obj_Clase3, arr_Parametros3);
                                #endregion

                                if (lst_MAE_Articulos_Embalajes != null &&
                                    lst_MAE_Articulos_Embalajes.Count > 0)
                                {
                                    foreach (MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes in lst_MAE_Articulos_Embalajes)
                                    {
                                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Articulos_Embalajes.MAE_Embalajes.id.ToString(), mdl_MAE_Articulos_Embalajes.MAE_Embalajes.descripcion, null));
                                    }
                                }

                                //Cantidades restantes
                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS = Calcular_CantidadesRestantes(mdl_INTERNO_VTA_PedidosLineas_Modelo);
                                if (mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.TodoCorrecto &&
                                     ((decimal)mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.Objeto_Auxiliar_1 != 0m))
                                {

                                    //idEmbalaje
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.idEmbalaje;

                                    //Embalaje texto
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes.descripcion;

                                    // Cantidad principal
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = (decimal)mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.Objeto_Auxiliar_1;

                                    //relacion
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.relacion;

                                    //Operacion
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.operacion;

                                    //precio_Cantidad_SegundaUnidad
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                                    //idEmbalajeRelacional
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_idEmbalaje;

                                    //Descripcion el embalaje relacional
                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes1 != null)
                                    {
                                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes1.descripcion;
                                    }

                                    //relacion embalaje segunda unidad
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_relacion != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_relacion.Value : 1m;

                                    // Cantidad Secundaria
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = (decimal)mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.Objeto_Auxiliar_2;

                                    //Precio
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_INTERNO_VTA_PedidosLineas_Modelo.precio;

                                    //Descuento
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral = mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral.Value : 0m;

                                    //NumeroRedondeo
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_INTERNO_VTA_PedidosLineas_Modelo.numeroRedondeo != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.numeroRedondeo.Value : 3;

                                    #region Embalaje Principal del Articulo
                                    //Embalaje
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_idEmbalaje;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_relacion;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_operacion;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes2.descripcion;

                                    //Listado de los precios de todas las nomenclaturas del embalaje principal del articulo
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios = null;

                                    //precio 
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_precio;

                                    //Embalaje Segunda unidad
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion.Value : 1m;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes3 != null)
                                    {
                                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes3.descripcion;
                                    }
                                    #endregion


                                    #endregion

                                    #region RELLENAR CANTIDAD SEGUNDA UNIDAD LINEA PROMOCION POR UNIDAD

                                    decimal? dcm_PromocionPorUnidad_Cantidad_SegundaUnidad = null;
                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion != null)
                                    {
                                        // Cantidad Secundaria
                                        dcm_PromocionPorUnidad_Cantidad_SegundaUnidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.segundaUnidad_cantidad;
                                    }
                                    #endregion

                                    //Rellenar la clase de calculos
                                    obj_VentasCompras_Calculos.CargaInicial(mdl_INTERNO_VentasCompras_Calculos_Modelo,
                                                                              dcm_PromocionPorUnidad_Cantidad_SegundaUnidad,
                                                                              mdl_INTERNO_VTA_PedidosLineas_Modelo.TarifasPromociones);

                                    #endregion

                                    #region 1º LINEA PRINCIPAL
                                    VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas = new VTA_AlbaranesFacturasLineas();

                                    //id
                                    mdl_VTA_AlbaranesFacturasLineas.id = -1;

                                    //idFacturaCabecera
                                    mdl_VTA_AlbaranesFacturasLineas.idFacturaCabecera = null;

                                    //idAlbaranCabecera
                                    mdl_VTA_AlbaranesFacturasLineas.idAlbaranCabecera = -1;

                                    //idTipoCompraVenta
                                    mdl_VTA_AlbaranesFacturasLineas.idTipoCompraVenta = obj_VentasCompras_Calculos.PROPIEDAD_TipoCompraVenta_Id;

                                    //idAlbaranFacturaLinea_PromocionesTarifasAsociadas
                                    mdl_VTA_AlbaranesFacturasLineas.idAlbaranFacturaLinea_PromocionesTarifasAsociadas = null;

                                    //idPedidoLinea
                                    mdl_VTA_AlbaranesFacturasLineas.idPedidoLinea = mdl_INTERNO_VTA_PedidosLineas_Modelo.id;

                                    //idArticulo
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_Articulo_Id > 0)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.idArticulo = obj_VentasCompras_Calculos.PROPIEDAD_Articulo_Id;
                                    }
                                    else
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.idArticulo = null;
                                    }

                                    //ArticuloComodin
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Id > 0)
                                    {
                                        //idArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin = obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Id;
                                        //descripcionArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas.descripcionArticuloComodin = mdl_INTERNO_VTA_PedidosLineas_Modelo.descripcionArticuloComodin;
                                    }
                                    else
                                    {
                                        //idArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin = null;
                                        //descripcionArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas.descripcionArticuloComodin = "";
                                    }

                                    //numeroLineaAlbaran
                                    mdl_VTA_AlbaranesFacturasLineas.numeroLineaAlbaran = int_NumeroLinea;

                                    //numeroLineaFactura
                                    mdl_VTA_AlbaranesFacturasLineas.numeroLineaFactura = 0;

                                    //idAlmacen 
                                    mdl_VTA_AlbaranesFacturasLineas.idAlmacen = mdl_INTERNO_VTA_PedidosLineas_Modelo.idAlmacen;

                                    //idUbicacion
                                    mdl_VTA_AlbaranesFacturasLineas.idUbicacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.idUbicacion;

                                    //cantidad
                                    mdl_VTA_AlbaranesFacturasLineas.cantidad = obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal;

                                    //idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas.idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Id;

                                    //relacion
                                    mdl_VTA_AlbaranesFacturasLineas.relacion = obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;

                                    //operacion
                                    mdl_VTA_AlbaranesFacturasLineas.operacion = obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Operacion;

                                    //segundaUnidad_Precio_Cantidad_SegundaUnidad
                                    mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_PrecioPor_SegundaUnidad_Entero;

                                    //segundaUnidad_relacion
                                    mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Relacion;

                                    //segundaUnidad_idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Id;

                                    //segundaUnidad_cantidad
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_cantidad = obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional;
                                    }
                                    else
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_cantidad = null;
                                    }

                                    //idNomenclaturaPrecio
                                    mdl_VTA_AlbaranesFacturasLineas.idNomenclaturaPrecio = obj_VentasCompras_Calculos.PROPIEDAD_NomenclaturaPrecio_Id;

                                    //precio
                                    mdl_VTA_AlbaranesFacturasLineas.precio = obj_VentasCompras_Calculos.PROPIEDAD_Precio;

                                    //numeroRedondeo
                                    mdl_VTA_AlbaranesFacturasLineas.numeroRedondeo = obj_VentasCompras_Calculos.PROPIEDAD_NumeroRedondeo;

                                    //descuentoGeneral
                                    mdl_VTA_AlbaranesFacturasLineas.descuentoGeneral = obj_VentasCompras_Calculos.PROPIEDAD_DescuentoGeneral;

                                    //importe
                                    mdl_VTA_AlbaranesFacturasLineas.importe = obj_VentasCompras_Calculos.PROPIEDAD_Importe;

                                    //idImpuestoTipo
                                    mdl_VTA_AlbaranesFacturasLineas.idImpuestoTipo = obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Id;

                                    //idAlbaranFacturaLinea_Padre
                                    mdl_VTA_AlbaranesFacturasLineas.idAlbaranFacturaLinea_Padre = null;

                                    //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
                                    //embalajePrincipalDelArticulo_idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_IdEmbalaje;

                                    //embalajePrincipalDelArticulo_relacion
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_relacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                                    //embalajePrincipalDelArticulo_operacion
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_operacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                                    //embalajePrincipalDelArticulo_precio
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_precio = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Precio;

                                    //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                                    //embalajePrincipalDelArticulo_segundaUnidad_relacion
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                                    //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                                    int_NumeroLinea += 1;
                                    #endregion

                                    #region 2º COMENTARIOS
                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.VTA_PedidosLineas_Comentarios != null &&
                                        mdl_INTERNO_VTA_PedidosLineas_Modelo.VTA_PedidosLineas_Comentarios.Count > 0)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_Comentarios = new List<VTA_AlbaranesFacturasLineas_Comentarios>();

                                        foreach (VTA_PedidosLineas_Comentarios mdl_VTA_PedidosLineas_Comentarios in mdl_INTERNO_VTA_PedidosLineas_Modelo.VTA_PedidosLineas_Comentarios)
                                        {
                                            VTA_AlbaranesFacturasLineas_Comentarios mdl_VTA_AlbaranesFacturasLineas_Comentarios = new VTA_AlbaranesFacturasLineas_Comentarios();

                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.id = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.idAlbaranFacturaLinea = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.comentario = mdl_VTA_PedidosLineas_Comentarios.comentario;
                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.mostrarImpresion = mdl_VTA_PedidosLineas_Comentarios.mostrarImpresion;

                                            //Añadir al Listado
                                            mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_Comentarios.Add(mdl_VTA_AlbaranesFacturasLineas_Comentarios);
                                        }
                                    }
                                    else
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_Comentarios = null;
                                    }
                                    #endregion

                                    #region 3º TARIFAS/PROMOCIONES
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR != null &&
                                        obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR.Count > 0)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_TarifasPromociones = new List<VTA_AlbaranesFacturasLineas_TarifasPromociones>();

                                        foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR)
                                        {
                                            VTA_AlbaranesFacturasLineas_TarifasPromociones mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones = new VTA_AlbaranesFacturasLineas_TarifasPromociones();

                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.id = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.idAlbaranFacturaLinea = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.codigo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Codigo;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descripcion = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descripcion;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_1 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_1;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_2 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_2;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_3 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_3;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_4 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_4;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_5 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_5;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.incremento = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Incremento;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.numeroRedondeo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NumeroRedondeo;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.tipo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.precioFijoDinamico = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico != null ? mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico.Value : Variables.G_INT_TIPOPRECIO_FIJO_CODIGO;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.precio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.idNomenclaturaPrecio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuentoMoneda = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_DescuentoMoneda;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Cantidad_A = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Cantidad_B = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Porcentaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_idArticulo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_idEmbalaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Cancelado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cancelado;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.orden = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.mensaje_Error = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Mensaje_Error;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.desactivado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Desactivado;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.noAplicarTarifa = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.NoAplicarTarifa;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.aplicadaEnLinea = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.AplicadaEnLinea;

                                            //CONDICIONANTES #############################################################################################################################
                                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes != null &&
                                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes.Count > 0)
                                            {
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes = new List<VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes>();

                                                foreach (INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo in mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes)
                                                {
                                                    VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes = new VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes();

                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.id = -1;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.idAlbaranFacturaLineaTarifaPromocion = -1;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.condicionante_Y_O = null;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Desde_Operador = null;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Desde_Valor = null;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Hasta_Operador = null;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Hasta_Valor = null;

                                                    //Añadir al listado e condicionantes
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.Add(mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes);
                                                }
                                            }
                                            else
                                            {
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes = null;
                                            }

                                            //Añadir al Listado
                                            mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_TarifasPromociones.Add(mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones);
                                        }
                                    }
                                    else
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_TarifasPromociones = null;
                                    }
                                    #endregion

                                    #region 4º LINEA PROMOCION POR UNIDAD (LINEA RELACIONAL)
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Existe &&
                                        mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion != null)

                                    {
                                        VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD = new VTA_AlbaranesFacturasLineas();

                                        //id
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.id = -1;

                                        //idFacturaCabecera
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idFacturaCabecera = null;

                                        //idAlbaranCabecera
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlbaranCabecera = -1;

                                        //idTipoCompraVenta 
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idTipoCompraVenta = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.idTipoCompraVenta;

                                        //idAlbaranFacturaLinea_PromocionesTarifasAsociadas 
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlbaranFacturaLinea_PromocionesTarifasAsociadas = null;

                                        //idPedidoLinea 
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idPedidoLinea = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.id;

                                        //idArticulo
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idArticulo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Articulo_Id;

                                        //idArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idArticuloComodin = null;

                                        //descripcionArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.descripcionArticuloComodin = "";

                                        //numeroLineaAlbaran
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.numeroLineaAlbaran = int_NumeroLinea;

                                        //numeroLineaFactura
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.numeroLineaFactura = 0;

                                        //idAlmacen 
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlmacen = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.idAlmacen;

                                        //idUbicacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idUbicacion = null;

                                        //cantidad
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.cantidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal;

                                        //idEmbalaje
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Id;

                                        //relacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion;

                                        //operacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.operacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Operacion;

                                        //segundaUnidad_Precio_Cantidad_SegundaUnidad
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_PrecioPor_SegundaUnidad_Entero;

                                        //segundaUnidad_relacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Relacion;

                                        //segundaUnidad_idEmbalaje
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Id;

                                        //segundaUnidad_cantidad
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_cantidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional;

                                        //idNomenclaturaPrecio
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idNomenclaturaPrecio = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NomenclaturaPrecio_Id;

                                        //precio
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.precio = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Precio;

                                        //numeroRedondeo
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.numeroRedondeo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NumeroRedondeo;

                                        //descuentoGeneral
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.descuentoGeneral = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_DescuentoGeneral;

                                        //importe
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.importe = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Importe;

                                        //idImpuestoTipo
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idImpuestoTipo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Id;

                                        //idAlbaranFacturaLinea_Padre
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlbaranFacturaLinea_Padre = -1;

                                        //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
                                        //embalajePrincipalDelArticulo_idEmbalaje
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_IdEmbalaje;

                                        //embalajePrincipalDelArticulo_relacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                                        //embalajePrincipalDelArticulo_operacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_operacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                                        //embalajePrincipalDelArticulo_precio
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_precio = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Precio;

                                        //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                                        //embalajePrincipalDelArticulo_segundaUnidad_relacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                                        //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                                        //fechaBorrado
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.fechaBorrado = null;


                                        #region 5º COMENTARIOS
                                        if (mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.VTA_PedidosLineas_Comentarios != null &&
                                            mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.VTA_PedidosLineas_Comentarios.Count > 0)
                                        {
                                            mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.VTA_AlbaranesFacturasLineas_Comentarios = new List<VTA_AlbaranesFacturasLineas_Comentarios>();

                                            foreach (VTA_PedidosLineas_Comentarios mdl_VTA_PedidosLineas_Comentarios in mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.VTA_PedidosLineas_Comentarios)
                                            {
                                                VTA_AlbaranesFacturasLineas_Comentarios mdl_VTA_AlbaranesFacturasLineas_Comentarios = new VTA_AlbaranesFacturasLineas_Comentarios();

                                                mdl_VTA_AlbaranesFacturasLineas_Comentarios.id = -1;
                                                mdl_VTA_AlbaranesFacturasLineas_Comentarios.idAlbaranFacturaLinea = -1;
                                                mdl_VTA_AlbaranesFacturasLineas_Comentarios.comentario = mdl_VTA_PedidosLineas_Comentarios.comentario;
                                                mdl_VTA_AlbaranesFacturasLineas_Comentarios.mostrarImpresion = mdl_VTA_PedidosLineas_Comentarios.mostrarImpresion;

                                                //Añadir al Listado
                                                mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.VTA_AlbaranesFacturasLineas_Comentarios.Add(mdl_VTA_AlbaranesFacturasLineas_Comentarios);
                                            }
                                        }
                                        else
                                        {
                                            mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.VTA_AlbaranesFacturasLineas_Comentarios = null;
                                        }
                                        #endregion

                                        //Agregar a la Linea
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1 = new List<VTA_AlbaranesFacturasLineas>();
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1.Add(mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD);

                                        int_NumeroLinea += 1;
                                    }

                                    #endregion

                                    // AGREGAR VTA_AlbaranesFacturasLineas
                                    mdl_VTA_AlbaranesCabecera.VTA_AlbaranesFacturasLineas.Add(mdl_VTA_AlbaranesFacturasLineas);
                                }
                            }
                        }
                    }
                }


                if (mdl_VTA_AlbaranesCabecera.VTA_AlbaranesFacturasLineas != null &&
                    mdl_VTA_AlbaranesCabecera.VTA_AlbaranesFacturasLineas.Count > 0)
                {
                    // ## 4º--> VTA_AlbaranCabecera_Resumen #######################################################################################
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN = AlbaranCabecera_Resumen_AGrabar(mdl_VTA_AlbaranesCabecera);
                    if (mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.TodoCorrecto)
                    {
                        mdl_VTA_AlbaranesCabecera.VTA_AlbaranesCabecera_Resumen = (List<VTA_AlbaranesCabecera_Resumen>)mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.Objeto;

                        //Totales
                        INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES = (INTERNO_ImportesImpuestos_Modelo)mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.Objeto_Auxiliar_1;
                        if (mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES != null)
                        {
                            //total_bruto
                            mdl_VTA_AlbaranesCabecera.total_bruto = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Bruto;

                            //total_baseImponible
                            mdl_VTA_AlbaranesCabecera.total_baseImponible = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.BaseImponible;

                            //total_impuesto
                            mdl_VTA_AlbaranesCabecera.total_impuesto = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Impuesto_Calculado;

                            //total_recargo
                            mdl_VTA_AlbaranesCabecera.total_recargo = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Recargo_Calculado;

                            //total_descuentoFinalAlbaran
                            mdl_VTA_AlbaranesCabecera.total_descuentoFinalAlbaran = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.DescuentoAlbaranFinal_Calculado;

                            //total
                            mdl_VTA_AlbaranesCabecera.total = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Total;
                        }

                    }
                    else
                    {
                        mdl_VTA_AlbaranesCabecera = null;
                    }
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera = null;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Convertir_Pedido_A_Albaran));

                mdl_VTA_AlbaranesCabecera = null;
            }


            return mdl_VTA_AlbaranesCabecera;
        }
        private VTA_AlbaranesCabecera Convertir_Pedido_A_Albaran_Servicios(long _lng_idCliente,
                                                                             INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo,
                                                                             GEN_EjerciciosActivos_Empresa _mdl_GEN_EjerciciosActivos_Empresa,
                                                                             DateTime _dtt_Fecha)
        {
            VTA_AlbaranesCabecera mdl_VTA_AlbaranesCabecera = null;
            try
            {
                mdl_VTA_AlbaranesCabecera = new VTA_AlbaranesCabecera();

                // ## 1º--> VTA_AlbaranesCabecera ############################################################################################
                //id
                mdl_VTA_AlbaranesCabecera.id = -1;

                //numeroAlbaran
                mdl_VTA_AlbaranesCabecera.numeroAlbaran = -1;

                // descripcion (Se pone Empresa/Ejercicio/Delegacion/Nº Documento)
                mdl_VTA_AlbaranesCabecera.descripcion = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.str_Empresa_Codigo + "/" +
                                                        (_mdl_GEN_EjerciciosActivos_Empresa != null ? _mdl_GEN_EjerciciosActivos_Empresa.anioControl : "") + "/" +
                                                        (g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion != null ? g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion.codigo : _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.GEN_Delegaciones.codigo + "/") +
                                                        "XXXXXXXX";

                //Delegacion
                mdl_VTA_AlbaranesCabecera.idDelegacion = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idDelegacion;
                if (g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion != null)
                {
                    mdl_VTA_AlbaranesCabecera.idDelegacion = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion.id;
                }

                //idEmpresa
                mdl_VTA_AlbaranesCabecera.idEmpresa = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa;

                //fecha
                mdl_VTA_AlbaranesCabecera.fecha = _dtt_Fecha;

                //guid
                mdl_VTA_AlbaranesCabecera.guid = null;

                //Estado
                mdl_VTA_AlbaranesCabecera.estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

                //idCliente
                mdl_VTA_AlbaranesCabecera.idCliente = _lng_idCliente;

                //idMoneda
                mdl_VTA_AlbaranesCabecera.idMoneda = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idMoneda;

                //idImpuestoCabecera
                mdl_VTA_AlbaranesCabecera.idImpuestoCabecera = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idImpuestoCabecera;

                //idRelacionClienteProveedor
                mdl_VTA_AlbaranesCabecera.idRelacionClienteProveedor = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idRelacionClienteProveedor;

                //descuentoFinalAlbaran
                mdl_VTA_AlbaranesCabecera.descuentoFinalAlbaran = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.descuentoFinalAlbaran;

                //Empleado
                if (g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Id > -1)
                {
                    mdl_VTA_AlbaranesCabecera.idEmpleado = g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Id;
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.idEmpleado = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idEmpleado;
                }

                //idFormaPago
                mdl_VTA_AlbaranesCabecera.idFormaPago = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.MAE_Clientes.idFormaPago;

                //idVendedor_Preventa
                mdl_VTA_AlbaranesCabecera.idVendedor_Preventa = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idVendedor_Preventa;

                //idVendedor_PreventaHabitual
                mdl_VTA_AlbaranesCabecera.idVendedor_PreventaHabitual = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.MAE_Clientes.idVendedor;

                //idVendedor_Repartidor
                mdl_VTA_AlbaranesCabecera.idVendedor_Repartidor = null;

                //idVendedor_Cobrador
                if (_mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.GEN_Delegaciones != null)
                {
                    //Preventa
                    if (_mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Preventa).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idVendedor_Preventa;
                    }
                    //Autoventa
                    else if (_mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Autoventa).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = null;
                    }
                    //Repartidor
                    else if (_mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Repartidor).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.idVendedor_Repartidor;
                    }
                    //Rutero
                    else if (_mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Rutero).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = null;
                    }
                    //Habitual
                    else if (_mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Habitual).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.MAE_Clientes.idVendedor_Cobrador;
                    }
                    //Fijo
                    else if (_mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Fijo).ToString())
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.GEN_Delegaciones.idVendedorCobrador;
                    }
                    //Ninguno
                    else
                    {
                        mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = null;
                    }
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.idVendedor_Cobrador = null;
                }

                //idVendedor_CobradorHabitual
                mdl_VTA_AlbaranesCabecera.idVendedor_CobradorHabitual = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.MAE_Clientes.idVendedor_Cobrador;

                //idVendedor_Autoventa
                mdl_VTA_AlbaranesCabecera.idVendedor_Autoventa = null;

                //referencia
                mdl_VTA_AlbaranesCabecera.referencia = null;

                //PredefinidosCabeceras_Albaran ....................................................................................................................
                //Cargamos el ensamblado 
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAPREDEFINIDOCABECERA_OBTENERMODELO_POR_DEFECTO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { Variables.G_PREDEFINIDOFICHEROS_ALBARANDEVENTA.Id };

                //Pasamos los parametros al metodo y lo ejecutamos
                CTA_PredefinidosCabeceras mdl_CTA_PredefinidosCabeceras_Albaran = (CTA_PredefinidosCabeceras)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);

                if (mdl_CTA_PredefinidosCabeceras_Albaran != null &&
                    mdl_CTA_PredefinidosCabeceras_Albaran.idPredefinidoFichero != null &&
                    mdl_CTA_PredefinidosCabeceras_Albaran.idPredefinidoFichero.Value.Equals(Variables.G_PREDEFINIDOFICHEROS_ALBARANDEVENTA.Id))
                {
                    mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Albaran = mdl_CTA_PredefinidosCabeceras_Albaran.id;
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Albaran = null;
                }

                //PredefinidosCabeceras_Servicio ....................................................................................................................
                //Cargamos el ensamblado 
                Assembly m_assembly_2 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_2 = m_assembly_2.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                //creamos la instancia
                var obj_Clase_2 = Activator.CreateInstance(m_type_2);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_2 = obj_Clase_2.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAPREDEFINIDOCABECERA_OBTENERMODELO_POR_DEFECTO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_2 = { Variables.G_PREDEFINIDOFICHEROS_ALBARANDESERVICIOS.Id };

                //Pasamos los parametros al metodo y lo ejecutamos
                CTA_PredefinidosCabeceras mdl_CTA_PredefinidosCabeceras_Servicio = (CTA_PredefinidosCabeceras)obj_MethodInfo_2.Invoke(obj_Clase_2, arr_Parametros_2);

                if (mdl_CTA_PredefinidosCabeceras_Servicio != null &&
                    mdl_CTA_PredefinidosCabeceras_Servicio.idPredefinidoFichero != null &&
                    mdl_CTA_PredefinidosCabeceras_Servicio.idPredefinidoFichero.Value.Equals(Variables.G_PREDEFINIDOFICHEROS_ALBARANDESERVICIOS.Id))
                {
                    mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Servicios = mdl_CTA_PredefinidosCabeceras_Servicio.id;
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Servicios = null;
                }

                //Recargo por Ejercicio
                if (_mdl_GEN_EjerciciosActivos_Empresa.recargo != null && _mdl_GEN_EjerciciosActivos_Empresa.recargo.Value)
                {
                    //Recargo Segun Cliente
                    bool? bol_Recargo_Cliente = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.MAE_Clientes.recargo;
                    if (bol_Recargo_Cliente != null && bol_Recargo_Cliente.Value)
                    {
                        mdl_VTA_AlbaranesCabecera.recargo = true;
                    }
                    else
                    {
                        mdl_VTA_AlbaranesCabecera.recargo = false;
                    }
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera.recargo = false;
                }

                //situacionPago
                mdl_VTA_AlbaranesCabecera.situacionPago = int.Parse(Variables.G_MDL_TIPOSITUACIONPAGO_ALBARAN_PENDIENTE.Codigo);

                //idFacturaCabecera
                mdl_VTA_AlbaranesCabecera.idFacturaCabecera = null;

                //fechaBorrado
                mdl_VTA_AlbaranesCabecera.fechaBorrado = null;

                // observaciones
                mdl_VTA_AlbaranesCabecera.observaciones = _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.observaciones;

                //total_bruto
                mdl_VTA_AlbaranesCabecera.total_bruto = 0;

                //total_baseImponible
                mdl_VTA_AlbaranesCabecera.total_baseImponible = 0;

                //total_impuesto
                mdl_VTA_AlbaranesCabecera.total_impuesto = 0;

                //total_recargo
                mdl_VTA_AlbaranesCabecera.total_recargo = 0;

                //total_descuentoFinalAlbaran
                mdl_VTA_AlbaranesCabecera.total_descuentoFinalAlbaran = 0;

                //total
                mdl_VTA_AlbaranesCabecera.total = 0;

                // ## 2º--> VTA_AlbaranesCabecera_Anexos #######################################################################################
                if (_mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.VTA_PedidosCabecera_Anexos != null &&
                    _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.VTA_PedidosCabecera_Anexos.Count > 0)
                {
                    //Instanciar
                    mdl_VTA_AlbaranesCabecera.VTA_AlbaranesCabecera_Anexos = new List<VTA_AlbaranesCabecera_Anexos>();

                    foreach (VTA_PedidosCabecera_Anexos mdl_VTA_PedidosCabecera_Anexos in _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.VTA_PedidosCabecera_Anexos)
                    {
                        VTA_AlbaranesCabecera_Anexos mdl_VTA_AlbaranesCabecera_Anexos = new VTA_AlbaranesCabecera_Anexos();

                        mdl_VTA_AlbaranesCabecera_Anexos.id = -1;
                        mdl_VTA_AlbaranesCabecera_Anexos.idAlbaranCabecera = -1;
                        mdl_VTA_AlbaranesCabecera_Anexos.numeroDocumentoManual = mdl_VTA_PedidosCabecera_Anexos.numeroDocumentoManual;
                        mdl_VTA_AlbaranesCabecera_Anexos.numeroPedidoCliente = mdl_VTA_PedidosCabecera_Anexos.numeroPedidoCliente;
                        mdl_VTA_AlbaranesCabecera_Anexos.identicket = mdl_VTA_PedidosCabecera_Anexos.identicket;
                        mdl_VTA_AlbaranesCabecera_Anexos.seccion = mdl_VTA_PedidosCabecera_Anexos.seccion;
                        mdl_VTA_AlbaranesCabecera_Anexos.departamento = mdl_VTA_PedidosCabecera_Anexos.departamento;

                        //Añadir al listado
                        mdl_VTA_AlbaranesCabecera.VTA_AlbaranesCabecera_Anexos.Add(mdl_VTA_AlbaranesCabecera_Anexos);
                    }
                }

                // ## 3º--> VTA_AlbaranesFacturasLineas #######################################################################################
                if (_mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas != null &&
                    _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas.Count > 0)
                {
                    //Instanciar la parte de pedidos
                    mdl_VTA_AlbaranesCabecera.VTA_AlbaranesFacturasLineas = new List<VTA_AlbaranesFacturasLineas>();

                    //Recorrer las lineas de la Pedido que no son LineasEnPromociones
                    int int_NumeroLinea = 1;
                    foreach (INTERNO_VTA_PedidosLineas_Modelo mdl_INTERNO_VTA_PedidosLineas_Modelo in _mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas.Where(m => m.idPedidoLinea_Padre == null))
                    {
                        if (mdl_INTERNO_VTA_PedidosLineas_Modelo.fechaBorrado == null)
                        {
                            VentasCompras_Calculos obj_VentasCompras_Calculos = new VentasCompras_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                                                            mdl_VTA_AlbaranesCabecera.idCliente.Value,
                                                                                                            mdl_VTA_AlbaranesCabecera.fecha,
                                                                                                            mdl_VTA_AlbaranesCabecera.idEmpresa,
                                                                                                            (mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral.Value : 0m)
                                                                                                            );
                            #region Ventas/Compras Calculos

                            #region RELLENAR MODELO DE CALCULOS LINEA PRINCIPAL
                            INTERNO_VentasCompras_Calculos_Modelo mdl_INTERNO_VentasCompras_Calculos_Modelo = new INTERNO_VentasCompras_Calculos_Modelo();

                            //Tipo de Compra Venta
                            mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_TiposCompraVenta.opcion;
                            mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.idTipoCompraVenta;

                            //Articulo
                            if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos != null)
                            {
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.id;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.codigo;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.descripcion;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.tipoTrazabilidad_Salidas;
                            }
                            else
                            {
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = -1;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = "";
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = "";
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = "";
                            }


                            //ArticuloComodin
                            if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin != null)
                            {
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.id;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.codigo;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.descripcion;
                            }
                            else
                            {
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = -1;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = "";
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = "";
                            }

                            //Impuesto Tipo
                            mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_ImpuestosTipos.id;
                            mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_ImpuestosTipos.codigo;
                            mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_ImpuestosTipos.descripcion;

                            //NomenclaturaPrecio
                            mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_NomenclaturasPrecios;

                            //Rellenar el listado de Embalajes
                            mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();
                            #region Articulos_Embalajes
                            //Cargamos el ensamblado
                            Assembly m_assembly3 = Assembly.LoadFrom(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                            //Obtenemos el tipo de la clase
                            Type m_type3 = m_assembly3.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                            //creamos la instancia
                            var obj_Clase3 = Activator.CreateInstance(m_type3);
                            //Cargamos el metodo solicitado
                            MethodInfo obj_MethodInfo3 = obj_Clase3.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOSEMBALAJES_OBTENERMODELOLISTADO_POR_ARTICULO, BindingFlags.Instance | BindingFlags.NonPublic);

                            //Obtener valores
                            object[] arr_Parametros3 = { mdl_INTERNO_VTA_PedidosLineas_Modelo.idArticulo };
                            //Pasamos los parametros al metodo y lo ejecutamos
                            List<MAE_Articulos_Embalajes> lst_MAE_Articulos_Embalajes = (List<MAE_Articulos_Embalajes>)obj_MethodInfo3.Invoke(obj_Clase3, arr_Parametros3);
                            #endregion

                            if (lst_MAE_Articulos_Embalajes != null &&
                                lst_MAE_Articulos_Embalajes.Count > 0)
                            {
                                foreach (MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes in lst_MAE_Articulos_Embalajes)
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Articulos_Embalajes.MAE_Embalajes.id.ToString(), mdl_MAE_Articulos_Embalajes.MAE_Embalajes.descripcion, null));
                                }
                            }

                            //Cantidades restantes
                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS = Calcular_CantidadesRestantes(mdl_INTERNO_VTA_PedidosLineas_Modelo);
                            if (mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.TodoCorrecto &&
                                 ((decimal)mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.Objeto_Auxiliar_1 != 0m))
                            {

                                //idEmbalaje
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.idEmbalaje;

                                //Embalaje texto
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes.descripcion;

                                // Cantidad principal
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = (decimal)mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.Objeto_Auxiliar_1;

                                //relacion
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.relacion;

                                //Operacion
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.operacion;

                                //precio_Cantidad_SegundaUnidad
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                                //idEmbalajeRelacional
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_idEmbalaje;

                                //Descripcion el embalaje relacional
                                if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes1 != null)
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes1.descripcion;
                                }

                                //relacion embalaje segunda unidad
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_relacion != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_relacion.Value : 1m;

                                // Cantidad Secundaria
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = (decimal)mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.Objeto_Auxiliar_2;

                                //Precio
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_INTERNO_VTA_PedidosLineas_Modelo.precio;

                                //Descuento
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral = mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral.Value : 0m;

                                //NumeroRedondeo
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_INTERNO_VTA_PedidosLineas_Modelo.numeroRedondeo != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.numeroRedondeo.Value : 3;

                                #region Embalaje Principal del Articulo
                                //Embalaje
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_idEmbalaje;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_relacion;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_operacion;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes2.descripcion;

                                //Listado de los precios de todas las nomenclaturas del embalaje principal del articulo
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios = null;

                                //precio 
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_precio;

                                //Embalaje Segunda unidad
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion.Value : 1m;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                                if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes3 != null)
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes3.descripcion;
                                }
                                #endregion


                                #endregion

                                #region RELLENAR CANTIDAD SEGUNDA UNIDAD LINEA PROMOCION POR UNIDAD

                                decimal? dcm_PromocionPorUnidad_Cantidad_SegundaUnidad = null;
                                if (mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion != null)
                                {
                                    // Cantidad Secundaria
                                    dcm_PromocionPorUnidad_Cantidad_SegundaUnidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.segundaUnidad_cantidad;
                                }
                                #endregion

                                //Rellenar la clase de calculos
                                obj_VentasCompras_Calculos.CargaInicial(mdl_INTERNO_VentasCompras_Calculos_Modelo,
                                                                          dcm_PromocionPorUnidad_Cantidad_SegundaUnidad,
                                                                          mdl_INTERNO_VTA_PedidosLineas_Modelo.TarifasPromociones);

                                #endregion

                                #region 1º LINEA PRINCIPAL
                                VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas = new VTA_AlbaranesFacturasLineas();

                                //id
                                mdl_VTA_AlbaranesFacturasLineas.id = -1;

                                //idFacturaCabecera
                                mdl_VTA_AlbaranesFacturasLineas.idFacturaCabecera = null;

                                //idAlbaranCabecera
                                mdl_VTA_AlbaranesFacturasLineas.idAlbaranCabecera = -1;

                                //idTipoCompraVenta
                                mdl_VTA_AlbaranesFacturasLineas.idTipoCompraVenta = obj_VentasCompras_Calculos.PROPIEDAD_TipoCompraVenta_Id;

                                //idAlbaranFacturaLinea_PromocionesTarifasAsociadas
                                mdl_VTA_AlbaranesFacturasLineas.idAlbaranFacturaLinea_PromocionesTarifasAsociadas = null;

                                //idPedidoLinea
                                mdl_VTA_AlbaranesFacturasLineas.idPedidoLinea = mdl_INTERNO_VTA_PedidosLineas_Modelo.id;

                                //idArticulo
                                if (obj_VentasCompras_Calculos.PROPIEDAD_Articulo_Id > 0)
                                {
                                    mdl_VTA_AlbaranesFacturasLineas.idArticulo = obj_VentasCompras_Calculos.PROPIEDAD_Articulo_Id;
                                }
                                else
                                {
                                    mdl_VTA_AlbaranesFacturasLineas.idArticulo = null;
                                }

                                //ArticuloComodin
                                if (obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Id > 0)
                                {
                                    //idArticuloComodin
                                    mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin = obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Id;
                                    //descripcionArticuloComodin
                                    mdl_VTA_AlbaranesFacturasLineas.descripcionArticuloComodin = mdl_INTERNO_VTA_PedidosLineas_Modelo.descripcionArticuloComodin;
                                }
                                else
                                {
                                    //idArticuloComodin
                                    mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin = null;
                                    //descripcionArticuloComodin
                                    mdl_VTA_AlbaranesFacturasLineas.descripcionArticuloComodin = "";
                                }

                                //numeroLineaAlbaran
                                mdl_VTA_AlbaranesFacturasLineas.numeroLineaAlbaran = int_NumeroLinea;

                                //numeroLineaFactura
                                mdl_VTA_AlbaranesFacturasLineas.numeroLineaFactura = 0;

                                //idAlmacen 
                                mdl_VTA_AlbaranesFacturasLineas.idAlmacen = mdl_INTERNO_VTA_PedidosLineas_Modelo.idAlmacen;

                                //idUbicacion
                                mdl_VTA_AlbaranesFacturasLineas.idUbicacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.idUbicacion;

                                //cantidad
                                mdl_VTA_AlbaranesFacturasLineas.cantidad = obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal;

                                //idEmbalaje
                                mdl_VTA_AlbaranesFacturasLineas.idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Id;

                                //relacion
                                mdl_VTA_AlbaranesFacturasLineas.relacion = obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;

                                //operacion
                                mdl_VTA_AlbaranesFacturasLineas.operacion = obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Operacion;

                                //segundaUnidad_Precio_Cantidad_SegundaUnidad
                                mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_PrecioPor_SegundaUnidad_Entero;

                                //segundaUnidad_relacion
                                mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Relacion;

                                //segundaUnidad_idEmbalaje
                                mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Id;

                                //segundaUnidad_cantidad
                                if (obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional)
                                {
                                    mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_cantidad = obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional;
                                }
                                else
                                {
                                    mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_cantidad = null;
                                }

                                //idNomenclaturaPrecio
                                mdl_VTA_AlbaranesFacturasLineas.idNomenclaturaPrecio = obj_VentasCompras_Calculos.PROPIEDAD_NomenclaturaPrecio_Id;

                                //precio
                                mdl_VTA_AlbaranesFacturasLineas.precio = obj_VentasCompras_Calculos.PROPIEDAD_Precio;

                                //numeroRedondeo
                                mdl_VTA_AlbaranesFacturasLineas.numeroRedondeo = obj_VentasCompras_Calculos.PROPIEDAD_NumeroRedondeo;

                                //descuentoGeneral
                                mdl_VTA_AlbaranesFacturasLineas.descuentoGeneral = obj_VentasCompras_Calculos.PROPIEDAD_DescuentoGeneral;

                                //importe
                                mdl_VTA_AlbaranesFacturasLineas.importe = obj_VentasCompras_Calculos.PROPIEDAD_Importe;

                                //idImpuestoTipo
                                mdl_VTA_AlbaranesFacturasLineas.idImpuestoTipo = obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Id;

                                //idAlbaranFacturaLinea_Padre
                                mdl_VTA_AlbaranesFacturasLineas.idAlbaranFacturaLinea_Padre = null;

                                //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
                                //embalajePrincipalDelArticulo_idEmbalaje
                                mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_IdEmbalaje;

                                //embalajePrincipalDelArticulo_relacion
                                mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_relacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                                //embalajePrincipalDelArticulo_operacion
                                mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_operacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                                //embalajePrincipalDelArticulo_precio
                                mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_precio = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Precio;

                                //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                                mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                                //embalajePrincipalDelArticulo_segundaUnidad_relacion
                                mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                                //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                                mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                                int_NumeroLinea += 1;
                                #endregion

                                #region 2º COMENTARIOS
                                if (mdl_INTERNO_VTA_PedidosLineas_Modelo.VTA_PedidosLineas_Comentarios != null &&
                                    mdl_INTERNO_VTA_PedidosLineas_Modelo.VTA_PedidosLineas_Comentarios.Count > 0)
                                {
                                    mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_Comentarios = new List<VTA_AlbaranesFacturasLineas_Comentarios>();

                                    foreach (VTA_PedidosLineas_Comentarios mdl_VTA_PedidosLineas_Comentarios in mdl_INTERNO_VTA_PedidosLineas_Modelo.VTA_PedidosLineas_Comentarios)
                                    {
                                        VTA_AlbaranesFacturasLineas_Comentarios mdl_VTA_AlbaranesFacturasLineas_Comentarios = new VTA_AlbaranesFacturasLineas_Comentarios();

                                        mdl_VTA_AlbaranesFacturasLineas_Comentarios.id = -1;
                                        mdl_VTA_AlbaranesFacturasLineas_Comentarios.idAlbaranFacturaLinea = -1;
                                        mdl_VTA_AlbaranesFacturasLineas_Comentarios.comentario = mdl_VTA_PedidosLineas_Comentarios.comentario;
                                        mdl_VTA_AlbaranesFacturasLineas_Comentarios.mostrarImpresion = mdl_VTA_PedidosLineas_Comentarios.mostrarImpresion;

                                        //Añadir al Listado
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_Comentarios.Add(mdl_VTA_AlbaranesFacturasLineas_Comentarios);
                                    }
                                }
                                else
                                {
                                    mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_Comentarios = null;
                                }
                                #endregion

                                #region 3º TARIFAS/PROMOCIONES
                                if (obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR != null &&
                                    obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR.Count > 0)
                                {
                                    mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_TarifasPromociones = new List<VTA_AlbaranesFacturasLineas_TarifasPromociones>();

                                    foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR)
                                    {
                                        VTA_AlbaranesFacturasLineas_TarifasPromociones mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones = new VTA_AlbaranesFacturasLineas_TarifasPromociones();

                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.id = -1;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.idAlbaranFacturaLinea = -1;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.codigo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Codigo;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descripcion = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descripcion;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_1 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_1;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_2 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_2;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_3 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_3;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_4 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_4;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_5 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_5;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.incremento = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Incremento;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.numeroRedondeo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NumeroRedondeo;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.tipo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.precioFijoDinamico = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico != null ? mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico.Value : Variables.G_INT_TIPOPRECIO_FIJO_CODIGO;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.precio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.idNomenclaturaPrecio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuentoMoneda = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_DescuentoMoneda;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Cantidad_A = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Cantidad_B = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Porcentaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_idArticulo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_idEmbalaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Cancelado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cancelado;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.orden = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.mensaje_Error = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Mensaje_Error;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.desactivado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Desactivado;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.noAplicarTarifa = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.NoAplicarTarifa;
                                        mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.aplicadaEnLinea = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.AplicadaEnLinea;

                                        //CONDICIONANTES #############################################################################################################################
                                        if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes != null &&
                                            mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes.Count > 0)
                                        {
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes = new List<VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes>();

                                            foreach (INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo in mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes)
                                            {
                                                VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes = new VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes();

                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.id = -1;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.idAlbaranFacturaLineaTarifaPromocion = -1;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.condicionante_Y_O = null;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Desde_Operador = null;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Desde_Valor = null;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Hasta_Operador = null;
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Hasta_Valor = null;

                                                //Añadir al listado e condicionantes
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.Add(mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes);
                                            }
                                        }
                                        else
                                        {
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes = null;
                                        }

                                        //Añadir al Listado
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_TarifasPromociones.Add(mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones);
                                    }
                                }
                                else
                                {
                                    mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_TarifasPromociones = null;
                                }
                                #endregion

                                #region 4º LINEA PROMOCION POR UNIDAD (LINEA RELACIONAL)
                                if (obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Existe &&
                                    mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion != null)

                                {
                                    VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD = new VTA_AlbaranesFacturasLineas();

                                    //id
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.id = -1;

                                    //idFacturaCabecera
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idFacturaCabecera = null;

                                    //idAlbaranCabecera
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlbaranCabecera = -1;

                                    //idTipoCompraVenta 
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idTipoCompraVenta = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.idTipoCompraVenta;

                                    //idAlbaranFacturaLinea_PromocionesTarifasAsociadas 
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlbaranFacturaLinea_PromocionesTarifasAsociadas = null;

                                    //idPedidoLinea 
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idPedidoLinea = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.id;

                                    //idArticulo
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idArticulo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Articulo_Id;

                                    //idArticuloComodin
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idArticuloComodin = null;

                                    //descripcionArticuloComodin
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.descripcionArticuloComodin = "";

                                    //numeroLineaAlbaran
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.numeroLineaAlbaran = int_NumeroLinea;

                                    //numeroLineaFactura
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.numeroLineaFactura = 0;

                                    //idAlmacen 
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlmacen = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.idAlmacen;

                                    //idUbicacion
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idUbicacion = null;

                                    //cantidad
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.cantidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal;

                                    //idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Id;

                                    //relacion
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion;

                                    //operacion
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.operacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Operacion;

                                    //segundaUnidad_Precio_Cantidad_SegundaUnidad
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_PrecioPor_SegundaUnidad_Entero;

                                    //segundaUnidad_relacion
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Relacion;

                                    //segundaUnidad_idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Id;

                                    //segundaUnidad_cantidad
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_cantidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional;

                                    //idNomenclaturaPrecio
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idNomenclaturaPrecio = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NomenclaturaPrecio_Id;

                                    //precio
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.precio = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Precio;

                                    //numeroRedondeo
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.numeroRedondeo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NumeroRedondeo;

                                    //descuentoGeneral
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.descuentoGeneral = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_DescuentoGeneral;

                                    //importe
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.importe = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Importe;

                                    //idImpuestoTipo
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idImpuestoTipo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Id;

                                    //idAlbaranFacturaLinea_Padre
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlbaranFacturaLinea_Padre = -1;

                                    //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
                                    //embalajePrincipalDelArticulo_idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_IdEmbalaje;

                                    //embalajePrincipalDelArticulo_relacion
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                                    //embalajePrincipalDelArticulo_operacion
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_operacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                                    //embalajePrincipalDelArticulo_precio
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_precio = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Precio;

                                    //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                                    //embalajePrincipalDelArticulo_segundaUnidad_relacion
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                                    //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                                    //fechaBorrado
                                    mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.fechaBorrado = null;


                                    #region 5º COMENTARIOS
                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.VTA_PedidosLineas_Comentarios != null &&
                                        mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.VTA_PedidosLineas_Comentarios.Count > 0)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.VTA_AlbaranesFacturasLineas_Comentarios = new List<VTA_AlbaranesFacturasLineas_Comentarios>();

                                        foreach (VTA_PedidosLineas_Comentarios mdl_VTA_PedidosLineas_Comentarios in mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.VTA_PedidosLineas_Comentarios)
                                        {
                                            VTA_AlbaranesFacturasLineas_Comentarios mdl_VTA_AlbaranesFacturasLineas_Comentarios = new VTA_AlbaranesFacturasLineas_Comentarios();

                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.id = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.idAlbaranFacturaLinea = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.comentario = mdl_VTA_PedidosLineas_Comentarios.comentario;
                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.mostrarImpresion = mdl_VTA_PedidosLineas_Comentarios.mostrarImpresion;

                                            //Añadir al Listado
                                            mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.VTA_AlbaranesFacturasLineas_Comentarios.Add(mdl_VTA_AlbaranesFacturasLineas_Comentarios);
                                        }
                                    }
                                    else
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.VTA_AlbaranesFacturasLineas_Comentarios = null;
                                    }
                                    #endregion

                                    //Agregar a la Linea
                                    mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1 = new List<VTA_AlbaranesFacturasLineas>();
                                    mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1.Add(mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD);

                                    int_NumeroLinea += 1;
                                }

                                #endregion

                                // AGREGAR VTA_AlbaranesFacturasLineas
                                mdl_VTA_AlbaranesCabecera.VTA_AlbaranesFacturasLineas.Add(mdl_VTA_AlbaranesFacturasLineas);
                            }
                        }
                    }
                }


                if (mdl_VTA_AlbaranesCabecera.VTA_AlbaranesFacturasLineas != null &&
                    mdl_VTA_AlbaranesCabecera.VTA_AlbaranesFacturasLineas.Count > 0)
                {
                    // ## 4º--> VTA_AlbaranCabecera_Resumen #######################################################################################
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN = AlbaranCabecera_Resumen_AGrabar(mdl_VTA_AlbaranesCabecera);
                    if (mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.TodoCorrecto)
                    {
                        mdl_VTA_AlbaranesCabecera.VTA_AlbaranesCabecera_Resumen = (List<VTA_AlbaranesCabecera_Resumen>)mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.Objeto;

                        //Totales
                        INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES = (INTERNO_ImportesImpuestos_Modelo)mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.Objeto_Auxiliar_1;
                        if (mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES != null)
                        {
                            //total_bruto
                            mdl_VTA_AlbaranesCabecera.total_bruto = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Bruto;

                            //total_baseImponible
                            mdl_VTA_AlbaranesCabecera.total_baseImponible = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.BaseImponible;

                            //total_impuesto
                            mdl_VTA_AlbaranesCabecera.total_impuesto = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Impuesto_Calculado;

                            //total_recargo
                            mdl_VTA_AlbaranesCabecera.total_recargo = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Recargo_Calculado;

                            //total_descuentoFinalAlbaran
                            mdl_VTA_AlbaranesCabecera.total_descuentoFinalAlbaran = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.DescuentoAlbaranFinal_Calculado;

                            //total
                            mdl_VTA_AlbaranesCabecera.total = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Total;
                        }

                    }
                    else
                    {
                        mdl_VTA_AlbaranesCabecera = null;
                    }
                }
                else
                {
                    mdl_VTA_AlbaranesCabecera = null;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Convertir_Pedido_A_Albaran_Servicios));

                mdl_VTA_AlbaranesCabecera = null;
            }


            return mdl_VTA_AlbaranesCabecera;
        }

        private INTERNO_ValorDevuelto_Modelo AlbaranCabecera_Resumen_AGrabar(VTA_AlbaranesCabecera _mdl_VTA_AlbaranesCabecera)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_1 = null;

            List<VTA_AlbaranesCabecera_Resumen> lst_VTA_AlbaranesCabecera_Resumen = new List<VTA_AlbaranesCabecera_Resumen>();

            try
            {
                //## 1º--> BUSCAR EL IMPUESTOSCABECERA
                GEN_ImpuestosCabecera mdl_GEN_ImpuestosCabecera = Datos_Generales.GEN_ImpuestosCabecera_Obtener_Modelo_Por_Id(_mdl_VTA_AlbaranesCabecera.idImpuestoCabecera);

                //## 2º--> OBTENER EL LISTADO DE GEN_IMPUESTOSTIPOS QUE HAY
                List<INTERNO_GEN_ImpuestosTipos_Listado_Modelo> lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo = Datos_Generales.GEN_ImpuestosTipos_Obtener_Listado();
                if (lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo != null)
                {
                    // ## 3º--> CONVERTIR LISTADO DE LINEAS EN LISTADO DEL MODELO INTERNO_VentasComprasCalculoLineas_Modelo ####################################
                    List<INTERNO_VentasCompras_Calculo_Lineas_Modelo> lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo = new List<INTERNO_VentasCompras_Calculo_Lineas_Modelo>();
                    VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION = null;
                    // ## 3º--> CONVERTIR LISTADO DE LINEAS EN LISTADO DEL MODELO INTERNO_VentasCompras_Calculo_Lineas_Modelo ####################################
                    foreach (VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas in _mdl_VTA_AlbaranesCabecera.VTA_AlbaranesFacturasLineas)
                    {
                        //LINEA PRINCIPAL
                        lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo.Add(new INTERNO_VentasCompras_Calculo_Lineas_Modelo((mdl_VTA_AlbaranesFacturasLineas.idArticulo != null ? mdl_VTA_AlbaranesFacturasLineas.idArticulo.Value : -1),
                                                                                                                             (mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin != null ? mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin.Value : -1),
                                                                                                                             (mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin != null ? true : false),
                                                                                                                             mdl_VTA_AlbaranesFacturasLineas.idImpuestoTipo,
                                                                                                                             (mdl_VTA_AlbaranesFacturasLineas.importe != null ? mdl_VTA_AlbaranesFacturasLineas.importe.Value : 0m)));



                        //LINEA EN PROMOCION
                        if (mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1 != null &&
                            mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1.Count > 0)
                        {
                            mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION = mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1.FirstOrDefault();

                            lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo.Add(new INTERNO_VentasCompras_Calculo_Lineas_Modelo((mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticulo != null ? mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticulo.Value : -1),
                                                                                                                                 (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticuloComodin != null ? mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticuloComodin.Value : -1),
                                                                                                                                 (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticuloComodin != null ? true : false),
                                                                                                                                 mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idImpuestoTipo,
                                                                                                                                 (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.importe != null ? mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.importe.Value : 0m)));
                        }
                    }

                    // ## 4º--> CALCULAR LOS IMPORTE E IMPUESTOS ################################################################################################
                    VentasCompras_Impuestos_Calculos obj_VentasCompras_Impuestos_Calculos = new VentasCompras_Impuestos_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                                                                               _mdl_VTA_AlbaranesCabecera.idCliente.Value,
                                                                                                                               _mdl_VTA_AlbaranesCabecera.fecha,
                                                                                                                               _mdl_VTA_AlbaranesCabecera.idEmpresa);

                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES = obj_VentasCompras_Impuestos_Calculos.Calcular_ImportesImpuestos(mdl_GEN_ImpuestosCabecera,
                                                                                                                                                                                        lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo,
                                                                                                                                                                                        0m,
                                                                                                                                                                                        0m,
                                                                                                                                                                                        _mdl_VTA_AlbaranesCabecera.descuentoFinalAlbaran,
                                                                                                                                                                                        lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo,
                                                                                                                                                                                        null,
                                                                                                                                                                                        (_mdl_VTA_AlbaranesCabecera.recargo != null ? _mdl_VTA_AlbaranesCabecera.recargo.Value : false));
                    // ## 5º--> CONVERTIR A EL MODELO 'VTA_AlbaranesCabecera_Resumen'
                    if (mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES.TodoCorrecto)
                    {
                        List<INTERNO_ImportesImpuestos_Modelo> lst_INTERNO_ImportesImpuestos_Modelo_FINAL = (List<INTERNO_ImportesImpuestos_Modelo>)mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES.Objeto;

                        if (lst_INTERNO_ImportesImpuestos_Modelo_FINAL != null && lst_INTERNO_ImportesImpuestos_Modelo_FINAL.Count > 0)
                        {
                            //Totales
                            mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_1 = mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES.Objeto_Auxiliar_1;

                            foreach (INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo in lst_INTERNO_ImportesImpuestos_Modelo_FINAL)
                            {
                                VTA_AlbaranesCabecera_Resumen mdl_VTA_AlbaranesCabecera_Resumen = new VTA_AlbaranesCabecera_Resumen();

                                //id
                                mdl_VTA_AlbaranesCabecera_Resumen.id = -1;

                                //idAlbaranCabecera
                                mdl_VTA_AlbaranesCabecera_Resumen.idAlbaranCabecera = -1;

                                //idImpuestoTipo
                                mdl_VTA_AlbaranesCabecera_Resumen.idImpuestoTipo = mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoTipo.Value;

                                //idImpuestoLinea
                                mdl_VTA_AlbaranesCabecera_Resumen.idImpuestoLinea = mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoLinea.Value;
                                //bruto
                                mdl_VTA_AlbaranesCabecera_Resumen.bruto = mdl_INTERNO_ImportesImpuestos_Modelo.Bruto;
                                //descuentoFinalAlbaran_Valor
                                mdl_VTA_AlbaranesCabecera_Resumen.descuentoFinalAlbaran_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoAlbaranFinal_Calculado;
                                //baseImponible
                                mdl_VTA_AlbaranesCabecera_Resumen.baseImponible = mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible;
                                //impuesto_Porcentaje
                                mdl_VTA_AlbaranesCabecera_Resumen.impuesto_Porcentaje = (mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje.Value : 0m);
                                //impuesto_Valor
                                mdl_VTA_AlbaranesCabecera_Resumen.impuesto_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado;
                                //recargo_Porcentaje
                                mdl_VTA_AlbaranesCabecera_Resumen.recargo_Porcentaje = (mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje.Value : 0m);
                                //recargo_Valor
                                mdl_VTA_AlbaranesCabecera_Resumen.recargo_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado;
                                //total
                                mdl_VTA_AlbaranesCabecera_Resumen.total = mdl_INTERNO_ImportesImpuestos_Modelo.Total;

                                //Añadir al listado
                                lst_VTA_AlbaranesCabecera_Resumen.Add(mdl_VTA_AlbaranesCabecera_Resumen);
                            }
                        }
                    }
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES;
                    }
                }

                //TodoCorrecto
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_VTA_AlbaranesCabecera_Resumen;
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(AlbaranCabecera_Resumen_AGrabar));
            }


            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        public INTERNO_ValorDevuelto_Modelo Buscar_CodigoSiguiente_Albaran(long _lng_idDelegacion, long _lng_idEmpresa, GEN_EjerciciosActivos_Empresa _mdl_GEN_EjerciciosActivos_Empresa)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {

                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente_Numerico(nameof(VTA_AlbaranesCabecera),
                                                                                            nameof(VTA_AlbaranesCabecera.numeroAlbaran),
                                                                                            nameof(VTA_AlbaranesCabecera.idEmpresa),
                                                                                            _lng_idEmpresa,
                                                                                            nameof(VTA_AlbaranesCabecera.idDelegacion),
                                                                                            _lng_idDelegacion,
                                                                                            true,
                                                                                            16,
                                                                                            nameof(VTA_AlbaranesCabecera.fecha),
                                                                                            _mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaInicio,
                                                                                            _mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin
                                                                                            );

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO("Nº Albaran");
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Buscar_CodigoSiguiente_Albaran));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private INTERNO_ValorDevuelto_Modelo Albaran_Cerrar_Documento(long _lng_idAlbaranCabecera, VTA_AlbaranesCabecera _mdl_VTA_AlbaranesCabecera)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {

                    //Insertar el idPredefinidoCabecera
                    List<long> lst_idPredefinidoCabecera = new List<long>();

                    //Es de Servicio
                    if (_mdl_VTA_AlbaranesCabecera.idRelacionClienteProveedor != null)
                    {
                        //Validar que tiene un idPredefinidoCabecera para Servicio
                        if (_mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Servicios != null && _mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Servicios.Value > 0)
                        {
                            lst_idPredefinidoCabecera.Add(_mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Servicios.Value);
                        }
                    }
                    else
                    {
                        //Validar que tiene un idPredefinidoCabecera para albaran
                        if (_mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Albaran != null && _mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Albaran.Value > 0)
                        {
                            lst_idPredefinidoCabecera.Add(_mdl_VTA_AlbaranesCabecera.idPredefinidoCabecera_Albaran.Value);
                        }
                    }

                    //Si esta Todo Correcto
                    if (lst_idPredefinidoCabecera.Count > 0)
                    {
                        //Cargamos el ensamblado #########################################################################################################################################################################
                        Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                        //creamos la instancia
                        var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_ACCIONDOCUMENTO_CERRAR, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros_1 = {   lst_idPredefinidoCabecera,
                                                    _lng_idAlbaranCabecera,
                                                    Variables.G_STR_OPCION_VTA_ALBARANESCABECERA,
                                                    null};

                        //Pasamos los parametros al metodo y lo ejecutamos
                        mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                        //########################################################################################################################################################################
                    }
                    //Si no tiene Predefinidos solo se cierra el documento
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VTA_AlbaranesCabecera_Datos.Actualizar_Estado(_lng_idAlbaranCabecera, Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO);
                    }

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Albaran_Cerrar_Documento));

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
                }
                catch (Control_Errores)
                {
                    transaccion_SQL.Dispose();

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Albaran_Cerrar_Documento));

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Factura

        private VTA_FacturasCabecera Convertir_Pedido_A_Factura(long _lng_idCliente,
                                                                List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo> _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo,
                                                                GEN_EjerciciosActivos_Empresa _mdl_GEN_EjerciciosActivos_Empresa,
                                                                DateTime _dtt_Fecha)
        {
            VTA_FacturasCabecera mdl_VTA_FacturasCabecera = null;
            try
            {
                long? lng_Nulo = null;

                mdl_VTA_FacturasCabecera = new VTA_FacturasCabecera();

                // ## 1º--> VTA_FacturasCabecera ############################################################################################
                //id
                mdl_VTA_FacturasCabecera.id = -1;

                //numeroFactura
                mdl_VTA_FacturasCabecera.numeroFactura = -1;

                //idCliente
                mdl_VTA_FacturasCabecera.idCliente = _lng_idCliente;

                //idSocio
                mdl_VTA_FacturasCabecera.idSocio = null;

                //idDelegacion
                GEN_Delegaciones mdl_GEN_Delegaciones = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].GEN_Delegaciones;
                if (g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion != null)
                {
                    mdl_GEN_Delegaciones = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion;
                }
                mdl_VTA_FacturasCabecera.idDelegacion = mdl_GEN_Delegaciones.id;

                //idFormaPago
                mdl_VTA_FacturasCabecera.idFormaPago = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idFormaPago;

                //fecha
                mdl_VTA_FacturasCabecera.fecha = DateTime.ParseExact(g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_CrearAlbaranFactura_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                //fechaIntroduccion
                mdl_VTA_FacturasCabecera.fechaIntroduccion = DateTime.ParseExact(g_frm_P_PedidoCabecera_Procesos.Exferia_FechaSeleccion_CrearAlbaranFactura_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                //idEmpresa
                mdl_VTA_FacturasCabecera.idEmpresa = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.lng_idEmpresa;

                //Estado
                mdl_VTA_FacturasCabecera.estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

                // descripcion (Se pone Empresa/Ejercicio/Delegacion/Nº Documento)
                mdl_VTA_FacturasCabecera.descripcion = g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.str_Empresa_Codigo + "/" +
                                                        (_mdl_GEN_EjerciciosActivos_Empresa != null ? _mdl_GEN_EjerciciosActivos_Empresa.anioControl : "") + "/" +
                                                        (g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion != null ? g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion.codigo : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].GEN_Delegaciones.codigo + "/") +
                                                        "XXXXXXXX";





                //guid
                mdl_VTA_FacturasCabecera.guid = null;

                //idLiquidacionTributaria
                mdl_VTA_FacturasCabecera.idLiquidacionTributaria = null;

                //idMoneda
                mdl_VTA_FacturasCabecera.idMoneda = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idMoneda : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idMoneda;

                //idImpuestoCabecera
                mdl_VTA_FacturasCabecera.idImpuestoCabecera = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idImpuestoCabecera : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idImpuestoCabecera;

                //descuentoProntoPago
                mdl_VTA_FacturasCabecera.descuentoProntoPago = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.descuentoProntoPago;

                //descuentoFinalFactura
                mdl_VTA_FacturasCabecera.descuentoFinalFactura = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.descuentoFinalFactura;

                //Empleado
                if (g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Id > -1)
                {
                    mdl_VTA_FacturasCabecera.idEmpleado = g_frm_P_PedidoCabecera_Procesos.Exferia_F3_SoloSeleccion_CrearAlbaranFactura_Empleado.Exferia_F3_SoloSeleccion_Id;
                }
                else
                {
                    mdl_VTA_FacturasCabecera.idEmpleado = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado != null ? Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.id : lng_Nulo;
                }

                //idVendedor_Preventa
                mdl_VTA_FacturasCabecera.idVendedor_Preventa = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idVendedor_Preventa;

                //idVendedor_PreventaHabitual
                mdl_VTA_FacturasCabecera.idVendedor_PreventaHabitual = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idVendedor_PreventaHabitual;

                //idVendedor_Repartidor
                mdl_VTA_FacturasCabecera.idVendedor_Repartidor = null;

                //idVendedor_Cobrador
                if (mdl_GEN_Delegaciones != null)
                {
                    //Preventa
                    if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Preventa).ToString())
                    {
                        mdl_VTA_FacturasCabecera.idVendedor_Cobrador = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idVendedor_PreventaHabitual;
                    }
                    //Autoventa
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Autoventa).ToString())
                    {
                        mdl_VTA_FacturasCabecera.idVendedor_Cobrador = null;
                    }
                    //Repartidor
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Repartidor).ToString())
                    {
                        mdl_VTA_FacturasCabecera.idVendedor_Cobrador = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Count > 1 ? _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor : _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].idVendedor_Repartidor;
                    }
                    //Rutero
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Rutero).ToString())
                    {
                        mdl_VTA_FacturasCabecera.idVendedor_Cobrador = null;
                    }
                    //Habitual
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Habitual).ToString())
                    {
                        mdl_VTA_FacturasCabecera.idVendedor_Cobrador = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor_Cobrador;
                    }
                    //Fijo
                    else if (mdl_GEN_Delegaciones.tipoCobrador == ((int)G_ENUM_TIPOVENDEDORCOBRADOR.Fijo).ToString())
                    {
                        mdl_VTA_FacturasCabecera.idVendedor_Cobrador = mdl_GEN_Delegaciones.idVendedorCobrador;
                    }
                    //Ninguno
                    else
                    {
                        mdl_VTA_FacturasCabecera.idVendedor_Cobrador = null;
                    }
                }
                else
                {
                    mdl_VTA_FacturasCabecera.idVendedor_Cobrador = null;
                }

                //idVendedor_CobradorHabitual
                mdl_VTA_FacturasCabecera.idVendedor_CobradorHabitual = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.idVendedor_Cobrador;

                //idVendedor_Autoventa
                mdl_VTA_FacturasCabecera.idVendedor_Autoventa = null;

                //referencia
                mdl_VTA_FacturasCabecera.referencia = null;

                //PredefinidosCabeceras_factura ....................................................................................................................
                //Cargamos el ensamblado 
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAPREDEFINIDOCABECERA_OBTENERMODELO_POR_DEFECTO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { Variables.G_PREDEFINIDOFICHEROS_FACTURASDEVENTA.Id };

                //Pasamos los parametros al metodo y lo ejecutamos
                CTA_PredefinidosCabeceras mdl_CTA_PredefinidosCabeceras_Factura = (CTA_PredefinidosCabeceras)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);

                if (mdl_CTA_PredefinidosCabeceras_Factura != null &&
                    mdl_CTA_PredefinidosCabeceras_Factura.idPredefinidoFichero != null &&
                    mdl_CTA_PredefinidosCabeceras_Factura.idPredefinidoFichero.Value.Equals(Variables.G_PREDEFINIDOFICHEROS_FACTURASDEVENTA.Id))
                {
                    mdl_VTA_FacturasCabecera.idPredefinidoCabecera = mdl_CTA_PredefinidosCabeceras_Factura.id;
                }
                else
                {
                    mdl_VTA_FacturasCabecera.idPredefinidoCabecera = null;
                }

                //Recargo por Ejercicio
                if (_mdl_GEN_EjerciciosActivos_Empresa.recargo != null && _mdl_GEN_EjerciciosActivos_Empresa.recargo.Value)
                {
                    //Recargo Segun Cliente
                    bool? bol_Recargo_Cliente = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.recargo;
                    if (bol_Recargo_Cliente != null && bol_Recargo_Cliente.Value)
                    {
                        mdl_VTA_FacturasCabecera.recargo = true;
                    }
                    else
                    {
                        mdl_VTA_FacturasCabecera.recargo = false;
                    }
                }
                else
                {
                    mdl_VTA_FacturasCabecera.recargo = false;
                }

                //situacionPago
                mdl_VTA_FacturasCabecera.situacionPago = int.Parse(Variables.G_MDL_TIPOSITUACIONPAGO_FACTURA_PENDIENTE.Codigo);

                //fechaBorrado
                mdl_VTA_FacturasCabecera.fechaBorrado = null;

                // observaciones
                mdl_VTA_FacturasCabecera.observaciones = "";

                //total_bruto
                mdl_VTA_FacturasCabecera.total_bruto = 0;

                //total_descuentoProntoPago
                mdl_VTA_FacturasCabecera.total_descuentoProntoPago = 0;

                //total_descuentoFinalFactura
                mdl_VTA_FacturasCabecera.total_descuentoFinalFactura = 0;

                //total_baseImponible
                mdl_VTA_FacturasCabecera.total_baseImponible = 0;

                //total_impuesto
                mdl_VTA_FacturasCabecera.total_impuesto = 0;

                //total_recargo
                mdl_VTA_FacturasCabecera.total_recargo = 0;

                //total
                mdl_VTA_FacturasCabecera.total = 0;

                //total_retencion
                mdl_VTA_FacturasCabecera.total_retencion = 0;

                //total_Final
                mdl_VTA_FacturasCabecera.total_Final = 0;

                // ## 3º--> VTA_AlbaranesFacturasLineas #######################################################################################
                //Instanciar la parte de pedidos
                mdl_VTA_FacturasCabecera.VTA_AlbaranesFacturasLineas = new List<VTA_AlbaranesFacturasLineas>();
                //Recorrer las lineas de la Pedido que no son LineasEnPromociones
                int int_NumeroLinea = 1;

                foreach (INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo in _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo)
                {
                    if (mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas != null &&
                        mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas.Count > 0)
                    {

                        foreach (INTERNO_VTA_PedidosLineas_Modelo mdl_INTERNO_VTA_PedidosLineas_Modelo in mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.PedidoLineas.Where(m => m.idPedidoLinea_Padre == null))
                        {
                            if (mdl_INTERNO_VTA_PedidosLineas_Modelo.fechaBorrado == null)
                            {
                                VentasCompras_Calculos obj_VentasCompras_Calculos = new VentasCompras_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                                                                mdl_VTA_FacturasCabecera.idCliente.Value,
                                                                                                                mdl_VTA_FacturasCabecera.fecha,
                                                                                                                mdl_VTA_FacturasCabecera.idEmpresa,
                                                                                                                (mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral.Value : 0m)
                                                                                                                );

                                #region RELLENAR MODELO DE CALCULOS LINEA PRINCIPAL
                                INTERNO_VentasCompras_Calculos_Modelo mdl_INTERNO_VentasCompras_Calculos_Modelo = new INTERNO_VentasCompras_Calculos_Modelo();

                                //Tipo de Compra Venta
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_TiposCompraVenta.opcion;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.idTipoCompraVenta;

                                //Articulo
                                if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos != null)
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.id;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.codigo;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.descripcion;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.tipoTrazabilidad_Salidas;
                                }
                                else
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = -1;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = "";
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = "";
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = "";
                                }


                                //ArticuloComodin
                                if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin != null)
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.id;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.codigo;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.descripcion;
                                }
                                else
                                {
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = -1;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = "";
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = "";
                                }

                                //Impuesto Tipo
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_ImpuestosTipos.id;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_ImpuestosTipos.codigo;
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = mdl_INTERNO_VTA_PedidosLineas_Modelo.GEN_ImpuestosTipos.descripcion;

                                //Si el Articulo o articulo Comidn tuviera retencionTipo se pone
                                if (_lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.retencion != null && _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes.retencion.Value)
                                {
                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin != null)
                                    {
                                        if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.idRetencionTipo_Venta != null)
                                        {
                                            GEN_RetencionesTipos mdl_GEN_RetencionesTipos = Datos_Generales.GEN_RetencionesTipos_Obtener_Modelo_Por_Id(mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_ArticulosComodin.idRetencionTipo_Venta.Value);

                                            if (mdl_GEN_RetencionesTipos != null)
                                            {
                                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id = mdl_GEN_RetencionesTipos.id;
                                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Codigo = mdl_GEN_RetencionesTipos.codigo;
                                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion = mdl_GEN_RetencionesTipos.descripcion;
                                            }
                                        }
                                    }
                                    else if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos != null)
                                    {
                                        if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.idRetencionTipo_Venta != null)
                                        {
                                            GEN_RetencionesTipos mdl_GEN_RetencionesTipos = Datos_Generales.GEN_RetencionesTipos_Obtener_Modelo_Por_Id(mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.idRetencionTipo_Venta.Value);

                                            if (mdl_GEN_RetencionesTipos != null)
                                            {
                                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id = mdl_GEN_RetencionesTipos.id;
                                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Codigo = mdl_GEN_RetencionesTipos.codigo;
                                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion = mdl_GEN_RetencionesTipos.descripcion;
                                            }
                                        }
                                    }
                                }


                                //NomenclaturaPrecio
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_NomenclaturasPrecios;

                                //Rellenar el listado de Embalajes
                                mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();
                                #region Articulos_Embalajes
                                //Cargamos el ensamblado
                                Assembly m_assembly3 = Assembly.LoadFrom(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                                //Obtenemos el tipo de la clase
                                Type m_type3 = m_assembly3.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                                //creamos la instancia
                                var obj_Clase3 = Activator.CreateInstance(m_type3);
                                //Cargamos el metodo solicitado
                                MethodInfo obj_MethodInfo3 = obj_Clase3.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOSEMBALAJES_OBTENERMODELOLISTADO_POR_ARTICULO, BindingFlags.Instance | BindingFlags.NonPublic);

                                //Obtener valores
                                object[] arr_Parametros3 = { mdl_INTERNO_VTA_PedidosLineas_Modelo.idArticulo };
                                //Pasamos los parametros al metodo y lo ejecutamos
                                List<MAE_Articulos_Embalajes> lst_MAE_Articulos_Embalajes = (List<MAE_Articulos_Embalajes>)obj_MethodInfo3.Invoke(obj_Clase3, arr_Parametros3);
                                #endregion

                                if (lst_MAE_Articulos_Embalajes != null &&
                                    lst_MAE_Articulos_Embalajes.Count > 0)
                                {
                                    foreach (MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes in lst_MAE_Articulos_Embalajes)
                                    {
                                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Articulos_Embalajes.MAE_Embalajes.id.ToString(), mdl_MAE_Articulos_Embalajes.MAE_Embalajes.descripcion, null));
                                    }
                                }

                                #endregion

                                //Cantidades restantes
                                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS = Calcular_CantidadesRestantes(mdl_INTERNO_VTA_PedidosLineas_Modelo);
                                if (mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.TodoCorrecto &&
                                        ((decimal)mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.Objeto_Auxiliar_1 != 0m))
                                {

                                    //idEmbalaje
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.idEmbalaje;

                                    //Embalaje texto
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes.descripcion;

                                    // Cantidad principal
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = (decimal)mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.Objeto_Auxiliar_1;

                                    //relacion
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.relacion;

                                    //Operacion
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.operacion;

                                    //precio_Cantidad_SegundaUnidad
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                                    //idEmbalajeRelacional
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_idEmbalaje;

                                    //Descripcion el embalaje relacional
                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes1 != null)
                                    {
                                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes1.descripcion;
                                    }

                                    //relacion embalaje segunda unidad
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_relacion != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_relacion.Value : 1m;

                                    // Cantidad Secundaria
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = (decimal)mdl_INTERNO_ValorDevuelto_Modelo_CALCULADOS.Objeto_Auxiliar_2;

                                    //Precio
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_INTERNO_VTA_PedidosLineas_Modelo.precio;

                                    //Descuento
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral = mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.descuentoGeneral.Value : 0m;

                                    //NumeroRedondeo
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_INTERNO_VTA_PedidosLineas_Modelo.numeroRedondeo != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.numeroRedondeo.Value : 3;

                                    #region Embalaje Principal del Articulo
                                    //Embalaje
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_idEmbalaje;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_relacion;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_operacion;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes2.descripcion;

                                    //Listado de los precios de todas las nomenclaturas del embalaje principal del articulo
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios = null;

                                    //precio 
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_precio;

                                    //Embalaje Segunda unidad
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion.Value : 1m;
                                    mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad != null ? mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad.Value : 0;

                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes3 != null)
                                    {
                                        mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Embalajes3.descripcion;
                                    }
                                    #endregion

                                    #region RELLENAR CANTIDAD SEGUNDA UNIDAD LINEA PROMOCION POR UNIDAD

                                    decimal? dcm_PromocionPorUnidad_Cantidad_SegundaUnidad = null;
                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion != null)
                                    {
                                        // Cantidad Secundaria
                                        dcm_PromocionPorUnidad_Cantidad_SegundaUnidad = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.segundaUnidad_cantidad;
                                    }
                                    #endregion

                                    //Rellenar la clase de calculos
                                    obj_VentasCompras_Calculos.CargaInicial(mdl_INTERNO_VentasCompras_Calculos_Modelo,
                                                                                  dcm_PromocionPorUnidad_Cantidad_SegundaUnidad,
                                                                                  mdl_INTERNO_VTA_PedidosLineas_Modelo.TarifasPromociones);



                                    #region 1º LINEA PRINCIPAL
                                    VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas = new VTA_AlbaranesFacturasLineas();

                                    //id
                                    mdl_VTA_AlbaranesFacturasLineas.id = -1;

                                    //idFacturaCabecera
                                    mdl_VTA_AlbaranesFacturasLineas.idFacturaCabecera = -1;

                                    //idAlbaranCabecera
                                    mdl_VTA_AlbaranesFacturasLineas.idAlbaranCabecera = null;

                                    //idTipoCompraVenta
                                    mdl_VTA_AlbaranesFacturasLineas.idTipoCompraVenta = obj_VentasCompras_Calculos.PROPIEDAD_TipoCompraVenta_Id;

                                    //idAlbaranFacturaLinea_PromocionesTarifasAsociadas
                                    mdl_VTA_AlbaranesFacturasLineas.idAlbaranFacturaLinea_PromocionesTarifasAsociadas = null;

                                    //idPedidoLinea
                                    mdl_VTA_AlbaranesFacturasLineas.idPedidoLinea = mdl_INTERNO_VTA_PedidosLineas_Modelo.id;

                                    //idArticulo
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_Articulo_Id > 0)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.idArticulo = obj_VentasCompras_Calculos.PROPIEDAD_Articulo_Id;
                                    }
                                    else
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.idArticulo = null;
                                    }

                                    //ArticuloComodin
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Id > 0)
                                    {
                                        //idArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin = obj_VentasCompras_Calculos.PROPIEDAD_ArticuloComodin_Id;
                                        //descripcionArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas.descripcionArticuloComodin = mdl_INTERNO_VTA_PedidosLineas_Modelo.descripcionArticuloComodin;
                                    }
                                    else
                                    {
                                        //idArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin = null;
                                        //descripcionArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas.descripcionArticuloComodin = "";
                                    }

                                    //numeroLineaFactura
                                    mdl_VTA_AlbaranesFacturasLineas.numeroLineaFactura = int_NumeroLinea;

                                    //numeroLineaAlbaran
                                    mdl_VTA_AlbaranesFacturasLineas.numeroLineaAlbaran = 0;

                                    //idAlmacen 
                                    mdl_VTA_AlbaranesFacturasLineas.idAlmacen = mdl_INTERNO_VTA_PedidosLineas_Modelo.idAlmacen;

                                    //idUbicacion
                                    mdl_VTA_AlbaranesFacturasLineas.idUbicacion = mdl_INTERNO_VTA_PedidosLineas_Modelo.idUbicacion;

                                    //cantidad
                                    mdl_VTA_AlbaranesFacturasLineas.cantidad = obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal;

                                    //idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas.idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Id;

                                    //relacion
                                    mdl_VTA_AlbaranesFacturasLineas.relacion = obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Principal_Relacion;

                                    //operacion
                                    mdl_VTA_AlbaranesFacturasLineas.operacion = obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_Operacion;

                                    //segundaUnidad_Precio_Cantidad_SegundaUnidad
                                    mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_PrecioPor_SegundaUnidad_Entero;

                                    //segundaUnidad_relacion
                                    mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Relacion;

                                    //segundaUnidad_idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajeRelacionado_Id;

                                    //segundaUnidad_cantidad
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_Embalaje_EsRelacional)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_cantidad = obj_VentasCompras_Calculos.PROPIEDAD_Cantidad_Relacional;
                                    }
                                    else
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.segundaUnidad_cantidad = null;
                                    }

                                    //idNomenclaturaPrecio
                                    mdl_VTA_AlbaranesFacturasLineas.idNomenclaturaPrecio = obj_VentasCompras_Calculos.PROPIEDAD_NomenclaturaPrecio_Id;

                                    //precio
                                    mdl_VTA_AlbaranesFacturasLineas.precio = obj_VentasCompras_Calculos.PROPIEDAD_Precio;

                                    //numeroRedondeo
                                    mdl_VTA_AlbaranesFacturasLineas.numeroRedondeo = obj_VentasCompras_Calculos.PROPIEDAD_NumeroRedondeo;

                                    //descuentoGeneral
                                    mdl_VTA_AlbaranesFacturasLineas.descuentoGeneral = obj_VentasCompras_Calculos.PROPIEDAD_DescuentoGeneral;

                                    //importe
                                    mdl_VTA_AlbaranesFacturasLineas.importe = obj_VentasCompras_Calculos.PROPIEDAD_Importe;

                                    //idImpuestoTipo
                                    mdl_VTA_AlbaranesFacturasLineas.idImpuestoTipo = obj_VentasCompras_Calculos.PROPIEDAD_ImpuestoTipo_Id;

                                    //idAlbaranFacturaLinea_Padre
                                    mdl_VTA_AlbaranesFacturasLineas.idAlbaranFacturaLinea_Padre = null;

                                    //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
                                    //embalajePrincipalDelArticulo_idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_IdEmbalaje;

                                    //embalajePrincipalDelArticulo_relacion
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_relacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                                    //embalajePrincipalDelArticulo_operacion
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_operacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                                    //embalajePrincipalDelArticulo_precio
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_precio = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_Precio;

                                    //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                                    //embalajePrincipalDelArticulo_segundaUnidad_relacion
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                                    //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                                    mdl_VTA_AlbaranesFacturasLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                                    //idRetencionTipo
                                    mdl_VTA_AlbaranesFacturasLineas.idRetencionTipo = obj_VentasCompras_Calculos.PROPIEDAD_RetencionTipo_Id > -1 ? obj_VentasCompras_Calculos.PROPIEDAD_RetencionTipo_Id : lng_Nulo;

                                    int_NumeroLinea += 1;
                                    #endregion

                                    #region 2º COMENTARIOS
                                    if (mdl_INTERNO_VTA_PedidosLineas_Modelo.VTA_PedidosLineas_Comentarios != null &&
                                        mdl_INTERNO_VTA_PedidosLineas_Modelo.VTA_PedidosLineas_Comentarios.Count > 0)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_Comentarios = new List<VTA_AlbaranesFacturasLineas_Comentarios>();

                                        foreach (VTA_PedidosLineas_Comentarios mdl_VTA_PedidosLineas_Comentarios in mdl_INTERNO_VTA_PedidosLineas_Modelo.VTA_PedidosLineas_Comentarios)
                                        {
                                            VTA_AlbaranesFacturasLineas_Comentarios mdl_VTA_AlbaranesFacturasLineas_Comentarios = new VTA_AlbaranesFacturasLineas_Comentarios();

                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.id = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.idAlbaranFacturaLinea = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.comentario = mdl_VTA_PedidosLineas_Comentarios.comentario;
                                            mdl_VTA_AlbaranesFacturasLineas_Comentarios.mostrarImpresion = mdl_VTA_PedidosLineas_Comentarios.mostrarImpresion;

                                            //Añadir al Listado
                                            mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_Comentarios.Add(mdl_VTA_AlbaranesFacturasLineas_Comentarios);
                                        }
                                    }
                                    else
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_Comentarios = null;
                                    }
                                    #endregion

                                    #region 3º TARIFAS/PROMOCIONES
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR != null &&
                                        obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR.Count > 0)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_TarifasPromociones = new List<VTA_AlbaranesFacturasLineas_TarifasPromociones>();

                                        foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in obj_VentasCompras_Calculos.PROPIEDAD_TarifaPromocion_Listado_AGRABAR)
                                        {
                                            VTA_AlbaranesFacturasLineas_TarifasPromociones mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones = new VTA_AlbaranesFacturasLineas_TarifasPromociones();

                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.id = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.idAlbaranFacturaLinea = -1;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.codigo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Codigo;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descripcion = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descripcion;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_1 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_1;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_2 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_2;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_3 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_3;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_4 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_4;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuento_5 = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_5;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.incremento = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Incremento;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.numeroRedondeo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NumeroRedondeo;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.tipo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.precioFijoDinamico = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico != null ? mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico.Value : Variables.G_INT_TIPOPRECIO_FIJO_CODIGO;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.precio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.idNomenclaturaPrecio = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.descuentoMoneda = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_DescuentoMoneda;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Cantidad_A = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Cantidad_B = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Porcentaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_idArticulo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_idEmbalaje = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.AB_Cancelado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cancelado;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.orden = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.mensaje_Error = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Mensaje_Error;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.desactivado = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Desactivado;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.noAplicarTarifa = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.NoAplicarTarifa;
                                            mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.aplicadaEnLinea = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.AplicadaEnLinea;

                                            //CONDICIONANTES #############################################################################################################################
                                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes != null &&
                                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes.Count > 0)
                                            {
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes = new List<VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes>();

                                                foreach (INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo in mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes)
                                                {
                                                    VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes = new VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes();

                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.id = -1;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.idAlbaranFacturaLineaTarifaPromocion = -1;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Desde_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Operador = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.cantidad_Hasta_Valor = mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.condicionante_Y_O = null;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Desde_Operador = null;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Desde_Valor = null;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Hasta_Operador = null;
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.importe_Hasta_Valor = null;

                                                    //Añadir al listado e condicionantes
                                                    mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes.Add(mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes);
                                                }
                                            }
                                            else
                                            {
                                                mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones.VTA_AlbaranesFacturasLineas_TarifasPromociones_Condicionantes = null;
                                            }

                                            //Añadir al Listado
                                            mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_TarifasPromociones.Add(mdl_VTA_AlbaranesFacturasLineas_TarifasPromociones);
                                        }
                                    }
                                    else
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas_TarifasPromociones = null;
                                    }
                                    #endregion

                                    #region 4º LINEA PROMOCION POR UNIDAD (LINEA RELACIONAL)
                                    if (obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Existe &&
                                        mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion != null)

                                    {
                                        VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD = new VTA_AlbaranesFacturasLineas();

                                        //id
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.id = -1;

                                        //idFacturaCabecera
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idFacturaCabecera = -1;

                                        //idAlbaranCabecera
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlbaranCabecera = null;

                                        //idTipoCompraVenta 
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idTipoCompraVenta = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.idTipoCompraVenta;

                                        //idAlbaranFacturaLinea_PromocionesTarifasAsociadas 
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlbaranFacturaLinea_PromocionesTarifasAsociadas = null;

                                        //idPedidoLinea 
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idPedidoLinea = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.id;

                                        //idArticulo
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idArticulo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Articulo_Id;

                                        //idArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idArticuloComodin = null;

                                        //descripcionArticuloComodin
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.descripcionArticuloComodin = "";

                                        //numeroLineaAlbaran
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.numeroLineaAlbaran = 0;

                                        //numeroLineaFactura
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.numeroLineaFactura = int_NumeroLinea;

                                        //idAlmacen 
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlmacen = mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.idAlmacen;

                                        //idUbicacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idUbicacion = null;

                                        //cantidad
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.cantidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal;

                                        //idEmbalaje
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Id;

                                        //relacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion;

                                        //operacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.operacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Embalaje_Operacion;

                                        //segundaUnidad_Precio_Cantidad_SegundaUnidad
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_PrecioPor_SegundaUnidad_Entero;

                                        //segundaUnidad_relacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Relacion;

                                        //segundaUnidad_idEmbalaje
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Id;

                                        //segundaUnidad_cantidad
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.segundaUnidad_cantidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional;

                                        //idNomenclaturaPrecio
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idNomenclaturaPrecio = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NomenclaturaPrecio_Id;

                                        //precio
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.precio = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Precio;

                                        //numeroRedondeo
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.numeroRedondeo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_NumeroRedondeo;

                                        //descuentoGeneral
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.descuentoGeneral = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_DescuentoGeneral;

                                        //importe
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.importe = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_Importe;

                                        //idImpuestoTipo
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idImpuestoTipo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Id;

                                        //idAlbaranFacturaLinea_Padre
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idAlbaranFacturaLinea_Padre = -1;

                                        //DATOS DEL EMBALAJE PRINCIPAL DEL ARTICULO
                                        //embalajePrincipalDelArticulo_idEmbalaje
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_IdEmbalaje;

                                        //embalajePrincipalDelArticulo_relacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion;

                                        //embalajePrincipalDelArticulo_operacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_operacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Embalaje_Operacion;

                                        //embalajePrincipalDelArticulo_precio
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_precio = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Precio;

                                        //embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero;

                                        //embalajePrincipalDelArticulo_segundaUnidad_relacion
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_segundaUnidad_relacion = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion;

                                        //embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id;

                                        //fechaBorrado
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.fechaBorrado = null;

                                        //idRetencionTipo
                                        mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.idRetencionTipo = obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_RetencionTipo_Id > -1 ? obj_VentasCompras_Calculos.PROPIEDAD_PromocionPorUnidad_RetencionTipo_Id : lng_Nulo;

                                        #region 5º COMENTARIOS
                                        if (mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.VTA_PedidosLineas_Comentarios != null &&
                                            mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.VTA_PedidosLineas_Comentarios.Count > 0)
                                        {
                                            mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.VTA_AlbaranesFacturasLineas_Comentarios = new List<VTA_AlbaranesFacturasLineas_Comentarios>();

                                            foreach (VTA_PedidosLineas_Comentarios mdl_VTA_PedidosLineas_Comentarios in mdl_INTERNO_VTA_PedidosLineas_Modelo.Linea_EnPromocion.VTA_PedidosLineas_Comentarios)
                                            {
                                                VTA_AlbaranesFacturasLineas_Comentarios mdl_VTA_AlbaranesFacturasLineas_Comentarios = new VTA_AlbaranesFacturasLineas_Comentarios();

                                                mdl_VTA_AlbaranesFacturasLineas_Comentarios.id = -1;
                                                mdl_VTA_AlbaranesFacturasLineas_Comentarios.idAlbaranFacturaLinea = -1;
                                                mdl_VTA_AlbaranesFacturasLineas_Comentarios.comentario = mdl_VTA_PedidosLineas_Comentarios.comentario;
                                                mdl_VTA_AlbaranesFacturasLineas_Comentarios.mostrarImpresion = mdl_VTA_PedidosLineas_Comentarios.mostrarImpresion;

                                                //Añadir al Listado
                                                mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.VTA_AlbaranesFacturasLineas_Comentarios.Add(mdl_VTA_AlbaranesFacturasLineas_Comentarios);
                                            }
                                        }
                                        else
                                        {
                                            mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD.VTA_AlbaranesFacturasLineas_Comentarios = null;
                                        }
                                        #endregion

                                        //Agregar a la Linea
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1 = new List<VTA_AlbaranesFacturasLineas>();
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1.Add(mdl_VTA_AlbaranesFacturasLineas_PROMOCIONPORUNIDAD);

                                        int_NumeroLinea += 1;
                                    }

                                    #endregion

                                    // AGREGAR VTA_AlbaranesFacturasLineas
                                    mdl_VTA_FacturasCabecera.VTA_AlbaranesFacturasLineas.Add(mdl_VTA_AlbaranesFacturasLineas);
                                }
                            }
                        }
                    }
                }

                if (mdl_VTA_FacturasCabecera.VTA_AlbaranesFacturasLineas != null &&
                    mdl_VTA_FacturasCabecera.VTA_AlbaranesFacturasLineas.Count > 0)
                {
                    // ## 4º--> VTA_FacturasCabecera_Resumen #######################################################################################
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN = FacturaCabecera_Resumen_AGrabar(mdl_VTA_FacturasCabecera, _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo[0].MAE_Clientes);
                    if (mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.TodoCorrecto)
                    {
                        mdl_VTA_FacturasCabecera.VTA_FacturasCabecera_Resumen = (List<VTA_FacturasCabecera_Resumen>)mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.Objeto;

                        //Totales
                        INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES = (INTERNO_ImportesImpuestos_Modelo)mdl_INTERNO_ValorDevuelto_Modelo_RESUMEN.Objeto_Auxiliar_1;
                        if (mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES != null)
                        {
                            //total_bruto
                            mdl_VTA_FacturasCabecera.total_bruto = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Bruto;

                            //total_descuentoProntoPago
                            mdl_VTA_FacturasCabecera.total_descuentoProntoPago = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.DescuentoProntoPago_Calculado;

                            //total_descuentoFinalFactura
                            mdl_VTA_FacturasCabecera.total_descuentoFinalFactura = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.DescuentoFacturaFinal_Calculado;

                            //total_baseImponible
                            mdl_VTA_FacturasCabecera.total_baseImponible = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.BaseImponible;

                            //total_impuesto
                            mdl_VTA_FacturasCabecera.total_impuesto = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Impuesto_Calculado;

                            //total_recargo
                            mdl_VTA_FacturasCabecera.total_recargo = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Recargo_Calculado;

                            //total
                            mdl_VTA_FacturasCabecera.total = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Total;

                            //total_retencion
                            mdl_VTA_FacturasCabecera.total_retencion = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Retencion_Calculado;

                            //total_Final
                            mdl_VTA_FacturasCabecera.total_Final = mdl_INTERNO_ImportesImpuestos_Modelo_TOTALES.Total_Final;
                        }

                    }
                    else
                    {
                        mdl_VTA_FacturasCabecera = null;
                    }
                }
                else
                {
                    mdl_VTA_FacturasCabecera = null;
                }


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

                mdl_VTA_FacturasCabecera = null;
            }


            return mdl_VTA_FacturasCabecera;
        }

        private INTERNO_ValorDevuelto_Modelo FacturaCabecera_Resumen_AGrabar(VTA_FacturasCabecera _mdl_VTA_FacturasCabecera,MAE_Clientes _mdl_Clientes)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_1 = null;

            List<VTA_FacturasCabecera_Resumen> lst_VTA_FacturasCabecera_Resumen = new List<VTA_FacturasCabecera_Resumen>();

            try
            {
                //## 1º--> BUSCAR EL IMPUESTOSCABECERA
                GEN_ImpuestosCabecera mdl_GEN_ImpuestosCabecera = Datos_Generales.GEN_ImpuestosCabecera_Obtener_Modelo_Por_Id(_mdl_VTA_FacturasCabecera.idImpuestoCabecera.Value);

                //## 2º--> OBTENER EL LISTADO DE GEN_IMPUESTOSTIPOS QUE HAY
                List<INTERNO_GEN_ImpuestosTipos_Listado_Modelo> lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo = Datos_Generales.GEN_ImpuestosTipos_Obtener_Listado();
                List<INTERNO_GEN_RetencionesTipos_Listado_Modelo> lst_INTERNO_GEN_RetencionesTipos_Listado_Modelo = Datos_Generales.GEN_RetencionesTipos_Obtener_Listado();

                if (lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo != null)
                {
                    // ## 3º--> CONVERTIR LISTADO DE LINEAS EN LISTADO DEL MODELO IMPUESTOS ####################################
                    List<INTERNO_VentasCompras_Calculo_Lineas_Modelo> lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo = new List<INTERNO_VentasCompras_Calculo_Lineas_Modelo>();
                    VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION = null;
                    List<VTA_AlbaranesFacturasLineas> lst_VTA_AlbaranesFacturasLineas = _mdl_VTA_FacturasCabecera.VTA_AlbaranesFacturasLineas.ToList();
                    if (lst_VTA_AlbaranesFacturasLineas != null && lst_VTA_AlbaranesFacturasLineas.Count > 0)
                    {
                        foreach (VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas in lst_VTA_AlbaranesFacturasLineas)
                        {
                            //LINEA PRINCIPAL
                            lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo.Add(new INTERNO_VentasCompras_Calculo_Lineas_Modelo((mdl_VTA_AlbaranesFacturasLineas.idArticulo != null ? mdl_VTA_AlbaranesFacturasLineas.idArticulo.Value : -1),
                                                                                                                                 (mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin != null ? mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin.Value : -1),
                                                                                                                                 (mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin != null ? true : false),
                                                                                                                                 mdl_VTA_AlbaranesFacturasLineas.idImpuestoTipo,
                                                                                                                                 (mdl_VTA_AlbaranesFacturasLineas.importe != null ? mdl_VTA_AlbaranesFacturasLineas.importe.Value : 0m)));



                            //LINEA EN PROMOCION
                            if (mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1 != null &&
                                mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1.Count > 0)
                            {
                                mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION = mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1.FirstOrDefault();

                                if (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION!=null)
                                {
                                    lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo.Add(new INTERNO_VentasCompras_Calculo_Lineas_Modelo((mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticulo != null ? mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticulo.Value : -1),
                                                                                                                                         (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticuloComodin != null ? mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticuloComodin.Value : -1),
                                                                                                                                         (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticuloComodin != null ? true : false),
                                                                                                                                         mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idImpuestoTipo,
                                                                                                                                         (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.importe != null ? mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.importe.Value : 0m)));
                                }
                            }
                        }
                    }

                    // ## 4º--> CALCULAR LOS IMPORTE E IMPUESTOS ################################################################################################
                    VentasCompras_Impuestos_Calculos obj_VentasCompras_Impuestos_Calculos = new VentasCompras_Impuestos_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                                                                                    _mdl_VTA_FacturasCabecera.idCliente.Value,
                                                                                                                                    _mdl_VTA_FacturasCabecera.fecha,
                                                                                                                                    _mdl_VTA_FacturasCabecera.idEmpresa);

                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES = obj_VentasCompras_Impuestos_Calculos.Calcular_ImportesImpuestos(mdl_GEN_ImpuestosCabecera,
                                                                                                                                                                                        lst_INTERNO_GEN_ImpuestosTipos_Listado_Modelo,
                                                                                                                                                                                        _mdl_VTA_FacturasCabecera.descuentoProntoPago,
                                                                                                                                                                                        _mdl_VTA_FacturasCabecera.descuentoFinalFactura,
                                                                                                                                                                                        0m,
                                                                                                                                                                                        lst_INTERNO_VentasCompras_Calculo_Lineas_Modelo,
                                                                                                                                                                                        null,
                                                                                                                                                                                        (_mdl_VTA_FacturasCabecera.recargo != null ? _mdl_VTA_FacturasCabecera.recargo.Value : false));

                    // ## 5º--> CONVERTIR A EL MODELO 'VTA_FacturasCabecera_Resumen'
                    if (mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES.TodoCorrecto)
                    {
                        List<INTERNO_ImportesImpuestos_Modelo> lst_INTERNO_ImportesImpuestos_Modelo_FINAL = (List<INTERNO_ImportesImpuestos_Modelo>)mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES.Objeto;

                        // ## 6º--< CONVERTIR LISTADO DE LINEAS EN LISTADO PARA MODELO RETENCIONES ####################################
                        if (_mdl_Clientes.retencion != null && _mdl_Clientes.retencion.Value)
                        {
                            List<VTA_AlbaranesFacturasLineas> lst_VTA_AlbaranesFacturasLineas_Retencion = _mdl_VTA_FacturasCabecera.VTA_AlbaranesFacturasLineas.Where(m => m.idRetencionTipo != null).ToList();
                            List<INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo> lst_INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo = new List<INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo>();
                            if (lst_VTA_AlbaranesFacturasLineas_Retencion != null && lst_VTA_AlbaranesFacturasLineas_Retencion.Count > 0)
                            {
                                foreach (VTA_AlbaranesFacturasLineas mdl_VTA_AlbaranesFacturasLineas in lst_VTA_AlbaranesFacturasLineas_Retencion)
                                {
                                    //LINEA PRINCIPAL
                                    lst_INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo.Add(new INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo(  (mdl_VTA_AlbaranesFacturasLineas.idArticulo != null ? mdl_VTA_AlbaranesFacturasLineas.idArticulo.Value : -1),
                                                                                                                                                                    (mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin != null ? mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin.Value : -1),
                                                                                                                                                                    (mdl_VTA_AlbaranesFacturasLineas.idArticuloComodin != null ? true : false),
                                                                                                                                                                    (mdl_VTA_AlbaranesFacturasLineas.importe != null ? mdl_VTA_AlbaranesFacturasLineas.importe.Value : 0m),
                                                                                                                                                                    mdl_VTA_AlbaranesFacturasLineas.idRetencionTipo,
                                                                                                                                                                    mdl_VTA_AlbaranesFacturasLineas.idImpuestoTipo
                                                                                                                                                                    ));



                                    //LINEA EN PROMOCION
                                    if (mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1 != null &&
                                        mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1.Count > 0)
                                    {
                                        mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION = mdl_VTA_AlbaranesFacturasLineas.VTA_AlbaranesFacturasLineas1.FirstOrDefault();

                                        if (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION != null &&
                                            mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idRetencionTipo != null)
                                        {
                                            lst_INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo.Add(new INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo(  (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticulo != null ? mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticulo.Value : -1),
                                                                                                                                                                             (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticuloComodin != null ? mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticuloComodin.Value : -1),
                                                                                                                                                                             (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idArticuloComodin != null ? true : false),
                                                                                                                                                                             (mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.importe != null ? mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.importe.Value : 0m),
                                                                                                                                                                             mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idRetencionTipo,
                                                                                                                                                                             mdl_VTA_AlbaranesFacturasLineas_ENPROMOCION.idImpuestoTipo));
                                        }
                                    }
                                }

                                if (lst_INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo != null &&
                                    lst_INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo.Count > 0)
                                {
                                    List<GEN_Retenciones> lst_GEN_Retenciones = Datos_Generales.GEN_Retenciones_Obtener();
                                    VentasCompras_Retenciones_Calculos obj_VentasCompras_Retenciones_Calculos = new VentasCompras_Retenciones_Calculos(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO,
                                                                                                                                                        _mdl_VTA_FacturasCabecera.idCliente.Value,
                                                                                                                                                        _mdl_VTA_FacturasCabecera.fecha,
                                                                                                                                                        _mdl_VTA_FacturasCabecera.idEmpresa);

                                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTERETENCIONES_TOTALES = obj_VentasCompras_Retenciones_Calculos.Calcular_ImportesRetenciones(  mdl_GEN_ImpuestosCabecera,
                                                                                                                                                                                                             lst_GEN_Retenciones,
                                                                                                                                                                                                             lst_INTERNO_GEN_RetencionesTipos_Listado_Modelo,
                                                                                                                                                                                                            _mdl_VTA_FacturasCabecera.descuentoProntoPago,
                                                                                                                                                                                                            _mdl_VTA_FacturasCabecera.descuentoFinalFactura,
                                                                                                                                                                                                             lst_INTERNO_VentasCompras_Calculos_Lineas_Retenciones_Modelo,
                                                                                                                                                                                                             (_mdl_VTA_FacturasCabecera.recargo != null ? _mdl_VTA_FacturasCabecera.recargo.Value : false));

                                    if (mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTERETENCIONES_TOTALES.TodoCorrecto)
                                    {
                                        List<INTERNO_ImportesImpuestos_Modelo> lst_INTERNO_ImportesImpuestos_Modelo_RETENCIONES = (List<INTERNO_ImportesImpuestos_Modelo>)mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTERETENCIONES_TOTALES.Objeto;

                                        if (lst_INTERNO_ImportesImpuestos_Modelo_RETENCIONES != null &&
                                            lst_INTERNO_ImportesImpuestos_Modelo_RETENCIONES.Count > 0)
                                        {
                                            if (lst_INTERNO_ImportesImpuestos_Modelo_FINAL == null)
                                            {
                                                lst_INTERNO_ImportesImpuestos_Modelo_FINAL = new List<INTERNO_ImportesImpuestos_Modelo>();
                                            }

                                            //Añadir al listado general
                                            lst_INTERNO_ImportesImpuestos_Modelo_FINAL.AddRange(lst_INTERNO_ImportesImpuestos_Modelo_RETENCIONES);
                                        }
                                    }
                                }
                            }
                        }


                        if (lst_INTERNO_ImportesImpuestos_Modelo_FINAL != null && lst_INTERNO_ImportesImpuestos_Modelo_FINAL.Count > 0)
                        {
                            //Totales
                            mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_1 = VentasCompras_ImpuestosRetencionesTotales_Calculos.Calcular_ImportesImpuestos_Totales(lst_INTERNO_ImportesImpuestos_Modelo_FINAL);

                            foreach (INTERNO_ImportesImpuestos_Modelo mdl_INTERNO_ImportesImpuestos_Modelo in lst_INTERNO_ImportesImpuestos_Modelo_FINAL)
                            {
                                VTA_FacturasCabecera_Resumen mdl_VTA_FacturasCabecera_Resumen = new VTA_FacturasCabecera_Resumen();

                                //id
                                mdl_VTA_FacturasCabecera_Resumen.id = -1;

                                //idFacturaCabecera
                                mdl_VTA_FacturasCabecera_Resumen.idFacturaCabecera = -1;
                                //idImpuestoTipo
                                mdl_VTA_FacturasCabecera_Resumen.idImpuestoTipo = mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoTipo;
                                //idImpuestoLinea
                                mdl_VTA_FacturasCabecera_Resumen.idImpuestoLinea = mdl_INTERNO_ImportesImpuestos_Modelo.IdImpuestoLinea;
                                //idRetencionTipo
                                mdl_VTA_FacturasCabecera_Resumen.idRetencionTipo = mdl_INTERNO_ImportesImpuestos_Modelo.IdRetencionTipo;
                                //idRetencion
                                mdl_VTA_FacturasCabecera_Resumen.idRetencion = mdl_INTERNO_ImportesImpuestos_Modelo.IdRetencion;
                                //bruto
                                mdl_VTA_FacturasCabecera_Resumen.bruto = mdl_INTERNO_ImportesImpuestos_Modelo.Bruto;
                                //descuentoFinalFactura_Valor
                                mdl_VTA_FacturasCabecera_Resumen.descuentoFinalFactura_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoFacturaFinal_Calculado;
                                //descuentoProntoPago_Valor
                                mdl_VTA_FacturasCabecera_Resumen.descuentoProntoPago_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.DescuentoProntoPago_Calculado;
                                //baseImponible
                                mdl_VTA_FacturasCabecera_Resumen.baseImponible = mdl_INTERNO_ImportesImpuestos_Modelo.BaseImponible;
                                //impuesto_Porcentaje
                                mdl_VTA_FacturasCabecera_Resumen.impuesto_Porcentaje = (mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Porcentaje.Value : 0m);
                                //impuesto_Valor
                                mdl_VTA_FacturasCabecera_Resumen.impuesto_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Impuesto_Calculado;
                                //recargo_Porcentaje
                                mdl_VTA_FacturasCabecera_Resumen.recargo_Porcentaje = (mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje != null ? mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Porcentaje.Value : 0m);
                                //recargo_Valor
                                mdl_VTA_FacturasCabecera_Resumen.recargo_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Recargo_Calculado;
                                //total
                                mdl_VTA_FacturasCabecera_Resumen.total = mdl_INTERNO_ImportesImpuestos_Modelo.Total;

                                //retencion_Porcentaje
                                mdl_VTA_FacturasCabecera_Resumen.retencion_Porcentaje = mdl_INTERNO_ImportesImpuestos_Modelo.Retencion_Porcentaje;
                                //retencion_Valor
                                mdl_VTA_FacturasCabecera_Resumen.retencion_Valor = mdl_INTERNO_ImportesImpuestos_Modelo.Retencion_Calculado;
                                //retencion_Base
                                mdl_VTA_FacturasCabecera_Resumen.retencion_Base = mdl_INTERNO_ImportesImpuestos_Modelo.BaseRetencion;

                                //total_Final
                                mdl_VTA_FacturasCabecera_Resumen.total_Final = mdl_INTERNO_ImportesImpuestos_Modelo.Total_Final;

                                //Añadir al listado
                                lst_VTA_FacturasCabecera_Resumen.Add(mdl_VTA_FacturasCabecera_Resumen);
                            }
                        }
                    }
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = mdl_INTERNO_ValorDevuelto_Modelo_CALCULO_IMPORTEIMPUESTOS_TOTALES;
                    }
                }

                //TodoCorrecto
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_VTA_FacturasCabecera_Resumen;
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(FacturaCabecera_Resumen_AGrabar));
            }


            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        public INTERNO_ValorDevuelto_Modelo Buscar_CodigoSiguiente_Factura(long _lng_idDelegacion, long _lng_idEmpresa, GEN_EjerciciosActivos_Empresa _mdl_GEN_EjerciciosActivos_Empresa)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {

                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente_Numerico(nameof(VTA_FacturasCabecera),
                                                                                            nameof(VTA_FacturasCabecera.numeroFactura),
                                                                                            nameof(VTA_FacturasCabecera.idEmpresa),
                                                                                            _lng_idEmpresa,
                                                                                            nameof(VTA_FacturasCabecera.idDelegacion),
                                                                                            _lng_idDelegacion,
                                                                                            true,
                                                                                            16,
                                                                                            nameof(VTA_FacturasCabecera.fecha),
                                                                                            _mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaInicio,
                                                                                            _mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin
                                                                                            );

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO("Nº Factura");
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Buscar_CodigoSiguiente_Factura));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private INTERNO_ValorDevuelto_Modelo Factura_Cerrar_Documento(long _lng_idFacturaCabecera, VTA_FacturasCabecera _mdl_VTA_FacturasCabecera)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {

                    //Insertar el idPredefinidoCabecera
                    List<long> lst_idPredefinidoCabecera = new List<long>();

                    //Validar que tiene un idPredefinidoCabecera para factura
                    if (_mdl_VTA_FacturasCabecera.idPredefinidoCabecera != null && _mdl_VTA_FacturasCabecera.idPredefinidoCabecera.Value > 0)
                    {
                        lst_idPredefinidoCabecera.Add(_mdl_VTA_FacturasCabecera.idPredefinidoCabecera.Value);
                    }

                    //Si esta Todo Correcto
                    if (lst_idPredefinidoCabecera.Count > 0)
                    {
                        //Cargamos el ensamblado #########################################################################################################################################################################
                        Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                        //creamos la instancia
                        var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_ACCIONDOCUMENTO_CERRAR, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros_1 = {   lst_idPredefinidoCabecera,
                                                    _lng_idFacturaCabecera,
                                                    Variables.G_STR_OPCION_VTA_FACTURACABECERA,
                                                    null};

                        //Pasamos los parametros al metodo y lo ejecutamos
                        mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                        //########################################################################################################################################################################
                    }
                    //Si no tiene Predefinidos solo se cierra el documento
                    else
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VTA_FacturasCabecera_Datos.Actualizar_Estado(_lng_idFacturaCabecera, Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO);
                    }

                    //Si esta todo correcto, creo los vencimientos
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        #region Generar Vencimientos

                        #region Formas de Pago
                        //Cargamos el ensamblado
                        Assembly m_assembly3 = Assembly.LoadFrom(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type3 = m_assembly3.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                        //creamos la instancia
                        var obj_Clase3 = Activator.CreateInstance(m_type3);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo3 = obj_Clase3.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEFORMASDEPAGO_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros3 = { _mdl_VTA_FacturasCabecera.idFormaPago };
                        //Pasamos los parametros al metodo y lo ejecutamos
                        MAE_FormasPago mdl_MAE_FormasPago = (MAE_FormasPago)obj_MethodInfo3.Invoke(obj_Clase3, arr_Parametros3);
                        #endregion

                        //calculo de la Base imponible
                        decimal dcm_Importe_Baseimponible = 0m;
                        if (_mdl_VTA_FacturasCabecera.VTA_FacturasCabecera_Resumen != null)
                        {
                            dcm_Importe_Baseimponible = _mdl_VTA_FacturasCabecera.VTA_FacturasCabecera_Resumen.Sum(m => m.baseImponible);
                        }

                        //calcular listado de vencimientos con fechas e importes
                        List<INTERNO_FechasSegunFormasPago_Modelo> lst_INTERNO_FechasSegunFormasPago_Modelo = Funciones.Calcular_Fechas_SegunFormarPago(mdl_MAE_FormasPago,
                                                                                                                                                        _mdl_VTA_FacturasCabecera.fechaIntroduccion,
                                                                                                                                                        DateTime.Now,
                                                                                                                                                        _mdl_VTA_FacturasCabecera.fecha,
                                                                                                                                                        dcm_Importe_Baseimponible,
                                                                                                                                                        _mdl_VTA_FacturasCabecera.total,
                                                                                                                                                        0m);
                        if (lst_INTERNO_FechasSegunFormasPago_Modelo != null && lst_INTERNO_FechasSegunFormasPago_Modelo.Count > 0)
                        {
                            long lng_CodigoVencimiento = 1;
                            foreach (INTERNO_FechasSegunFormasPago_Modelo mdl_INTERNO_FechasSegunFormasPago_Modelo in lst_INTERNO_FechasSegunFormasPago_Modelo)
                            {
                                VTA_Vencimientos mdl_VTA_Vencimientos = new VTA_Vencimientos();

                                //id
                                mdl_VTA_Vencimientos.id = -1;

                                //codigo
                                mdl_VTA_Vencimientos.codigo = lng_CodigoVencimiento;

                                #region observaciones
                                string str_descripcion = "Vencimiento " + _mdl_VTA_FacturasCabecera.fecha.Year;
                                //Delegacion
                                str_descripcion += "/" + g_frm_P_PedidoCabecera_Procesos.P_Base_ValoresGenerales.Delegacion.codigo;
                                //Factura
                                str_descripcion += "/" + _mdl_VTA_FacturasCabecera.numeroFactura;
                                //Codigo
                                str_descripcion += "/" + lng_CodigoVencimiento;

                                mdl_VTA_Vencimientos.observaciones = str_descripcion;
                                #endregion
                                //idFacturaCabecera
                                mdl_VTA_Vencimientos.idFacturaCabecera = _lng_idFacturaCabecera;

                                //estado
                                mdl_VTA_Vencimientos.estado = Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO;

                                //referencia
                                mdl_VTA_Vencimientos.referencia = "";

                                //importe
                                mdl_VTA_Vencimientos.importe = mdl_INTERNO_FechasSegunFormasPago_Modelo.Importe;

                                //fechaVencimiento
                                mdl_VTA_Vencimientos.fechaVencimiento = mdl_INTERNO_FechasSegunFormasPago_Modelo.Fecha;

                                //idConcepto
                                mdl_VTA_Vencimientos.idConcepto = null;

                                //idTesoreria
                                mdl_VTA_Vencimientos.idTesoreria = null;

                                //idVendedor
                                mdl_VTA_Vencimientos.idVendedor = _mdl_VTA_FacturasCabecera.idVendedor_CobradorHabitual;

                                // Se graba el modelo ya relleno.
                                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VTA_Vencimientos_Datos.Grabar(mdl_VTA_Vencimientos);

                                // Grabamos las Agrupaciones del Vencimiento
                                if (!mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                                {

                                    break;
                                }

                                lng_CodigoVencimiento += 1;

                            }
                        }
                        #endregion

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            transaccion_SQL.Complete();
                        }
                    }


                    transaccion_SQL.Dispose();
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Factura_Cerrar_Documento));

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
                }
                catch (Control_Errores)
                {
                    transaccion_SQL.Dispose();

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Factura_Cerrar_Documento));

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #endregion

        private INTERNO_ValorDevuelto_Modelo Calcular_CantidadesRestantes(INTERNO_VTA_PedidosLineas_Modelo _mdl_INTERNO_VTA_PedidosLineas_Modelo)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            try
            {
                //## 1º--> CANTIDADES DE LA LINEA DEL PEDIDO 
                decimal dcm_Cantidad_PEDIDOLINEA_FINAL = _mdl_INTERNO_VTA_PedidosLineas_Modelo.cantidad;
                decimal dcm_Cantidad_SegundaUnidad_PEDIDOLINEA_FINAL = (_mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_cantidad != null ? _mdl_INTERNO_VTA_PedidosLineas_Modelo.segundaUnidad_cantidad.Value : 0m);

                //## 2º--> OBTENEMOS LOS REGISTROS YA CALCULADOS DONDE SE HA RELACIONADO YA LA LINEA DE PEDIDO DE VENTA
                List<INTERNO_Calculos_CantidadesRestantes> lst_INTERNO_Calculos_CantidadesRestantes = g_obj_VTA_AlbaranesFacturasLineas_Datos.Obtener_Calculos_Para_CantidadesRestantes(_mdl_INTERNO_VTA_PedidosLineas_Modelo.id);

                //## 3º--> PASAMOS LAS CANTIDADES DE TODAS LAS LINEAS QUE HAYAN 
                if (lst_INTERNO_Calculos_CantidadesRestantes != null &&
                    lst_INTERNO_Calculos_CantidadesRestantes.Count > 0)
                {
                    //## 4º--> RECORRER CADA CALCULO PARA PASARLO AL EMBALAJE PRINCIPAL LOS CALCULOS ################################################################################################
                    decimal dcm_Cantidad_CALCULADOS = 0;

                    foreach (INTERNO_Calculos_CantidadesRestantes mdl_INTERNO_Calculos_CantidadesRestantes in lst_INTERNO_Calculos_CantidadesRestantes)
                    {
                        if (mdl_INTERNO_Calculos_CantidadesRestantes.Cantidad != 0m)
                        {
                            dcm_Cantidad_CALCULADOS += Calculos_FuncionesGenerales.Calcular_Cantidad_SegunEmbalajes(mdl_INTERNO_Calculos_CantidadesRestantes.Embalaje_id,
                                                                                                                    mdl_INTERNO_Calculos_CantidadesRestantes.Embalaje_Operacion,
                                                                                                                    mdl_INTERNO_Calculos_CantidadesRestantes.Embalaje_Relacion,
                                                                                                                    mdl_INTERNO_Calculos_CantidadesRestantes.Cantidad,
                                                                                                                    mdl_INTERNO_Calculos_CantidadesRestantes.EmbalajePrincipal_idEmbalaje,
                                                                                                                    true
                                                                                                                    );
                        }
                    }

                    decimal dcm_Porcentaje_Cancelacion = 0m;
                    if (_mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos != null)
                    {
                        dcm_Porcentaje_Cancelacion = _mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.porcentajeCancelacion_Ventas != null ? _mdl_INTERNO_VTA_PedidosLineas_Modelo.MAE_Articulos.porcentajeCancelacion_Ventas.Value : 0m;
                    }

                    //COMPROBAR SI EL CALCULO ESTA HECHO EN EL EMBALAJE PRINCIPAL
                    decimal dcm_Cantidad_Principal_PEDIDOLINEA = Calculos_FuncionesGenerales.Calcular_Cantidad_SegunEmbalajes(_mdl_INTERNO_VTA_PedidosLineas_Modelo.idEmbalaje,
                                                                                                                                    _mdl_INTERNO_VTA_PedidosLineas_Modelo.operacion,
                                                                                                                                    _mdl_INTERNO_VTA_PedidosLineas_Modelo.relacion,
                                                                                                                                    _mdl_INTERNO_VTA_PedidosLineas_Modelo.cantidad,
                                                                                                                                    _mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_idEmbalaje,
                                                                                                                                    true
                                                                                                                                    );
                    bool bol_Servido = false;

                    //CANTIDAD ####################################################################################################
                    decimal dcm_Cantidad_Principal_RESULTADO = dcm_Cantidad_Principal_PEDIDOLINEA - dcm_Cantidad_CALCULADOS;
                    if (dcm_Porcentaje_Cancelacion != 0m)
                    {
                        if (dcm_Cantidad_Principal_RESULTADO >= Funciones.RedondearDecimal(dcm_Cantidad_Principal_PEDIDOLINEA * (dcm_Porcentaje_Cancelacion / 100), 3))
                        {
                            bol_Servido = true;
                        }
                    }
                    else
                    {
                        //Negativo
                        if (dcm_Cantidad_Principal_PEDIDOLINEA < 0)
                        {
                            if (dcm_Cantidad_Principal_RESULTADO >= 0m)
                            {
                                bol_Servido = true;
                            }
                        }
                        //Positivo
                        else
                        {
                            if (dcm_Cantidad_Principal_RESULTADO <= 0)
                            {
                                bol_Servido = true;
                            }
                        }
                    }

                    //Si no esta Servido se pone en las varibles generales
                    if (bol_Servido == false)
                    {
                        //Transformar al Embalaje original otra vez
                        dcm_Cantidad_PEDIDOLINEA_FINAL = Calculos_FuncionesGenerales.Calcular_Cantidad_SegunEmbalajes(_mdl_INTERNO_VTA_PedidosLineas_Modelo.idEmbalaje,
                                                                                                                            _mdl_INTERNO_VTA_PedidosLineas_Modelo.operacion,
                                                                                                                            _mdl_INTERNO_VTA_PedidosLineas_Modelo.relacion,
                                                                                                                            dcm_Cantidad_Principal_RESULTADO,
                                                                                                                            _mdl_INTERNO_VTA_PedidosLineas_Modelo.embalajePrincipalDelArticulo_idEmbalaje,
                                                                                                                            false);

                        dcm_Cantidad_SegundaUnidad_PEDIDOLINEA_FINAL = Calculos_FuncionesGenerales.Calcular_SegundaUnidad(dcm_Cantidad_PEDIDOLINEA_FINAL, _mdl_INTERNO_VTA_PedidosLineas_Modelo.relacion);


                    }
                    else
                    {
                        dcm_Cantidad_PEDIDOLINEA_FINAL = 0;
                        dcm_Cantidad_SegundaUnidad_PEDIDOLINEA_FINAL = 0;
                    }
                }

                //Valores Finales
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_1 = dcm_Cantidad_PEDIDOLINEA_FINAL;
                mdl_INTERNO_ValorDevuelto_Modelo.Objeto_Auxiliar_2 = dcm_Cantidad_SegundaUnidad_PEDIDOLINEA_FINAL;
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();
            }
            catch (Exception ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GENERARDATOS();

                Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(Calcular_CantidadesRestantes));
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #region GrabarDatos
        private INTERNO_ValorDevuelto_Modelo GrabarDatos(VTA_AlbaranesCabecera _mdl_VTA_AlbaranesCabecera, List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo> _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //## 1º-> GRABAR VTA_ALBARANCABECERA CON SUS RELACIONES
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VTA_AlbaranesCabecera_Datos.Insertar(_mdl_VTA_AlbaranesCabecera);
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        long lng_idAlbaranCabecera = mdl_INTERNO_ValorDevuelto_Modelo.Id;

                        //## 2º-> ACTUALIZAR VTA_PedidosCabecera CON EL IDPEDIDO Y situacion servido
                        foreach (INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo in _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VTA_PedidosCabecera_Datos.Actualizar_Situacion(mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.id, int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_SERVIDO.Codigo));
                            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                            {
                                break;
                            }
                        }

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            //Añadir el idPedidoCabecera para que se modifique en el listado general los valores
                            mdl_INTERNO_ValorDevuelto_Modelo.Listado_Id = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Select(m => m.id).ToList();
                            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lng_idAlbaranCabecera;

                            //Terminamos la transaccion
                            transaccion_SQL.Complete();
                            transaccion_SQL.Dispose();
                        }

                    }

                    transaccion_SQL.Dispose();
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(GrabarDatos));
                }
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos(VTA_FacturasCabecera _mdl_VTA_FacturasCabecera, List<INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo> _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = null;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //## 1º-> GRABAR VTA_FACTURASCABECERA CON SUS RELACIONES
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VTA_FacturasCabecera_Datos.Insertar(_mdl_VTA_FacturasCabecera);
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        long lng_idFacturaCabecera = mdl_INTERNO_ValorDevuelto_Modelo.Id;

                        //## 2º-> ACTUALIZAR VTA_PedidosCabecera CON EL IDPEDIDO Y situacion servido
                        foreach (INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo in _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo = g_obj_VTA_PedidosCabecera_Datos.Actualizar_Situacion(mdl_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.id, int.Parse(Variables.G_MDL_TIPOSITUACION_PEDIDOVENTA_SERVIDO.Codigo));
                            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                            {
                                break;
                            }
                        }

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            //Añadir el idPedidoCabecera para que se modifique en el listado general los valores
                            mdl_INTERNO_ValorDevuelto_Modelo.Listado_Id = _lst_INTERNO_VTA_PedidosCabecera_ConversionAlbaranFactura_Modelo.Select(m => m.id).ToList();

                            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lng_idFacturaCabecera;

                            //Terminamos la transaccion
                            transaccion_SQL.Complete();
                            transaccion_SQL.Dispose();
                        }
                    }

                    transaccion_SQL.Dispose();
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    Control_Errores.Errores_Log("", ex, nameof(P_PedidoCabecera_Procesos_Controladora) + "/" + nameof(GrabarDatos));
                }
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion


        #endregion
    }
}
