[2026-06-28] eagle: personal/projects/budget-app/bank-statement-import.md personal/projects/budget-app/index.md
This commit is contained in:
@@ -153,6 +153,45 @@ scripts/bank_scraper/
|
||||
|
||||
**Статус:** ✅ base + Demir driver написаны, Playwright установлен. **НО — Demir требует QR-логин через мобильное приложение**, не логин/пароль на сайте.
|
||||
|
||||
## Match placeholder transactions
|
||||
|
||||
### Проблема
|
||||
|
||||
Ручной ввод расходов с debit/credit счетов через CashInput создаёт placeholder-транзакции (`is_placeholder=true`). У них есть категория и комментарий, но нет реального подтверждения из банка. Когда выписка импортируется, те же траты появляются как новые транзакции из банка — без категории и комментария. Нужно сопоставить плейсхолдеры с реальными транзакциями.
|
||||
|
||||
### Механика матчинга
|
||||
|
||||
При импорте CSV-выписки скрипт (будущий `csv_bank_import.py` или orchestrator) выполняет:
|
||||
|
||||
1. Для каждой строки из выписки найти плейсхолдеры в БД с теми же:
|
||||
- `source_account_id` (тот же счёт)
|
||||
- `is_placeholder = true`
|
||||
- Сумма совпадает с точностью ±0.01
|
||||
- Дата в пределах ±3 дней от даты выписки
|
||||
2. Если найден ровно 1 плейсхолдер:
|
||||
- `UPDATE transaction SET is_placeholder = false, import_id = '<import_id>', category_id = <placeholder.category_id>, comment = <placeholder.comment> WHERE id = <placeholder.id>`
|
||||
- Реальная транзакция **не создаётся** — плейсхолдер становится постоянным с перенесёнными категорией и комментарием
|
||||
3. Если найдено несколько плейсхолдеров:
|
||||
- Создать реальную транзакцию как есть
|
||||
- Пометить плейсхолдеры как "требуют ручного разрешения" (флаг в будущем через TG-бот)
|
||||
4. Если не найден ни один:
|
||||
- Создать обычную транзакцию (is_placeholder=false, категория не указана)
|
||||
|
||||
### SQL для матчинга (ориентир)
|
||||
|
||||
```sql
|
||||
-- Найти плейсхолдер для строки выписки
|
||||
SELECT id, category_id, comment
|
||||
FROM transaction
|
||||
WHERE user_id = $user_id
|
||||
AND source_account_id = $source_account_id
|
||||
AND is_placeholder = true
|
||||
AND ABS(amount - $amount) < 0.01
|
||||
AND ABS(EXTRACT(EPOCH FROM (date - $date))) < 259200 -- ±3 дня в секундах
|
||||
ORDER BY ABS(amount - $amount), ABS(EXTRACT(EPOCH FROM (date - $date)))
|
||||
LIMIT 1
|
||||
```
|
||||
|
||||
## Реальность Demir IB
|
||||
|
||||
Сайт `93.171.215.109` (и `apps.demirbank.kg/ib/`) — **Flutter web SPA** с QR-аутентификацией. Нет формы логина с паролем — нужно сканировать QR мобильным приложением Demir.
|
||||
|
||||
Reference in New Issue
Block a user