fix: validate broker XLSX closing balance

This commit is contained in:
2026-08-19 15:56:37 +03:00
parent 076ab7b055
commit 3d08c9e5c6

View File

@@ -179,15 +179,17 @@ def main():
transactions = cash_transactions(rows, cash_start, holdings_start)
assert len({item['sourceId'] for item in transactions}) == len(transactions), 'sourceId операции не уникальны'
opening = kopecks(rows[find_row(rows, 'Отчёт об остатках денежных средств') + 3][1].get('L'))
closing = sum(item['amountSigned'] for item in transactions) + opening
balance_row = rows[find_row(rows, 'Отчёт об остатках денежных средств') + 3][1]
closing = kopecks(balance_row.get('AF'))
cash = {'schemaVersion': '1.0', 'bank': 'VTB_BROKER',
'statement': {'accountNumber': account, 'currency': 'RUB',
'openingBalance': opening, 'closingBalance': closing,
'exportedAt': (report_date or transactions[-1]['operationAt'][:10]) + 'T00:00:00+03:00'},
'transactions': [{key: value for key, value in item.items() if not key.startswith('_')}
for item in transactions]}
if opening + sum(item['amountSigned'] for item in transactions) != closing:
raise ValueError('Баланс не сходится')
calculated_closing = opening + sum(item['amountSigned'] for item in transactions)
if calculated_closing != closing:
raise ValueError(f'Баланс не сходится: операции дают {calculated_closing}, XLSX содержит {closing}')
cash_path.parent.mkdir(parents=True, exist_ok=True)
cash_path.write_text(json.dumps(cash, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
duplicate_candidates = len(transactions) - len({item['sourceId'].rsplit(':', 1)[0] for item in transactions})