34 lines
1.4 KiB
Python
34 lines
1.4 KiB
Python
from sqlalchemy import text
|
|
from sqlalchemy.engine import Engine
|
|
|
|
VIEWS: dict[str, str] = {
|
|
"v_balance_history": """
|
|
SELECT t.booking_date AS day, a.name AS account,
|
|
SUM(SUM(t.amount)) OVER (PARTITION BY a.id
|
|
ORDER BY t.booking_date) AS balance
|
|
FROM transactions t JOIN accounts a ON a.id = t.account_id
|
|
WHERE t.status = 'confirmed'
|
|
GROUP BY a.id, a.name, t.booking_date""",
|
|
"v_balance_total": """
|
|
SELECT booking_date AS day,
|
|
SUM(SUM(amount)) OVER (ORDER BY booking_date) AS balance
|
|
FROM transactions WHERE status = 'confirmed' GROUP BY booking_date""",
|
|
"v_monthly_by_category": """
|
|
SELECT date_trunc('month', t.booking_date) AS month,
|
|
COALESCE(c.name, 'unkategorisiert') AS category,
|
|
SUM(t.amount) AS total
|
|
FROM transactions t LEFT JOIN categories c ON c.id = t.category_id
|
|
WHERE t.status = 'confirmed' GROUP BY 1, 2""",
|
|
"v_projection": """
|
|
SELECT s.name AS scenario, p.day, p.balance
|
|
FROM projection_points p JOIN scenarios s ON s.id = p.scenario_id""",
|
|
}
|
|
|
|
|
|
def create_views(engine: Engine) -> None:
|
|
if engine.dialect.name != "postgresql":
|
|
return
|
|
with engine.begin() as conn:
|
|
for name, body in VIEWS.items():
|
|
conn.execute(text(f"CREATE OR REPLACE VIEW {name} AS {body}"))
|