using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_Aplicacion.General;
using Exferia_Formularios;
using System.Reflection;
using System.Threading;
using System.Globalization;
using Exferia_General;
using static Exferia_Aplicacion.General.Enumerados;
using Exferia_Aplicacion.Modelos_Contabilidad;

namespace Exferia_Controles.ControlesAuxiliares
{
    public partial class CTU_Contabilidad_Extracto : UserControl
    {
        #region Variables
        private long g_lng_idMayor = -1;
        private string g_str_Mayor_Codigo = "";
        private string g_str_Mayor_Descripcion = "";
        private GEN_EjerciciosActivos_Empresa g_mdl_GEN_EjerciciosActivos_Empresa = null;

        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_Listado =null;
        private System.Windows.Forms.Timer g_timer_TareaAsincrona_Rellenar_Listado = new System.Windows.Forms.Timer();
        private List<long> g_lst_TareaAsincrona_Rellenar_Listado_LLAMADAS = new List<long>();

        private List<INTERNO_Contabilidad_Extracto_Modelo> g_lst_INTERNO_Contabilidad_Extracto_Modelo = null;
        private INTERNO_Contabilidad_Extracto_Modelo g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES = null;
        private string g_str_Opcion_OTROS_RESUMEN_ASIENTO = "OTROS_RESUMEN_ASIENTO";

        //Llamar al Progress
        private int g_int_TotalRegistrosInsertados = 0;

        internal List<INTERNO_Permisos_Modelo> g_lst_INTERNO_Permisos_Modelo_EXTRACTOS = null;

        private INTERNO_ValoresGenerales_Modelo g_mdl_INTERNO_ValoresGenerales_Modelo = null;
        private DateTime g_dtt_FechaTrabajo;

        #endregion

        public CTU_Contabilidad_Extracto()
        {
            InitializeComponent();

            Repintar.Empezar(this);

            //Colores de los totales
            ex_dgv_ExtractosTotales.DefaultCellStyle.BackColor = Colores.G_COLOR_LISTADO_TOTALES_FONDO;
            ex_dgv_ExtractosTotales.DefaultCellStyle.SelectionBackColor = Colores.G_COLOR_LISTADO_TOTALES_FONDO;
            ex_dgv_ExtractosTotales.RowsDefaultCellStyle.SelectionBackColor = Colores.G_COLOR_LISTADO_TOTALES_FONDO;
            ex_dgv_ExtractosTotales.DefaultCellStyle.ForeColor = Colores.G_COLOR_LISTADO_TOTALES_LETRA;
            ex_dgv_ExtractosTotales.DefaultCellStyle.SelectionForeColor = Colores.G_COLOR_LISTADO_TOTALES_LETRA;
            ex_dgv_ExtractosTotales.RowsDefaultCellStyle.SelectionForeColor = Colores.G_COLOR_LISTADO_TOTALES_LETRA;

            // (Tarea Asincrona) ###################################################################################
            g_obj_TareaAsincrona_Rellenar_Listado = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_Listado.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_Listado_DoWork);
            g_obj_TareaAsincrona_Rellenar_Listado.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_Listado_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_Listado.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_Listado_Completed);
            g_obj_TareaAsincrona_Rellenar_Listado.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_Listado.WorkerSupportsCancellation = true;

            Funciones_Timer();
        }

        #region Timers
        private void Funciones_Timer()
        {
            //## TareaAsincrona_Recargar_Datos_DiarioCabecera ###############################
            g_timer_TareaAsincrona_Rellenar_Listado.Interval = 500;
            g_timer_TareaAsincrona_Rellenar_Listado.Tick += delegate (object s, EventArgs ee)
            {
                g_timer_TareaAsincrona_Rellenar_Listado.Stop();

                if (g_lst_TareaAsincrona_Rellenar_Listado_LLAMADAS.Count > 0)
                {
                    try
                    {
                        //Borro el Listado
                        g_lst_TareaAsincrona_Rellenar_Listado_LLAMADAS.Clear();

                        g_obj_TareaAsincrona_Rellenar_Listado.CancelAsync();
                        while (g_obj_TareaAsincrona_Rellenar_Listado.IsBusy)
                        {
                            Application.DoEvents();
                        }

                        ex_dgv_Extractos.Rows.Clear();
                        ex_dgv_ExtractosTotales.Rows.Clear();

                        g_lst_INTERNO_Contabilidad_Extracto_Modelo = null;
                        g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES = null;

                        g_int_TotalRegistrosInsertados = 0;
                        ex_pgb_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                        ex_pgb_BarraProgreso.Exferia_BarraProgreso_Actualizar = 0;

                        ex_lbl_Cargando.Visible = true;
                        ex_lbl_Cargando.BringToFront();

                        //Empezar tareaAsincrona
                        g_obj_TareaAsincrona_Rellenar_Listado.RunWorkerAsync();
                    }
                    catch (Exception ex)
                    {
                        Control_Errores.Errores_Log("", ex, nameof(CTU_Contabilidad_Extracto) + "/" + nameof(Rellenar_Listado));
                        ex_lbl_Cargando.Visible = false;
                    }
                }
            };
            //#################################################################
        }
        #endregion

        public void Cargar_DatosAuxiliares(INTERNO_ValoresGenerales_Modelo _mdl_INTERNO_ValoresGenerales_Modelo, 
                                            DateTime _dtt_FechaTrabajo,
                                            List<INTERNO_Permisos_Modelo>  _lst_INTERNO_Permisos_Modelo_EXTRACTOS, 
                                            GEN_EjerciciosActivos_Empresa _mdl_GEN_EjerciciosActivos_Empresa)
        {
            g_mdl_INTERNO_ValoresGenerales_Modelo = _mdl_INTERNO_ValoresGenerales_Modelo;
            g_dtt_FechaTrabajo = _dtt_FechaTrabajo;
            g_lst_INTERNO_Permisos_Modelo_EXTRACTOS = _lst_INTERNO_Permisos_Modelo_EXTRACTOS;
            g_mdl_GEN_EjerciciosActivos_Empresa = _mdl_GEN_EjerciciosActivos_Empresa;
            
            //Rellenar las fechas
            if (ex_usc_Fecha_Desde.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') == "" ||
                ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') == "")
            {
                ex_usc_Fecha_Desde.Exferia_FechaSeleccion_Fecha = g_mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaInicio.ToString("dd/MM/yyyy");
                ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Fecha = g_mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin.ToString("dd/MM/yyyy");
            }
        }

        public void Vaciar_Datos()
        {
            try
            {
                if (g_obj_TareaAsincrona_Rellenar_Listado != null)
                {
                    g_obj_TareaAsincrona_Rellenar_Listado.CancelAsync();
                    while (g_obj_TareaAsincrona_Rellenar_Listado.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }

                //Guardar Variables
                g_lng_idMayor = -1;
                g_str_Mayor_Codigo = "";
                g_str_Mayor_Descripcion = "";
                
                //Rellenar datos del Mayor
                ex_lbl_Mayor_Codigo.Text = g_str_Mayor_Codigo;
                ex_lbl_Mayor_Descripcion.Text = g_str_Mayor_Descripcion;

                //Rellenar las fechas
                ex_usc_Fecha_Desde.Exferia_FechaSeleccion_Fecha = "";
                ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Fecha = "";

                ex_dgv_Extractos.Rows.Clear();
                ex_dgv_ExtractosTotales.Rows.Clear();

                g_int_TotalRegistrosInsertados = 0;
                ex_pgb_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                ex_pgb_BarraProgreso.Exferia_BarraProgreso_Actualizar = 0;

                g_lst_INTERNO_Contabilidad_Extracto_Modelo = null;
                g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES = null;

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

        public void Recargar_Datos(long _lng_idMayor,string _str_Mayor_Codigo,string _str_Mayor_Descripcion)
        {
            try
            {
                //Guardar Variables
                g_lng_idMayor = _lng_idMayor;
                g_str_Mayor_Codigo = _str_Mayor_Codigo;
                g_str_Mayor_Descripcion = _str_Mayor_Descripcion;


                //Rellenar datos del Mayor
                ex_lbl_Mayor_Codigo.Text = g_str_Mayor_Codigo;
                ex_lbl_Mayor_Descripcion.Text = g_str_Mayor_Descripcion;

                //Rellenar las fechas
                if (ex_usc_Fecha_Desde.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') == "" ||
                    ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') == "")
                {
                    ex_usc_Fecha_Desde.Exferia_FechaSeleccion_Fecha = g_mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaInicio.ToString("dd/MM/yyyy");
                    ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Fecha = g_mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin.ToString("dd/MM/yyyy");
                }

                Rellenar_Listado();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_Contabilidad_Extracto) + "/" + nameof(Recargar_Datos));
                ex_lbl_Cargando.Visible = false;
            }
        }

        #region Rellenar Listado
        private void Rellenar_Listado()
        {
            try
            {
                g_lst_TareaAsincrona_Rellenar_Listado_LLAMADAS.Add(DateTime.Now.Ticks);

                //Arranco el timer
                g_timer_TareaAsincrona_Rellenar_Listado.Start();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_Contabilidad_Extracto) + "/" + nameof(Rellenar_Listado));
                ex_lbl_Cargando.Visible = false;
            }
        }

        protected void TareaAsincrona_Rellenar_Listado_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //bUSCAR EL EJERCICIO DE LA PRIMERA FECHA
                GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa_INICIO=Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(DateTime.ParseExact(ex_usc_Fecha_Desde.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture), Variables.G_MDL_INTERNO_VALORESGENERALES_MODELO.lng_idEmpresa);
                GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa_FIN = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(DateTime.ParseExact(ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture), Variables.G_MDL_INTERNO_VALORESGENERALES_MODELO.lng_idEmpresa);


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

                object[] arr_parametros = { g_lng_idMayor,
                                            g_str_Mayor_Codigo,
                                            mdl_GEN_EjerciciosActivos_Empresa_INICIO.temporadaFechaInicio,
                                            mdl_GEN_EjerciciosActivos_Empresa_FIN.temporadaFechaFin,
                                            DateTime.ParseExact(ex_usc_Fecha_Desde.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture),
                                            DateTime.ParseExact(ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture)};

                //Pasamos los parametros al metodo y lo ejecutamos
                object obj= m.Invoke(obj_clase, arr_parametros);

                if (obj != null)
                {
                    g_lst_INTERNO_Contabilidad_Extracto_Modelo = (List<INTERNO_Contabilidad_Extracto_Modelo>)obj;

                    //Totales
                    g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES = new INTERNO_Contabilidad_Extracto_Modelo();
                    g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Concepto = "TOTALES";
                    g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Debe_AUX = 0m;
                    g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Haber_AUX = 0m;
                    g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Saldo = 0m;

                    ex_pgb_BarraProgreso.Exferia_BarraProgreso_Total = g_lst_INTERNO_Contabilidad_Extracto_Modelo.Count;

                    decimal dcm_SaldoAnterior = 0m;

                    INTERNO_Contabilidad_Extracto_Modelo mdl_INTERNO_Contabilidad_Extracto_Modelo_Anterior= g_lst_INTERNO_Contabilidad_Extracto_Modelo.Where(x => x.Anterior).FirstOrDefault();
                    if (mdl_INTERNO_Contabilidad_Extracto_Modelo_Anterior != null)
                    {
                        //Llamar al Progress
                        g_int_TotalRegistrosInsertados += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row(mdl_INTERNO_Contabilidad_Extracto_Modelo_Anterior));

                        //Sumar para los Totales
                        g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Debe_AUX += mdl_INTERNO_Contabilidad_Extracto_Modelo_Anterior.Debe;
                        g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Haber_AUX += mdl_INTERNO_Contabilidad_Extracto_Modelo_Anterior.Haber;
                        g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Saldo += mdl_INTERNO_Contabilidad_Extracto_Modelo_Anterior.Saldo;

                        dcm_SaldoAnterior = mdl_INTERNO_Contabilidad_Extracto_Modelo_Anterior.Saldo;
                    }

                    //Order el Listado
                    foreach (INTERNO_Contabilidad_Extracto_Modelo mdl_INTERNO_Contabilidad_Extracto_Modelo in g_lst_INTERNO_Contabilidad_Extracto_Modelo.Where(x => x.Anterior==false).OrderBy(x => x.Fecha).ThenBy(n=> n.Asiento).ToList())
                    {

                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Llamar al Progress
                        g_int_TotalRegistrosInsertados += 1;

                        mdl_INTERNO_Contabilidad_Extracto_Modelo.Saldo += dcm_SaldoAnterior;

                        dcm_SaldoAnterior = mdl_INTERNO_Contabilidad_Extracto_Modelo.Saldo;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row(mdl_INTERNO_Contabilidad_Extracto_Modelo));

                        //Esperar un poco
                        Thread.Sleep(1);

                        //Sumar para los Totales
                        g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Debe_AUX += mdl_INTERNO_Contabilidad_Extracto_Modelo.Debe;
                        g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Haber_AUX += mdl_INTERNO_Contabilidad_Extracto_Modelo.Haber;
                        g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES.Saldo = dcm_SaldoAnterior;
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
                Thread.ResetAbort();
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_Listado_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                ex_dgv_Extractos.Rows.Add((DataGridViewRow)e.UserState);

                ex_pgb_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados;

                if (ex_lbl_Cargando.Visible)
                {
                    ex_lbl_Cargando.Visible = false;
                }
            }
            catch (Exception)
            { }
        }
        protected void TareaAsincrona_Rellenar_Listado_Completed(object sender, RunWorkerCompletedEventArgs e)
        {

            ex_lbl_Cargando.Visible = false;

            if (e.Cancelled == false)
            {
                //Totales 
                try
                {
                    if (g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES != null)
                    {
                        ex_dgv_ExtractosTotales.Rows.Add(Transformar_Modelo_A_Row_TOTALES(g_mdl_INTERNO_Contabilidad_Extracto_Modelo_TOTALES));
                    }
                }
                catch (Exception)
                { }
            }
        }

        private DataGridViewRow Transformar_Modelo_A_Row(INTERNO_Contabilidad_Extracto_Modelo _mdl_INTERNO_Contabilidad_Extracto_Modelo)
        {
            DataGridViewRow obj_DataGridViewRow = (DataGridViewRow)ex_dgv_Extractos.RowTemplate.Clone();
            obj_DataGridViewRow.CreateCells(ex_dgv_Extractos);

            obj_DataGridViewRow.Cells[0].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.idDiarioCabecera!=null ? _mdl_INTERNO_Contabilidad_Extracto_Modelo.idDiarioCabecera.Value : -1;
            obj_DataGridViewRow.Cells[1].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.idDiarioLinea != null ? _mdl_INTERNO_Contabilidad_Extracto_Modelo.idDiarioLinea.Value : -1;

            obj_DataGridViewRow.Cells[3].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Asiento != null ? _mdl_INTERNO_Contabilidad_Extracto_Modelo.Asiento.Value.ToString() : "";
            obj_DataGridViewRow.Cells[4].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Fecha!=null ? _mdl_INTERNO_Contabilidad_Extracto_Modelo.Fecha.Value.ToString("dd/MM/yyyy") : "";
            obj_DataGridViewRow.Cells[5].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Concepto;
            obj_DataGridViewRow.Cells[6].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Debe;
            obj_DataGridViewRow.Cells[7].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Haber;
            obj_DataGridViewRow.Cells[8].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Saldo;


            return obj_DataGridViewRow;
        }
        private DataGridViewRow Transformar_Modelo_A_Row_TOTALES(INTERNO_Contabilidad_Extracto_Modelo _mdl_INTERNO_Contabilidad_Extracto_Modelo)
        {
            DataGridViewRow obj_DataGridViewRow = (DataGridViewRow)ex_dgv_ExtractosTotales.RowTemplate.Clone();
            obj_DataGridViewRow.CreateCells(ex_dgv_ExtractosTotales);

            obj_DataGridViewRow.Cells[0].Value = "";
            obj_DataGridViewRow.Cells[1].Value = "";
            obj_DataGridViewRow.Cells[2].Value = "";
            obj_DataGridViewRow.Cells[3].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Concepto;
            obj_DataGridViewRow.Cells[4].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Debe;
            obj_DataGridViewRow.Cells[5].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Haber;
            obj_DataGridViewRow.Cells[6].Value = _mdl_INTERNO_Contabilidad_Extracto_Modelo.Saldo;

            return obj_DataGridViewRow;
        }
        #endregion

        #region Actualizar
        private void ex_usc_Fecha_Hasta_Exferia_FechaSeleccion_TextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar.Equals((char)13))
            {
                Actualizar();
            }
        }
        private void ex_btn_Actualizar_Click(object sender, EventArgs e)
        {
            Actualizar();
        }
        private void Actualizar()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = ValidarDatos();
            if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto)
            {
                Rellenar_Listado();
            }
            else
            {
                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 problema en validar
                if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                {
                    Funciones.Poner_Foco_Objeto(null,mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                }
            }
        }
        private INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                if (g_lng_idMayor == -1 && g_str_Mayor_Codigo=="")
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO("No hay cuenta/código seleccionada.");
                    mdl_ValorDevuelto_Modelo.Objeto = null;
                }

                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    // La fecha Desde no puede estar vacia y debe ser correcta
                    int int_fecha_Respuesta = Funciones.Fecha_Validacion(ex_usc_Fecha_Desde.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

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

                    // La fecha Hasta no puede estar vacia y debe ser correcta
                    int_fecha_Respuesta = Funciones.Fecha_Validacion(ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

                    if (int_fecha_Respuesta == 1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = ex_usc_Fecha_Hasta;
                    }
                    else if (int_fecha_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(ex_usc_Fecha_Hasta.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = ex_usc_Fecha_Hasta;
                    }
                }
            }
            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.Message, ex, nameof(CTU_Contabilidad_Extracto) + "/" + nameof(ValidarDatos));

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

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        private void ex_dgv_Extractos_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 5 && ex_dgv_Extractos[1, e.RowIndex].Value.ToString() == "-1")
            {
                //Alineado
                e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Bold);

                //Colores
                ex_dgv_Extractos.Rows[e.RowIndex].DefaultCellStyle.BackColor = Colores.G_COLOR_LISTADO_TOTALES_FONDO;
                ex_dgv_Extractos.Rows[e.RowIndex].DefaultCellStyle.SelectionBackColor = Colores.G_COLOR_LISTADO_TOTALES_FONDO;
                ex_dgv_Extractos.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Colores.G_COLOR_LISTADO_TOTALES_LETRA;
                ex_dgv_Extractos.Rows[e.RowIndex].DefaultCellStyle.SelectionForeColor = Colores.G_COLOR_LISTADO_TOTALES_LETRA;
            }
        }
        private void ex_dgv_Extractos_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (ex_dgv_Extractos.Columns[e.ColumnIndex].Name == "VerAsiento")
                {
                    if (ex_dgv_Extractos[0, e.RowIndex].Value != null &&
                        !ex_dgv_Extractos[0, e.RowIndex].Value.ToString().Equals("-1"))
                    {
                        if (Datos_Generales.Permisos_Comprobar(g_str_Opcion_OTROS_RESUMEN_ASIENTO, g_lst_INTERNO_Permisos_Modelo_EXTRACTOS, (int)G_ENUM_PERMISOS.Ver, true))
                        {

                            INTERNO_OpcionesDetalle_Modelo mdl_INTERNO_OpcionesDetalle_Modelo = Datos_Generales.PRV_Opciones_Buscar_Detalles(Variables.G_STR_OPCION_CTA_DIARIOCABECERA);

                            //Cargamos el ensamblado
                            Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                            //Obtenemos el tipo de la clase
                            Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                            //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_OPCIONES_PROCEDIMIENTO_MOSTRAR_EN_MANTENIMIENTO, BindingFlags.Instance | BindingFlags.NonPublic);

                            List<object> lst_Argumentos = new List<object>();
                            lst_Argumentos.Add(ex_dgv_Extractos[3, e.RowIndex].Value.ToString());
                            lst_Argumentos.Add(g_mdl_GEN_EjerciciosActivos_Empresa.id);

                            object[] arr_Parametros = { Variables.G_STR_OPCION_CTA_DIARIOCABECERA,
                                                        null,
                                                        null,
                                                        g_mdl_INTERNO_ValoresGenerales_Modelo,
                                                        g_dtt_FechaTrabajo,
                                                        mdl_INTERNO_OpcionesDetalle_Modelo,
                                                        null,
                                                        "",
                                                        "",
                                                        lst_Argumentos,
                                                        null};
                            //Pasamos los parametros al metodo y lo ejecutamos
                            obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_Contabilidad_Extracto) + "/" + nameof(ex_dgv_Extractos_CellClick));
            }
        }
    }
}
