|
| 1 | +# OpenSTAManager – Architecture Analysis |
| 2 | +> Generato automaticamente – Fase 1 (Discovery & Architecture) |
| 3 | +
|
| 4 | +## Pattern architetturale generale |
| 5 | + |
| 6 | +OpenSTAManager adotta un'architettura **ibrida** che combina: |
| 7 | + |
| 8 | +1. **Legacy MVC PHP** – Il nucleo storico: `core.php` inizializza la sessione, il database e il translator; `controller.php` / `editor.php` fungono da dispatcher front-controller che includono dinamicamente i file PHP dei moduli. |
| 9 | +2. **Laravel moderno** – Laravel 12 è usato come layer di infrastruttura (Eloquent ORM, Routing, Queue, Mail, API Platform). Il file `bootstrap/app.php` crea l'Application Laravel con routing in `routes/`. |
| 10 | +3. **Moduli plug-in** – La logica di business è organizzata in **moduli** (`modules/`) e **plugin** (`plugins/`), ognuno con la propria struttura `src/`, `custom/src/`, viste PHP e risorse. |
| 11 | + |
| 12 | +--- |
| 13 | + |
| 14 | +## Mappa dei componenti principali |
| 15 | + |
| 16 | +``` |
| 17 | +┌─────────────────────────────────────────────────────────────┐ |
| 18 | +│ Browser / Client │ |
| 19 | +└──────────────────────┬──────────────────────────────────────┘ |
| 20 | + │ HTTP |
| 21 | + ┌────────────▼────────────────┐ |
| 22 | + │ Entry Points │ |
| 23 | + │ index.php / controller.php │ |
| 24 | + │ editor.php / ajax*.php │ |
| 25 | + │ api/index.php │ |
| 26 | + └────────────┬────────────────┘ |
| 27 | + │ |
| 28 | + ┌────────────▼────────────────┐ |
| 29 | + │ core.php │ Bootstrap globale |
| 30 | + │ - Sessione PHP │ |
| 31 | + │ - App::getConfig() │ |
| 32 | + │ - Database (singleton) │ |
| 33 | + │ - Translator │ |
| 34 | + │ - AuthOSM │ |
| 35 | + └────────────┬────────────────┘ |
| 36 | + │ |
| 37 | + ┌───────────────┼───────────────────┐ |
| 38 | + │ │ │ |
| 39 | +┌──────▼──────┐ ┌──────▼──────┐ ┌─────────▼────────┐ |
| 40 | +│ src/App.php │ │src/Modules │ │ src/Database.php │ |
| 41 | +│ Config │ │ .php │ │ (Eloquent │ |
| 42 | +│ Assets │ │ Module list │ │ Capsule) │ |
| 43 | +│ File paths │ │ Hierarchy │ │ │ |
| 44 | +└──────┬───────┘ └──────┬──────┘ └─────────┬─────────┘ |
| 45 | + │ │ │ |
| 46 | + │ ┌──────▼──────┐ ┌──────▼──────┐ |
| 47 | + │ │ modules/ │ │ src/Models/ │ |
| 48 | + │ │ ~70 moduli │ │ Eloquent │ |
| 49 | + │ │ plugins/ │ │ Models │ |
| 50 | + │ │ ~30 plugin │ └─────────────┘ |
| 51 | + │ └─────────────┘ |
| 52 | + │ |
| 53 | +┌──────▼───────────────────────────────┐ |
| 54 | +│ assets/ (frontend) │ |
| 55 | +│ Bootstrap, AdminLTE, jQuery, │ |
| 56 | +│ FullCalendar, Chart.js – build Gulp │ |
| 57 | +└──────────────────────────────────────┘ |
| 58 | +``` |
| 59 | + |
| 60 | +--- |
| 61 | + |
| 62 | +## Struttura directory – ruolo di ogni cartella |
| 63 | + |
| 64 | +| Directory | Contenuto | |
| 65 | +|---|---| |
| 66 | +| `src/` | Core PHP: App, Auth, Database, Modules, Models, Controllers Laravel, API, Util | |
| 67 | +| `modules/` | ~70 moduli applicativi (ogni modulo = directory autonoma con PHP + src/) | |
| 68 | +| `plugins/` | ~30 plugin (logica add-on attaccata ai moduli) | |
| 69 | +| `templates/` | Template di stampa PDF (mPDF/html2pdf) | |
| 70 | +| `include/` | Partials HTML: header/footer, form comuni, init scripts | |
| 71 | +| `config/` | Configurazioni Laravel (database, mail, cache, osm, sanctum…) | |
| 72 | +| `routes/` | Routing Laravel (web.php, api.php, console.php) | |
| 73 | +| `bootstrap/` | Bootstrap Laravel (app.php, providers.php) | |
| 74 | +| `assets/src` | Sorgenti frontend (SCSS, JS) da compilare con Gulp | |
| 75 | +| `assets/dist` | Asset compilati serviti al browser | |
| 76 | +| `locale/` | File .po/.mo per internazionalizzazione (it_IT, en_GB, de_DE) | |
| 77 | +| `update/` | Script di migrazione SQL/PHP per ogni versione | |
| 78 | +| `lib/` | Funzioni helper globali (functions.php, common.php, util.php) | |
| 79 | +| `files/` | Allegati e file upload organizzati per modulo | |
| 80 | +| `vendor/` | Dipendenze Composer | |
| 81 | +| `node_modules/` | Dipendenze npm/yarn | |
| 82 | +| `docker/` | Configurazione Docker per sviluppo | |
| 83 | +| `logs/` | Log applicativi (error.log, cron-*.log, setup.log) | |
| 84 | +| `storage/` | Storage Laravel (framework cache, logs) | |
| 85 | + |
| 86 | +--- |
| 87 | + |
| 88 | +## Sistema dei Moduli |
| 89 | + |
| 90 | +Ogni modulo in `modules/<nome>/` ha questa struttura tipica: |
| 91 | + |
| 92 | +``` |
| 93 | +modules/fatture/ |
| 94 | +├── src/ # Classi PHP del modulo (namespace Modules\Fatture\) |
| 95 | +├── custom/src/ # Override personalizzati (non sovrascritti dagli aggiornamenti) |
| 96 | +├── init.php # Inizializzazione modulo |
| 97 | +├── modutil.php # Utility specifiche |
| 98 | +├── edit.php # Vista di dettaglio/modifica |
| 99 | +├── actions.php # Azioni POST del modulo |
| 100 | +└── bulk.php # Operazioni bulk |
| 101 | +``` |
| 102 | + |
| 103 | +Il sistema `custom/` è il meccanismo ufficiale di personalizzazione: i file in `custom/src/` e `custom/` sovrascrivono quelli standard senza toccare il codice base, sopravvivendo agli aggiornamenti. |
| 104 | + |
| 105 | +--- |
| 106 | + |
| 107 | +## Flusso di una richiesta tipica |
| 108 | + |
| 109 | +``` |
| 110 | +1. Browser → controller.php?id_module=X&id_record=Y |
| 111 | +2. core.php → inizializza sessione, DB, auth, translator |
| 112 | +3. AuthOSM::check() → verifica login |
| 113 | +4. Permissions::check() → verifica permessi modulo |
| 114 | +5. Modules::getCurrent() → carica metadati modulo da DB |
| 115 | +6. include modules/<nome>/init.php → inizializza modulo |
| 116 | +7. App::load('edit.php', ...) → cerca custom/ poi standard |
| 117 | +8. Output HTML con include top.php / bottom.php |
| 118 | +``` |
| 119 | + |
| 120 | +--- |
| 121 | + |
| 122 | +## Sistema di autenticazione |
| 123 | + |
| 124 | +- **Classe**: `AuthOSM` (src/AuthOSM.php) |
| 125 | +- **Sessione PHP** nativa per la sessione utente |
| 126 | +- **OAuth2** via `zz_oauth2` table: supporto Microsoft, Google, Keycloak |
| 127 | +- **Token OTP**: accesso temporaneo per link condivisi (`zz_tokens`) |
| 128 | +- **Brute-force**: lockout automatico dopo N tentativi falliti |
| 129 | +- **Intended URL**: redirect post-login all'URL originale richiesto |
| 130 | + |
| 131 | +--- |
| 132 | + |
| 133 | +## API REST |
| 134 | + |
| 135 | +- **Path**: `api/index.php` + `routes/api.php` |
| 136 | +- **Framework**: Laravel + API Platform ^4.1 |
| 137 | +- **Auth**: Laravel Sanctum (Bearer token) |
| 138 | +- **Risorse**: auto-generate da `src/Models/ApiResource.php` |
| 139 | + |
| 140 | +--- |
| 141 | + |
| 142 | +## Internazionalizzazione |
| 143 | + |
| 144 | +- File `.po`/`.mo` in `locale/` |
| 145 | +- Lingue: `it_IT` (primaria), `en_GB`, `de_DE` |
| 146 | +- Classe: `src/Translator.php` + `symfony/translation` |
| 147 | +- Helper globale: `tr()` (alias di traduzione) |
| 148 | + |
| 149 | +--- |
| 150 | + |
| 151 | +## Pattern "Custom Override" |
| 152 | + |
| 153 | +Il sistema riconosce percorsi con `|custom|` e cerca prima `custom/` poi il file standard: |
| 154 | + |
| 155 | +```php |
| 156 | +// App::filepath('include|custom|/common/', 'form.php') |
| 157 | +// cerca: include/common/custom/form.php → se esiste usa questo |
| 158 | +// altrimenti: include/common/form.php |
| 159 | +``` |
| 160 | + |
| 161 | +Stesso meccanismo per i moduli: `modules/<nome>/custom/src/` sovrascrive `modules/<nome>/src/`. |
0 commit comments