54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
from decimal import Decimal
|
|
from app.core.database import get_connection
|
|
from app.modules.general_ledger.sql import GENERAL_LEDGER_SQL
|
|
|
|
def D(x) -> Decimal:
|
|
return Decimal(str(x or 0))
|
|
|
|
def fetch_general_ledger(account_id: int, date_from: str, date_to: str):
|
|
|
|
with get_connection() as conn, conn.cursor() as cur:
|
|
|
|
# ① 科目确认
|
|
cur.execute("""
|
|
SELECT account_code, account_name
|
|
FROM accounts
|
|
WHERE account_id = %s
|
|
AND is_active = true
|
|
""", (account_id,))
|
|
acc = cur.fetchone()
|
|
if not acc:
|
|
return None
|
|
|
|
# ② 元帳明细
|
|
cur.execute(
|
|
GENERAL_LEDGER_SQL,
|
|
{
|
|
"account_id": account_id,
|
|
"date_from": date_from,
|
|
"date_to": date_to
|
|
}
|
|
)
|
|
rows = cur.fetchall()
|
|
|
|
balance = Decimal("0")
|
|
lines = []
|
|
|
|
for r in rows:
|
|
balance += D(r["debit"]) - D(r["credit"])
|
|
lines.append({
|
|
"journal_date": r["journal_date"],
|
|
"description": r["description"],
|
|
"debit": str(D(r["debit"])),
|
|
"credit": str(D(r["credit"])),
|
|
"balance": str(balance)
|
|
})
|
|
|
|
return {
|
|
"account": {
|
|
"account_code": acc["account_code"],
|
|
"account_name": acc["account_name"]
|
|
},
|
|
"lines": lines
|
|
}
|