修正
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
24
backend/sql/add_line_description.sql
Normal file
24
backend/sql/add_line_description.sql
Normal 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;
|
||||
Reference in New Issue
Block a user