V2.0: Refonte système bancaire - DB SQLite, RIB FR, TVA auto, multi-banques
- Remplace JSON par SQLite (aiosqlite) pour atomicité et intégrité - Nouveau format RIB français avec checksum modulo 97 - Chaque banque a son propre rôle Discord (isolation par serveur) - TVA automatique Particulier -> Entreprise, redirection au Fisc - Institutions gouvernementales avec droit d'audit optionnel - Commandes: /gouv, /banque, /audit, /mes-ribs - Supprime: 16 anciens fichiers (entreprises, FBM, URSAFF, etc.) - Reset complet des données, repart de zéro
This commit is contained in:
parent
2e38d05152
commit
c9ad155bf6
38 changed files with 3689 additions and 5106 deletions
|
|
@ -1,93 +1,62 @@
|
|||
import discord
|
||||
from discord import app_commands
|
||||
from discord.ext import commands
|
||||
from utils.banque_manager import BanqueManager
|
||||
|
||||
banque_manager = BanqueManager()
|
||||
from utils.bank_manager import BankManager
|
||||
|
||||
bank_manager = BankManager()
|
||||
|
||||
|
||||
class Compte(commands.Cog):
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
|
||||
@app_commands.command(
|
||||
name="compte",
|
||||
description="Afficher vos comptes bancaires et vos 3 dernières transactions"
|
||||
)
|
||||
@app_commands.describe(
|
||||
membre="Afficher le compte d'un autre membre (réservé au gouvernement)"
|
||||
)
|
||||
async def compte(self, interaction: discord.Interaction, membre: discord.Member = None):
|
||||
"""Affiche les soldes et dernières transactions de l'utilisateur ou d'un autre membre (si gouvernement)"""
|
||||
@app_commands.command(name="compte", description="Afficher vos comptes bancaires et vos dernières transactions")
|
||||
async def compte(self, interaction: discord.Interaction):
|
||||
comptes = await bank_manager.get_comptes_user(interaction.guild.id, interaction.user.id)
|
||||
|
||||
banque_manager.load_data()
|
||||
|
||||
# Par défaut, on cible l'utilisateur qui exécute la commande
|
||||
cible = interaction.user
|
||||
user_id = str(cible.id)
|
||||
|
||||
# Si un autre membre est précisé, on vérifie le rôle
|
||||
if membre and membre != interaction.user:
|
||||
role_gouv = discord.utils.get(interaction.guild.roles, name="🌍│Gouvernement")
|
||||
if role_gouv not in interaction.user.roles:
|
||||
await interaction.response.send_message(
|
||||
"❌ Vous devez avoir le rôle **gouvernement** pour consulter le compte d'un autre membre.",
|
||||
ephemeral=True
|
||||
)
|
||||
return
|
||||
cible = membre
|
||||
user_id = str(membre.id)
|
||||
|
||||
comptes = banque_manager.comptes
|
||||
if not comptes:
|
||||
await interaction.response.send_message(
|
||||
"❌ Vous n'avez aucun compte bancaire. Utilisez `/mes-ribs` pour voir vos RIBs.",
|
||||
ephemeral=True,
|
||||
)
|
||||
return
|
||||
|
||||
embed = discord.Embed(
|
||||
title=f"💳 Comptes bancaires de {cible.display_name}",
|
||||
color=discord.Color.blue()
|
||||
title=f"💳 Comptes de {interaction.user.display_name}",
|
||||
color=discord.Color.blue(),
|
||||
)
|
||||
|
||||
banques_trouvees = False
|
||||
for c in comptes:
|
||||
transactions = await bank_manager.get_transactions(interaction.guild.id, c["rib"], limit=5)
|
||||
tva_text = f" | TVA: {c['tva_rate']}%" if c["account_type"] == "entreprise" else ""
|
||||
|
||||
for banque, data in comptes.items():
|
||||
if not isinstance(data, dict) or user_id not in data:
|
||||
continue # Ce n'est pas une banque valide pour cet utilisateur
|
||||
|
||||
compte = data[user_id]
|
||||
rib = compte.get("rib", "Non défini")
|
||||
solde = compte.get("solde", 0)
|
||||
transactions = compte.get("transactions", [])
|
||||
|
||||
# Récupérer les 3 dernières transactions avec date
|
||||
last_transactions = transactions[-3:] if transactions else []
|
||||
|
||||
tx_str = ""
|
||||
for tx in last_transactions:
|
||||
date = tx.get("date", "Date inconnue")
|
||||
tx_type = tx.get("type", "Inconnu")
|
||||
montant = tx.get("montant", 0)
|
||||
source = tx.get("emetteur", tx.get("source", "Inconnu"))
|
||||
dest = tx.get("destinataire", "Inconnu")
|
||||
|
||||
if tx_type.lower() == "virement" or tx_type.lower().startswith("virement"):
|
||||
tx_str += f"- 🕒 {date} : **{tx_type}** de **{montant}€** à <@{dest}>\n"
|
||||
elif tx_type.lower() == "virement reçu":
|
||||
tx_str += f"- 🕒 {date} : **{tx_type}** de **{montant}€** de <@{source}>\n"
|
||||
tx_lines = []
|
||||
for tx in transactions:
|
||||
is_outgoing = tx["emetteur_rib"] == c["rib"]
|
||||
direction = "→" if is_outgoing else "←"
|
||||
other_rib = tx["destinataire_rib"] if is_outgoing else tx["emetteur_rib"]
|
||||
signe = "-" if is_outgoing else "+"
|
||||
tx_type = tx["type"]
|
||||
if tx_type == "tva_prelevee":
|
||||
tx_lines.append(f"- {direction} **TVA** : `{signe}{tx['montant']:.2f}€`")
|
||||
else:
|
||||
tx_str += f"- 🕒 {date} : **{tx_type}** de **{montant}€**\n"
|
||||
tx_lines.append(f"- {direction} **{tx_type}** : `{signe}{tx['montant']:.2f}€` vers `{other_rib or '?'}`")
|
||||
|
||||
if not tx_str:
|
||||
tx_str = "*Aucune transaction.*"
|
||||
tx_text = "\n".join(tx_lines) if tx_lines else "*Aucune transaction récente.*"
|
||||
|
||||
embed.add_field(
|
||||
name=f"🏦 {banque}",
|
||||
value=f"💳 **RIB** : `{rib}`\n💰 **Solde** : `{solde}€`\n📜 **Transactions récentes :**\n{tx_str}",
|
||||
inline=False
|
||||
name=f"🏦 {c['bank_name']} ({c['account_type']}){tva_text}",
|
||||
value=(
|
||||
f"**RIB :** `{c['rib']}`\n"
|
||||
f"**Solde :** `{c['solde']:.2f}€`\n\n"
|
||||
f"**Transactions récentes :**\n{tx_text}"
|
||||
),
|
||||
inline=False,
|
||||
)
|
||||
|
||||
banques_trouvees = True
|
||||
|
||||
if not banques_trouvees:
|
||||
embed.description = "❌ Aucun compte bancaire trouvé dans les banques enregistrées pour cet utilisateur."
|
||||
|
||||
await interaction.response.send_message(embed=embed, ephemeral=True)
|
||||
|
||||
|
||||
async def setup(bot):
|
||||
await bot.add_cog(Compte(bot))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue