This commit is contained in:
2026-03-28 01:33:24 +01:00
parent 8320738acb
commit 6ce14acc3f
8 changed files with 117 additions and 53 deletions
+44 -2
View File
@@ -20,18 +20,60 @@ class CompteService:
conn = creer_connexion()
try:
import decimal as _d
type_compte = donnees.get('account_type', 'courant')
depot_brut = donnees.get('initial_deposit')
depot = _d.Decimal(str(depot_brut)) if depot_brut else _d.Decimal('0')
if depot < 0:
raise ValueError('Le depot initial ne peut pas etre negatif')
# Pour les comptes epargne, le depot est preleve du compte courant
if type_compte in ('livret_a', 'assurance_vie') and depot > 0:
# Trouver le compte courant actif de l'utilisateur
comptes = self.compte_dao.lister_par_utilisateur(conn, id_utilisateur_courant)
compte_courant = next(
(c for c in comptes if c['account_type'] == 'courant'), None
)
if not compte_courant:
raise ValueError(
"Vous devez posséder un compte courant pour alimenter ce compte."
)
solde_courant = _d.Decimal(str(compte_courant['balance']))
if solde_courant < depot:
raise ValueError(
f"Solde insuffisant sur votre compte courant "
f"(disponible : {float(solde_courant):.2f} €)."
)
# Debiter le compte courant
self.compte_dao.debiter(conn, str(compte_courant['id']), depot)
# Enregistrer la transaction de transfert vers le nouveau compte (fait apres ouvrir)
id_courant = str(compte_courant['id'])
else:
id_courant = None
compte = self.compte_dao.ouvrir(
conn, id_utilisateur_courant,
donnees.get('account_type', 'courant'),
type_compte,
depot
)
# Si on a debite le courant, creer la transaction de transfert
if id_courant and depot > 0:
curseur = conn.cursor()
noms = {'livret_a': 'Livret A', 'assurance_vie': 'Assurance Vie'}
libelle = f"Versement initial sur {noms.get(type_compte, type_compte)}"
curseur.execute(
"""
INSERT INTO transactions
(from_account_id, to_account_id, transaction_type,
amount, description, status, executed_at)
VALUES (%s, %s, 'virement_interne', %s, %s, 'completed', NOW())
""",
(id_courant, str(compte['id']), float(depot), libelle)
)
enregistrer_audit(conn.cursor(), id_utilisateur_courant, 'OPEN_ACCOUNT',
{'type': donnees.get('account_type'), 'depot': float(depot)},
{'type': type_compte, 'depot': float(depot)},
obtenir_ip_client())
conn.commit()
return compte