72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
from fastapi import APIRouter, HTTPException, Query
|
||
from decimal import Decimal
|
||
from typing import Dict, Any, List, Optional
|
||
from app.modules.trial_balance.service import fetch_trial_balance
|
||
from app.core.database import get_connection
|
||
|
||
router = APIRouter(prefix="/trial-balance", tags=["試算表"])
|
||
|
||
@router.get("/fiscal-years", summary="仕訳データから会計年度一覧取得(5月期)")
|
||
def get_fiscal_years():
|
||
REIWA_OFFSET = 2018 # 令和元年 = 2019年
|
||
|
||
with get_connection() as conn, conn.cursor() as cur:
|
||
cur.execute("""
|
||
SELECT
|
||
MIN(entry_date)::date AS min_date,
|
||
MAX(entry_date)::date AS max_date
|
||
FROM journal_entries
|
||
WHERE is_deleted = false
|
||
""")
|
||
row = cur.fetchone()
|
||
|
||
if not row or not row["min_date"]:
|
||
return []
|
||
|
||
min_date = row["min_date"]
|
||
max_date = row["max_date"]
|
||
|
||
def fiscal_end_year(d):
|
||
return d.year + 1 if d.month >= 6 else d.year
|
||
|
||
start_fy = fiscal_end_year(min_date)
|
||
end_fy = fiscal_end_year(max_date)
|
||
|
||
result = []
|
||
for fy in range(start_fy, end_fy + 1):
|
||
reiwa = fy - REIWA_OFFSET
|
||
if reiwa > 0:
|
||
wareki = f"令和{reiwa}年"
|
||
elif reiwa == 0:
|
||
wareki = "平成31/令和元年"
|
||
else:
|
||
wareki = f"平成{fy - 1988}年"
|
||
label = f"{wareki}({fy}年)5月期"
|
||
result.append({
|
||
"label": label,
|
||
"date_from": f"{fy - 1}-06-01",
|
||
"date_to": f"{fy}-05-31",
|
||
})
|
||
|
||
return result
|
||
|
||
@router.get("", summary="試算表(全科目)")
|
||
def get_trial_balance(
|
||
fiscal_year: Optional[int] = Query(None, description="会計年度(例: 2025)"),
|
||
date_from: Optional[str] = Query(None, description="YYYY-MM-DD"),
|
||
date_to: Optional[str] = Query(None, description="YYYY-MM-DD"),
|
||
):
|
||
# 👉 没传参数时,给默认值(开发期非常推荐)
|
||
if fiscal_year is None:
|
||
fiscal_year = 2025
|
||
if date_from is None:
|
||
date_from = "2025-01-01"
|
||
if date_to is None:
|
||
date_to = "2025-12-31"
|
||
|
||
if date_from > date_to:
|
||
raise HTTPException(status_code=400, detail="期間指定が不正です。")
|
||
|
||
result = fetch_trial_balance(date_from, date_to)
|
||
return result
|