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:
parent
c9ad155bf6
commit
48ec3a3d89
5 changed files with 868 additions and 1637 deletions
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue