import sys sys.path.insert(0, '/app') from app.core.database import get_connection from datetime import datetime print("=" * 80) print("【account_id 53(小口現金) → 20(未払金)の置換前分析】") print("=" * 80) with get_connection() as conn: with conn.cursor() as cur: # 1. 影響する仕訳の件数 print("\n【1】影響する仕訳行の件数") cur.execute(""" SELECT COUNT(*) as cnt FROM journal_lines WHERE account_id = 53 """) result = cur.fetchone() print(f" • account_id 53 を含む仕訳行: {result['cnt']} 件") if result['cnt'] > 0: # 2. 金額の影響 print("\n【2】金額の影響") cur.execute(""" SELECT SUM(CASE WHEN debit > 0 THEN debit ELSE 0 END) as total_debit, SUM(CASE WHEN credit > 0 THEN credit ELSE 0 END) as total_credit FROM journal_lines WHERE account_id = 53 """) result_amount = cur.fetchone() print(f" • 借方合計: {result_amount['total_debit']}") print(f" • 貸方合計: {result_amount['total_credit']}") # 3. 影響する仕訳の詳細 print("\n【3】影響する仕訳の詳細(最初の 20 件)") cur.execute(""" SELECT je.journal_entry_id, je.entry_date, je.description, a.account_code, a.account_name, jl.debit, jl.credit FROM journal_lines jl JOIN journal_entries je ON jl.journal_entry_id = je.journal_entry_id JOIN accounts a ON jl.account_id = a.account_id WHERE jl.account_id = 53 ORDER BY je.entry_date DESC LIMIT 20 """) for i, row in enumerate(cur.fetchall(), 1): side = '借方' if row['debit'] > 0 else '貸方' amount = row['debit'] if row['debit'] > 0 else row['credit'] print(f" {i}. {row['entry_date']} - {row['description'][:40]}...") print(f" {row['account_code']} {row['account_name']}: {side} {amount}") # 4. 会計的影響の分析 print("\n【4】会計的な影響(警告)⚠️") print(" 【問題1】資産 vs 負債の分類変更") print(" • 小口現金(105)= 流動資産") print(" • 未払金(502)= 流動負債") print(" → 貸借対照表の構成が大きく変わります") print("\n 【問題2】簿記ルール違反の可能性") cur.execute(""" SELECT COUNT(DISTINCT je.journal_entry_id) as journal_count, MAX(je.entry_date) as latest_date FROM journal_lines jl JOIN journal_entries je ON jl.journal_entry_id = je.journal_entry_id WHERE jl.account_id = 53 """) result_check = cur.fetchone() print(f" • 影響する仕訳: {result_check['journal_count']} 件") print(f" • 最新の仕訳: {result_check['latest_date']}") print(" → これらの仕訳の相手科目との整合性が乱れる可能性") print("\n 【問題3】監査証跡の喪失") print(" • 元の科目情報が失われます") print(" → 修正履歴は保存されていません(一度背き不可)") else: print(" • account_id 53 の仕訳行は存在しません(置換は不要)") print("\n" + "=" * 80) print("【SQL 置換コマンド】") print("=" * 80) print(""" -- バックアップ推奨:先に元のデータをダンプしてください -- pg_dump accounting_db > backup_before_replacement.sql -- 置換実行SQL(自己責任で実行してください) BEGIN; -- トランザクション開始 UPDATE journal_lines SET account_id = 20 WHERE account_id = 53; -- 確認用SQL(実行前に確認してください) -- SELECT COUNT(*) FROM journal_lines WHERE account_id = 20; COMMIT; -- コミット(このコマンドで確定) -- ROLLBACK; -- ロールバック(中止したい場合) """) print("=" * 80)