DEV Community

Baptiste
Baptiste

Posted on

Un barème à tranches et sa réciproque : calculer l'enchère maximale d'une vente immobilière judiciaire

Quand on achète un logement aux enchères au tribunal, la question n'est pas « combien vais-je payer », mais l'inverse : avec 120 000 € en poche, jusqu'à combien puis-je enchérir ? Les frais dépendent du prix, et ils ne sont pas proportionnels. Voici comment je l'ai codé pour le simulateur de MdB Scanner, le site que je développe, et l'erreur qui faussait mes calculs.

Ce que paie l'acheteur en plus du prix

Trois lignes calculables à l'avance :

  1. Les droits d'enregistrement : un pourcentage du prix, 6,3185 % dans la plupart des départements, 5,80665 % dans onze autres et 5,09006 % dans l'Indre (tableau DGFiP au 1er juin 2026, liste qui bouge chaque année). Ce sont les taux d'un particulier.
  2. L'émolument de vente de l'avocat, fixé par un barème réglementé à tranches (code de commerce, art. A444-191 et A444-102), hors taxe, plus 20 % de TVA :
    • 7,256 % jusqu'à 6 500 € ;
    • 2,993 % de 6 500 à 17 000 € ;
    • 1,995 % de 17 000 à 60 000 € ;
    • 1,497 % au-delà.
  3. La contribution de sécurité immobilière : 0,10 % du prix (CGI, art. 881 K), avec un minimum de perception de 15 €.

Restent les frais préalables de la procédure, taxés par le juge et annoncés au plus tard à l'ouverture des enchères (l'avocat poursuivant peut souvent les donner avant), et les honoraires libres de son propre avocat : ceux-là ne se calculent pas, ils se demandent.

Le barème à tranches

TRANCHES = [(6_500, 7.256), (17_000, 2.993), (60_000, 1.995), (None, 1.497)]
TVA, CSI_PCT, CSI_MIN = 0.20, 0.10, 15
DROITS_PCT = 6.3185

def emolument_ht(prix):
    reste, bas, total = prix, 0.0, 0.0
    for haut, taux in TRANCHES:
        tranche = reste if haut is None else min(reste, haut - bas)
        if tranche <= 0:
            break
        total += tranche * taux / 100
        reste -= tranche
        if haut is not None:
            bas = haut
    return total

def cout_total(prix, droits_pct=DROITS_PCT):
    emolument_ttc = emolument_ht(prix) * (1 + TVA)
    csi = max(CSI_MIN, prix * CSI_PCT / 100)
    droits = prix * droits_pct / 100
    return prix + emolument_ttc + csi + droits
Enter fullscreen mode Exit fullscreen mode

Ce que ça donne, hors frais préalables :

Prix d'adjudication Frais calculables En % du prix
30 000 € 3 180 € 10,6 %
100 000 € 9 110 € 9,1 %
250 000 € 21 432 € 8,6 %

Le barème est dégressif : plus le prix est bas, plus les frais pèsent lourd.

La réciproque : l'enchère maximale

On veut le prix p tel que cout_total(p) = budget. Avec des tranches, une formule fermée existe, mais elle se casse à chaque changement de barème. Comme cout_total est strictement croissante, une dichotomie suffit, et elle reste juste quel que soit le barème :

def enchere_max(budget, droits_pct=DROITS_PCT):
    bas, haut = 0.0, float(budget)
    for _ in range(80):
        milieu = (bas + haut) / 2
        if cout_total(milieu, droits_pct) <= budget:
            bas = milieu
        else:
            haut = milieu
    return bas
Enter fullscreen mode Exit fullscreen mode

80 tours ramènent l'écart sous le centime pour n'importe quel budget réaliste. Pour un budget de 120 000 €, hors frais préalables et honoraires de son avocat : 110 064 € d'enchère maximale. Avec 3 000 € de frais préalables, on retombe à 107 291 €.

L'erreur que je faisais

On lit souvent que les frais d'adjudication font « environ 10 % » en plus des droits. J'avais codé ce forfait. Avec lui, le même budget de 120 000 € ne donnait que 103 165 € d'enchère maximale : presque 7 000 € de moins. À 110 000 €, le forfait comptait 11 000 € là où l'émolument et la contribution font environ 3 000 € : près de quatre fois trop (deux fois trop sous 20 000 €). Une partie de l'écart couvrait sans le dire des frais préalables bien réels, mais même avec 3 000 € de frais préalables, l'enchère maximale juste reste à 107 291 €, 4 000 € au-dessus. Les vérifier ligne à ligne dans les textes a coûté une après-midi ; l'erreur aurait coûté des ventes perdues.

Ce qu'il faut retenir

  • Un barème à tranches se code comme un impôt sur le revenu : on parcourt les tranches en retirant ce qui est déjà taxé.
  • Pour la réciproque, préférez une dichotomie à une formule inversée : elle survit aux changements de barème.
  • Datez et sourcez chaque taux dans le code : la liste des départements à taux réduit change chaque année.

Le simulateur en ligne, qui ajoute les droits selon le département et la situation de l'acheteur : [https://mdbscanner.fr/simulateur-encheres-immobilieres]

Top comments (0)