V2.1: Plafond negatif, reserve vault, carte bancaire visuelle, panel rewrite

- db: added client_negative_floor column to banks
- bank_manager: vault check on depot, negative floor on retrait/virement
- banque: new /banque set-plafond and /banque set-reserve commands
- bank_card: new Pillow-based bank card image generator
- panel: full rewrite (no more JSON), guild name in title, new banking flow
This commit is contained in:
utilisateurqu 2026-08-19 17:11:52 +02:00
parent c9ad155bf6
commit 48ec3a3d89
5 changed files with 868 additions and 1637 deletions

View file

@ -212,7 +212,17 @@ class BankManager:
raise ValueError("Compte destination introuvable.")
if source["solde"] < montant:
raise ValueError(f"Solde insuffisant. Disponible : {source['solde']:.2f}€")
cursor = await db.execute(
"SELECT client_negative_floor FROM banks WHERE id = ? AND guild_id = ?",
(source["bank_id"], guild_id),
)
bank_row = await cursor.fetchone()
floor = bank_row[0] if bank_row else 0.0
nouveau_solde = source["solde"] - montant
if nouveau_solde < -floor:
raise ValueError(
f"Solde insuffisant. Disponible : {source['solde']:.2f}€, plafond négatif : {-floor:.2f}€"
)
tva_montant = 0.0
montant_net = montant
@ -287,13 +297,26 @@ class BankManager:
if not compte:
raise ValueError("Compte introuvable.")
cursor = await db.execute(
"SELECT vault_balance FROM banks WHERE id = ? AND guild_id = ?",
(compte["bank_id"], guild_id),
)
bank_row = await cursor.fetchone()
if not bank_row:
raise ValueError("Banque introuvable.")
vault = bank_row[0]
if vault < montant:
raise ValueError(
f"Réserve bancaire insuffisante. Disponible : {vault:.2f}€"
)
cursor = await db.execute(
"UPDATE accounts SET solde = solde + ? WHERE rib = ? AND guild_id = ?",
(montant, rib, guild_id),
)
cursor = await db.execute(
"UPDATE banks SET clients_total_balance = clients_total_balance + ? WHERE id = ? AND guild_id = ?",
(montant, compte["bank_id"], guild_id),
"UPDATE banks SET clients_total_balance = clients_total_balance + ?, vault_balance = vault_balance - ? WHERE id = ? AND guild_id = ?",
(montant, montant, compte["bank_id"], guild_id),
)
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@ -318,16 +341,26 @@ class BankManager:
compte = await self._get_account(db, guild_id, rib)
if not compte:
raise ValueError("Compte introuvable.")
if compte["solde"] < montant:
raise ValueError(f"Solde insuffisant. Disponible : {compte['solde']:.2f}€")
cursor = await db.execute(
"SELECT client_negative_floor FROM banks WHERE id = ? AND guild_id = ?",
(compte["bank_id"], guild_id),
)
bank_row = await cursor.fetchone()
floor = bank_row[0] if bank_row else 0.0
nouveau_solde = compte["solde"] - montant
if nouveau_solde < -floor:
raise ValueError(
f"Plafond négatif atteint ({-floor:.2f}€). Solde actuel : {compte['solde']:.2f}€"
)
cursor = await db.execute(
"UPDATE accounts SET solde = solde - ? WHERE rib = ? AND guild_id = ?",
(montant, rib, guild_id),
)
cursor = await db.execute(
"UPDATE banks SET clients_total_balance = clients_total_balance - ? WHERE id = ? AND guild_id = ?",
(montant, compte["bank_id"], guild_id),
"UPDATE banks SET clients_total_balance = clients_total_balance - ?, vault_balance = vault_balance + ? WHERE id = ? AND guild_id = ?",
(montant, montant, compte["bank_id"], guild_id),
)
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@ -337,7 +370,7 @@ class BankManager:
(guild_id, rib, compte["user_id"], montant, "retrait_banquier", now, json.dumps({"banquier_id": banquier_id})),
)
await db.commit()
return {"nouveau_solde": compte["solde"] - montant}
return {"nouveau_solde": nouveau_solde}
finally:
await db.close()
@ -498,3 +531,27 @@ class BankManager:
)
row = await cursor.fetchone()
return dict(row) if row else None
async def set_negative_floor(self, guild_id: int, bank_id: int, floor: float) -> bool:
db = await get_db()
try:
cursor = await db.execute(
"UPDATE banks SET client_negative_floor = ? WHERE id = ? AND guild_id = ?",
(floor, bank_id, guild_id),
)
await db.commit()
return cursor.rowcount > 0
finally:
await db.close()
async def set_vault_balance(self, guild_id: int, bank_id: int, montant: float) -> bool:
db = await get_db()
try:
cursor = await db.execute(
"UPDATE banks SET vault_balance = ? WHERE id = ? AND guild_id = ?",
(montant, bank_id, guild_id),
)
await db.commit()
return cursor.rowcount > 0
finally:
await db.close()