Guida progettisti software – Atlas Medical

Ultimo aggiornamento: marzo 2026.

Questa guida è rivolta a sviluppatori e progettisti che devono mantenere, estendere o integrare il sistema Atlas Medical Center. Descrive architettura, stack, convenzioni e flussi principali.

1. Stack tecnologico

2. Struttura del progetto

atlas-medical/
├── index.php              # Entry: .env BASE_URI, sessione, bootstrap, router
├── bootstrap.php          # Costanti, autoload, Database
├── .env                   # BASE_URI, APP_READ_ONLY, DB, mail, segreti (non in repo)
├── Core/                  # Router, ReadOnlyGuard, AuthGuard, BaseController, Csrf, Database, ErrorHandler
├── Controllers/
│   ├── Auth/              # Login, OTP, Logout, ChangePassword, SetPassword, RequestPasswordReset, ChooseRole
│   ├── Admin/             # Dashboard, Doctor, Patient, Specialization, DoctorLeave, DoctorSlotTemplate
│   ├── Doctor/            # Dashboard, Patient, Visit, Report, Profile
│   ├── Reception/       # Dashboard, Appointments
│   ├── Public/            # Home, Booking, Guida, Storage, Specialization, Doctor
│   └── System/            # SystemController, Setup, AdminUsers, Accounts, ChangePassword, Audit, Commands, …
├── Models/                # Entità dominio e Models/System/
├── Views/                 # Template PHP per area + layouts + partials (es. read-only-banner)
├── Services/              # SystemLogger, OtpService, AuditTrailService, Mail, …
├── routes/                # web.php, admin.php, doctor.php, reception.php, auth.php, system_admin.php, …
├── public/                # assets (js, css)
├── storage/               # File caricati (referti, foto medici)
├── docs/                  # Guide HTML, markdown architettura, audit, storage
└── sql/                   # Script SQL (migrazioni, fix)

3. Bootstrap, .env e entry point

index.php legge .env per BASE_URI (prima della sessione, per allineare il path del cookie), imposta i parametri di sessione, avvia la sessione, carica bootstrap.php, registra error handler e shutdown, istanzia il Router(BASE_URI), include tutti i file in routes/ e chiama dispatch().

bootstrap.php carica l’intero .env in $_ENV e definisce tra le altre:

Autoload PSR-4: namespace root = directory radice progetto. Classe Database con getReader() / getWriter().

4. Routing e modalità sola lettura

Il router gestisce solo GET e POST. All’inizio di Router::dispatch(), dopo resolvePath():

Pattern di route:

CSRF: le richieste POST sono soggette a verifica CSRF, salvo i path in Router::$csrfExempt (es. /login, /set-password). Il token va incluso nei form come _csrf e nelle chiamate AJAX (body o header).

Ordine di caricamento rotte: system.php, web.php, admin.php, doctor.php, roles.php, otp.php, auth.php, reception.php, patient.php, specializations.php, system_admin.php. La prima corrispondenza vince.

PUT/PATCH/DELETE: non sono registrati nel router; in modalità normale si ottiene 405; in sola lettura vengono comunque intercettati dal ReadOnlyGuard prima.

5. Autenticazione e autorizzazione

AuthGuard (in Core/):

Session: dopo il login: auth_user_id, active_role, roles; per i doctor anche doctor_id, otp_verified.

Account disattivati: in LoginController si controlla is_active; se disattivo, errore e nessuna sessione.

6. Database e modelli

Due connessioni PDO: Database::getReader() (SELECT) e Database::getWriter() (INSERT/UPDATE/DELETE). I model ricevono il PDO dal costruttore; i controller usano reader per letture e writer per scritture.

Tabelle principali: doctors, doctor_accounts, patients, appointments, doctor_slots, doctor_slot_templates, doctor_leave_periods, medical_reports, admin_users, specializations, system_actions, system_access_logs, audit_trail, otp_codes, … Schema e moduli in docs/ATLAS_MEDICAL_EVOLUTION_ARCHITECTURE.md.

Convenzione model: namespace Models o Models\System; tipizzazione dove possibile; per le write usare getWriter().

7. Controller e risposte

I controller estendono Core\BaseController. Metodi principali:

Per AJAX: Accept: application/json e/o X-Requested-With: XMLHttpRequestErrorHandler::expectsJson() restituisce true (anche per errori centralizzati).

8. View e layout

View in Views/ per area; layout in Views/layouts/ (public, admin, doctor, reception, system). Spesso window.APP_CONFIG = { BASE_URI, CSRF } in testata.

Sola lettura: Views/partials/read-only-banner.php è incluso dopo <body> nei layout principali e nella pagina login; mostra un avviso solo se APP_READ_ONLY è vero.

UI: Materialize, Material Icons, CSS in public/assets/css/.

9. Servizi

ServizioScopo
SystemLoggersystem_actions
AuditTrailServiceaudit_trail (old/new, catena)
OtpService / OtpMailServiceOTP e invio email
BookingConfirmationMailServiceConferma prenotazione
SlotRecurringServiceSlot da template, esclusione assenze
SecurityLoggerEventi sicurezza

10. Convenzioni di codice

11. Come estendere il sistema

Nuova pagina

  1. Rotte in routes/.
  2. Controller con AuthGuard, model, render().
  3. View sotto Views/<area>/.

Nuova azione POST/AJAX

  1. Route POST, CSRF, ruolo, jsonResponse.
  2. Se serve consentire il POST anche in sola lettura (caso raro), valutare se ha senso oppure aggiungere il path in ReadOnlyGuard::ALLOWED_POST_PATHS solo dopo analisi.

Nuova entità

  1. SQL in sql/, model, controller, view, logging/audit se necessario.

12. Configurazione e deploy (incluso Aruba)

Hosting tipo Aruba: allineare BASE_URI al path pubblicato; abilitare HTTPS; verificare che .env non sia scaricabile; dopo upload file e test, disattivare APP_READ_ONLY.

Guida progettisti Atlas Medical. Per il dettaglio architetturale: docs/ATLAS_MEDICAL_EVOLUTION_ARCHITECTURE.md e docs/Architettura-Atlas-Medical.html (anche dal menu Guide nell’app).