/**
 * Copia de la jerarquía de la semana 6, ahora con una capacidad más:
 * todo empleado se puede pagar.
 */
public abstract class Employee implements Payable {
    private final String name;

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

    public String name() {
        return name;
    }

    /** Pago del mes en céntimos; cada tipo de empleado lo calcula a su manera. */
    public abstract long monthlyPay();

    /** Lo que se debe a un empleado es su pago del mes. */
    @Override
    public long amountDue() {
        return monthlyPay();
    }

    /** Template Method: arma la boleta y deja el cálculo a la subclase. */
    public String payslip() {
        return name + ": " + formattedAmount();
    }

    @Override
    public String toString() {
        return getClass().getSimpleName() + "[" + name + "]";
    }
}
