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

96 lines
3.9 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.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
sys.path.insert(0, 'backend')
os.environ['DB_HOST'] = '192.168.0.61'
os.environ['DB_NAME'] = 'njts_acct'
os.environ['DB_USER'] = 'njts_app'
os.environ['DB_PASSWORD'] = 'njts_app2025'
os.environ['DB_PORT'] = '55432'
from app.core.database import get_connection
from decimal import Decimal
with get_connection() as conn:
with conn.cursor() as cur:
# 获取account_id
cur.execute("SELECT account_id FROM accounts WHERE account_code = '701'")
aid = cur.fetchone()['account_id']
print('\n【 2025年6月701売上高的借方交易 】\n')
cur.execute("""
SELECT
jl.journal_line_id,
jl.journal_entry_id,
je.entry_date,
je.description,
jl.debit,
jl.credit,
je.parent_entry_id,
je.is_deleted,
(SELECT COUNT(*) FROM journal_entries child WHERE child.parent_entry_id = je.journal_entry_id) as has_child
FROM journal_lines jl
JOIN journal_entries je ON je.journal_entry_id = jl.journal_entry_id
WHERE jl.account_id = %s
AND je.entry_date >= '2025-06-01'
AND je.entry_date <= '2025-06-30'
AND jl.debit > 0
ORDER BY je.entry_date, je.journal_entry_id
""", (aid,))
total_debit = 0
print("Entry# | Date | Debit | Parent | HasChild | Description (first 50 chars)")
print("-" * 90)
for row in cur.fetchall():
parent_str = f"#{row['parent_entry_id']}" if row['parent_entry_id'] else "None"
print(f"#{row['journal_entry_id']:<5} | {row['entry_date']} | {row['debit']:>10} | {parent_str:<6} | {row['has_child']:<8} | {row['description'][:50]}")
total_debit += row['debit']
print("-" * 90)
print(f"总计借方: {total_debit}")
print('\n【 按照LEFT JOIN过滤逻辑 】\n')
print('当前SQL: child.journal_entry_id IS NULL')
print('= 只包含没有子交易的交易')
print('')
print('关键问题:')
print('- Entry#360 (debit=1,400,000) 现在 parent_entry_id=357')
print('- 但Entry#360本身还是被包含的因为它没有子交易只是Entry#357被过滤了')
print('')
print('\n【 验证当前的SQL过滤结果 】\n')
cur.execute("""
SELECT
COALESCE(SUM(l.debit), 0) AS debit,
COALESCE(SUM(l.credit), 0) AS credit
FROM journal_lines l
JOIN journal_entries j
ON j.journal_entry_id = l.journal_entry_id
LEFT JOIN journal_entries child
ON child.parent_entry_id = j.journal_entry_id
WHERE l.account_id = %s
AND j.entry_date BETWEEN %s AND %s
AND j.is_deleted = false
AND child.journal_entry_id IS NULL
""", (aid, '2025-06-01', '2025-06-30'))
row = cur.fetchone()
print(f"当前SQL查询结果:")
print(f" 借方 (debit) = {row['debit']}")
print(f" 貸方 (credit) = {row['credit']}")
print('\n【 分析 】')
print('Entry#360的1,400,000借方是"取消"交易')
print('它与Entry#357形成对冲:')
print(' Entry#357: 贷方1,400,000 (原始业务)')
print(' Entry#360: 借方1,400,000 (取消)')
print('')
print('问题: 这两个是相互抵消的关系,不应该同时出现自一个科目的报告里')
print(' current logic 过滤掉了Entry#357但Entry#360仍然被计入')
print('')
print('可能的解决方案:')
print('1. 当parent_entry_id不为NULL时该交易也应被排除')
print('2. 或者: Entry#360应该成为"leaf",后续有更正交易')