using Exferia_Aplicacion.General;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_General._3_Vistas.ListadosSeleccion;
using Exferia_Maestros._0_Modelos;
using Exferia_Maestros._1_Datos;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;

namespace Exferia_Maestros._3_Vistas.Controladoras
{
    public class P_ArticuloTemporada_Controladora
    {
        #region Variables Generales 
        private P_ArticuloTemporada g_frm_P_ArticuloTemporada = null;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        //Clases de Negocio Necesarias para la carga de datos
        private MAE_Articulos_Temporadas_Datos g_obj_MAE_Articulos_Temporadas_Datos = new MAE_Articulos_Temporadas_Datos();

        private MAE_Articulos_Temporadas g_mdl_MAE_Articulos_Temporadas = null;
        private INTERNO_MAE_Articulos_Modelo g_mdl_INTERNO_MAE_Articulos_Modelo = null;

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

        //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;
        public bool g_bol_GrabarDatos_VaciarDatos = false;

        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;
        #endregion

        #region Constuctor
        public P_ArticuloTemporada_Controladora(P_ArticuloTemporada _frm_P_ArticuloTemporada, INTERNO_MAE_Articulos_Modelo _mdl_INTERNO_MAE_Articulos_Modelo)
        {
            g_frm_P_ArticuloTemporada = _frm_P_ArticuloTemporada;
            g_mdl_INTERNO_MAE_Articulos_Modelo = _mdl_INTERNO_MAE_Articulos_Modelo;

            Datos_Iniciales();

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        private void Datos_Iniciales()
        {
            try
            {
                g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde.Text=   g_frm_P_ArticuloTemporada.P_Base_ValoresGenerales.EjercicioActivo.temporadaFechaInicio.ToString("dd/MM");
                g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta.Text = g_frm_P_ArticuloTemporada.P_Base_ValoresGenerales.EjercicioActivo.temporadaFechaFin.ToString("dd/MM");
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "" + nameof(Datos_Iniciales));
            }
        }

        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            g_mdl_MAE_Articulos_Temporadas = null;

            //Desde
            g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde.Text = g_frm_P_ArticuloTemporada.P_Base_ValoresGenerales.EjercicioActivo.temporadaFechaInicio.ToString("dd/MM");

            //Hasta
            g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta.Text = g_frm_P_ArticuloTemporada.P_Base_ValoresGenerales.EjercicioActivo.temporadaFechaFin.ToString("dd/MM");

            //CantidadMinima
            g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMinima.Text = "";

            //CantidadMaxima
            g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMaxima.Text = "";

            //PuntoPedido
            g_frm_P_ArticuloTemporada.Exferia_TextBox_PuntoPedido.Text = "1,000";

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

            //Actualizar el Boton de Seleccion de pantalla ####################################################
            Variables.G_EMS_CONTROL_MENUSUPERIOR.Update_Texto_NombrePantalla(g_frm_P_ArticuloTemporada.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_ArticuloTemporada.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(false);

                    //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 Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_ArticuloTemporada.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();

                    //Vaciar
                    VaciarDatos();
                }
                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;
                }

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_ArticuloTemporada.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_ArticuloTemporada_Controladora) + "/" + nameof(RecargarDatos), true);
            }
        }
        private void TareaAsincrona_CargarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                // Cargar Valores
                if (CargarDatos(g_frm_P_ArticuloTemporada.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_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_ArticuloTemporada.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_ArticuloTemporada.Salir_P_Base();
                }

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_ArticuloTemporada.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                Funciones.Poner_Foco_Objeto(g_frm_P_ArticuloTemporada, g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde);
            }
        }
        public bool CargarDatos(long _lng_id)
        {
            bool bol_ValorDevuelto = true;
            try
            {
                g_mdl_MAE_Articulos_Temporadas = g_obj_MAE_Articulos_Temporadas_Datos.Obtener(_lng_id);

                //Si no es Nulo Cargo lo Datos
                if (g_mdl_MAE_Articulos_Temporadas != null)
                {
                    //Paginador ................................................................................
                    if (g_frm_P_ArticuloTemporada.P_Base_PantallaOrigen != null &&
                        g_frm_P_ArticuloTemporada.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                        g_frm_P_ArticuloTemporada.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_MAE_Articulos_Temporadas.id;
                        int int_PaginaDelObjeto = g_frm_P_ArticuloTemporada.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_ArticuloTemporada.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

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

                    // Desde
                    DateTime dtt_Desde = new DateTime(DateTime.Now.Year, g_mdl_MAE_Articulos_Temporadas.desde_Mes, g_mdl_MAE_Articulos_Temporadas.desde_Dia);
                    g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde.Text = dtt_Desde.ToString("dd/MM");

                    // hasta
                    DateTime dtt_Hasta = new DateTime(DateTime.Now.Year, g_mdl_MAE_Articulos_Temporadas.hasta_Mes, g_mdl_MAE_Articulos_Temporadas.hasta_Dia);
                    g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta.Text = dtt_Hasta.ToString("dd/MM");

                    // cantidad_Minima
                    g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMinima.Text = g_mdl_MAE_Articulos_Temporadas.cantidad_Minima!=null ? string.Format("{0:0.000}", g_mdl_MAE_Articulos_Temporadas.cantidad_Minima.Value) : ""; 

                    // cantidad_Maxima
                    g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMaxima.Text = g_mdl_MAE_Articulos_Temporadas.cantidad_Maxima != null ? string.Format("{0:0.000}", g_mdl_MAE_Articulos_Temporadas.cantidad_Maxima.Value) : "";

                    // puntoPedido
                    g_frm_P_ArticuloTemporada.Exferia_TextBox_PuntoPedido.Text = string.Format("{0:0.000}", g_mdl_MAE_Articulos_Temporadas.puntoPedido);

                    // Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior_Codigo = "";
                    if (g_frm_P_ArticuloTemporada.g_mdl_PRV_OpcionesDetalle != null &&
                        g_frm_P_ArticuloTemporada.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                        g_frm_P_ArticuloTemporada.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de Campos
                        string[] arr_Campos = g_frm_P_ArticuloTemporada.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_ArticuloTemporada.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_ArticuloTemporada.P_Base_TituloPantalla = (g_frm_P_ArticuloTemporada.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

                        dynamic dnm_Objeto = g_mdl_MAE_Articulos_Temporadas;
                        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;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_ArticuloTemporada.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_ArticuloTemporada.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

                    g_frm_P_ArticuloTemporada.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "/" + nameof(CargarDatos));
                bol_ValorDevuelto = false;
            }

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos

        public void GrabarDatos(bool _bol_GrabarDatos_VaciarDatos)
        {
            try
            {
                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_bol_GrabarDatos_VaciarDatos = _bol_GrabarDatos_VaciarDatos;

                g_frm_P_ArticuloTemporada.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_ArticuloTemporada.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_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_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

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

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            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_ArticuloTemporada_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_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_ArticuloTemporada.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)
                {
                    g_bol_GrabarDatos_TerminoCorrectamente = false;

                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);

                        //Poner el Foco en el objeto que tuvoel problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_ArticuloTemporada, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }
                }
                else
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_ArticuloTemporada.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);

                    g_frm_P_ArticuloTemporada.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //Vaciar los datos para que se pueda meter otro linea
                    if (g_bol_GrabarDatos_VaciarDatos)
                    {
                        VaciarDatos();
                    }

                    //Poner el Foco Inicial
                    Funciones.Poner_Foco_Objeto(g_frm_P_ArticuloTemporada, g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMinima);
                   
                    //Se pone para que no pregunte si se modifico algo
                    g_frm_P_ArticuloTemporada.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

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

            try
            {
                // Desde debe ser correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Desde = "";
                    if (g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde.Text.Trim(' ', '/').Length > 0)
                    {
                        str_Desde = g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde.Text + "/" + DateTime.Now.Year;
                    }

                    int int_fecha_Respuesta = Funciones.Fecha_Validacion(str_Desde);

                    if (int_fecha_Respuesta == 1)//Vacia
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_ArticuloTemporada.Exferia_Label_Desde.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde;
                    }
                    else if (int_fecha_Respuesta == 2)//Incorrecta
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_ArticuloTemporada.Exferia_Label_Desde.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde;
                    }
                }

                // Hasta debe ser correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Hasta = "";
                    if (g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta.Text.Trim(' ', '/').Length > 0)
                    {
                        str_Hasta = g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta.Text + "/" + DateTime.Now.Year;
                    }

                    int int_fecha_Respuesta = Funciones.Fecha_Validacion(str_Hasta);

                    if (int_fecha_Respuesta == 1)//Vacia
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_ArticuloTemporada.Exferia_Label_Hasta.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta;
                    }
                    else if (int_fecha_Respuesta == 2)//Incorrecta
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_ArticuloTemporada.Exferia_Label_Hasta.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta;
                    }
                }

                //Comprobar que las fechas no estan contenidas en otras
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    //Obtener todas las temporadas para este articulo
                    List<MAE_Articulos_Temporadas> lst_MAE_Articulos_Temporadas = g_obj_MAE_Articulos_Temporadas_Datos.Obtener_ModeloListado_Por_IdArticulo_SinID(g_mdl_INTERNO_MAE_Articulos_Modelo.id, (g_mdl_MAE_Articulos_Temporadas != null ? g_mdl_MAE_Articulos_Temporadas.id : -1));

                    if (lst_MAE_Articulos_Temporadas!=null && lst_MAE_Articulos_Temporadas.Count>0)
                    {
                        int int_Anyo = DateTime.Now.Year;

                        //Desde
                        DateTime dtt_Desde = DateTime.ParseExact(g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde.Text + "/" + int_Anyo, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                        
                        //Hasta
                        DateTime dtt_Hasta = DateTime.ParseExact(g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta.Text + "/" + int_Anyo, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                        //Si el mes es mas pequeño que el de desde, se suma un año
                        if (dtt_Desde.Month > dtt_Hasta.Month)
                        {
                            dtt_Hasta = dtt_Hasta.AddYears(1);
                        }

                        foreach (MAE_Articulos_Temporadas mdl_MAE_Articulos_Temporadas in lst_MAE_Articulos_Temporadas)
                        {
                            //Desde
                            DateTime dtt_FechaDesde_BD=new DateTime(DateTime.Now.Year, mdl_MAE_Articulos_Temporadas.desde_Mes, mdl_MAE_Articulos_Temporadas.desde_Dia);

                            //Hasta
                            DateTime dtt_FechaHasta_BD = new DateTime(DateTime.Now.Year, mdl_MAE_Articulos_Temporadas.hasta_Mes, mdl_MAE_Articulos_Temporadas.hasta_Dia);

                            //Si el mes es mas pequeño que el de desde, se suma un año
                            if (dtt_FechaDesde_BD.Month > dtt_FechaHasta_BD.Month)
                            {
                                dtt_FechaHasta_BD = dtt_FechaHasta_BD.AddYears(1);
                            }

                            //Cuando se salta de año
                            if ((
                                    dtt_Desde >= dtt_FechaDesde_BD &&
                                    dtt_Desde <= dtt_FechaHasta_BD
                                )
                                ||
                                (
                                    dtt_Hasta >= dtt_FechaDesde_BD &&
                                    dtt_Hasta <= dtt_FechaHasta_BD
                                )
                                ||
                                (
                                    dtt_Desde < dtt_FechaDesde_BD &&
                                    dtt_Hasta > dtt_FechaHasta_BD
                                )
                                )
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_VALIDACION_FECHASEJERCICIOS_FECHACONTENIDADENTRODEOTRA();
                                mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta;

                                break;
                            }
                        }
                    }
                }

                //Si la cantidad minima tien valor debe ser positivo 
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && 
                    g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMinima.Text.Trim().Length > 0 &&
                    decimal.Parse(g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMinima.Text.Trim()) < 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_POSITIVO(g_frm_P_ArticuloTemporada.Exferia_Label_CantidadMinima.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMinima;
                }

                //Si la cantidad maxima tien valor debe ser positivo 
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMaxima.Text.Trim().Length > 0 &&
                    decimal.Parse(g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMaxima.Text.Trim()) < 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_POSITIVO(g_frm_P_ArticuloTemporada.Exferia_Label_CantidadMaxima.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMaxima;
                }

                //El PuntoPedido no puede ser vacio
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_ArticuloTemporada.Exferia_TextBox_PuntoPedido.Text.Trim().Length == 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_ArticuloTemporada.Exferia_Label_PuntoPedido.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_ArticuloTemporada.Exferia_TextBox_PuntoPedido;
                }

                //El PuntoPedido debe ser mayor que 0
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && decimal.Parse(g_frm_P_ArticuloTemporada.Exferia_TextBox_PuntoPedido.Text.Trim()) <= 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CERO(g_frm_P_ArticuloTemporada.Exferia_Label_PuntoPedido.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_ArticuloTemporada.Exferia_TextBox_PuntoPedido;
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "/" + nameof(ValidarDatos));

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            try
            {
                decimal? dcm_Nulo = null;

                MAE_Articulos_Temporadas mdl_MAE_Articulos_Temporadas = new MAE_Articulos_Temporadas();

                //id
                mdl_MAE_Articulos_Temporadas.id = g_mdl_MAE_Articulos_Temporadas != null ? g_mdl_MAE_Articulos_Temporadas.id : -1;

                //idArticulo
                mdl_MAE_Articulos_Temporadas.idArticulo = g_mdl_INTERNO_MAE_Articulos_Modelo.id;

                //Desde
                DateTime dtt_Desde=   DateTime.ParseExact(g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Desde.Text + "/" + DateTime.Now.Year, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                mdl_MAE_Articulos_Temporadas.desde_Dia = dtt_Desde.Day;
                mdl_MAE_Articulos_Temporadas.desde_Mes = dtt_Desde.Month;
                
                //Hasta
                DateTime dtt_Hasta = DateTime.ParseExact(g_frm_P_ArticuloTemporada.Exferia_TextBox_ConMascara_Hasta.Text + "/" + DateTime.Now.Year, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                mdl_MAE_Articulos_Temporadas.hasta_Dia = dtt_Hasta.Day;
                mdl_MAE_Articulos_Temporadas.hasta_Mes = dtt_Hasta.Month;
                
                //cantidad_Minima
                mdl_MAE_Articulos_Temporadas.cantidad_Minima = g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMinima.Text.Trim().Length>0 ?  Convert.ToDecimal(g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMinima.Text.Trim()) : dcm_Nulo;

                //cantidad_Maxima
                mdl_MAE_Articulos_Temporadas.cantidad_Maxima = g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMaxima.Text.Trim().Length > 0 ? Convert.ToDecimal(g_frm_P_ArticuloTemporada.Exferia_TextBox_CantidadMaxima.Text.Trim()) : dcm_Nulo;

                //puntoPedido
                mdl_MAE_Articulos_Temporadas.puntoPedido = Convert.ToDecimal(g_frm_P_ArticuloTemporada.Exferia_TextBox_PuntoPedido.Text.Trim());

                // Se graba el modelo ya relleno.
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_MAE_Articulos_Temporadas_Datos.Grabar(mdl_MAE_Articulos_Temporadas);

                //Recargar el Modelo de Linea 
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    g_mdl_MAE_Articulos_Temporadas = g_obj_MAE_Articulos_Temporadas_Datos.Obtener(mdl_INTERNO_ValorDevuelto_Modelo.Id);

                    //Si tienes Permisos para Borrar
                    g_frm_P_ArticuloTemporada.Exferia_Button_Borrar.Enabled = true;
                }
            }
            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_ArticuloTemporada_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_ArticuloTemporada.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_P_ArticuloTemporada.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_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_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                //Borrar
                mdl_INTERNO_ValorDevuelto_Modelo = BorrarDatos_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            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_ArticuloTemporada_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        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_ArticuloTemporada.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
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_ArticuloTemporada.g_mdl_PRV_OpcionesDetalle.opcion);

                    List<long> lst_id = new List<long>();
                    lst_id.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    lst_obj.Add(lst_id);

                    g_frm_P_ArticuloTemporada.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_ArticuloTemporada.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_ArticuloTemporada.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_MAE_Articulos_Temporadas_Datos.Borrar(g_mdl_MAE_Articulos_Temporadas != null ? g_mdl_MAE_Articulos_Temporadas.id : -1);
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ArticuloTemporada_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

    }
}
