Files
finansePRO/.paul/codebase/impact_map.md
T
2026-07-12 19:21:35 +02:00

4.6 KiB

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

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::financesapp/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::indexinvestments/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::indexapp/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.