83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
|
|
import aiosqlite
|
||
|
|
import os
|
||
|
|
|
||
|
|
DB_PATH = os.path.join(os.path.dirname(__file__), "..", "data", "bank_v2.db")
|
||
|
|
|
||
|
|
SCHEMA = """
|
||
|
|
CREATE TABLE IF NOT EXISTS banks (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
guild_id INTEGER NOT NULL,
|
||
|
|
name TEXT NOT NULL,
|
||
|
|
role_id INTEGER NOT NULL,
|
||
|
|
establishment_code INTEGER NOT NULL,
|
||
|
|
vault_balance REAL DEFAULT 0.0,
|
||
|
|
clients_total_balance REAL DEFAULT 0.0,
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
UNIQUE(guild_id, name),
|
||
|
|
UNIQUE(guild_id, establishment_code)
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS accounts (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
guild_id INTEGER NOT NULL,
|
||
|
|
bank_id INTEGER NOT NULL,
|
||
|
|
user_id INTEGER NOT NULL,
|
||
|
|
rib TEXT NOT NULL UNIQUE,
|
||
|
|
account_type TEXT NOT NULL CHECK(account_type IN ('particulier', 'entreprise')),
|
||
|
|
solde REAL DEFAULT 0.0,
|
||
|
|
tva_rate REAL DEFAULT 0.0,
|
||
|
|
password TEXT,
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
FOREIGN KEY (bank_id) REFERENCES banks(id) ON DELETE CASCADE,
|
||
|
|
UNIQUE(guild_id, bank_id, user_id, account_type)
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS institutions (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
guild_id INTEGER NOT NULL,
|
||
|
|
name TEXT NOT NULL,
|
||
|
|
role_id INTEGER,
|
||
|
|
can_audit_all INTEGER DEFAULT 0,
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
UNIQUE(guild_id, name)
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS fisc_config (
|
||
|
|
guild_id INTEGER PRIMARY KEY,
|
||
|
|
institution_id INTEGER,
|
||
|
|
FOREIGN KEY (institution_id) REFERENCES institutions(id) ON DELETE SET NULL
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS transactions (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
guild_id INTEGER NOT NULL,
|
||
|
|
emetteur_rib TEXT,
|
||
|
|
destinataire_rib TEXT,
|
||
|
|
emetteur_id INTEGER,
|
||
|
|
destinataire_id INTEGER,
|
||
|
|
montant REAL NOT NULL,
|
||
|
|
type TEXT NOT NULL,
|
||
|
|
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
metadata TEXT
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_accounts_guild_user ON accounts(guild_id, user_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_accounts_rib ON accounts(rib);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_accounts_bank ON accounts(guild_id, bank_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_transactions_guild ON transactions(guild_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_transactions_ribs ON transactions(emetteur_rib, destinataire_rib);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_banks_guild ON banks(guild_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_institutions_guild ON institutions(guild_id);
|
||
|
|
"""
|
||
|
|
|
||
|
|
|
||
|
|
async def get_db() -> aiosqlite.Connection:
|
||
|
|
os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
|
||
|
|
db = await aiosqlite.connect(DB_PATH)
|
||
|
|
db.row_factory = aiosqlite.Row
|
||
|
|
await db.execute("PRAGMA journal_mode=WAL")
|
||
|
|
await db.execute("PRAGMA foreign_keys=ON")
|
||
|
|
await db.executescript(SCHEMA)
|
||
|
|
await db.commit()
|
||
|
|
return db
|