Saltar a contenido

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 Empleado proporciona 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