//Método que comprueba si una determinada semana ya existe en la nómina
        public static bool ExisteNomina(ref Nomina[] Nomina, int semana)
        {
            bool existe = false;

            if (Nomina.Length == 0) //Si el array con las nóminas está vacio se crea con tantos espacios como semana queremos comprobar
            {
                Nomina = new Nomina[semana];
                existe = false;
            }
            else if (Nomina.Length < semana)     //Si la longitud del Array de Nóminas es menor que la semana que queremos introducir.
            {
                existe = false;                  //Indica que la semana no existe
            }
            else if (Nomina[semana - 1] != null) //Si el espacio correspondiente a la semana dentro del array no es nulo, entonces existe.
            {
                existe = true;
            }
            return(existe);
        }
        //Añadir semanas a la nómina. Pasamos tanto la nómina temporal como un la semana a añadir mediante referencias.
        public static void CreaSemana(ref Nomina[] Nomina, ref Nomina semana)
        {
            String cadena = null;

            Nomina[] nomcop = null;

            if (semana.ID_pre < Nomina.Length) //Si el número de semana es menor que la longitud de la semana, se inserta en su posición.
            {
                Nomina[semana.ID_pre - 1] = semana;
            }
            else //En caso contrario redimensionamos la nómina para hacer sitio a la nueva semana y se inserta en su posición.
            {
                nomcop = new Nomina[Nomina.Length];
                Nomina.CopyTo(nomcop, 0);
                Nomina = new Nomina[semana.ID_pre + 1];
                nomcop.CopyTo(Nomina, 0);
                nomcop = null;
            }
            Nomina[semana.ID_pre - 1] = semana;

            // SALIDA
            cadena += "\n\n\t Se ha añadido la semana " + semana.ID_pre;
        }
        //Método de eliminación de semana
        public static void ProcesoEliminarSemana(ref Nomina[] Nomina, int semana)
        {
            int i = 0;
            int j = 0;

            Nomina[] copiaNomina;
            bool     existesemana;
            String   cadena = "";

            //Existe la semana?
            existesemana = ExisteNomina(ref Nomina, semana);
            if (!existesemana)
            {
                cadena = "\n\t\t La semana no existe";
            }
            else//Si la semana existe
            {
                copiaNomina = new Nomina[Nomina.Length]; //Creamos un Array en el que copiamos la nómina


                for (i = 0; i <= copiaNomina.Length - 1; i++, j++)
                {
                    if (i != (semana - 1)) //En caso que el contador sea distinto a la posición de la seman en el array se copia en copianomina
                    {
                        copiaNomina[j] = Nomina[i];
                    }
                }
                //Array dinámico (Una vez copiado todo, redimensionamos el array eliminando una seman y vaciándolo
                Nomina = new Nomina[copiaNomina.Length];
                copiaNomina.CopyTo(Nomina, 0); //Copiamos el array copia en la nómina
                                               //Ponemos el array de copia en Null para ahorrar memoria
                copiaNomina = null;
                cadena      = "\n\t\t Semana eliminada con éxito";
            }
            cadena += "\n\t\tPulse ENTER para continuar\n";
            Interfaz.Continuar(cadena);
        }
        //Métodos que controlan el funcionamiento de la clase GestionNomina y la Interfaz
        public static void GestionNominas(int numb, ref bool flag, string dni)
        {
            string fecha;
            Nomina[] Nomina = null;
            Nomina semana = null;
            try
            {
                //Recuperamos la nómina del trabajador y la cargamos en un Array de Nóminas de trabajo.
                Nomina = Ficheros.GetNomina(dni);
                //Ordenamos el array y lo redimensionamos, dejando huecos en las semanas no creadas aún
                Gestion_Nomina.OrdenaNomina(ref Nomina);

                switch (numb)
                {
                    case 0:
                        flag = true;
                        break;
                    //Introducir nóminas
                    case 1:
                        /*Comprobamos que el array no ha llenado los seis espacios que es el máximo de semanas
                        * que tiene un mes. En caso de haber huecos, lanzamos los métodos para pedir la semana
                        *  e introducirla en el array nómina, tras lo cual se almacena en el fichero.*/
                        if (!Gestion_Nomina.LimiteSemanas(Nomina))
                        {
                            semana = Interfaz.AgregarSemana(Nomina);
                            Gestion_Nomina.CreaSemana(ref Nomina, ref semana);
                            Ficheros.GuardarNominaTemporal(ref Nomina);
                        }
                        else
                        {
                            Interfaz.Error("No se pueden agregar más semanas, se ha alcanzado el máximo posible de semanas de un mes");
                        }
                        break;
                    //Modificar Nóminas
                    case 2:
                        /*Con esta opción vamos a cambiar los parámetros de la nómina, para lo que lanzamos el 
                        * método de cambio de la semana. Y, una vez terminado, se guarda la nómina en el fichero.*/
                        Gestion_Nomina.CambiaSemana(ref Nomina);
                        Ficheros.GuardarNominaTemporal(ref Nomina);
                        break;

                    //Modificar archivo de configuracion
                    case 3:
                        /* Esta opción lanza una interfaz que nos va a permitir modificar los parámetros almacenados en 
                        * app.config, previa validación de la contraseña de administrador*/
                        int option = 0;
                        float valor = 0;
                        string pass = null;
                        pass = Interfaz.PedirContraseña();
                        if (GestionNegocio.ValidarContraseña(pass))
                        {
                            Interfaz.PedirDatosArchivoConf(ref option, ref valor);
                            Ficheros.ModConfig(option, valor);
                            Interfaz.Continuar("Valor modificado con éxito");
                        }
                        else
                        {
                            Interfaz.Error("La contraseña no coincide.");
                            Interfaz.Continuar();
                            break;
                        }
                        break;
                    //Eliminar nominas
                    case 4:
                        /*La opción de eliminar nóminas a su vez lanza un menú por interfaz que permite eliminar una sóla semana
                        * del array de nóminas o, por el contrario, eliminar todas las posiciones de dicho array.
                        * Tanto en un método como en el otro, se lanza un método en gestión de nómina que es el que se encarga de 
                        * hacer la eliminación y redimensión del array. */
                        int ordinal = 0, opcion = 0;
                        opcion = Interfaz.EliminarSemanaOpcion();
                        if (opcion == 1)
                        {
                            ordinal = Interfaz.ElegirSemana(); // Pide la semana a eliminar
                            Gestion_Nomina.ProcesoEliminarSemana(ref Nomina, ordinal);
                        }
                        else
                        {
                            Gestion_Nomina.ProcesoEliminarNomina(ref Nomina);
                        }
                        Ficheros.GuardarNominaTemporal(ref Nomina);
                        break;
                    //Mostrar Nómina Temporal
                    case 5:
                        /*En esta opción se muestra la nómina temporal, con el número de semanas
                        * como los parámetros tales como número de horas, horas extra, 
                        * precio de la hora extra, porcentaje de retencion, etc.*/
                        Console.WriteLine(Interfaz.MostrarNominaTemporal(Nomina, dni));
                        Console.ReadLine();
                        break;
                    //Cerrar Nómina del Mes
                    case 6:
                        /*Este método sirve para guardar la nómina del mes, exportándola a un archivo de texto 
                        * (después de mostrarla en pantalla y pedir confirmación) y eliminar el archivo temporal*/
                        string cadena = null;
                        /*Se calculan los parámetros tales como horas extra trabajadas, salario base, extra, 
                        * retenciones y neto, y se almacenan en él array de nóminas*/
                        Gestion_Nomina.CalculaParcial(ref Nomina);
                        //La interfaz muestra por pantalla los parciales semanales y se devuelve en la variable cadena.
                        cadena = Interfaz.MostrarNomina(Nomina, dni);
                        //El método cierreMes devuelve (y concatena) en la variable cadena el resultado del cálculo de los totales de cada semana.
                        cadena += Interfaz.CierreMes(Nomina);
                        if (!Confirmar())//se pide confirmación para guardar los cambios.
                        {
                            //Almacena en el fichero
                            fecha = Interfaz.Pidefecha();//En este método vamos a pedir la fecha de mes y año de la nómina para almacenarla.
                            Ficheros.CerrarNomina(cadena, fecha);//En este método almacenamos la cadena de texto en un archivo nombrado con la fecha y el dni del trabajador.
                            //Eliminar fichero
                            Ficheros.BorrarTemporal(dni); //Eliminamos el fichero temporal de la nómina del sistema.
                            Interfaz.Continuar("Nómina Exportada Correctamente \n \t\tPulsa una tecla para continuar...");
                        }
                        else
                        {
                            Interfaz.Continuar();
                        }

                        break;
                }
            }
            catch (Exception e)
            {
                Interfaz.Error(e.Message);
                Interfaz.Continuar("Pulsa una tecla para continuar...");
            }
        }
        public static Nomina[] GetNomina(string dni) // OBTIENE TODAS LAS SEMANAS QUE TIENE ACTUALMENTE EL EMPLEADO
        {
            string ruta = null;
            int    id = 0, horas = 0;
            int    jornadapre = 0;
            float  hextraspre = 0.0F, retencionespre = 0.0F, preciopre = 0.0F;

            dni_glo = dni;
            ruta    = BuscarNombre(dni);
            Nomina Nom = null;

            Nomina[] ArraySemanas = null;
            doc = new XmlDocument();

            try
            {
                doc.Load(ruta);
                XmlNodeList ListaSemanas = doc.SelectNodes("Nomina/Semana"); // ACCEDE AL NODO SEMANA DENTRO DE NOMINA
                XmlNode     UnaSemana    = null;

                ArraySemanas = new Nomina[ListaSemanas.Count];
                for (int i = 0; i < ListaSemanas.Count; i++)
                {
                    Nom       = new Nomina();
                    UnaSemana = ListaSemanas.Item(i);                                                   // RECORRE CADA SEMANA Y OBTIENE SUS PROPIEDADES

                    id            = Int32.Parse(UnaSemana.Attributes.GetNamedItem("ID").InnerText);     // OBTIENE EL ID
                    Nom.ID_pre    = id;
                    horas         = Int32.Parse(UnaSemana.SelectSingleNode("Horas_Totales").InnerText); // OBTIENE LAS HORAS TOTALES DE LA SEMANA
                    Nom.Horas_pre = horas;
                    // Valores predeterminados CONF
                    jornadapre       = Int32.Parse(UnaSemana.SelectSingleNode("Jornada_Pre").InnerText);         // OBTIENE LA JORNADA PREDETERMINADA DE ESA SEMANA
                    Nom.JornadaPre   = jornadapre;
                    hextraspre       = Single.Parse(UnaSemana.SelectSingleNode("ValHExtras_Pre").InnerText);     // OBTIENE EL VALOR DE LAS HORAS EXTRAS
                    Nom.HextrasPre   = hextraspre;
                    preciopre        = Single.Parse(UnaSemana.SelectSingleNode("ValPrecio_Hora_Pre").InnerText); // OBTIENE EL VALOR DE LA HORA ORDINARIA DE ESA SEMANA
                    Nom.PrecioPre    = preciopre;
                    retencionespre   = Single.Parse(UnaSemana.SelectSingleNode("ValRetencion_Pre").InnerText);   // OBTIENE LA RETENCION APLICADA ESA SEMANA
                    Nom.RetencionPre = retencionespre;
                    //

                    ArraySemanas[i] = Nom; // METE EN EL ARRAY EL OBJETO DE LA SEMANA CREADO
                }
            }
            catch (FileNotFoundException)
            {
                throw new Exception("Archivo no encontrado");
            }
            catch (ArgumentException)
            {
                throw new Exception("El archivo al que trata de acceder esta vacio. Por favor inserte minimo un trabajador.");
            }
            catch (XmlException)
            {
                throw new Exception("No se ha podido abrir el archivo, revise el contenido.");
            }
            catch (NullReferenceException)
            {
                throw new Exception("Falta un elemento en el archivo, revíse el contenido.");
            }
            return(ArraySemanas);
        }
 //Calculo del salario Extra
 private static void CalculoSalarioExtra(ref Nomina nomina)
 {
     nomina.SalExtra_pre = nomina.HExtra_pre * nomina.PrecioPre * nomina.HextrasPre;
 }
 //Cálculo del salario Neto
 private static void CalculoSalarioNeto(ref Nomina nomina)
 {
     nomina.SalNeto_pre = nomina.SalBruto_pre - nomina.SalRetencion_pre;
 }
 //Cálculo de las retenciones
 private static void CalculoRetenciones(ref Nomina nomina)
 {
     nomina.SalRetencion_pre = nomina.SalBruto_pre * nomina.RetencionPre;
 }