Files
2026-07-06 20:16:00 +02:00

93 lines
5.3 KiB
Markdown

---
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/`).