Semana 7 - Herencia en Java: Sistema de Empleados Colombiano
Este documento describe la implementación de herencia en Java para un sistema de gestión de empleados de una empresa colombiana, con una clase padre Empleado y dos clases hijas (EmpleadoTiempoCompleto y EmpleadoContratista), incluyendo cálculos de nómina y beneficios aplicables al contexto laboral colombiano.
Estructura de las Clases
Clase Padre: Empleado
Atributos:
nombre(String): Nombre completo del empleado (ej. "Carlos Andrés Pérez").cedula(String): Número de cédula de ciudadanía colombiana.cargo(String): Cargo o posición en la empresa (ej. "Desarrollador", "Contador").salarioBase(double): Salario base mensual en pesos colombianos (COP).fechaIngreso(String): Fecha de ingreso a la empresa en formato "dd/mm/yyyy".
Métodos y Lógica de Negocio:
calcularSalud(): Calcula el descuento de salud (4% del salario base) según la ley colombiana.calcularPension(): Calcula el descuento de pensión (4% del salario base) según la ley colombiana.calcularARL(): Calcula el aporte de ARL (0.522% del salario base) que paga la empresa.obtenerInformacion(): Devuelve información completa del empleado para reportes de nómina.calcularAntiguedad(): Calcula los años de antigüedad en la empresa.
Clase Hija: EmpleadoTiempoCompleto
Hereda de: Empleado
Atributos adicionales:
tieneTransporte(boolean): Indica si recibe auxilio de transporte.tieneAlimentacion(boolean): Indica si recibe auxilio de alimentación.diasVacaciones(int): Días de vacaciones acumulados (15 días hábiles por año en Colombia).
Métodos adicionales y Lógica de Negocio:
calcularAuxilioTransporte(): Calcula el auxilio de transporte ($140,606 COP en 2024) si aplica.calcularAuxilioAlimentacion(): Calcula el auxilio de alimentación si la empresa lo otorga.calcularPrimaServicios(): Calcula la prima de servicios (un salario al año dividido en dos pagos).calcularCesantias(): Calcula las cesantías (un salario por año trabajado).calcularInteresesCesantias(): Calcula los intereses de cesantías (12% anual sobre las cesantías).
Clase Hija: EmpleadoContratista
Hereda de: Empleado
Atributos adicionales:
tipoContrato(String): Tipo de contrato ("Prestación de servicios", "Obra labor").fechaFinContrato(String): Fecha de finalización del contrato.horasTrabajadas(int): Horas trabajadas en el mes.
Métodos adicionales y Lógica de Negocio:
calcularRetencionFuente(): Calcula la retención en la fuente según la tabla de retenciones colombiana.calcularICA(): Calcula el impuesto de Industria y Comercio (varía por municipio, promedio 0.7%).calcularPagoMensual(): Calcula el pago mensual basado en horas trabajadas.verificarEstadoContrato(): Verifica si el contrato está vigente o próximo a vencer.calcularFacturacion(): Calcula el valor total a facturar incluyendo IVA (19%).
Explicación de la Herencia
- La clase
Empleadoproporciona funcionalidades básicas comunes a todos los empleados de una empresa colombiana. - Las clases hijas (
EmpleadoTiempoCompleto,EmpleadoContratista) añaden características específicas según el tipo de vinculación laboral. - La herencia permite reutilizar código común (como cálculos de salud y pensión) mientras cada clase hija maneja sus particularidades.
- Los métodos se adaptan al contexto laboral colombiano: auxilios, prestaciones sociales, retenciones, etc.
- Esta estructura es ideal para sistemas de nómina, recursos humanos o contabilidad en empresas colombianas.
Implementación en Java
Clase Padre: Empleado
public class Empleado {
protected String nombre;
protected String cedula;
protected String cargo;
protected double salarioBase;
protected String fechaIngreso;
// Constructor
public Empleado(String nombre, String cedula, String cargo, double salarioBase, String fechaIngreso) {
this.nombre = nombre;
this.cedula = cedula;
this.cargo = cargo;
this.salarioBase = salarioBase;
this.fechaIngreso = fechaIngreso;
}
// Getters y Setters
public String getNombre() { return nombre; }
public void setNombre(String nombre) { this.nombre = nombre; }
public String getCedula() { return cedula; }
public void setCedula(String cedula) { this.cedula = cedula; }
public String getCargo() { return cargo; }
public void setCargo(String cargo) { this.cargo = cargo; }
public double getSalarioBase() { return salarioBase; }
public void setSalarioBase(double salarioBase) { this.salarioBase = salarioBase; }
public String getFechaIngreso() { return fechaIngreso; }
public void setFechaIngreso(String fechaIngreso) { this.fechaIngreso = fechaIngreso; }
// Métodos de lógica de negocio
public double calcularSalud() {
return salarioBase * 0.04; // 4% del salario base
}
public double calcularPension() {
return salarioBase * 0.04; // 4% del salario base
}
public double calcularARL() {
return salarioBase * 0.00522; // 0.522% del salario base
}
public String obtenerInformacion() {
return "Empleado: " + nombre + " - Cédula: " + cedula + " - Cargo: " + cargo +
" - Salario Base: $" + String.format("%.0f", salarioBase);
}
public int calcularAntiguedad() {
// Lógica simplificada - en implementación real se calcularía con fechas
return 2; // Ejemplo: 2 años de antigüedad
}
}
Clase Hija: EmpleadoTiempoCompleto
public class EmpleadoTiempoCompleto extends Empleado {
private boolean tieneTransporte;
private boolean tieneAlimentacion;
private int diasVacaciones;
// Constructor
public EmpleadoTiempoCompleto(String nombre, String cedula, String cargo, double salarioBase,
String fechaIngreso, boolean tieneTransporte, boolean tieneAlimentacion) {
super(nombre, cedula, cargo, salarioBase, fechaIngreso);
this.tieneTransporte = tieneTransporte;
this.tieneAlimentacion = tieneAlimentacion;
this.diasVacaciones = 15; // 15 días hábiles por año
}
// Getters y Setters específicos
public boolean isTieneTransporte() { return tieneTransporte; }
public void setTieneTransporte(boolean tieneTransporte) { this.tieneTransporte = tieneTransporte; }
public boolean isTieneAlimentacion() { return tieneAlimentacion; }
public void setTieneAlimentacion(boolean tieneAlimentacion) { this.tieneAlimentacion = tieneAlimentacion; }
public int getDiasVacaciones() { return diasVacaciones; }
public void setDiasVacaciones(int diasVacaciones) { this.diasVacaciones = diasVacaciones; }
// Métodos específicos de empleado tiempo completo
public double calcularAuxilioTransporte() {
if (tieneTransporte && salarioBase <= 2320000) { // Solo si gana menos de 2 SMMLV
return 140606; // Auxilio de transporte 2024
}
return 0;
}
public double calcularAuxilioAlimentacion() {
return tieneAlimentacion ? 150000 : 0; // Ejemplo: $150,000 COP
}
public double calcularPrimaServicios() {
return salarioBase; // Un salario completo al año (dividido en dos pagos)
}
public double calcularCesantias() {
return salarioBase * calcularAntiguedad(); // Un salario por año trabajado
}
public double calcularInteresesCesantias() {
return calcularCesantias() * 0.12; // 12% anual sobre las cesantías
}
public double calcularSalarioTotal() {
double descuentos = calcularSalud() + calcularPension();
double auxilios = calcularAuxilioTransporte() + calcularAuxilioAlimentacion();
return salarioBase - descuentos + auxilios;
}
}
Clase Hija: EmpleadoContratista
public class EmpleadoContratista extends Empleado {
private String tipoContrato;
private String fechaFinContrato;
private int horasTrabajadas;
// Constructor
public EmpleadoContratista(String nombre, String cedula, String cargo, double salarioBase,
String fechaIngreso, String tipoContrato, String fechaFinContrato) {
super(nombre, cedula, cargo, salarioBase, fechaIngreso);
this.tipoContrato = tipoContrato;
this.fechaFinContrato = fechaFinContrato;
this.horasTrabajadas = 0;
}
// Getters y Setters específicos
public String getTipoContrato() { return tipoContrato; }
public void setTipoContrato(String tipoContrato) { this.tipoContrato = tipoContrato; }
public String getFechaFinContrato() { return fechaFinContrato; }
public void setFechaFinContrato(String fechaFinContrato) { this.fechaFinContrato = fechaFinContrato; }
public int getHorasTrabajadas() { return horasTrabajadas; }
public void setHorasTrabajadas(int horasTrabajadas) { this.horasTrabajadas = horasTrabajadas; }
// Métodos específicos de contratista
public double calcularRetencionFuente() {
if (salarioBase > 3500000) { // Si supera cierto monto
return salarioBase * 0.11; // 11% de retención
}
return 0;
}
public double calcularICA() {
return salarioBase * 0.007; // 0.7% promedio de ICA
}
public double calcularPagoMensual() {
double valorHora = salarioBase / 160; // Asumiendo 160 horas mensuales
return valorHora * horasTrabajadas;
}
public boolean verificarEstadoContrato() {
// Lógica simplificada - en implementación real se compararían fechas
return true; // Contrato vigente
}
public double calcularFacturacion() {
double subtotal = calcularPagoMensual();
double iva = subtotal * 0.19; // 19% de IVA
return subtotal + iva;
}
public double calcularPagoNeto() {
double pagoTotal = calcularPagoMensual();
double retenciones = calcularRetencionFuente() + calcularICA();
return pagoTotal - retenciones;
}
}
Clase Principal: SistemaEmpleados
public class SistemaEmpleados {
public static void main(String[] args) {
// Crear empleado tiempo completo
EmpleadoTiempoCompleto empleado1 = new EmpleadoTiempoCompleto(
"María Fernanda López", "1234567890", "Desarrolladora Senior",
4500000, "15/01/2022", true, true
);
// Crear empleado contratista
EmpleadoContratista empleado2 = new EmpleadoContratista(
"Juan Carlos Rodríguez", "0987654321", "Consultor IT",
6000000, "01/03/2024", "Prestación de servicios", "31/12/2024"
);
empleado2.setHorasTrabajadas(120);
// Demostrar funcionalidades del empleado tiempo completo
System.out.println("=== EMPLEADO TIEMPO COMPLETO ===");
System.out.println(empleado1.obtenerInformacion());
System.out.println("Descuento Salud: $" + String.format("%.0f", empleado1.calcularSalud()));
System.out.println("Descuento Pensión: $" + String.format("%.0f", empleado1.calcularPension()));
System.out.println("Auxilio Transporte: $" + String.format("%.0f", empleado1.calcularAuxilioTransporte()));
System.out.println("Auxilio Alimentación: $" + String.format("%.0f", empleado1.calcularAuxilioAlimentacion()));
System.out.println("Prima de Servicios: $" + String.format("%.0f", empleado1.calcularPrimaServicios()));
System.out.println("Cesantías: $" + String.format("%.0f", empleado1.calcularCesantias()));
System.out.println("Salario Total: $" + String.format("%.0f", empleado1.calcularSalarioTotal()));
System.out.println("\n=== EMPLEADO CONTRATISTA ===");
System.out.println(empleado2.obtenerInformacion());
System.out.println("Horas Trabajadas: " + empleado2.getHorasTrabajadas());
System.out.println("Pago por Horas: $" + String.format("%.0f", empleado2.calcularPagoMensual()));
System.out.println("Retención Fuente: $" + String.format("%.0f", empleado2.calcularRetencionFuente()));
System.out.println("ICA: $" + String.format("%.0f", empleado2.calcularICA()));
System.out.println("Facturación Total (con IVA): $" + String.format("%.0f", empleado2.calcularFacturacion()));
System.out.println("Pago Neto: $" + String.format("%.0f", empleado2.calcularPagoNeto()));
System.out.println("Estado Contrato: " + (empleado2.verificarEstadoContrato() ? "Vigente" : "Vencido"));
}
}
Este ejemplo demuestra: - Herencia simple: Las clases hijas heredan atributos y métodos de la clase padre - Encapsulación: Uso de getters y setters para controlar el acceso a los atributos - Lógica de negocio colombiana: Cálculos específicos del contexto laboral colombiano - Reutilización de código: Los métodos comunes se definen una vez en la clase padre - Especialización: Cada clase hija añade funcionalidades específicas a su tipo de empleado