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

99 lines
4.2 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
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月1日 - 701科目的所有交易 】\n')
cur.execute("""
SELECT
j.journal_entry_id,
j.entry_date,
j.description,
l.debit,
l.credit,
j.parent_entry_id,
(SELECT COUNT(*) FROM journal_entries child WHERE child.parent_entry_id = j.journal_entry_id) as has_child
FROM journal_lines l
JOIN journal_entries j ON j.journal_entry_id = l.journal_entry_id
WHERE l.account_id = %s
AND j.entry_date = '2025-06-01'
ORDER BY j.journal_entry_id
""", (aid,))
entries = cur.fetchall()
print("Entry# | Debit | Credit | Parent | HasChild | Description")
print("-" * 100)
for row in entries:
parent_str = f"#{row['parent_entry_id']}" if row['parent_entry_id'] else "None"
print(f"#{row['journal_entry_id']:<5} | {row['debit'] or 0:>10} | {row['credit'] or 0:>10} | {parent_str:<6} | {row['has_child']:<8} | {row['description'][:60]}")
print('\n【 分析对冲关系 】\n')
# 查找【未計上のため取消】的交易
cur.execute("""
SELECT
j.journal_entry_id,
j.description,
l.debit,
l.credit,
j.parent_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 j.entry_date = '2025-06-01'
AND j.description LIKE '%未計上のため取消%'
ORDER BY j.journal_entry_id
""", (aid,))
cancel_entries = cur.fetchall()
print(f"找到【未計上のため取消】的交易: {len(cancel_entries)}")
for row in cancel_entries:
parent_str = f"Parent=#{row['parent_entry_id']}" if row['parent_entry_id'] else "Parent=None"
print(f"\nEntry#{row['journal_entry_id']}")
print(f" {parent_str}")
print(f" 借: {row['debit'] or 0}")
print(f" 贷: {row['credit'] or 0}")
if row['parent_entry_id']:
print(f" ↑ 这是 Entry#{row['parent_entry_id']} 的修正交易")
# 查找原始交易
cur.execute("""
SELECT debit, credit FROM journal_lines
WHERE journal_entry_id = %s AND account_id = %s
""", (row['parent_entry_id'], aid))
parent_line = cur.fetchone()
if parent_line:
print(f" 原始交易 Entry#{row['parent_entry_id']}: 借={parent_line['debit'] or 0}, 贷={parent_line['credit'] or 0}")
print('\n【 用户说应该对冲 1,400,000 】\n')
print('根据之前的分析:')
print(' - Entry#357: 贳方 1,400,000 (原始交易 - 现在被过滤了)')
print(' - Entry#360: 借方 1,400,000 (取消交易 - 现在被计入了)')
print('')
print('问题确认:')
print(' 这两笔确实应该相互抵消(对冲),不应该同时出现在试算表中')
print('')
print('当前的过滤逻辑:')
print(' - 过滤掉了有子交易的父交易 (Entry#357被过滤因为Entry#360是它的子)')
print(' - 但没有过滤掉作为"取消"的子交易本身 (Entry#360被计入)')
print('')
print('需要验证的事项:')
print(' 1. Entry#360是否还需要有后续的修正交易')
print(' 2. 还是应该改变过滤逻辑来排除Entry#360')