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

144 lines
5.7 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 python3
# -*- coding: utf-8 -*-
"""
Analyze the composition of 2025年6月 売上高 debit 3,310,000
"""
import sys
sys.path.insert(0, '/app')
from app.core.database import get_connection
from datetime import date
def analyze():
with get_connection() as conn:
with conn.cursor() as cur:
print("=" * 80)
print("【2025年6月 売上高借方 3,310,000 の分析】")
print("=" * 80)
print()
# Get account_id for 701
cur.execute("SELECT account_id FROM accounts WHERE account_code = '701'")
acc_result = cur.fetchone()
if not acc_result:
print("701科目が見つかりません")
return
account_id = acc_result['account_id']
print("【ステップ1: 2025年6月の売上高借方明細最新版のみ")
print()
cur.execute("""
SELECT
j.journal_entry_id,
j.description,
j.entry_date,
j.is_latest,
j.created_at,
l.debit,
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(YEAR FROM j.entry_date) = 2025
AND EXTRACT(MONTH FROM j.entry_date) = 6
AND j.is_deleted = false
AND j.is_latest = true
ORDER BY j.entry_date, j.journal_entry_id
""", (account_id,))
entries = cur.fetchall()
total_debit = 0
total_credit = 0
for i, e in enumerate(entries, 1):
print(f"{i}. ID={e['journal_entry_id']:4d}: {e['description']:<30s} ({e['entry_date']})")
print(f" 借={e['debit']:>12.0f} 貸={e['credit']:>12.0f} is_latest={e['is_latest']}")
total_debit += e['debit']
total_credit += e['credit']
print()
print(f"【合計】借方: {total_debit:>12,.0f} 貸方: {total_credit:>12,.0f}")
print()
# Double check: also include old versions to see the difference
print("【ステップ2: 参考 - すべてのバージョンis_latest無関係")
print()
cur.execute("""
SELECT
j.journal_entry_id,
j.description,
j.entry_date,
j.is_latest,
j.is_deleted,
l.debit,
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(YEAR FROM j.entry_date) = 2025
AND EXTRACT(MONTH FROM j.entry_date) = 6
AND j.is_deleted = false
ORDER BY j.entry_date, j.journal_entry_id
""", (account_id,))
all_entries = cur.fetchall()
all_debit = 0
all_credit = 0
for e in all_entries:
latest_mark = "✓最新" if e['is_latest'] else "✗旧版"
print(f"ID={e['journal_entry_id']:4d}: {e['description']:<30s} ({e['entry_date']}) {latest_mark}")
print(f" 借={e['debit']:>12,.0f} 貸={e['credit']:>12,.0f}")
all_debit += e['debit']
all_credit += e['credit']
print()
if all_debit != total_debit:
print(f"【注意】すべてのバージョン: 借方={all_debit:>12,.0f} 貸方={all_credit:>12,.0f}")
print(f" 最新版のみ: 借方={total_debit:>12,.0f} 貸方={total_credit:>12,.0f}")
print(f" 差分: 借方={all_debit - total_debit:>12,.0f}(古い版の分)")
else:
print(f"✓ 最新版のみのデータ = すべてのバージョン(修正なし)")
print()
print("【ステップ3: 修正チェーンの確認】")
# Check if any of these entries are part of a correction chain
cur.execute("""
SELECT DISTINCT
COALESCE(j.original_entry_id, j.journal_entry_id) as chain_id,
COUNT(*) as count_in_chain
FROM journal_entries j
WHERE j.journal_entry_id IN (
SELECT DISTINCT l.journal_entry_id
FROM journal_lines l
JOIN journal_entries j ON j.journal_entry_id = l.journal_entry_id
WHERE l.account_id = %s
AND EXTRACT(YEAR FROM j.entry_date) = 2025
AND EXTRACT(MONTH FROM j.entry_date) = 6
AND j.is_deleted = false
)
GROUP BY COALESCE(j.original_entry_id, j.journal_entry_id)
HAVING COUNT(*) > 1
""", (account_id,))
chains = cur.fetchall()
if chains:
print("修正チェーンが見つかりました:")
for chain in chains:
print(f" Chain {chain['chain_id']}: {chain['count_in_chain']} バージョン")
else:
print("修正チェーンなし(すべて単独のバージョン)")
if __name__ == "__main__":
try:
analyze()
except Exception as e:
print(f"エラー: {e}")
import traceback
traceback.print_exc()
sys.exit(1)