126 lines
4.2 KiB
Python
126 lines
4.2 KiB
Python
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()
|