Files
orderPRO/.paul/codebase/STACK.md
Jacek Pyziak b1b2cc5827 chore: generate codebase map in .paul/codebase/
INDEX, STACK, ARCHITECTURE, CONVENTIONS, TESTING, INTEGRATIONS, CONCERNS
2026-04-26 21:39:12 +02:00

72 lines
2.8 KiB
Markdown

# Technology Stack
## Runtime
| Layer | Technology | Version | Notes |
|-------|-----------|---------|-------|
| PHP | PHP | ^8.4 | `declare(strict_types=1)` in all files |
| Web server | Apache | XAMPP (local) | `public/.htaccess` handles routing |
| Database | MySQL | InnoDB | utf8mb4_unicode_ci |
| Node.js | npm | dev only | Sass build tool only, no runtime JS bundler |
## PHP Dependencies (`composer.json`)
| Package | Version | Purpose |
|---------|---------|---------|
| `dompdf/dompdf` | ^3.1 | PDF generation (receipts, labels) |
| `phpoffice/phpspreadsheet` | ^5.5 | Excel/XLSX export (accounting) |
| `phpmailer/phpmailer` | ^7.0 | SMTP email sending |
| `phpunit/phpunit` | ^11.5 (dev) | Unit testing |
| `dg/bypass-finals` | ^1.9 (dev) | Mock final classes in tests |
## Framework
**Custom lightweight framework** — no Laravel/Symfony.
| Component | File |
|-----------|------|
| Application bootstrap | `src/Core/Application.php` |
| Router | `src/Core/Routing/Router.php` |
| Request / Response | `src/Core/Http/Request.php`, `Response.php` |
| Template engine | `src/Core/View/Template.php` (PHP-native, `$e()` + `$t()` helpers) |
| Session | `src/Core/Support/Session.php` |
| Logger | `src/Core/Support/Logger.php``storage/logs/app.log` |
| CSRF | `src/Core/Security/Csrf.php` |
| i18n | `src/Core/I18n/Translator.php` (Polish primary: `resources/lang/pl/`) |
| DB connection | `src/Core/Database/ConnectionFactory.php` (PDO, no ORM, no medoo) |
| Migrator | `src/Core/Database/Migrator.php` (custom SQL runner, `migrations` table) |
| SSL resolver | `src/Core/Http/SslCertificateResolver.php` (env: `CURL_CA_BUNDLE_PATH`) |
## Frontend
- **No CSS framework** — custom SCSS design tokens
- **jQuery** — used only for `jquery-alerts` module (`resources/modules/jquery-alerts/`)
- **No JS bundler** — files served directly from `public/assets/js/`
- **Build**: `npm run build:assets` (Sass → compressed CSS + JS copy)
## Build Scripts
```json
"build:css" sass --style=compressed resources/scss/app.scss public/assets/css/app.css
"build:modules" sass jquery-alerts.scss + copy jquery-alerts.js
"build:assets" build:css && build:modules
"watch:css" sass --watch (development)
```
```json
"serve" php -S localhost:8000 -t public public/index.php
"migrate" php bin/migrate.php
"cron" php bin/cron.php
"test" vendor/bin/phpunit -c phpunit.xml --testdox
```
## Environment Variables (`.env.example`)
| Variable | Purpose |
|----------|---------|
| `DB_HOST`, `DB_PORT`, `DB_DATABASE` | MySQL connection |
| `DB_HOST_REMOTE` | Agent-only manual DB ops (NOT used by app runtime) |
| `CURL_CA_BUNDLE_PATH` | SSL cert path (XAMPP: `C:/xampp/php/extras/ssl/cacert.pem`) |
| `ALLEGRO_USER_AGENT_URL` | Required by Allegro REST API from 01.07.2026 |
| `CRON_RUN_ON_WEB`, `CRON_WEB_LIMIT`, `CRON_PUBLIC_TOKEN` | Cron configuration |