/**
 * Un empleado de la bodega. No tiene sentido crear un "empleado en general":
 * cada empleado concreto cobra de una forma, y la clase obliga a decir cuál.
 */
public abstract class Employee {
    private final String name;

    protected Employee(String name) {
        this.name = name;
    }

    public String name() {
        return name;
    }

    /** Pago del mes, en céntimos. Cada subclase concreta dice cómo se calcula. */
    public abstract long monthlyPay();

    /** Template Method: el formato es común; el monto lo da la subclase. */
    public String payslip() {
        return name + ": " + soles(monthlyPay());
    }

    protected static String soles(long cents) {
        return String.format("S/ %d.%02d", cents / 100, cents % 100);
    }
}
