# 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`.