This commit is contained in:
admin
2026-03-04 00:35:51 +09:00
parent 079057ef41
commit 99d16d8219
5 changed files with 1012 additions and 72 deletions

View File

@@ -7,6 +7,26 @@ from datetime import date
router = APIRouter(prefix="/journal-entries", tags=["仕訳"])
# journal_lines に line_description カラムが存在するかキャッシュ
_line_description_column_exists: Optional[bool] = None
def _check_line_description_column() -> bool:
"""journal_lines テーブルに line_description カラムが存在するか確認(キャッシュあり)"""
global _line_description_column_exists
if _line_description_column_exists is None:
try:
with get_connection() as conn:
with conn.cursor() as cur:
cur.execute("""
SELECT 1 FROM information_schema.columns
WHERE table_name = 'journal_lines'
AND column_name = 'line_description'
""")
_line_description_column_exists = cur.fetchone() is not None
except Exception:
_line_description_column_exists = False
return _line_description_column_exists
class JournalLine(BaseModel):
account_id: int
@@ -14,6 +34,7 @@ class JournalLine(BaseModel):
credit: Decimal = Decimal("0")
tax_rate: Optional[int] = None # 10 or 8 or None
tax_direction: Optional[str] = None # "paid" or "received" or None
line_description: Optional[str] = None # 行摘要(任意)
class JournalEntryRequest(BaseModel):
@@ -205,7 +226,9 @@ def get_journal_entry(journal_id: int):
raise HTTPException(status_code=404, detail="仕訳が存在しません")
# 明細取得
cur.execute("""
has_line_desc = _check_line_description_column()
line_desc_col = ", jl.line_description" if has_line_desc else ""
cur.execute(f"""
SELECT
jl.journal_line_id,
jl.account_id,
@@ -215,6 +238,7 @@ def get_journal_entry(journal_id: int):
jl.credit,
jl.tax_rate,
jl.tax_direction
{line_desc_col}
FROM journal_lines jl
JOIN accounts a ON jl.account_id = a.account_id
WHERE jl.journal_entry_id = %s
@@ -493,6 +517,7 @@ def create_journal_entry(req: JournalEntryRequest):
entry_id = cur.fetchone()["journal_entry_id"]
# ④ 插入交易明細
has_line_desc = _check_line_description_column()
for line in all_lines:
# 轉換 tax_direction
tax_dir_db = None
@@ -504,24 +529,46 @@ def create_journal_entry(req: JournalEntryRequest):
else:
tax_dir_db = line.tax_direction.upper()
cur.execute("""
INSERT INTO journal_lines (
journal_entry_id,
account_id,
debit,
credit,
tax_rate,
tax_direction
)
VALUES (%s, %s, %s, %s, %s, %s)
""", (
entry_id,
line.account_id,
line.debit,
line.credit,
line.tax_rate,
tax_dir_db
))
if has_line_desc:
cur.execute("""
INSERT INTO journal_lines (
journal_entry_id,
account_id,
debit,
credit,
tax_rate,
tax_direction,
line_description
)
VALUES (%s, %s, %s, %s, %s, %s, %s)
""", (
entry_id,
line.account_id,
line.debit,
line.credit,
line.tax_rate,
tax_dir_db,
line.line_description or None
))
else:
cur.execute("""
INSERT INTO journal_lines (
journal_entry_id,
account_id,
debit,
credit,
tax_rate,
tax_direction
)
VALUES (%s, %s, %s, %s, %s, %s)
""", (
entry_id,
line.account_id,
line.debit,
line.credit,
line.tax_rate,
tax_dir_db
))
conn.commit()
@@ -543,6 +590,7 @@ def create_journal_entry(req: JournalEntryRequest):
entry_id = cur.fetchone()["journal_entry_id"]
# 插入交易明細
has_line_desc = _check_line_description_column()
for line in all_lines:
# 轉換 tax_direction
tax_dir_db = None
@@ -554,19 +602,35 @@ def create_journal_entry(req: JournalEntryRequest):
else:
tax_dir_db = line.tax_direction.upper()
cur.execute("""
INSERT INTO journal_lines (
journal_entry_id, account_id, debit, credit,
tax_rate, tax_direction
) VALUES (%s, %s, %s, %s, %s, %s)
""", (
entry_id,
line.account_id,
line.debit,
line.credit,
line.tax_rate,
tax_dir_db
))
if has_line_desc:
cur.execute("""
INSERT INTO journal_lines (
journal_entry_id, account_id, debit, credit,
tax_rate, tax_direction, line_description
) VALUES (%s, %s, %s, %s, %s, %s, %s)
""", (
entry_id,
line.account_id,
line.debit,
line.credit,
line.tax_rate,
tax_dir_db,
line.line_description or None
))
else:
cur.execute("""
INSERT INTO journal_lines (
journal_entry_id, account_id, debit, credit,
tax_rate, tax_direction
) VALUES (%s, %s, %s, %s, %s, %s)
""", (
entry_id,
line.account_id,
line.debit,
line.credit,
line.tax_rate,
tax_dir_db
))
conn.commit()

View File

@@ -0,0 +1,24 @@
-- ============================================================================
-- マイグレーション: journal_lines テーブルに line_description カラム追加
-- 実行方法: admin または postgres 超级用户で実行
-- psql -h 192.168.0.61 -p 55432 -U admin -d njts_acct -f add_line_description.sql
-- ============================================================================
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'journal_lines' AND column_name = 'line_description'
) THEN
ALTER TABLE journal_lines ADD COLUMN line_description TEXT;
RAISE NOTICE '✓ line_description カラムを journal_lines に追加しました';
ELSE
RAISE NOTICE '✓ line_description カラムはすでに存在しています';
END IF;
END $$;
-- 確認
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'journal_lines'
ORDER BY ordinal_position;