CalculateurContributionExceptionnelle.java

package com.kerware.simulateurreusine;

/**
 * Calculateur de la contribution exceptionnelle sur les hauts revenus (CEHR).
 *
 * Implémente l'exigence EXG_IMPOT_07 :
 *  - Calculée sur le revenu fiscal de référence du foyer entier
 *  - Barèmes différents pour personne seule et couple
 *  - Calcul progressif identique au barème de l'impôt principal
 */
public final class CalculateurContributionExceptionnelle {

    /** Limites des tranches de la CEHR (en euros). 5 valeurs pour 4 tranches. */
    private static final int[] LIMITES_TRANCHES_CEHR = {
            0, 250000, 500000, 1000000, Integer.MAX_VALUE
    };
    /** Taux de la CEHR pour une personne seule (célibataire, divorcé, veuf). */
    private static final double[] TAUX_CEHR_CELIBATAIRE = {
            0.0, 0.03, 0.04, 0.04
    };
    /** Taux de la CEHR pour un couple (marié, pacsé). */
    private static final double[] TAUX_CEHR_COUPLE = {
            0.0, 0.0, 0.03, 0.04
    };

    /** Nombre de parts d'un déclarant seul. */
    private static final double PARTS_DECLARANT_SEUL = 1.0;

    private final CalculateurImpotProgressif calculateurProgressif
            = new CalculateurImpotProgressif();

    /**
     * Calcule la contribution exceptionnelle sur les hauts revenus.
     *
     * @param revenuFiscalReference  revenu fiscal de référence du foyer
     * @param nbPartsDeclarants      nombre de parts des déclarants seuls (1 ou 2)
     * @return la CEHR arrondie à l'euro le plus proche
     */
    public double calculer(double revenuFiscalReference, double nbPartsDeclarants) {
        double[] tauxApplicables = (nbPartsDeclarants == PARTS_DECLARANT_SEUL)
                ? TAUX_CEHR_CELIBATAIRE
                : TAUX_CEHR_COUPLE;

        return Math.round(
                calculateurProgressif.calculer(revenuFiscalReference,
                        LIMITES_TRANCHES_CEHR, tauxApplicables)
        );
    }
}