84 lines
2.5 KiB
Python
84 lines
2.5 KiB
Python
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()
|