import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author Billy Joel
*/
public final class COMOLSA {
Map<String, Trabajador> trabajadores;
public static final String FILE_TRABAJADORES = "C:\\COMOLSA_Trabajadores.txt";
public static final int OPCION_REGISTRAR_TRABAJADOR = 1;
public static final int OPCION_MOSTRAR_TRABAJADORES = 2;
public static final int OPCION_ACTUALIZAR_DATOS_TRABAJADOR = 3;
public static final int OPCION_BORRAR_TRABAJADOR = 4;
public static final int OPCION_SALIR = 5;
public COMOLSA() {
trabajadores = new HashMap();
cargarTrabajadores();
}
/**
* Método utilizado para leer cadenas o strings
*
* @param mensaje
* @return
*/
public static String leerString(String mensaje) {
String s = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print(mensaje);
s = br.readLine();
} catch (IOException ex) {
System.out.println("Hubo un error de lectura");
ex.printStackTrace(System.out);
}
if (s == null) {
s = leerString(mensaje);
}
return s;
}
/**
* Método utilizado para leer número enteros
*
* @param mensaje
* @return
*/
public static Integer leerInt(String mensaje) {
Integer i = null;
try {
i = Integer.parseInt(leerString(mensaje));
} catch (NumberFormatException ex) {
System.out.println("Hubo un error de formato");
ex.printStackTrace(System.out);
}
if (i == null) {
i = leerInt(mensaje);
}
return i;
}
/**
* Método utilizado para leer números doubles
*
* @param mensaje
* @return
*/
public static Double leerDouble(String mensaje) {
Double d = null;
try {
d = Double.parseDouble(leerString(mensaje));
} catch (NumberFormatException ex) {
System.out.println("Hubo un error de formato");
ex.printStackTrace(System.out);
}
if (d == null) {
d = leerDouble(mensaje);
}
return d;
}
/**
* Guarda los datos de los trabajadores en un archivo
*/
public void guardarTrabajadores() {
FileWriter fichero = null;
PrintWriter pw;
try {
fichero = new FileWriter(FILE_TRABAJADORES);
pw = new PrintWriter(fichero);
trabajadores.entrySet().forEach(e -> {
pw.println(
e.getValue().getNombres()
+ "\t" + e.getValue().getApellidos()
+ "\t" + e.getValue().getEstadoCivil()
+ "\t" + e.getValue().getHorasTrabajadas()
+ "\t" + e.getValue().getValorPorHora()
);
});
} catch (IOException ex) {
ex.printStackTrace(System.out);
} finally {
try {
if (fichero != null) {
fichero.close();
}
} catch (IOException ex) {
ex.printStackTrace(System.out);
}
}
}
/**
* Carga los datos de los trabajadores desde el archivo
*/
public void cargarTrabajadores() {
File archivo;
FileReader fr = null;
BufferedReader br;
trabajadores.clear();
try {
archivo = new File(FILE_TRABAJADORES);
if (!archivo.exists()) {
return;
}
fr = new FileReader(archivo);
br = new BufferedReader(fr);
String linea;
while ((linea = br.readLine()) != null) {
String[] l = linea.split("\t");
String nombres = l[0];
String apellidos = l[1];
String estadoCivil = l[2];
int horasTrabajadas = Integer.parseInt(l[3]);
double valorPorHora = Double.parseDouble(l[4]);
Trabajador t = new Trabajador(nombres, apellidos, estadoCivil, horasTrabajadas, valorPorHora);
trabajadores.put(t.getNombres() + " " + t.getApellidos(), t);
}
} catch (IOException ex) {
ex.printStackTrace(System.out);
} finally {
try {
if (fr != null) {
fr.close();
}
} catch (IOException ex) {
ex.printStackTrace(System.out);
}
}
}
/**
* Captura los datos del trabajador y los registra en el mapa de
* trabajadores
*/
public void registrarTrabajador() {
System.out.println("Favor a continuación introduzca los datos del trabajador");
String nombre = leerString("Introduzca el nombre: ");
String apellidos = leerString("Introduzca los apellidos: ");
int ec = leerInt("Introduzca 0 si el estado civil es " + Trabajador.ESTADO_CIVIL_SOLTERO + " de otro modo introduzca 1 si el estado civil es " + Trabajador.ESTADO_CIVIL_CASADO);
while (ec < 0 || ec > 1) {
System.out.println("Opción incorrecta, vuelva a introducir");
ec = leerInt("Introduzca 0 si el estado civil es " + Trabajador.ESTADO_CIVIL_SOLTERO + " de otro modo introduzca 1 si el estado civil es " + Trabajador.ESTADO_CIVIL_CASADO);
}
String estadoCivil = ec == 0 ? Trabajador.ESTADO_CIVIL_SOLTERO : Trabajador.ESTADO_CIVIL_CASADO;
int horasTrabajadas = leerInt("Introduzca la cantidad de horas trabajadas: ");
while (horasTrabajadas < 0) {
System.out.println("Cantidad incorrecta, vuelva a intentar");
horasTrabajadas = leerInt("Introduzca la cantidad de horas trabajadas: ");
}
double valorPorHora = leerDouble("Introduzca el valor por hora: ");
while (valorPorHora < 0) {
System.out.println("Valor incorrecta, vuelva a intentar");
valorPorHora = leerDouble("Introduzca el valor por hora: ");
}
Trabajador t = new Trabajador(nombre, apellidos, estadoCivil, horasTrabajadas, valorPorHora);
if (trabajadores.containsKey(t.getNombres() + " " + t.getApellidos())) {
System.out.println("El trabajador ya estaba registrado");
} else {
System.out.println("El trabajador ha sido registrado");
}
}
/**
* Hace los cálculos de salario de un trabajador
*
* @param t
*/
public void calcularSalario(Trabajador t) {
double salarioBruto = t.getHorasTrabajadas() * t.getValorPorHora();
double impuestos = salarioBruto - (salarioBruto * 0.13);
double bonificacion = t.getEstadoCivil().equals(Trabajador.ESTADO_CIVIL_CASADO) ? (salarioBruto * 0.07) : 0.00;
double salarioNeto = salarioBruto - impuestos + bonificacion;
System.out.println(t.toString()
+ "\nSalario bruto: " + String.format("%.2f", salarioBruto)
+ "\nImpuestos SNP: " + String.format("%.2f", impuestos)
+ "\nBonificación familiar: " + String.format("%.2f", bonificacion)
+ "\nSalario neto: " + String.format("%.2f", salarioNeto)
);
}
public void iniciarMenu() {
int opcion;
do {
opcion = leerInt("Menú"
+ "\nIntroduzca " + OPCION_REGISTRAR_TRABAJADOR + " para registrar un trabajador"
+ "\nIntroduzca " + OPCION_MOSTRAR_TRABAJADORES + " para mostrar los trabajadores registrados"
+ "\nIntroduzca " + OPCION_ACTUALIZAR_DATOS_TRABAJADOR + " para actualizar los datos de un trabajador"
+ "\nIntroduzca " + OPCION_BORRAR_TRABAJADOR + " para borrar un trabajador"
+ "\nIntroduzca " + OPCION_SALIR + " para salir: ");
switch (opcion) {
case OPCION_REGISTRAR_TRABAJADOR:
registrarTrabajador();
break;
case OPCION_MOSTRAR_TRABAJADORES:
mostrarTrabajadores();
break;
case OPCION_ACTUALIZAR_DATOS_TRABAJADOR:
actualizarDatosTrabajador();
break;
case OPCION_BORRAR_TRABAJADOR:
borrarTrabajador();
break;
case OPCION_SALIR:
salir();
break;
default:
System.out.println("Opción incorrecta!");
break;
}
} while (opcion != OPCION_SALIR);
}
/**
* Actualiza los datos de un trabajador
*/
public void actualizarDatosTrabajador() {
System.out.println("Actualizar datos de trabajador");
String nombreCompleto = leerString("Introduzca el nombre completo del trabajador: ");
if (trabajadores.containsKey(nombreCompleto)) {
Trabajador t = trabajadores.get(nombreCompleto);
System.out.println("Estos son los datos del trabajador\n" + t.toString());
int ec = leerInt("Introduzca 0 si el estado civil es " + Trabajador.ESTADO_CIVIL_SOLTERO + " de otro modo introduzca 1 si el estado civil es " + Trabajador.ESTADO_CIVIL_CASADO);
while (ec < 0 || ec > 1) {
System.out.println("Opción incorrecta, vuelva a introducir");
ec = leerInt("Introduzca 0 si el estado civil es " + Trabajador.ESTADO_CIVIL_SOLTERO + " de otro modo introduzca 1 si el estado civil es " + Trabajador.ESTADO_CIVIL_CASADO);
}
String estadoCivil = ec == 0 ? Trabajador.ESTADO_CIVIL_SOLTERO : Trabajador.ESTADO_CIVIL_CASADO;
int horasTrabajadas = leerInt("Introduzca la cantidad de horas trabajadas: ");
while (horasTrabajadas < 0) {
System.out.println("Cantidad incorrecta, vuelva a intentar");
horasTrabajadas = leerInt("Introduzca la cantidad de horas trabajadas: ");
}
double valorPorHora = leerDouble("Introduzca el valor por hora: ");
while (valorPorHora < 0) {
System.out.println("Valor incorrecta, vuelva a intentar");
valorPorHora = leerDouble("Introduzca el valor por hora: ");
}
t.setEstadoCivil(estadoCivil);
t.setHorasTrabajadas(horasTrabajadas);
t.setValorPorHora(valorPorHora);
} else {
System.out.println("El nombre ingresado no se encuentra");
}
}
/**
* Borra los datos de un trabajador
*/
public void borrarTrabajador() {
System.out.println("Borrar trabajador");
String nombreCompleto = leerString("Introduzca el nombre completo del trabajador: ");
if (trabajadores.containsKey(nombreCompleto)) {
trabajadores.remove(nombreCompleto);
System.out.println("El trabajador ha sido borrado");
} else {
System.out.println("El nombre ingresado no se encuentra");
}
}
/**
* Muestra los datos de los trabajadores
*/
public void mostrarTrabajadores() {
trabajadores.forEach((nombreCompleto, trabajador) -> {
System.out.println("Datos de " + nombreCompleto
+ "\n" + trabajador.toString());
System.out.println("---------------------------------------------");
});
}
/**
* Guarda los datos de los trabajadores en el archivo y muestra un mensaje
* de salida
*/
public void salir() {
guardarTrabajadores();
System.out.println("Ha escogido la opción salir. Adios!!");
}
public static void main(String[] args) {
COMOLSA c = new COMOLSA();
c.iniciarMenu();
}
}