using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Contabilidad._1_Datos;
using Exferia_Contabilidad._3_Vistas.ControlesPersonalizados_DentroPaneles;
using Exferia_Contabilidad.General;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_General._3_Vistas.ListadosSeleccion;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.IO;
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_Contabilidad._3_Vistas.Controladoras
{
    public class P_Inmovilizado_Controladora
    {
        #region Variables Generales
        private P_Inmovilizado g_frm_P_Inmovilizado = null; // Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando; //Pantalla de esper,a para cuando se ejecuten tareas pesadas como cargar

        //Clases de Datos Necesariar para la carga ed datos
        private CTA_Inmovilizados_Datos g_obj_CTA_Inmovilizados_Datos = new CTA_Inmovilizados_Datos();

        //Modelos 
        public CTA_Inmovilizados g_mdl_CTA_Inmovilizados = null;
        public COM_FacturasCabecera g_mdl_COM_FacturasCabecera = null;

        //Combos
        public List<INTERNO_ComboBox_Modelo> g_lst_TipoCaculoTiempo_INTERNO_ComboBox_Modelo;
        private List<INTERNO_ComboBox_Modelo> g_lst_Naturaleza_INTERNO_ComboBox_Modelo;

        public bool g_bol_Termino_CargaDatos_Inicial = false;// Se utiliza para saber cuando se termina la carga de datos estaticos iniciales

        public bool g_bol_Campocodigo_Numerico = false;

        public decimal g_dcm_ImporteAmortizado = 0m;

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

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        private bool g_bol_GrabarDatos_TerminoCorrectamente = true;
        
        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;
        #endregion
        #endregion

        #region Constructor
        public P_Inmovilizado_Controladora(P_Inmovilizado _frm_P_Inmovilizado)
        {
            g_frm_P_Inmovilizado = _frm_P_Inmovilizado;

            Cargar_DatosIniciales();

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        public void Cargar_DatosIniciales()
        {
            try
            {
                //TipoCalculo
                g_lst_TipoCaculoTiempo_INTERNO_ComboBox_Modelo = ListadosEstaticos.Devolver_TipoCalculo_Tiempo();
                g_frm_P_Inmovilizado.Exferia_ComboBox_TipoCalculoTiempo.Items.Clear();
                g_frm_P_Inmovilizado.Exferia_ComboBox_TipoCalculoTiempo.DataSource = g_lst_TipoCaculoTiempo_INTERNO_ComboBox_Modelo;
                g_frm_P_Inmovilizado.Exferia_ComboBox_TipoCalculoTiempo.SelectedIndex = 0;

                //Naturaleza
                g_lst_Naturaleza_INTERNO_ComboBox_Modelo = ListadosEstaticos.Devolver_Naturaleza_Inmovilizado();
                g_frm_P_Inmovilizado.Exferia_ComboBox_Naturaleza.Items.Clear();
                g_frm_P_Inmovilizado.Exferia_ComboBox_Naturaleza.DataSource = g_lst_Naturaleza_INTERNO_ComboBox_Modelo;
                g_frm_P_Inmovilizado.Exferia_ComboBox_Naturaleza.SelectedIndex = 0;

            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "" + nameof(Cargar_DatosIniciales));
            }
        }
        public void Datos_PorDefecto()
        {
            //Ejercicio
            g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Id = g_frm_P_Inmovilizado.P_Base_ValoresGenerales.EjercicioActivo.id;
            g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Codigo = g_frm_P_Inmovilizado.P_Base_ValoresGenerales.EjercicioActivo.anioControl;
            g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Descripcion = g_frm_P_Inmovilizado.P_Base_ValoresGenerales.EjercicioActivo.descripcion;
            g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_FechaBorrado = g_frm_P_Inmovilizado.P_Base_ValoresGenerales.EjercicioActivo.fechaBorrado;


            g_frm_P_Inmovilizado.P_Base_SeModificoDatosPantalla = false;
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //Modelos
            g_mdl_CTA_Inmovilizados = null;
            g_mdl_COM_FacturasCabecera = null;

            //numeroorden
            g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden.Text = "";

            //concepto
            g_frm_P_Inmovilizado.Exferia_TextBox_Concepto.Text = "";

            //Delegacion
            g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Id = -1;
            g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Codigo = "";
            g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Descripcion = "";
            g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_FechaBorrado = null;

            //factura
            g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_Id = -1;
            g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_Codigo= "";
            g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_FechaBorrado = null;
            FacturaCabecera_VaciarDatos();

            //naturaleza
            g_frm_P_Inmovilizado.Exferia_ComboBox_Naturaleza.SelectedIndex = 0;

            //fechaInicioAmortizacion
            g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.Exferia_FechaSeleccion_Fecha = "";

            //importeAmortizadoEnAlta
            g_frm_P_Inmovilizado.Exferia_TextBox_AmortizadoEnAlta.Text= "";

            //rangoAmortizar
            g_frm_P_Inmovilizado.Exferia_TextBox_RangoTiempo.Text = "";

            //tipoCalculoAmortizar
            g_frm_P_Inmovilizado.Exferia_ComboBox_TipoCalculoTiempo.SelectedIndex = 0;

            //importeAmortizable
            g_frm_P_Inmovilizado.Exferia_TextBox_ImporteAmortizable.Text = "";

            //ImporteAmortizado
            g_frm_P_Inmovilizado.Exferia_Label_SinColor_ImporteAmortizado_Valor.Text = "";

            //AmortizacionMaxima
            g_frm_P_Inmovilizado.Exferia_TextBox_AmortizacionMaxima.Text = "";

            //tipoAmortizacion
            g_frm_P_Inmovilizado.Exferia_TextBox_TipoAmortizacion.Text = "";

            //idMayor_CuentaInmovilizado
            g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Id = -1;
            g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Codigo = "";
            g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Descripcion = "";
            g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_FechaBorrado = null;
            g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_IdEjercicio_Baja = null;

            //idMayor_CuentaAmortizacionAcumulada
            g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Id = -1;
            g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Codigo = "";
            g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Descripcion = "";
            g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_FechaBorrado = null;
            g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_IdEjercicio_Baja = null;

            //idMayor_CuentaDotacion
            g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Id = -1;
            g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Codigo = "";
            g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Descripcion = "";
            g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_FechaBorrado = null;
            g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_IdEjercicio_Baja = null;

            //idMayorAuxiliar
            g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Id = -1;
            g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Codigo = "";
            g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Descripcion = "";
            g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_FechaBorrado = null;
            g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_IdEjercicio_Baja = null;

            //idDepartamento
            g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Id = -1;
            g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Codigo = "";
            g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Descripcion = "";
            g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_FechaBorrado = null;

            //fechaBaja
            g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha = "";

            //noAmortizar
            g_frm_P_Inmovilizado.Exferia_CheckBox_NoAmortizar.Checked = false;

            //idInmovilizadoMotivoBaja
            g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Id = -1;
            g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Codigo = "";
            g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Descripcion = "";
            g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_FechaBorrado = null;

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

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

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

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

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        #endregion

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

            try
            {
                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente(nameof(CTA_Inmovilizados),
                                                                                    nameof(CTA_Inmovilizados.numeroOrden),
                                                                                    nameof(CTA_Inmovilizados.idEmpresa),
                                                                                    g_mdl_CTA_Inmovilizados != null ? g_mdl_CTA_Inmovilizados.idEmpresa : Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Inmovilizado.P_Base_ValoresGenerales.lng_idEmpresa, nameof(CTA_Inmovilizados)),
                                                                                    true,
                                                                                    g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden.Exferia_TextBox_MaxLength);
                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden.Text = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO(g_frm_P_Inmovilizado.Exferia_Label_NumeroOrden.Text);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(Buscar_CodigoSiguiente));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Inmovilizado.Enabled = false;

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

                //Si la tarea asincrona esta en marcha la paro
                if(g_obj_TareaAsincrona_CargarDatos != null)
                {
                    while (g_obj_TareaAsincrona_CargarDatos.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_Dowork);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = false;
                }

                //Varicar Datos
                VaciarDatos();

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

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

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

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(RecargarDatos),true);
            }
        }
        private void TareaAsincrona_CargarDatos_Dowork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Cargar Valores
                if(CargarDatos(g_frm_P_Inmovilizado.P_Base_id) == false)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Dowork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Dowork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear el Formulario
            g_frm_P_Inmovilizado.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_Inmovilizado.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Inmovilizado.Salir_P_Base();
            }
            finally
            {

                //Hacemos foco al primer control.
                g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden.Exferia_TextBox_Foco();
            }
        }
        public bool CargarDatos(long _lng_id)
        {
            bool bol_ValorDevuelto = true;

            try
            {
                g_mdl_CTA_Inmovilizados = g_obj_CTA_Inmovilizados_Datos.Obtener(_lng_id);

                //Si no es nulo se Cargan los datos
                if(g_mdl_CTA_Inmovilizados != null)
                {
                    //Paginador ................................................................................
                    if (g_frm_P_Inmovilizado.P_Base_PantallaOrigen != null &&
                        g_frm_P_Inmovilizado.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                        g_frm_P_Inmovilizado.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_CTA_Inmovilizados.id;
                        int int_PaginaDelObjeto = g_frm_P_Inmovilizado.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_Inmovilizado.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

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

                    //numeroOrden
                    g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden.Text = g_mdl_CTA_Inmovilizados.numeroOrden;

                    //concepto
                    g_frm_P_Inmovilizado.Exferia_TextBox_Concepto.Text = g_mdl_CTA_Inmovilizados.concepto;

                    //Delegacion
                    g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Id = g_mdl_CTA_Inmovilizados.GEN_Delegaciones.id;
                    g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Codigo = g_mdl_CTA_Inmovilizados.GEN_Delegaciones.codigo;
                    g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Descripcion = g_mdl_CTA_Inmovilizados.GEN_Delegaciones.descripcion;
                    g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_FechaBorrado = g_mdl_CTA_Inmovilizados.GEN_Delegaciones.fechaBorrado;

                    //facturaCabecera
                    if (g_mdl_CTA_Inmovilizados.idFacturaCompraCabecera!=null)
                    {
                        //Factura
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_Id = g_mdl_CTA_Inmovilizados.COM_FacturasCabecera.id;
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_Codigo = g_mdl_CTA_Inmovilizados.COM_FacturasCabecera.numeroFactura.ToString();
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_FechaBorrado = g_mdl_CTA_Inmovilizados.COM_FacturasCabecera.fechaBorrado;

                        FacturaCabecera_RellenarDatosAuxiliares(g_mdl_CTA_Inmovilizados.idFacturaCompraCabecera.Value, g_mdl_CTA_Inmovilizados.COM_FacturasCabecera);
                    }

                    //naturaleza
                    g_frm_P_Inmovilizado.Exferia_ComboBox_Naturaleza.SelectedItem = g_lst_Naturaleza_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_CTA_Inmovilizados.naturaleza.ToString())).FirstOrDefault();
                    
                    //fechaInicioAmortizacion
                    g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.Exferia_FechaSeleccion_Fecha = g_mdl_CTA_Inmovilizados.fechaInicioAmortizacion.ToString("dd/MM/yyyy");

                    //importeAmortizadoEnAlta
                    g_frm_P_Inmovilizado.Exferia_TextBox_AmortizadoEnAlta.Text = string.Format("{0:0.00}", g_mdl_CTA_Inmovilizados.importeAmortizadoEnAlta);

                    //rangoAmortizar
                    g_frm_P_Inmovilizado.Exferia_TextBox_RangoTiempo.Text = g_mdl_CTA_Inmovilizados.rangoAmortizar.ToString();

                    //tipoCalculoAmortizar
                    g_frm_P_Inmovilizado.Exferia_ComboBox_TipoCalculoTiempo.SelectedItem = g_lst_TipoCaculoTiempo_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_CTA_Inmovilizados.tipoCalculoAmortizar)).FirstOrDefault();

                    //importeAmortizable
                    g_frm_P_Inmovilizado.Exferia_TextBox_ImporteAmortizable.Text = string.Format("{0:0.00}", g_mdl_CTA_Inmovilizados.importeAmortizable);

                    //tipoAmortizacion
                    g_frm_P_Inmovilizado.Exferia_TextBox_TipoAmortizacion.Text = string.Format("{0:0.00}", g_mdl_CTA_Inmovilizados.tipoAmortizacion);

                    //tipoAmortizacionMaxima
                    g_frm_P_Inmovilizado.Exferia_TextBox_AmortizacionMaxima.Text = string.Format("{0:0.00}", g_mdl_CTA_Inmovilizados.tipoAmortizacionMaxima);

                    // Cuenta Inmovilizado
                    if (g_mdl_CTA_Inmovilizados.CTA_Mayor != null)
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Id = g_mdl_CTA_Inmovilizados.CTA_Mayor.id;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Codigo = g_mdl_CTA_Inmovilizados.CTA_Mayor.codigo;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Descripcion = g_mdl_CTA_Inmovilizados.CTA_Mayor.descripcion;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_FechaBorrado = g_mdl_CTA_Inmovilizados.CTA_Mayor.fechaBorrado;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_IdEjercicio_Baja = g_mdl_CTA_Inmovilizados.CTA_Mayor.idEjercicio_Baja;
                    }
                    else
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Id = -1;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_FechaBorrado = null;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_IdEjercicio_Baja = null;
                    }

                    // Cuenta Amortizacion Acumulada
                    if (g_mdl_CTA_Inmovilizados.CTA_Mayor1 != null)
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Id = g_mdl_CTA_Inmovilizados.CTA_Mayor1.id;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Codigo = g_mdl_CTA_Inmovilizados.CTA_Mayor1.codigo;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Descripcion = g_mdl_CTA_Inmovilizados.CTA_Mayor1.descripcion;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_FechaBorrado = g_mdl_CTA_Inmovilizados.CTA_Mayor1.fechaBorrado;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_IdEjercicio_Baja = g_mdl_CTA_Inmovilizados.CTA_Mayor1.idEjercicio_Baja;
                    }
                    else
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Id = -1;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_FechaBorrado = null;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_IdEjercicio_Baja = null;
                    }

                    // Cuenta Dotacion
                    if (g_mdl_CTA_Inmovilizados.CTA_Mayor2 != null)
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Id = g_mdl_CTA_Inmovilizados.CTA_Mayor2.id;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Codigo = g_mdl_CTA_Inmovilizados.CTA_Mayor2.codigo;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Descripcion = g_mdl_CTA_Inmovilizados.CTA_Mayor2.descripcion;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_FechaBorrado = g_mdl_CTA_Inmovilizados.CTA_Mayor2.fechaBorrado;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_IdEjercicio_Baja = g_mdl_CTA_Inmovilizados.CTA_Mayor2.idEjercicio_Baja;
                    }
                    else
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Id = -1;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_FechaBorrado = null;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_IdEjercicio_Baja = null;
                    }

                    // Cuenta Auxiliar
                    if (g_mdl_CTA_Inmovilizados.CTA_MayorAuxiliar != null)
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Id = g_mdl_CTA_Inmovilizados.CTA_MayorAuxiliar.id;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Codigo = g_mdl_CTA_Inmovilizados.CTA_MayorAuxiliar.codigo;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Descripcion = g_mdl_CTA_Inmovilizados.CTA_MayorAuxiliar.descripcion;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_FechaBorrado = g_mdl_CTA_Inmovilizados.CTA_MayorAuxiliar.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Id = -1;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_FechaBorrado = null;
                    }

                    // Departamento
                    if (g_mdl_CTA_Inmovilizados.CTA_Departamentos != null)
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Id = g_mdl_CTA_Inmovilizados.CTA_Departamentos.id;
                        g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Codigo = g_mdl_CTA_Inmovilizados.CTA_Departamentos.codigo;
                        g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Descripcion = g_mdl_CTA_Inmovilizados.CTA_Departamentos.descripcion;
                        g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_FechaBorrado = g_mdl_CTA_Inmovilizados.CTA_Departamentos.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Id = -1;
                        g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_FechaBorrado = null;
                    }

                    //Fecha baja
                    g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha = g_mdl_CTA_Inmovilizados.fechaBaja!=null ? g_mdl_CTA_Inmovilizados.fechaBaja.Value.ToString("dd/MM/yyyy") : "";

                    //noAmortizar
                    g_frm_P_Inmovilizado.Exferia_CheckBox_NoAmortizar.Checked = g_mdl_CTA_Inmovilizados.noAmortizar != null ? g_mdl_CTA_Inmovilizados.noAmortizar.Value : false;

                    // Motivos Baja
                    if (g_mdl_CTA_Inmovilizados.CTA_InmovilizadosMotivosBaja != null)
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Id = g_mdl_CTA_Inmovilizados.CTA_InmovilizadosMotivosBaja.id;
                        g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Codigo = g_mdl_CTA_Inmovilizados.CTA_InmovilizadosMotivosBaja.codigo;
                        g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Descripcion = g_mdl_CTA_Inmovilizados.CTA_InmovilizadosMotivosBaja.descripcion;
                        g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_FechaBorrado = g_mdl_CTA_Inmovilizados.CTA_InmovilizadosMotivosBaja.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Id = -1;
                        g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_FechaBorrado = null;
                    }

                    //Importe Amortizado
                    CTA_AmortizacionesLinea_Datos obj_CTA_AmortizacionesLinea_Datos = new CTA_AmortizacionesLinea_Datos();
                    List<CTA_AmortizacionesLinea> lst_CTA_AmortizacionesLinea = obj_CTA_AmortizacionesLinea_Datos.Obtener_ModeloListado_Por_IdInmovilizado(g_mdl_CTA_Inmovilizados.id, -1, false);
                    g_dcm_ImporteAmortizado = 0;
                    if (lst_CTA_AmortizacionesLinea != null && lst_CTA_AmortizacionesLinea.Count > 0)
                    {
                        g_dcm_ImporteAmortizado += lst_CTA_AmortizacionesLinea.Sum(m => m.importeAmortizar);
                    }

                    g_frm_P_Inmovilizado.Exferia_Label_SinColor_ImporteAmortizado_Valor.Text = string.Format("{0:0.00}", g_dcm_ImporteAmortizado + g_mdl_CTA_Inmovilizados.importeAmortizadoEnAlta);

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

                        string[] str_Separador = new string[] { " [" };
                        //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
                        if (g_frm_P_Inmovilizado.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_Inmovilizado.P_Base_TituloPantalla = (g_frm_P_Inmovilizado.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }
                        dynamic dnm_Objeto = g_mdl_CTA_Inmovilizados;
                        foreach (string str_campo in arr_Campos)
                        {
                            var Valor = dnm_Objeto.GetType().GetProperty(str_campo).GetValue(dnm_Objeto, null);
                            if (Valor != null)
                            {
                                str_ValorAMostrarFinal += " " + Valor;
                            }

                            // numeroOrden
                            if (str_campo.Equals(nameof(CTA_Inmovilizados.numeroOrden)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_CTA_Inmovilizados.numeroOrden;
                            }
                            // concepto
                            else if (str_campo.Equals(nameof(CTA_Inmovilizados.concepto)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_CTA_Inmovilizados.concepto;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Inmovilizado.P_Base_TituloPantalla += " [" + str_ValorAMostrarFinal + "] -Modificar";
                        }
                    }

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

                    g_frm_P_Inmovilizado.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(CargarDatos));
            }
            return bol_ValorDevuelto;
        }
        #endregion

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

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


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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_bol_GrabarDatos_TerminoCorrectamente = false;

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

                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(GrabarDatos));

                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_GrabarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

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

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

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

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

                //Mostrar si tuviere algun mensaje
                if(mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if(mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);

                        //Poner el Foco en el objeto que tuvo el poroblema en validar
                        if(mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_Inmovilizado, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    if (g_frm_P_Inmovilizado.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Inmovilizado.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Inmovilizado.P_Base_F3Origen != null)
                    {
                        g_frm_P_Inmovilizado.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    g_frm_P_Inmovilizado.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_Inmovilizado.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

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

            try
            {
                //Si el numeroorden esta vacio y se intenta buscar el ultimo numeri y ver si llego al limite de base de datos
                if(g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden.Text.Trim().Length == 0)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = Buscar_CodigoSiguiente();

                    if(mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo.Mensaje;
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden;
                    }
                }

                //El numeroorden no puede estar Repetido
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Codigo = g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden.Text.Trim();
                    if (g_bol_Campocodigo_Numerico)
                    {
                        int int_Codigo = int.Parse(str_Codigo);
                        str_Codigo = int_Codigo.ToString();
                    }

                    if (Datos_Generales.Buscar_CodigoRepetido(nameof(CTA_Inmovilizados), nameof(CTA_Inmovilizados.numeroOrden), str_Codigo, nameof(g_mdl_CTA_Inmovilizados.id), (g_mdl_CTA_Inmovilizados != null ? g_mdl_CTA_Inmovilizados.id : -1), nameof(CTA_Inmovilizados.idEmpresa), g_frm_P_Inmovilizado.P_Base_ValoresGenerales.lng_idEmpresa, true))
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_Inmovilizado.Exferia_Label_NumeroOrden.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden;
                    }
                }

                //El concepto no puede estar vacio
                if((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Inmovilizado.Exferia_TextBox_Concepto.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Inmovilizado.Exferia_Label_Concepto.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_TextBox_Concepto;
                }

                // La Delegacion no puede estar Vacia (Obligatoria)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Delegacion validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay FacturaCabecera validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_Codigo.Trim().Length != 0) && g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_PRINCIPAL_TextBox_Codigo;
                }

                // La fecha de inicio de amortizacion no puede estar vacia y debe ser correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.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_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion;
                    }
                    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_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion;
                    }
                }

                //La fecha de Amortizacion no puede ser inferior ala fecha de la factura
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_mdl_COM_FacturasCabecera!=null &&
                    g_mdl_COM_FacturasCabecera.fecha> DateTime.ParseExact(g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_MAYORQUEOTRAAFECHA(g_frm_P_Inmovilizado.Exferia_Label_DatosFactura_FechaCompra.Text,g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.Exferia_FechaSeleccion_Descripcion);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion;
                }

                //El importe amortizable no puede estar vacio
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Inmovilizado.Exferia_TextBox_ImporteAmortizable.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Inmovilizado.Exferia_Label_ImporteAmortizable.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_TextBox_ImporteAmortizable;
                }

                //La amortizacion maxima no puede estar vacio
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Inmovilizado.Exferia_TextBox_AmortizacionMaxima.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Inmovilizado.Exferia_Label_AmortizacionMaxima.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_TextBox_AmortizacionMaxima;
                }

                //El rangotiempo no puede estar vacio
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Inmovilizado.Exferia_TextBox_RangoTiempo.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Inmovilizado.Exferia_Label_RangoTiempo.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_TextBox_RangoTiempo;
                }

                //El tipo amortizacion no puede estar vacio
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Inmovilizado.Exferia_TextBox_TipoAmortizacion.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Inmovilizado.Exferia_Label_TipoAmortizacion.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_TextBox_TipoAmortizacion;
                }

                //El importe amortizado no ser mayor que el importe amortizable
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) &&
                    (decimal.Parse(g_frm_P_Inmovilizado.Exferia_TextBox_ImporteAmortizable.Text) < decimal.Parse(g_frm_P_Inmovilizado.Exferia_Label_SinColor_ImporteAmortizado_Valor.Text)))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_INMOVILIZADO_VALIDACION_IMPORTEAMORTIZABLE_MENOR_IMPORTEAMORTIZADO(g_frm_P_Inmovilizado.Exferia_Label_ImporteAmortizable.Text, g_frm_P_Inmovilizado.Exferia_Label_ImporteAmortizado_Titulo.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_TextBox_ImporteAmortizable;
                }

                // Si hay Mayor(Cuenta inmovilizada) validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Mayor(Cuenta AmortizacionAcumulada) validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Mayor(Cuenta Dotacion) validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay MayorAuxiliar validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Departamento validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // La fecha baja, si no esta vacio, debe ser correcta. (mensaje de vacio se queda vacio para que no controle el error)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaMovilidadGeografica_Respuesta = Funciones.Fecha_Validacion(g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));
                    if (int_fechaMovilidadGeografica_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja;
                    }
                }

                // Si hay Motivobaja validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && 
                    (g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Descripcion.Trim().Length != 0) && 
                    g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //Si hay motivoBaja tiene que tener fecha de baja
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Id>-1 && g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha.Trim(' ', '/')=="")
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja;
                    }
                }
            }
            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_Inmovilizado_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 GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            try
            {
                DateTime? dtt_Fecha_Nula = null;

                CTA_Inmovilizados mdl_CTA_Inmovilizados = new CTA_Inmovilizados();

                //id
                mdl_CTA_Inmovilizados.id = g_mdl_CTA_Inmovilizados != null ? g_mdl_CTA_Inmovilizados.id : -1;

                //numeroOrden
                mdl_CTA_Inmovilizados.numeroOrden = g_frm_P_Inmovilizado.Exferia_TextBox_NumeroOrden.Text;

                //concepto
                mdl_CTA_Inmovilizados.concepto = g_frm_P_Inmovilizado.Exferia_TextBox_Concepto.Text;

                //idDelegacion
                mdl_CTA_Inmovilizados.idDelegacion = g_frm_P_Inmovilizado.Exferia_F3_Delegacion.Exferia_F3_Id;

                //naturaleza
                mdl_CTA_Inmovilizados.naturaleza = int.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_Inmovilizado.Exferia_ComboBox_Naturaleza.SelectedItem).Identificador);

                //idFacturaCompraCabecera
                if (g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_Id!= -1)
                { mdl_CTA_Inmovilizados.idFacturaCompraCabecera = g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Simple_FacturaCabecera.Exferia_F3_SoloSeleccion_Simple_Id; }
                else
                { mdl_CTA_Inmovilizados.idFacturaCompraCabecera = null; }

                //fechaInicioAmortizacion
                mdl_CTA_Inmovilizados.fechaInicioAmortizacion= DateTime.ParseExact(g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                //importeAmortizabledecimal
                mdl_CTA_Inmovilizados.importeAmortizable=decimal.Parse(g_frm_P_Inmovilizado.Exferia_TextBox_ImporteAmortizable.Text);

                //importeAmortizadoEnAlta
                if (g_frm_P_Inmovilizado.Exferia_TextBox_AmortizadoEnAlta.Text.Trim().Length>0)
                {
                    mdl_CTA_Inmovilizados.importeAmortizadoEnAlta = decimal.Parse(g_frm_P_Inmovilizado.Exferia_TextBox_AmortizadoEnAlta.Text);
                }
                else
                {
                    mdl_CTA_Inmovilizados.importeAmortizadoEnAlta=0m;
                }
               
                //rangoAmortizar
                mdl_CTA_Inmovilizados.rangoAmortizar = int.Parse(g_frm_P_Inmovilizado.Exferia_TextBox_RangoTiempo.Text);

                //tipoCalculoAmortizar
                mdl_CTA_Inmovilizados.tipoCalculoAmortizar = ((INTERNO_ComboBox_Modelo)g_frm_P_Inmovilizado.Exferia_ComboBox_TipoCalculoTiempo.SelectedItem).Identificador;

                //tipoAmortizacionMaxima
                mdl_CTA_Inmovilizados.tipoAmortizacionMaxima = decimal.Parse(g_frm_P_Inmovilizado.Exferia_TextBox_AmortizacionMaxima.Text);

                //tipoAmortizacion
                mdl_CTA_Inmovilizados.tipoAmortizacion = decimal.Parse(g_frm_P_Inmovilizado.Exferia_TextBox_TipoAmortizacion.Text);

                //idMayor_CuentaInmovilizado
                if (g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Id != -1)
                { mdl_CTA_Inmovilizados.idMayor_CuentaInmovilizado = g_frm_P_Inmovilizado.Exferia_F3_MayorCuentaInmovilizado.Exferia_F3_Id; }
                else
                { mdl_CTA_Inmovilizados.idMayor_CuentaInmovilizado = null; }

                //idMayor_CuentaAmortizacionAcumulada
                if (g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Id != -1)
                { mdl_CTA_Inmovilizados.idMayor_CuentaAmortizacionAcumulada = g_frm_P_Inmovilizado.Exferia_F3_MayorAmortizacionAcumulada.Exferia_F3_Id; }
                else
                { mdl_CTA_Inmovilizados.idMayor_CuentaAmortizacionAcumulada = null; }

                //idMayor_CuentaDotacion
                if (g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Id != -1)
                { mdl_CTA_Inmovilizados.idMayor_CuentaDotacion = g_frm_P_Inmovilizado.Exferia_F3_MayorDotacion.Exferia_F3_Id; }
                else
                { mdl_CTA_Inmovilizados.idMayor_CuentaDotacion = null; }

                //idMayorAuxiliar
                if (g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Id != -1)
                { mdl_CTA_Inmovilizados.idMayorAuxiliar = g_frm_P_Inmovilizado.Exferia_F3_MayorAuxiliar.Exferia_F3_Id; }
                else
                { mdl_CTA_Inmovilizados.idMayorAuxiliar = null; }

                //idDepartamento
                if (g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Id != -1)
                { mdl_CTA_Inmovilizados.idDepartamento = g_frm_P_Inmovilizado.Exferia_F3_Departamento.Exferia_F3_Id; }
                else
                { mdl_CTA_Inmovilizados.idDepartamento = null; }

                //fechaBaja
                mdl_CTA_Inmovilizados.fechaBaja= g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "" ? DateTime.ParseExact(g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : dtt_Fecha_Nula;

                //noAmortizar
                mdl_CTA_Inmovilizados.noAmortizar = g_frm_P_Inmovilizado.Exferia_CheckBox_NoAmortizar.Checked;

                //idInmovilizadoMotivoBaja
                if (g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Id != -1)
                { mdl_CTA_Inmovilizados.idInmovilizadoMotivoBaja = g_frm_P_Inmovilizado.Exferia_F3_MotivoBaja.Exferia_F3_Id; }
                else
                { mdl_CTA_Inmovilizados.idInmovilizadoMotivoBaja = null; }

                //idEmpresa
                if ((g_mdl_CTA_Inmovilizados != null ? g_mdl_CTA_Inmovilizados.idEmpresa : -1) != -1)
                {
                    mdl_CTA_Inmovilizados.idEmpresa = g_mdl_CTA_Inmovilizados.idEmpresa;
                }
                else
                {
                    //Busar el idEmpresa correspondiente
                    mdl_CTA_Inmovilizados.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Inmovilizado.P_Base_ValoresGenerales.lng_idEmpresa, nameof(CTA_Inmovilizados));
                }

                //amortizadoTerminado
                mdl_CTA_Inmovilizados.amortizadoTerminado = g_mdl_CTA_Inmovilizados != null ? g_mdl_CTA_Inmovilizados.amortizadoTerminado : false;

                //Se graba el modelo ya relleno
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_CTA_Inmovilizados_Datos.Grabar(mdl_CTA_Inmovilizados);

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

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

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

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

                g_frm_PE_Esperando.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(BorrarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Mdeolo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Mdeolo.TodoCorrecto = true;

            try
            {
                //Borrar
                mdl_ValorDevuelto_Mdeolo = BorrarDatos_Final();
            }
            catch(ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

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

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

            g_frm_P_Inmovilizado.Enabled = true;

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

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

                    g_frm_P_Inmovilizado.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_Inmovilizado.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_CTA_Inmovilizados_Datos.Borrar(g_mdl_CTA_Inmovilizados!= null ? g_mdl_CTA_Inmovilizados.id : -1);
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Factura Cabecera
        public void FacturaCabecera_RellenarDatosAuxiliares(long _lng_idFacturaCabecera, COM_FacturasCabecera _mdl_COM_FacturasCabecera)
        {
            try
            {

                #region Buscar el Modelo de facturaCabecera Seleccionado
                if (_mdl_COM_FacturasCabecera==null)
                {
                    //Cargamos el ensamblado
                    Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_COMPRAS + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_COMPRAS + "." + Variables.G_STR_LIBRERIA_DATOSCOMPRAS);
                    //creamos la instancia
                    var obj_Clase = Activator.CreateInstance(m_type);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCOMPRAS_PROCEDIMIENTO_COMFACTURASCABECERA_OBTENERMODELO_POR_ID_AUX_1, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros = { _lng_idFacturaCabecera, true,false,false };
                    //Pasamos los parametros al metodo y lo ejecutamos
                    g_mdl_COM_FacturasCabecera = (COM_FacturasCabecera)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                }
                else
                {
                    g_mdl_COM_FacturasCabecera = _mdl_COM_FacturasCabecera;
                }
                #endregion

                if (g_mdl_COM_FacturasCabecera!= null)
                {
                    if (g_mdl_COM_FacturasCabecera.MAE_Proveedores != null)
                    {
                        //Proveedor_Codigo
                        g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_Proveedor_Codigo.Text = g_mdl_COM_FacturasCabecera.MAE_Proveedores.codigo;

                        //Proveedor_Descripcion
                        g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_Proveedor_Descripcion.Text = g_mdl_COM_FacturasCabecera.MAE_Proveedores.razonSocial;
                    }
                    else
                    {
                        //Proveedor_Codigo
                        g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_Proveedor_Codigo.Text = "";

                        //Proveedor_Descripcion
                        g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_Proveedor_Descripcion.Text = "";
                    }

                    //numerofactura
                    g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_NumeroFactura.Text = g_mdl_COM_FacturasCabecera.numeroFactura;

                    //fecha de compra
                    g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_FechaCompra.Text = g_mdl_COM_FacturasCabecera.fecha.ToString("dd/MM/yyyy");
                    //Si esta vacio la fecha de inicio de amortizacion se pone tambien
                    if (g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.Exferia_FechaSeleccion_Fecha.Trim(' ', '/')=="")
                    {
                        g_frm_P_Inmovilizado.Exferia_FechaSeleccion_FechaAmortizacion.Exferia_FechaSeleccion_Fecha = g_mdl_COM_FacturasCabecera.fecha.ToString("dd/MM/yyyy");
                    }

                    //importe de compra
                    g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_ImporteCompra.Text = string.Format("{0:0.00}", (g_mdl_COM_FacturasCabecera.total_baseImponible!=null ? g_mdl_COM_FacturasCabecera.total_baseImponible.Value : 0M));
                    //Si esta vacio el importe amortizable se pone tambien
                    if (g_frm_P_Inmovilizado.Exferia_TextBox_ImporteAmortizable.Text.Trim().Length==0)
                    {
                        g_frm_P_Inmovilizado.Exferia_TextBox_ImporteAmortizable.Text = string.Format("{0:0.00}", (g_mdl_COM_FacturasCabecera.total_baseImponible != null ? g_mdl_COM_FacturasCabecera.total_baseImponible.Value : 0M));
                    }

                    #region Ejercicio
                    GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa=Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(g_mdl_COM_FacturasCabecera.fecha, g_mdl_COM_FacturasCabecera.idEmpresa);

                    if (mdl_GEN_EjerciciosActivos_Empresa!=null)
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Id = mdl_GEN_EjerciciosActivos_Empresa.id;
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Codigo = mdl_GEN_EjerciciosActivos_Empresa.anioControl;
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Descripcion = mdl_GEN_EjerciciosActivos_Empresa.descripcion;
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_FechaBorrado = mdl_GEN_EjerciciosActivos_Empresa.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Id = -1;
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Codigo = "";
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Descripcion = "";
                        g_frm_P_Inmovilizado.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_FechaBorrado = null;
                    }
                    #endregion
                }
                else
                {
                    FacturaCabecera_VaciarDatos();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(FacturaCabecera_RellenarDatosAuxiliares));
            }
        }

        public void FacturaCabecera_VaciarDatos()
        {
            try
            {
                //Proveedor_Codigo
                g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_Proveedor_Codigo.Text = "";

                //Proveedor_Descripcion
                g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_Proveedor_Descripcion.Text = "";

                //NumeroFactura
                g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_NumeroFactura.Text = "";

                //FechaCompra
                g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_FechaCompra.Text = "";

                //ImporteCompra
                g_frm_P_Inmovilizado.Exferia_TextBox_DatosFactura_ImporteCompra.Text = "";
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Inmovilizado_Controladora) + "/" + nameof(FacturaCabecera_VaciarDatos));
            }
        }
        #endregion

    }
}
