//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; }