Files
njts-accounting-core/check_deleted_entries.py
2026-02-21 10:51:25 +09:00

126 lines
4.2 KiB
Python
Raw Permalink 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.
import psycopg2
conn = psycopg2.connect(
host="192.168.0.61",
port=55432,
database="njts_acct",
user="njts_app",
password="njts_app2025"
)
cur = conn.cursor()
print("=" * 160)
print("【要确认的关键仕訳】")
print("=" * 160)
# 查询ID 444和445的current状态
for entry_id in [444, 445]:
print(f"\n--- ID={entry_id} ---")
cur.execute("""
SELECT
je.journal_entry_id,
je.entry_date,
je.description,
je.is_latest,
je.is_deleted,
COALESCE(SUM(jl.debit), 0) as debit,
COALESCE(SUM(jl.credit), 0) as credit
FROM journal_entries je
LEFT JOIN journal_lines jl ON je.journal_entry_id = jl.journal_entry_id
WHERE je.journal_entry_id = %s
GROUP BY je.journal_entry_id, je.entry_date, je.description, je.is_latest, je.is_deleted
""", (entry_id,))
result = cur.fetchone()
if result:
je_id, date, desc, is_latest, is_deleted, debit, credit = result
print(f"日付: {date}")
print(f"摘要: {desc}")
print(f"is_latest: {is_latest}, is_deleted: {is_deleted}")
print(f"仕訳: 借={debit:>12,.0f} 貸={credit:>12,.0f}")
else:
print("存在しません")
# 查询所有is_deleted=true但金额较大的仕订
print("\n" + "=" * 160)
print("【削除済みの大きい仕訳is_deleted=true")
print("=" * 160)
cur.execute("""
WITH deleted_with_impact AS (
SELECT
je.journal_entry_id,
je.entry_date,
je.description,
je.is_latest,
COALESCE(SUM(jl.debit), 0) as total_debit,
COALESCE(SUM(jl.credit), 0) as total_credit,
COALESCE(SUM(CASE WHEN jl.account_id = 2 THEN jl.debit - jl.credit ELSE 0 END), 0) as bank_impact
FROM journal_entries je
LEFT JOIN journal_lines jl ON je.journal_entry_id = jl.journal_entry_id
WHERE je.is_deleted = true
AND EXTRACT(YEAR FROM je.entry_date) = 2025
GROUP BY je.journal_entry_id, je.entry_date, je.description, je.is_latest
)
SELECT *
FROM deleted_with_impact
WHERE ABS(total_debit - total_credit) > 100000
ORDER BY ABS(bank_impact) DESC
LIMIT 20
""")
deleted_entries = cur.fetchall()
print(f"\n金額100万以上が削除最大20件\n")
for je_id, date, desc, is_latest, debit, credit, bank_impact in deleted_entries:
print(f"ID={je_id:3d} | {date} | 借={debit:>12,.0f} 貸={credit:>12,.0f} | 普通預金への影响={bank_impact:>12,.0f}")
print(f" └─ {desc[:80]}")
print("\n" + "=" * 160)
print("【復旧すべき削除仕訳の推奨】")
print("=" * 160)
# 計算期待値とのギャップ
target_balance = 14_916_322
current_balance = 11_685_193
gap = target_balance - current_balance
print(f"\n期望値: {target_balance:>15,.0f}")
print(f"現在値: {current_balance:>15,.0f}")
print(f"ギャップ: {gap:>15,.0f}")
if gap > 0:
print(f"\n{gap:,}円分の入金(または出金削減)が必要")
# 找出删除的仕訳中,哪些恢复后能接近目标
cur.execute("""
SELECT
je.journal_entry_id,
je.entry_date,
je.description,
COALESCE(SUM(CASE WHEN jl.account_id = 2 THEN jl.debit - jl.credit ELSE 0 END), 0) as bank_impact
FROM journal_entries je
LEFT JOIN journal_lines jl ON je.journal_entry_id = jl.journal_entry_id
WHERE je.is_deleted = true
AND EXTRACT(YEAR FROM je.entry_date) = 2025
AND je.is_latest = true
GROUP BY je.journal_entry_id, je.entry_date, je.description
ORDER BY bank_impact DESC
""")
restored_balance = current_balance
print(f"\n削除済みの仕訳を復旧した場合のシミュレーション:\n")
for je_id, date, desc, impact in cur.fetchall():
if impact != 0:
restored_balance += impact
print(f"ID={je_id:3d}: {date} | impact={impact:>12,.0f} → balance={restored_balance:>12,.0f}")
if abs(restored_balance - target_balance) < abs(current_balance - target_balance):
print(f" ✓ これを復旧すると目標値に近くなります")
cur.close()
conn.close()