CalculateurPlafonnement.java

package com.kerware.simulateurreusine;

/**
 * Calculateur du plafonnement du gain lié au quotient familial.
 *
 * Implémente l'exigence EXG_IMPOT_05 :
 *  - Le quotient familial (parts apportées par les enfants/situations particulières)
 *    permet de réduire l'impôt
 *  - Cette réduction est cependant plafonnée à un montant fixe par demi-part supplémentaire
 *  - Si le gain réel dépasse ce plafond, on applique la limite au lieu du gain réel
 */
public final class CalculateurPlafonnement {

    /** Plafond du gain d'impôt apporté par chaque demi-part supplémentaire (en euros). */
    private static final double PLAFOND_DEMI_PART = 1759;
    /** Une demi-part = 0.5 part. */
    private static final double VALEUR_DEMI_PART = 0.5;

    /**
     * Applique le plafonnement à l'impôt du foyer si le gain dépasse le plafond légal.
     *
     * @param impotDeclarants    impôt calculé sur les seules parts des déclarants
     * @param impotFoyer         impôt calculé sur le nombre total de parts du foyer
     * @param nbPartsDeclarants  nombre de parts des déclarants seuls
     * @param nbPartsFoyer       nombre total de parts du foyer
     * @return l'impôt du foyer après application éventuelle du plafonnement
     */
    public double appliquerPlafonnement(double impotDeclarants, double impotFoyer,
                                        double nbPartsDeclarants, double nbPartsFoyer) {
        double gainReel = impotDeclarants - impotFoyer;
        double plafond = calculerPlafond(nbPartsDeclarants, nbPartsFoyer);

        if (gainReel >= plafond) {
            return impotDeclarants - plafond;
        }
        return impotFoyer;
    }

    /**
     * Calcule le plafond de gain autorisé selon le nombre de demi-parts supplémentaires.
     */
    private double calculerPlafond(double nbPartsDeclarants, double nbPartsFoyer) {
        double ecartParts = nbPartsFoyer - nbPartsDeclarants;
        double nbDemiParts = ecartParts / VALEUR_DEMI_PART;
        return nbDemiParts * PLAFOND_DEMI_PART;
    }
}