--- plan_id: 20260706-1248-fundament-wydatki-przychody title: Fundament finansePRO + moduł wydatków/przychodów bieżących completed: 2026-07-06T13:20:00+02:00 storage: plan-first quality_radar: degraded --- # Summary: Fundament finansePRO + moduł wydatków/przychodów bieżących ## Objective Postawić fundament aplikacji finansePRO na CodeIgniter 4 (MySQL z `.env`), logowanie jednego użytkownika oraz moduł finansów bieżących: kategorie hierarchiczne z typem, operacje z filtrami i dashboard z wykresami ApexCharts. ## What Was Built | Area | Result | |------|--------| | Fundament CI4 | CodeIgniter 4.7.3 zainstalowany (Composer), `Database.php` czyta klucze z istniejącego `.env`, czyste URL-e (`indexPage=''`) | | Logowanie | Filtr `auth` + `Auth::login/logout` weryfikuje wobec `user_email`/`user_password` z `.env`, sesja `logged_in` | | Schemat DB | Migracje `categories` (hierarchia `parent_id`, `type`, FK self `SET NULL`) i `operations` (FK `category_id` `SET NULL`), seeder 9 kategorii | | CRUD kategorii/operacji | Pełny CRUD, filtry (data/kategoria/typ), sumy przychody/wydatki/saldo, blokada usunięcia używanej kategorii | | Dashboard | 3 wykresy ApexCharts (bilans miesięczny, wydatki wg kategorii donut, saldo skumulowane) + kafelki podsumowań | | Deployment | Root `.htaccess` (forward do `public/`, HTTPS jak crmPRO), sekcja produkcyjna w `.env` | ## Files Modified - `composer.json`, `composer.lock`, `vendor/`, `spark`, `public/`, `writable/` — szkielet CI4 - `app/Config/Database.php` — hostname/username/password/database z `.env` (jedno źródło prawdy) - `app/Config/Routes.php` — trasy publiczne + grupa chroniona filtrem `auth` - `app/Config/Filters.php` — alias `auth` - `app/Config/App.php` — `indexPage=''` - `app/Controllers/BaseController.php` — helpery `form`, `url` - `app/Filters/AuthFilter.php` — ochrona tras - `app/Controllers/{Auth,Categories,Operations,Dashboard}.php` - `app/Models/{CategoryModel,OperationModel}.php` - `app/Database/Migrations/2026-07-06-100001_CreateCategories.php`, `...100002_CreateOperations.php` - `app/Database/Seeds/DefaultCategoriesSeeder.php` - `app/Views/layout/main.php`, `auth/login.php`, `categories/{index,form}.php`, `operations/{index,form}.php`, `dashboard/index.php` - `.env` — `CI_ENVIRONMENT`, `app.baseURL` (produkcja) - `.htaccess` (root) — forward do `public/` dla hostido - `C:/xampp/php/php.ini` — włączone `extension=intl` (poza repo, wymóg CI4) ## Acceptance Criteria Results | Criterion | Status | Evidence | |-----------|--------|----------| | AC-1: start + połączenie z DB | Pass | `php spark serve` startuje, `migrate` łączy się z bazą hostido | | AC-2: logowanie z `.env` | Pass | curl: poprawne dane → 303 `/dashboard`; złe → powrót; `/logout` → `/login`; trasa chroniona → `/login` | | AC-3: kategorie (hierarchia+typ) | Pass | CRUD OK; `parent_id` respektowany; usunięcie używanej kategorii zablokowane komunikatem | | AC-4: CRUD operacji + filtry | Pass | filtry income/expense/zakres dat zwracają dokładne kwoty; sumy 5000/450/4550 | | AC-5: dashboard z wykresami | Pass | JSON `monthly`/`byCat`/`running` poprawne; 3 wykresy ApexCharts renderowane | ## Verification Results | Check | Result | Notes | |-------|--------|-------| | `php spark migrate` | Pass | 2 migracje na bazie hostido | | `php spark db:seed DefaultCategoriesSeeder` | Pass | 9 kategorii | | `php spark serve` + curl (login/logout/CRUD/filtry/dashboard) | Pass | pełny przepływ end-to-end | | Wymuszenie typu operacji przez kategorię | Pass | wysłane złe typy zostały poprawione wg kategorii | | Blokada usunięcia używanej kategorii | Pass | redirect + komunikat | | Dane testowe | Cleaned | operacje: 0, kategorie seed: 9 | ## Quality Radar Results **Status:** degraded - New risks: brak nowych ryzyk duplikacji (jscpd/ast-grep wyłączone polityką) - Resolved risks: config DB — jedno źródło prawdy (`.env`); typ operacji — wymuszany przez kategorię - Deferred risks: pełna indeksacja `codebase-memory-mcp` odłożona do `$paul-map-codebase`; weryfikacja przeprowadzona runtime'owo - Raw outputs: `.paul/codebase/tooling_status.md` ## Deviations - Dodano `CI_ENVIRONMENT` i `app.baseURL` do `.env` (potrzebne dla dev/prod; nie dubluje configu DB). - `app/Config/App.php`: `indexPage=''` (czyste URL-e) — poza pierwotną listą plików. - Włączono `intl` w XAMPP `php.ini`; zainstalowano Composer (środowisko). - Dev łączy się do zdalnej bazy hostido (lokalny MySQL zgaszony); produkcyjnie `localhost`. - Dodano root `.htaccess` (naprawa 403 na hostido) — poza pierwotnym zakresem, wynikło z wdrożenia. ## Key Decisions / Patterns - **Jedno źródło prawdy dla DB**: `Database.php` czyta wyłącznie klucze `.env`, wybór host wg `ENVIRONMENT`. - **Typ operacji narzuca kategoria**: spójność wymuszana po stronie serwera (`Operations::persist`) + UX w JS. - **CI4 na współdzielonym hostingu**: root `.htaccess` forwarduje do `public/` (wzorzec z crmPRO dla HTTPS). ## Follow-up - Plan 2: moduł inwestycji — `inv_operations` (wpłaty/wypłaty) + `inv_valuations` (ręczne snapshoty wartości), wykres suma wpłat vs bieżąca wartość vs zarobek. - Opcjonalnie: `$paul-map-codebase` (pełny indeks) przed Planem 2. - Weryfikacja wdrożenia produkcyjnego na `https://finanse.projectpro.pl/` (docroot/`.htaccess`, `vendor/`, prawa `writable/`).