Files
njts-accounting-core/check_july_august_issues.py
2026-02-20 15:47:27 +09:00

118 lines
5.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
sys.path.insert(0, 'backend')
os.environ['DB_HOST'] = '192.168.0.61'
os.environ['DB_NAME'] = 'njts_acct'
os.environ['DB_USER'] = 'njts_app'
os.environ['DB_PASSWORD'] = 'njts_app2025'
os.environ['DB_PORT'] = '55432'
from app.core.database import get_connection
with get_connection() as conn:
with conn.cursor() as cur:
print('\n【 檢查2025年7月和8月的問題交易 】\n')
# 获取account_id
cur.execute("SELECT account_id FROM accounts WHERE account_code = '701'")
aid = cur.fetchone()['account_id']
for month in [7, 8]:
print(f"{'='*80}")
print(f"【 2025年{month}月的701科目交易 】")
print(f"{'='*80}\n")
# 查找类似"【未計上のため取消】"的交易没有parent的可能重複
cur.execute("""
SELECT
j.journal_entry_id,
j.entry_date,
j.description,
l.debit,
l.credit,
j.parent_entry_id,
j.is_deleted,
(SELECT COUNT(*) FROM journal_entries child WHERE child.parent_entry_id = j.journal_entry_id) as has_child
FROM journal_lines l
JOIN journal_entries j ON j.journal_entry_id = l.journal_entry_id
WHERE l.account_id = %s
AND EXTRACT(MONTH FROM j.entry_date) = %s
AND EXTRACT(YEAR FROM j.entry_date) = 2025
AND j.is_deleted = false
ORDER BY j.entry_date, j.journal_entry_id
""", (aid, month))
entries = cur.fetchall()
print(f"找到交易 {len(entries)}\n")
print("Entry# | Date | Debit | Credit | Parent | HasChild | Description (first 40 chars)")
print("-" * 100)
for row in entries:
parent_str = f"#{row['parent_entry_id']}" if row['parent_entry_id'] else "None"
child_str = "" if row['has_child'] > 0 else ""
desc_short = row['description'][:40] if row['description'] else ""
print(f"#{row['journal_entry_id']:<5} | {row['entry_date']} | {row['debit'] or 0:>10} | {row['credit'] or 0:>10} | {parent_str:<6} | {child_str:<8} | {desc_short}")
# 查找可疑的交易模式
print(f"\n【 掃描可疑模式 】\n")
# 1. 查找沒有parent且金額大的【未計上のため取消】交易重複取消
cur.execute("""
SELECT
j.journal_entry_id,
j.description,
l.credit
FROM journal_lines l
JOIN journal_entries j ON j.journal_entry_id = l.journal_entry_id
WHERE l.account_id = %s
AND EXTRACT(MONTH FROM j.entry_date) = %s
AND EXTRACT(YEAR FROM j.entry_date) = 2025
AND j.is_deleted = false
AND j.parent_entry_id IS NULL
AND j.description LIKE '%未計上のため取消%'
AND l.credit > 500000
""", (aid, month))
duplicate_cancels = cur.fetchall()
if duplicate_cancels:
print(f"⚠️ 發現可能重複的取消交易無parent但有大額貳方:\n")
for row in duplicate_cancels:
print(f" Entry#{row['journal_entry_id']}: {row['credit']:>12} | {row['description'][:50]}")
else:
print("✓ 沒有發現重複的取消交易")
# 2. 查找【修正後】且是最後一個交易葉節點的交易可能是Entry#373的情況
cur.execute("""
SELECT
j.journal_entry_id,
j.description,
l.debit,
j.parent_entry_id,
(SELECT COUNT(*) FROM journal_entries child WHERE child.parent_entry_id = j.journal_entry_id) as has_child
FROM journal_lines l
JOIN journal_entries j ON j.journal_entry_id = l.journal_entry_id
WHERE l.account_id = %s
AND EXTRACT(MONTH FROM j.entry_date) = %s
AND EXTRACT(YEAR FROM j.entry_date) = 2025
AND j.is_deleted = false
AND j.description LIKE '%【修正後】%'
AND l.debit > 500000
AND (SELECT COUNT(*) FROM journal_entries child WHERE child.parent_entry_id = j.journal_entry_id) = 0
""", (aid, month))
correction_leafs = cur.fetchall()
if correction_leafs:
print(f"\n⚠️ 發現可能的修正鏈葉節點(【修正後】且無子交易):\n")
for row in correction_leafs:
parent_str = f"#{row['parent_entry_id']}" if row['parent_entry_id'] else "None"
print(f" Entry#{row['journal_entry_id']}: {row['debit']:>12} | parent={parent_str} | {row['description'][:45]}")
else:
print("✓ 沒有發現修正鏈葉節點")
print("\n")