Versements de revenus & remboursement du capital¶
Extrait du domain map API, qui était chargé dans chaque session agent. La rule garde l'index module → contexte ; le détail vit ici, à côté du code.
Versement revenus (coupons obligation / royalty recurring) :
- Decouple du paiement porteur : le porteur paie via virement, un admin assigne le virement a une echeance, puis un script manuel (avec fichier Excel) verse les revenus aux investisseurs
- Script 02a alloue avec computeHamiltonPayout (plus grand reste, ex aequo par investorId, somme exacte par ligne Excel projet × échéance) — l'allowlist projectIdsAllowedToPayoutEvenIfBelow1Cent leve le plancher 1 ct/brique et skip les holders a 0 ct apres merge (pas de WT) ; property_dividends.perBrick partage le même univers briques que Hamilton (isAvailableOnPrimary = false)
- Le script calcule : interets / nombre de briques = montant par investisseur
- Le versement n'est pas automatise : un operateur execute le script manuellement avec les donnees de paiement
- Prelevements fiscaux appliques lors du versement
- Script 02a refuse le versement si l'echeance a un prelevement bank-debit executed il y a moins de 7 jours ouvres francais (Europe/Paris, lun-ven hors feries metropole) — fenetre chargeback Lemonway (etablissement de paiement francais). Virement / sequestre : pas de hold
- Apres boucle : table Excel vs WT creees + compteur d'investisseurs skippes (idempotence jour)
Remboursement capital :
- Payout cree en pending, execute seulement le lendemain (createdAt < NOW()::date)
- Si montant < 1ct par brique : payout differe, inclus dans le remboursement final
- Remboursement final : calcul exact par investisseur (brickCount * brickPrice - dejaRembourse), pas de floor par brique (evite les erreurs d'arrondi)
- Remboursement partiel : Math.floor(montantParBrique * brickCount) (arrondi a l'inferieur)
- Le prix de la brique diminue a chaque remboursement partiel : max(0, Math.round((lastBrickPrice * brickCount - repaymentAmount) / brickCount))
- Remboursement final : prix brique set a 0 directement (pas de formule), finalRepaymentAt set sur la propriete
- Detection final : totalDejaRembourse + montant = montantFinance