93 lines
5.3 KiB
Markdown
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/`).
|