113 lines
4.4 KiB
Python
113 lines
4.4 KiB
Python
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)
|