update
This commit is contained in:
@@ -1,5 +1,19 @@
|
||||
# Impact Map
|
||||
|
||||
## Post-apply 20260712-1647
|
||||
- Mechanizm wdrożony w kontrolerze logowania, filtrze, widoku, modelu i migracji.
|
||||
- Zdalna tabela `remember_tokens` istnieje.
|
||||
- Trasy i globalna konfiguracja sesji pozostały bez zmian.
|
||||
- Do ręcznego potwierdzenia pozostaje UAT dwóch profili przeglądarki.
|
||||
|
||||
## Plan 20260712-1647 — zapamiętywanie logowania (plan scan)
|
||||
- Logowanie: `app/Controllers/Auth.php`, `app/Views/auth/login.php`.
|
||||
- Odtworzenie sesji: `app/Filters/AuthFilter.php`; trasy pozostają bez zmian.
|
||||
- Dane: nowa tabela tokenów i model; wiele rekordów umożliwia wiele urządzeń.
|
||||
- Konfiguracja: użyć istniejących ustawień HttpOnly/SameSite; nie wydłużać `Session::$expiration`.
|
||||
- Test/UAT: dwa profile, wylogowanie jednego urządzenia, nieważny i wygasły token.
|
||||
- Wdrożenie: migrację zastosować ręcznie na hostido przed kodem.
|
||||
|
||||
**Aktualizacja:** 2026-07-06 (post-apply Plan 2 — degraded)
|
||||
|
||||
## Kontekst
|
||||
@@ -16,6 +30,15 @@ CodeIgniter 4.7.3 + MySQL (`.env`). Radar degraded — brak indeksu codebase-mem
|
||||
- Wyceny: `ValuationModel`, `Valuations.php`, widoki `valuations/`, tabela `inv_valuations` (FK RESTRICT → inv_instruments).
|
||||
- Pulpit inwestycji: `Investments::index` → `investments/index.php`, trasa `/investments`.
|
||||
|
||||
### Import paragonów (Plan 3)
|
||||
- Paragony: `ReceiptModel` (`withCounts`), `ReceiptItemModel` (`forReceipt`, `name` surowa + `display_name` ładna), `Receipts.php`, widoki `receipts/`, tabele `receipts` + `receipt_items` (FK CASCADE → receipts, SET NULL → categories).
|
||||
- Uczone dopasowania: `ReceiptCategoryMapModel` (`normalize`, `suggest`, `remember`), tabela `receipt_category_map` (item_name UNIQUE → category_id). Klucz = surowa nazwa z paragonu. Tylko podpowiedź, brak auto-zapisu.
|
||||
- Parser AI: `app/Libraries/ReceiptParser.php` — OpenAI **Responses API** (`/v1/responses`) przez `\Config\Services::curlrequest()`; jpg/png (`input_image`), pdf (`input_file` — OpenAI renderuje strony), json (`input_text`). Model z `env('openai.model')` domyślnie **o4-mini** (rozumujący; mini/gpt-4o za słabe na gęsty druk). Zwraca `name`+`display`. Klucz `OPEN_AI_API`.
|
||||
- Upload bez `fileinfo` (hostido je wyłącza): walidacja rozszerzeń ręczna, własna nazwa pliku, MIME z rozszerzenia. Cały przepływ w try/catch → błąd zapisany w `receipts.error_msg`, nie 500.
|
||||
- Zapis: `confirm()` grupuje pozycje po kategorii → 1 operacja `expense`/kategoria (suma edytowalnych kwot) przez `OperationModel`, z `operations.receipt_id` (FK SET NULL). Uczenie na surowej nazwie, opis z ładnych. Transakcja DB.
|
||||
- Kategorie: `CategoryModel::tree()` daje `path_label` („Nadrzędna → Podrzędna") — używane w przeglądzie paragonu; `indent_label` nadal w operacjach.
|
||||
- Pliki skanów: `writable/uploads/receipts/`, serwowane przez `Receipts::file` pod filtrem `auth`.
|
||||
|
||||
### Pulpit globalny
|
||||
- `Dashboard::index` → `app/Views/dashboard/index.php`, trasy `/` i `/dashboard`. Majątek = saldo bieżące (`OperationModel::totals`) + wartość inwestycji (`InstrumentModel::withStats`).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user