# Consultant — Iteracja 1: Szkielet infrastruktury

## Status: ZAKOŃCZONA (po przeglądzie zakresu)

## Zakres Iteracji 1

Infrastruktura bez logiki domenowej, bez auth, bez permissions.

## Struktura projektu

```
consultant/
├── composer.json
├── config/
│   └── app.php                              ← stałe ROOT, API_BASE_URL, CURRENCY itp.
├── public/
│   ├── .htaccess                            ← routing przez index.php
│   ├── index.php                            ← bootstrap: dotenv, lang, DI, dispatch
│   ├── sw.js                                ← Service Worker PWA
│   ├── manifest.webmanifest
│   ├── offline.html
│   └── assets/js/consultant-ajax.js        ← biblioteka AJAX przez proxy
└── src/
    ├── core/
    │   ├── Bootstrap/
    │   │   ├── App.php                      ← dispatcher FastRoute (bez middleware)
    │   │   ├── routes.php                   ← auto-load *Routes.php
    │   │   └── Routes/
    │   │       └── ApiProxyRoutes.php
    │   ├── Http/ApiClient.php               ← klient cURL, bez tokenu (Iteracja 1)
    │   ├── Container/Container.php          ← DI php-di
    │   ├── Support/
    │   │   ├── functions.php
    │   │   ├── GlobalRegistry.php
    │   │   ├── UserHeaderProvider.php
    │   │   └── Route.php
    │   ├── Twig/AppExtension.php
    │   ├── Exceptions/
    │   │   ├── DataNotFoundException.php
    │   │   └── ProtectedResourceException.php
    │   └── I18n/translations/page/{pl,en}/
    │       ├── auth.json
    │       ├── layouts.json
    │       ├── dashboard.json
    │       ├── components.json
    │       └── errors.json
    └── app/
        ├── Http/
        │   ├── Controllers/
        │   │   ├── Controller.php           ← bazowy, bez permissions
        │   │   └── ApiProxyController.php
        └── Views/
            ├── layouts/
            │   ├── mobile_base.twig         ← layout PWA, bottom_nav jako placeholder
            │   └── error_mobile.twig
            ├── components/
            │   └── bottom_nav.twig          ← warunkowy, items z kontrolera (Iteracja 2+)
            └── errors/
                ├── 404.twig
                ├── 403.twig
                └── 500.twig
```

## Pliki poza zakresem (wygenerowane przedwcześnie, NIE usunięte)

Poniższe pliki istnieją w repozytorium ale nie są wstrzyknięte do bootstrapu.
Zostaną włączone w odpowiednich iteracjach:

| Plik | Iteracja |
|---|---|
| `src/core/Cookie/CookieManager.php` | Iteracja 2 (auth) |
| `src/core/Bootstrap/Routes/Auth/LoginRoutes.php` | Iteracja 2 |
| `src/app/Models/Auth/JWTModel.php` | Iteracja 2 |
| `src/app/Models/Me/LoggedUserModel.php` | Iteracja 2 |
| `src/app/Repositories/Auth/LoginRepository.php` | Iteracja 2 |
| `src/app/Services/Auth/AuthService.php` | Iteracja 2 |
| `src/app/Services/Auth/JwtService.php` | Iteracja 2 |
| `src/app/Http/Controllers/Auth/AuthController.php` | Iteracja 2 |
| `src/app/Http/Middleware/AuthMiddleware.php` | Iteracja 2 |
| `src/app/Http/Requests/LoginRequest.php` | Iteracja 2 |
| `src/app/Views/auth/login.twig` | Iteracja 2 |
| `src/core/Bootstrap/Routes/Dashboard/DashboardRoutes.php` | Iteracja 3+ |
| `src/app/Http/Controllers/Dashboard/DashboardController.php` | Iteracja 3+ |
| `src/app/Views/dashboard/dashboard.twig` | Iteracja 3+ |

## Konfiguracja serwera (Apache)

Assets Mazer współdzielone z `owner`:

```bash
ln -s /var/www/html/owner/public/assets/mazer /var/www/html/consultant/public/assets/mazer
ln -s /var/www/html/owner/public/assets/pwa   /var/www/html/consultant/public/assets/pwa
```

## Następne iteracje

- **Iteracja 2** — auth: CookieManager, JwtService, AuthService, AuthController, middleware, login.twig
- **Iteracja 3** — Dashboard skeleton + trasy domenowe + bottom_nav items
- **Iteracja 4** — Sklepy: lista + przychody
- **Iteracja 5** — Raporty PDF
- **Iteracja 6** — Zadania ToDo
- **Iteracja 7** — Reklamacje CENTRAL
