Initial income_calculator project

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-23 16:49:24 +03:00
commit 31dc287c3d
44 changed files with 1935 additions and 0 deletions

3
backend/db/__init__.py Normal file
View File

@@ -0,0 +1,3 @@
from .database import init_db, get_connection
__all__ = ["init_db", "get_connection"]

74
backend/db/database.py Normal file
View File

@@ -0,0 +1,74 @@
import sqlite3
from pathlib import Path
from typing import Optional
from backend.config import DATABASE_PATH
def get_connection() -> sqlite3.Connection:
conn = sqlite3.connect(DATABASE_PATH)
conn.row_factory = sqlite3.Row
return conn
def init_db() -> None:
Path(DATABASE_PATH).parent.mkdir(parents=True, exist_ok=True)
conn = get_connection()
try:
conn.executescript("""
CREATE TABLE IF NOT EXISTS banks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
code TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
is_salary INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS accounts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
bank_id INTEGER NOT NULL REFERENCES banks(id),
external_id TEXT NOT NULL,
name TEXT,
UNIQUE(bank_id, external_id)
);
CREATE TABLE IF NOT EXISTS opening_balances (
id INTEGER PRIMARY KEY AUTOINCREMENT,
account_id INTEGER NOT NULL REFERENCES accounts(id),
period_start TEXT NOT NULL,
amount REAL NOT NULL,
UNIQUE(account_id, period_start)
);
CREATE TABLE IF NOT EXISTS transactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
account_id INTEGER NOT NULL REFERENCES accounts(id),
operation_date TEXT NOT NULL,
debit_date TEXT,
amount REAL NOT NULL,
currency TEXT DEFAULT 'RUB',
amount_card_currency REAL,
description TEXT,
source_file TEXT NOT NULL,
imported_at TEXT NOT NULL,
dedup_key TEXT NOT NULL UNIQUE
);
CREATE INDEX IF NOT EXISTS idx_transactions_account ON transactions(account_id);
CREATE INDEX IF NOT EXISTS idx_transactions_operation_date ON transactions(operation_date);
CREATE INDEX IF NOT EXISTS idx_transactions_dedup ON transactions(dedup_key);
""")
conn.commit()
try:
conn.execute("ALTER TABLE transactions ADD COLUMN excluded_from_balance INTEGER NOT NULL DEFAULT 0")
conn.commit()
except sqlite3.OperationalError:
pass
conn.executescript("""
CREATE TABLE IF NOT EXISTS app_settings (
key TEXT PRIMARY KEY,
value TEXT
);
""")
conn.commit()
finally:
conn.close()