Initial income_calculator project
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
83
backend/api/balance.py
Normal file
83
backend/api/balance.py
Normal file
@@ -0,0 +1,83 @@
|
||||
from fastapi import APIRouter, HTTPException, Query
|
||||
|
||||
from backend.db.database import get_connection
|
||||
from backend.services.balance_service import get_summary, get_transactions
|
||||
from pydantic import BaseModel
|
||||
|
||||
router = APIRouter(tags=["balance"])
|
||||
|
||||
|
||||
class TransactionExcludedBody(BaseModel):
|
||||
excluded_from_balance: bool
|
||||
|
||||
|
||||
def _parse_bank_ids(bank_ids: str | None) -> list[int] | None:
|
||||
if not bank_ids or not bank_ids.strip():
|
||||
return None
|
||||
try:
|
||||
return [int(x.strip()) for x in bank_ids.split(",") if x.strip()]
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
|
||||
@router.get("/api/balance/summary")
|
||||
def balance_summary(
|
||||
period_start: str | None = Query(None, description="YYYY-MM-DD"),
|
||||
period_end: str | None = Query(None, description="YYYY-MM-DD"),
|
||||
bank_ids: str | None = Query(None, description="ID банков через запятую, например 1,2"),
|
||||
):
|
||||
return get_summary(
|
||||
period_start=period_start,
|
||||
period_end=period_end,
|
||||
bank_ids=_parse_bank_ids(bank_ids),
|
||||
)
|
||||
|
||||
|
||||
@router.get("/api/balance/by-account")
|
||||
def balance_by_account(
|
||||
period_start: str | None = Query(None),
|
||||
period_end: str | None = Query(None),
|
||||
bank_ids: str | None = Query(None),
|
||||
):
|
||||
data = get_summary(
|
||||
period_start=period_start,
|
||||
period_end=period_end,
|
||||
bank_ids=_parse_bank_ids(bank_ids),
|
||||
)
|
||||
return {"by_account": data["by_account"]}
|
||||
|
||||
|
||||
@router.get("/api/transactions")
|
||||
def list_transactions(
|
||||
account_id: int | None = Query(None),
|
||||
bank_ids: str | None = Query(None),
|
||||
period_start: str | None = Query(None),
|
||||
period_end: str | None = Query(None),
|
||||
limit: int = Query(50, ge=1, le=500),
|
||||
offset: int = Query(0, ge=0),
|
||||
):
|
||||
items, total = get_transactions(
|
||||
account_id=account_id,
|
||||
bank_ids=_parse_bank_ids(bank_ids),
|
||||
period_start=period_start,
|
||||
period_end=period_end,
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
)
|
||||
return {"items": items, "total": total}
|
||||
|
||||
|
||||
@router.patch("/api/transactions/{transaction_id}")
|
||||
def set_transaction_excluded(transaction_id: int, body: TransactionExcludedBody):
|
||||
conn = get_connection()
|
||||
try:
|
||||
cur = conn.execute(
|
||||
"UPDATE transactions SET excluded_from_balance = ? WHERE id = ?",
|
||||
(1 if body.excluded_from_balance else 0, transaction_id),
|
||||
)
|
||||
conn.commit()
|
||||
if cur.rowcount == 0:
|
||||
raise HTTPException(status_code=404, detail="Transaction not found")
|
||||
return {"id": transaction_id, "excluded_from_balance": body.excluded_from_balance}
|
||||
finally:
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user