Manuale database.json
Riferimento completo per la configurazione del sistema TIMS — struttura, logiche, query e regole per inserire/modificare record.
Panoramica struttura
Il file database.json è il cuore della configurazione di TIMS. Contiene tutto ciò che serve al sistema per funzionare: connessione al DB, autenticazione, definizione di ogni query e le relative regole di visualizzazione e modifica.
Connection
Parametri di connessione al database SQL Server.
| Parametro | Valore attuale | Note |
|---|---|---|
| server | ems.tilog.it | Host del SQL Server |
| database | EMS_Premi | Nome database |
| user | sa | Utente SQL |
| options.encrypt | true | Crittografia connessione |
| options.trustServerCertificate | true | Accetta certificati self-signed |
| options.connectionTimeout | 15000 ms | Timeout connessione |
| options.requestTimeout | 15000 ms | Timeout richieste |
| options.pool.max | 10 | Max connessioni pool |
Autenticazione
L'autenticazione usa la tabella dbo.AnUtenti. Ecco il mapping dei campi:
| Chiave JSON | Campo DB | Descrizione |
|---|---|---|
| username | Login | Campo login utente |
| password | Password | Campo password |
| level | TipoUtente | Livello accesso numerico |
| active | Abilitato | Utente attivo (1/0) |
| deleted | Cancellato | Utente cancellato (1/0) |
| user_id | ID | ID univoco utente |
| display_name | Utente | Nome visualizzato |
| codsoc | codsoc | Codice società assegnata |
Livelli utente
| Livello | Ruolo | Accesso |
|---|---|---|
| 100 | Administrator | Tutto |
| 90 | Administrator | Tutto (incl. Configurazione, Locazioni) |
| 50 | SuperUser | Query standard + bottoni custom (es. Chiudi Ordine, Stampa Etichette IN) |
| 10 | StandardUser | Solo query con min_level ≤ 10 |
Session & Security
Session
| Parametro | Valore | Note |
|---|---|---|
| timeout | 3600 s (1 ora) | Durata sessione |
| secure | false | Cookie secure flag (true in prod con HTTPS) |
| sameSite | strict | Protezione CSRF |
| name | PHPSESSID | Nome cookie sessione (valore configurato db_session_id non applicato: manca session_name() in config.php) |
Security
| Parametro | Valore | Descrizione |
|---|---|---|
| max_login_attempts | 5 | Tentativi login prima del blocco |
| lockout_duration | 300 s (5 min) | Durata blocco account |
| password_min_length | 4 | Lunghezza minima password |
| session_regenerate | true | Rigenera session ID al login |
UI Settings
| Parametro | Valore |
|---|---|
| theme | dark |
| sidebar_width | 250px |
| default_page_size | 25 righe |
| date_format | DD/MM/YYYY |
| currency_symbol | € |
| decimal_places | 2 |
Tipi di query
Query singola, tabella piatta. Ha una sola sql a livello root della query. Usata per: movimenti, locazioni, giacenza, articoli, clienti/fornitori, bordereau, opzioni, utenti, progressivi.
Struttura a due livelli: testata (master) + righe (detail). La query detail usa @masterId come parametro per filtrare le righe della testata espansa. Usata per: ordini_in, ordini_out.
Logica campi
Ogni query (o ogni sezione master/detail) definisce 4 categorie di campi:
| Proprietà | Significato | Regola |
|---|---|---|
| editable_fields | Campi modificabili dall'utente | Appariranno come input editabili nella UI di modifica |
| readonly_fields | Campi in sola lettura | Visibili ma non modificabili |
| required_fields | Campi obbligatori | Devono avere un valore per salvare. Sottoinsieme di editable_fields |
| Campi nascosti | Solo per master_detail. Presenti nei dati ma non mostrati in griglia (es. ID, codSoc) |
Insert rules (regole di inserimento)
La proprietà insert_rules permette di definire regole di validazione complesse per la creazione di nuovi record. Viene valutata lato server prima di eseguire l'INSERT.
| Regola | Tipo valore | Descrizione |
|---|---|---|
| required | array di campi | Campi obbligatori: devono avere un valore non vuoto |
| at_least_one_true | array di array | Per ogni gruppo: almeno uno dei campi deve essere = 1 (true) |
| conditional_required | array di regole | Se il campo if_field = if_value allora then_required deve essere valorizzato |
| duplicate_check | array di regole | Verifica unicità : il campo indicato non deve esistere già per la stessa società |
| auto_fields | oggetto chiave-valore | Campi valorizzati automaticamente dal server: @session.username, @session.codsoc, ecc. |
Display options
| Opzione | Default | Descrizione |
|---|---|---|
| rows_per_page | 50 | Righe per pagina nella griglia |
| allow_export | true | Abilita export (Excel, PDF, WhatsApp) |
| show_record_count | true | Mostra conteggio record totali |
| expand_icon | "+" | Solo master_detail: icona espansione |
| collapse_icon | "-" | Solo master_detail: icona compressione |
| edit_icon | "🔧" | Solo master_detail: icona modifica |
Highlight fields
Dentro la sezione detail di una master_detail, puoi definire regole di evidenziazione condizionale sulle righe.
Filtro codSoc (Società )
Di default, ogni query viene filtrata automaticamente per il codSoc dell'utente loggato. Il sistema aggiunge AND codSoc = @userCodSoc alla WHERE.
Query con skip_codsoc_filter: true:
Gruppo: Magazzino
Movimenti di carico/scarico magazzino. Tabella: StMovimenti JOIN AnArticoli.
Tutti i campi readonly. Nessun campo editabile. Solo visualizzazione.
Campi
Anagrafica locazioni magazzino. Tabella: AnLocazioni. Solo Admin (90+). Non ha campo codSoc.
Tutti i campi readonly.
Campi
Giacenza articoli in magazzino. Vista: vStockArticoliPosizioni (filtro Qta > 0).
Tutti i campi readonly.
Campi
Gruppo: Anagrafiche
Anagrafica articoli. Tabella: AnArticoli (Cancellato = 0). Primary key: codArticolo.
Campo editabile
Campi readonly
Anagrafica clienti, fornitori e vettori. Tabella: AnCliForn (Cancellato = 0). Primary key: IdCliOForn (hidden).
Campi editabili
Campi nascosti
Insert rules (validazione creazione)
at_least_one_true: [Cli, Forn, Vett] — almeno uno dei ruoli deve essere attivo
conditional_required: se Cli=1 → codCli obbligatorio; se Forn=1 o Vett=1 → codForn obbligatorio
duplicate_check: codCli unico tra clienti, codForn unico tra fornitori/vettori
auto_fields: codSoc, codAnSubTipoAn, utenteCreazione, utenteUltModifica (popolati automaticamente dal server)
Gruppo: Spedizioni
MASTER — OfOrdiniInTES
JOIN con AnCliForn su IdAnCliForn = IdCliOForn. Primary key: id.
Campi nascosti:
Campi editabili:
Campo obbligatorio:
Campi readonly:
DETAIL — OfOrdiniInRIG
JOIN con AnArticoli su IdAnArticolo = ID. Join field: idOfOrdiniInTES.
Campi editabili:
Campi obbligatori:
Highlight: daControllare = 1 → stile warning
MASTER — OrListaPCOTes
JOIN con OrOrdiniOutTes su Id = idOrListaPCOTes. Primary key: id. Sola lettura.
DETAIL — OrListaPCORig
JOIN con AnArticoli e AnLocazioni. Join field: idOrListaPCOTes. Sola lettura.
Gestione bordereau spedizioni. Tabella: OrBordereau. Non ha filtro codSoc. Ha custom_create: "bordereau" e custom_delete: "bordereau" per la gestione speciale di creazione e cancellazione.
Campi visualizzati (readonly)
Stampa bordereau (dropdown, min_level 10) — menu con: "Stampa Lista di Carico" → api/print_bordereau.php, "Bordereau per Vettore" → api/print_bordereau_vettore.php
Chiudi Bordereau (min_level 50, selection: multiple, same_group_field: "Codice") — handler: chiudiBordereau() in assets/js/chiudi-bordereau.js. Verifica dataChiusura IS NULL. API: api/bordereau.php?action=close
Cancella Bordereau (min_level 50, selection: multiple, same_group_field: "Codice") — handler: deleteBordereau() in assets/js/app.js. Transazione atomica: Cancellato=1 + scollega ordini collegati. API: api/bordereau.php?action=delete
MASTER — OrOrdiniOutTes
JOIN con AnCliForn su IdAnCli = IdCliOForn. Primary key: id.
Campi nascosti:
Campi editabili:
Campo obbligatorio:
Campi readonly:
DETAIL — OrOrdiniOutRig
JOIN con AnArticoli su IdAnArticolo = ID. Join field: IdOrOrdiniOutTes.
Campi editabili:
Campi obbligatori:
Highlight: ORR_InPrelievo = 1 → stile warning
Gruppo: Configurazione
Opzioni di configurazione sistema. Tabella: AnOpzioni. Tutti i campi readonly.
Campi
Anagrafica utenti. Tabella: AnUtenti. Primary key: ID.
Campo editabile
Campi readonly
Anagrafica progressivi. Tabella: AnProgr. Primary key composita: ["codSoc", "NomeProgr"]. Limitata a TOP 200.
Campi editabili
Campi readonly
Mappa tabelle DB
Riepilogo di tutte le tabelle/viste referenziate nel database.json.
| Tabella / Vista | Usata in | Tipo | Note |
|---|---|---|---|
| StMovimenti | movimenti | Tabella | JOIN con AnArticoli su IdAnArticolo |
| AnLocazioni | locazioni | Tabella | Niente codSoc (skip_codsoc_filter) |
| vStockArticoliPosizioni | giacenza | Vista | Filtro Qta > 0 |
| AnArticoli | articoli, ordini_in detail, ordini_out detail, movimenti | Tabella | Cancellato = 0 in anagrafica |
| AnCliForn | clienti_fornitori, ordini_in master, ordini_out master | Tabella | JOIN su IdCliOForn o IdAnCliForn |
| OfOrdiniInTES | ordini_in master | Tabella | Testata ordini ingresso |
| OfOrdiniInRIG | ordini_in detail | Tabella | Righe ordini ingresso |
| OrOrdiniOutTes | ordini_out master | Tabella | Testata ordini spedizione |
| OrOrdiniOutRig | ordini_out detail | Tabella | Righe ordini spedizione |
| OrBordereau | bordereau | Tabella | skip_codsoc_filter |
| AnOpzioni | opzioni | Tabella | Configurazioni sistema |
| AnUtenti | utenti, autenticazione | Tabella | Login + livelli accesso |
| AnProgr | progressivi | Tabella | PK composita, TOP 200 |
| TimsUserGridPreferences | preferenze griglia (non in database.json) | Tabella | Preferenze colonne per utente: user_id, codsoc, query_id, visible_fields (JSON), field_order (JSON). Gestita da api/user_preferences.php |
Feature flags (Features.php)
Il sistema supporta feature flags per abilitare/disabilitare funzionalità specifiche per singola società (codSoc). La configurazione è in C:\inetpub\config_secure\features_config.php, che non è nel repository per sicurezza.
| Metodo | Firma | Descrizione |
|---|---|---|
| Features::enabled() | (codSoc, feature): bool | Ritorna true se la feature è attiva per la società |
| Features::matchesPrefix() | (codSoc, feature, codArticolo): bool | Ritorna true se il codArticolo inizia con uno dei prefix abilitati per la feature |
if (Features::enabled($codsoc, 'mia_feature')) { ... }if (Features::matchesPrefix($codsoc, 'feature', $codArticolo)) { ... }
Encoding (Encoding.php)
SQL Server con collation Latin1_General_CI_AS restituisce i campi VARCHAR in encoding Windows-1252 anziché UTF-8. La classe Encoding in includes/Encoding.php gestisce la conversione esplicita prima dell'output JSON.
| Metodo | Descrizione |
|---|---|
| Encoding::toUtf8($data) | Conversione ricorsiva: stringhe non-UTF8 vengono convertite da Windows-1252. Array, null, int, float, bool vengono gestiti automaticamente. |
Logica di conversione
Preferenze griglia utente
Il sistema salva le preferenze colonne di ogni utente (visibilità e ordine) per ogni query, persistendo in database. Non fa parte della configurazione database.json ma è un layer applicativo sopra di esso.
| Componente | Ruolo |
|---|---|
| assets/js/grid-preferences.js | Modal drag-drop (SortableJS) per riordinare e nascondere colonne |
| api/user_preferences.php | GET: carica preferenze · POST: salva · DELETE: ripristina default |
| dbo.TimsUserGridPreferences | Tabella DB con campi: user_id, codsoc, query_id, visible_fields (JSON), field_order (JSON) |
| includes/Auth.php → loadUserGridPreferences() | Carica le preferenze al login e le rende disponibili al frontend |
| applyUserGridPrefs(queryId, columns) | Funzione JS che filtra e riordina le colonne prima del rendering griglia |
Checklist: aggiungere una nuova query
Quando devi inserire una nuova query nel database.json, segui questi passaggi:
1. Scegli il gruppo
Decidi in quale gruppo inserire la query (Magazzino, Anagrafiche, Ordini, Configurazione) oppure crea un nuovo gruppo con name, icon e description.
2. Definisci i campi base
3. Scrivi la SQL
Per simple: un'unica proprietà "sql".
Per master_detail: master.sql e detail.sql (con @masterId).
4. Configura i campi
readonly_fields — tutti gli altri campi visibili.
required_fields — sottoinsieme dei editabili, obbligatori per il salvataggio.
hidden_fields — (solo master_detail) campi nei dati ma non in griglia (ID, codSoc, Cancellato).
primary_key — necessaria se vuoi abilitare UPDATE. Stringa o array.
5. Gestisci il filtro codSoc
Se la tabella NON ha il campo codSoc, aggiungi "skip_codsoc_filter": true.
5b. (Opzionale) Insert rules
Se la query ha regole di validazione per la creazione di nuovi record, definisci insert_rules con le regole: required, at_least_one_true, conditional_required, duplicate_check, auto_fields. Vedi la sezione Insert rules.
6. Display options
7. (Opzionale) Highlight fields
Solo per detail di master_detail. Definisci campo, condizione, valore e stile.
8. (Opzionale) Custom buttons
Aggiungi bottoni con azioni SQL o API call. Ricorda min_level e selection_mode.