Files
finansePRO/.paul/codebase/impact_map.md
T
2026-07-22 00:27:20 +02:00

79 lines
6.2 KiB
Markdown

# Impact Map
## Post-apply 20260721-2324 — ceny z JSON w groszach
- Zmieniono wyłącznie `app/Libraries/ReceiptParser.php` — dodano regułę promptu „grosze → złote" dla wejścia JSON (eParagon).
- Backend/kontroler/modele/baza/trasy/widoki bez zmian; ścieżka `input_image`/`input_file` (obraz/PDF) nietknięta.
- Ukryte sprzężenie: reguła warunkowa tylko dla JSON, żeby nie zaburzyć odczytu kwot ze zdjęć/PDF.
- UAT runtime (wymaga OpenAI + aplikacji): import `d:\telefon-download\2607202229016050.json` → pozycje 3,69 / 5,29 / 2,58 / 0,34 / 1,25, total 13,65. Do potwierdzenia przez użytkownika.
## Post-apply 20260713-2111
- Zmieniono wyłącznie `app/Views/receipts/new.php` i `app/Views/receipts/review.php`.
- Aparat korzysta z istniejącego pola `receipt` i `Receipts::create`; backend, routing, parser, modele i baza bez zmian.
- Mobilny przegląd pozycji używa układu kart poniżej `md`, zachowując nazwy pól i skrypt grupowania.
- UAT aparatu i poprawionego przeglądu zatwierdzony przez użytkownika.
## Plan 20260713-2111 — skanowanie paragonu kamerą telefonu
- UI: `app/Views/receipts/new.php`; istniejące pole `receipt` może użyć natywnego `capture="environment"`.
- Backend: `Receipts::create` już obsługuje JPG/JPEG/PNG do 10 MB i przekazuje obraz do obecnego parsera; bez zmiany kontrolera.
- Trasy, parser AI, modele, baza i zapis operacji pozostają bez zmian.
- UAT: telefon mobilny — tylna kamera, wysłanie zdjęcia, przejście do przeglądu oraz zachowany wybór istniejącego pliku.
- Ukryte sprzężenie: zachować `name="receipt"`, `multipart/form-data` i obecny `accept`, aby nie rozdzielić przepływu uploadu.
## 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
CodeIgniter 4.7.3 + MySQL (`.env`). Radar degraded — brak indeksu codebase-memory-mcp; weryfikacja runtime.
## Moduły
### Finanse bieżące (Plan 1)
- Kategorie/operacje: `app/Models/{Category,Operation}Model.php`, `app/Controllers/{Categories,Operations}.php`, tabele `categories`/`operations`.
- Pulpit finansów: `Dashboard::finances``app/Views/dashboard/finances.php`, trasa `/finances`.
### Inwestycje (Plan 2)
- Instrumenty: `InstrumentModel` (`withStats`, `portfolioTimeline`, `hasChildren`), `Instruments.php`, widoki `instruments/`, tabela `inv_instruments`.
- Operacje: `InvOperationModel`, `InvOperations.php`, widoki `inv_operations/`, tabela `inv_operations` (FK RESTRICT → inv_instruments).
- 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`).
## Routing / nawigacja
- `app/Config/Routes.php` — grupa `auth`: `/`, `dashboard`, `finances`, `operations/*`, `categories/*`, `investments`, `instruments/*`, `investments/operations/*`, `investments/valuations/*`.
- `app/Views/layout/main.php` — top-level „Pulpit" + dropdowny „Finanse bieżące" / „Inwestycje".
## Dane / config
- MySQL z `.env` (dev → `db_host_remote`, prod → `db_host`) w `Database.php`.
- Tabele inwestycji: `inv_instruments` (name unique), `inv_operations` (instrument_id, date, amount, type enum deposit/withdraw), `inv_valuations` (instrument_id, date, value).
## Ukryte sprzężenia
- Zarobek netto liczony wyłącznie w `InstrumentModel::withStats` — kontrolery/widoki konsumują (jedno źródło prawdy).
- FK RESTRICT: instrument z operacjami/wycenami nieusuwalny (spójne z blokadą w `Instruments::delete`).
- Pulpit globalny zależny od obu domen (finanse + inwestycje).
## Weryfikacja manualna
- Migracje `inv_*`; CRUD 3 encji; filtry; blokada usunięcia; wzór zarobku; pulpity `/dashboard`, `/finances`, `/investments`.