Protocolli operativi standardizzati, strutture organizzative e standard per la gestione completa dei cantieri
Protocollo repo V2.2 (riferimento incrociato): sequenza Git, verifica anagrafica CRM (conteggio aziende, id 1 = Frigerio Legnami) e deploy SSH produzione sono in app/index.php → Sync Git e tracciamento accessi.
CMS / pagine dinamiche (non sono cantieri): contenuti in SQLite serviti da page.php in root; istruzioni per AI in app/index.php → Gestione CMS Dinamico (SQLite).
diario_di_cantiere.php, rese_di_posa.php, programma.php, analisi_fattibilita_consegna.php usa MASSIMA potenza (leggi COMPLETAMENTE, ragionamento approfondito).
rese_di_posa.php e nei file dedicati.
1. DIVIETO DI IPOTESI (NO ASSUMPTIONS): Se ricevi istruzioni di integrazione note, aggiornamento dati o modifiche ai file di cantiere SENZA che sia specificato chiaramente il nome del cantiere (es. Legnano, Monza): FERMATI. Chiedi esplicitamente: «Per quale cantiere devo applicare queste modifiche?». Non usare MAI il cantiere demo come fallback predefinito.
2. ISOLAMENTO CANTIERE DEMO (demo_villa_monza): Il cantiere demo deve rimanere in uno stato «congelato». È formalmente ESCLUSO da ogni automazione di salvataggio note giornaliere, alert di massa o script di aggiornamento. Può essere modificato SOLO se l'utente scrive testualmente: «Aggiorna il cantiere demo per fini dimostrativi». In ogni altro caso, ignorarlo durante l'elaborazione dei dati reali.
3. VERIFICA IDENTITÀ CANTIERE: Prima di ogni scrittura, verifica che la cartella di destinazione corrisponda al cantiere citato nelle note o confermato dall'utente.
4. NOTE SITE-SPECIFIC – TAG [CANTIERE]: L'inserimento delle note giornaliere è centralizzato nel contesto del cantiere: le note si inseriscono solo dalle pagine del singolo cantiere (Diario, Programma, Consuntivo, Analisi, Meteo, Rese, Index). In Homepage le note sono in sola lettura. Al salvataggio, il sistema antepone automaticamente al testo il tag [CANTIERE: slug_cartella] (es. [CANTIERE: legnano_via_milano]). Quel tag è la prova suprema dell'identità del cantiere: quando si integrano le note nel sistema (prompt «Integra Note»), l'AI deve leggerlo e operare solo sulla cartella indicata, ignorando ogni altra ipotesi.
Le Sezioni 1 e 2 di diario_di_cantiere.php devono contenere SOLO testo descrittivo. È VIETATO inserire calcoli, mq, ore uomo o medie produttività. Tali dati restano esclusivi dei file consuntivo_ore.php, _consuntivo_ore_tabelle.html e rese_di_posa.php. Il Diario è cronaca descrittiva, non registro contabile.
Separazione: Ore/Presenze e Motivazioni Assenze (SOP-01) → _consuntivo_ore_tabelle.html. Diario riceve SOLO lavorazioni svolte, materiali ricevuti, note tecniche + Tabella SOP-01 (Meteo, Supervisore, Totale Ore Uomo, Lavorazione Prevalente). Controllo incrociato: Totale Ore Uomo in SOP-01 (Diario) = Somma ore individuali del Consuntivo.
Rese analitiche (mq, ore, medie) → rese_di_posa.php esclusivamente. Mai nel Diario (privacy).
Eseguire php app/scripts/update_all_meteo.php [anno] prima di procedere con l'integrazione note. Exit code 0 obbligatorio. Su Windows/Laragon: se php non è nel PATH, usare il percorso completo (es. C:\laragon\bin\php\php-8.3.28-Win32-vs16-x64\php.exe). Cercare con Get-ChildItem -Path "C:\laragon\bin\php" -Recurse -Filter "php.exe". In PowerShell, con percorso completo, usare il call operator: & "C:\laragon\bin\php\php-8.3.28-Win32-vs16-x64\php.exe" "app/scripts/update_all_meteo.php" 2026 (senza & può comparire errore parser su token imprevisto).
Giornate pioggia/sospensione/mancanza materiale: registrare in rese_di_posa.php con 0.0 ore e 0.0 quantità, escludendole dalle medie Sezione B (nota: «non inclusa nelle medie produttività»). In consuntivo: 0 ore con nota (es. «Cantiere fermo – mancanza tegole»).
Utilizzare esclusivamente il formato decimale (es. 1.50 per un'ora e mezza, 17.0 per 17 ore, 0.0 per giornate sospese) in tutti i file di calcolo: rese_di_posa.php, _consuntivo_ore_tabelle.html.
Se l'integrità dei dati in rese_di_posa.php è compromessa (allucinazioni, deduzioni non tracciate), è obbligatorio eseguire reset completo: svuotare Sezione A (Registro Cronologico) e Sezione B (Riepilogo Consolidato), mantenendo solo la struttura template. Meglio file vuoto che dati non verificati. Ripopolare solo con numeri esplicitamente presenti in notes.txt o storico_note.php.
⚠️ Regola sicurezza: NON inviare mai action=archive durante i salvataggi intermedi. Usarlo ESCLUSIVAMENTE come ultimo atto dopo che tutti i dati sono stati messi in sicurezza (Diario, Consuntivo, Rese, Programma, Analisi).
L'API app/api/notes.php con action=archive richiede sessione autenticata. In contesti senza sessione (CLI, automazione, agenti AI): usare app/scripts/archive_notes_cli.php.
Comando: php app/scripts/archive_notes_cli.php <slug_cantiere> (es. legnano_via_milano). Lo script legge notes.txt, lo appende a storico_note.json e svuota notes.txt. Su Windows/Laragon, se PHP non è nel PATH: usare il percorso completo (es. C:\laragon\bin\php\php-8.3.x-Win32-vs16-x64\php.exe).
Se entrambi falliscono: archiviazione manuale — appendere il contenuto di notes.txt in storico_note.json, svuotare notes.txt.
I cantieri sono organizzati per anno e stato di avanzamento in una struttura gerarchica standardizzata.
cantieri/
├── index.php (pagina principale cantieri + protocolli)
└── [ANNO]/
├── in_esecuzione/
│ └── [nome_cantiere]/
│ ├── index.php (1 – Dashboard)
│ ├── diario_di_cantiere.php (2 – Cronaca Pubblica)
│ ├── consuntivo_ore.php (3 – Registro Contabile)
│ ├── rese_di_posa.php (4 – Database Tecnico Interno)
│ ├── programma.php (5 – Pianificazione)
│ ├── analisi_fattibilita_consegna.php (6 – Strategia)
│ ├── previsioni_meteo.php (7 – Dati Esterni)
│ ├── storico_note.php (8 – Archivio note giornate concluse)
│ ├── notes.txt (note correnti; schema Silos)
│ ├── storico_note.json (archivio JSON; generato da API)
│ └── Documenti_Cantiere/ (opzionale)
└── completati/
└── [cantieri completati]
in_esecuzione/ a completati/. Standard Magenta Manager 2.0: sostituire index.php con versione "archiviato" (solo link al diario); eliminare programma.php, previsioni_meteo.php, analisi_fattibilita_consegna.php; aggiornare breadcrumb nel diario e negli eventuali file rimanenti (consuntivo, rese) da path in_esecuzione a completati. Il box in "In Esecuzione" scompare automaticamente (lista generata da users_db_list_cantieri_available()). Struttura legacy: disegni/, istruzioni.html, programma.html.località_via (es: legnano_via_milano)💡 CONVENZIONE NOMI:
milano_via_ampere, legnano_via_milanoOgni cantiere in esecuzione (a partire dal 2026) deve essere composto da 1 dashboard + 7 file operativi (incluso storico_note.php). In ogni cartella: notes.txt (note correnti) e storico_note.json (archivio; vedi schema Note Silos sotto). La struttura è codificata nella documentazione tecnica e non va modificata.
| # | File | Ruolo | Contenuto / Regola |
|---|---|---|---|
| 1 | index.php |
Dashboard Cantiere | Hub di navigazione: box/link verso tutti i file sottostanti. Punto di ingresso unico del cantiere. |
| 2 | diario_di_cantiere.php |
Cronaca Pubblica | Solo cronaca descrittiva: meteo, supervisore, SOP-01 (Totale Ore Uomo, Lavorazione Prevalente). NON contiene tabelle ore uomo né ore per operaio — il consuntivo è l'unica fonte per alert. File condivisibile con la Direzione Lavori. |
| 3 | consuntivo_ore.php |
Registro Contabile | Guscio PHP che include _consuntivo_ore_tabelle.html. Sorgente esclusiva per gli alert automatici di sistema (Dashboard + Telegram). Data | Operaio | Ore Lavorate | Note. Supervisore escluso dai conteggi. Il diario non è mai letto per calcoli ore. |
| 4 | rese_di_posa.php |
Database Tecnico Interno 🔒 PROTETTO | Doppio binario: Sezione A = storico cronologico giornaliero (Data | Lavorazione | Quantità del Giorno | Ore Uomo | Resa Giornaliera | Note); Sezione B = medie consolidate per preventivi e Storico Rese. Non destinato a condivisione esterna. |
| 5 | programma.php |
Pianificazione | Solo visione futura. Tabella Target (Data | Fascia | Lavorazione | Squadra | Target) basata sulle rese reali estratte da rese_di_posa.php. Niente cronistoria. |
| 6 | analisi_fattibilita_consegna.php |
Strategia | Valutazione ritardi, milestone, ore disponibili, gap e scenari di consegna. |
| 7 | previsioni_meteo.php |
Dati Esterni | Meteo da script; cache locale. |
| 8 | storico_note.php |
Archivio Note 🔒 Nascosto al cliente | Consultazione storico_note.json (note giornate concluse; schema Silos). notes.txt in cartella per note correnti. Box rimosso dalla dashboard per ruolo cliente; accesso diretto → redirect. |
_consuntivo_ore_tabelle.html. Lo script app/includes/cantieri-alert.php e le notifiche Telegram dipendono da questo nome.rese_di_posa.php. Il Diario resta condivisibile con la DL senza dati sensibili.Cartella opzionale: Documenti_Cantiere/ per allegati. File opzionali: sopralluogo_tecnico.php (verbali, collaudi) se previsto dal cantiere.
Tutti i file devono avere breadcrumbs corretti. Per un cantiere in cantieri/2026/in_esecuzione/nome_cantiere/:
$breadcrumbs = [
['label' => 'Home', 'url' => '../../../../index.php'],
['label' => 'Cantieri', 'url' => '../../../index.php'],
['label' => 'Nome Cantiere', 'url' => 'index.php'],
['label' => 'Diario di Cantiere'], // o altro file
];
Quando si crea un nuovo cantiere, utilizzare come riferimento:
cantieri/2026/in_esecuzione/legnano_via_milano/cantieri/2026/in_esecuzione/milano_via_ampere/app/templates/cantieri_in_esecuzione/ (vedi sezione sotto)Riferimento tecnico: architettura file, API, tag, regex e prompt. Per dettagli condivisi con App vedi anche app/index.php#note-silos.
Le note non sono più globali: ogni cantiere ha cantieri/[ANNO]/[STATO]/[SLUG]/notes.txt (note correnti) e storico_note.json (archivio giornate concluse). Consultazione: storico_note.php in ogni cartella.
API (app/api/notes.php): POST standard sovrascrive notes.txt. Archiviazione SOLO con parametro esplicito action=archive: contenuto spostato in storico_note.json con timestamp, notes.txt svuotato.
Tag [CANTIERE: slug]: gestito dal frontend (app/includes/notes-modal.php). Se slug è "slug" o "nome_cantiere" il tag non viene iniettato. Regex pulizia: /^\[CANTIERE:\s*[^\]]+\]\s*\n*/gi.
Prompt: Solo «Salvataggio note giornata lavorativa» (app/cursor/ai_prompt) può inviare action=archive, come ultimo atto dopo aver messo in sicurezza tutti i file. Creazione nuovo cantiere: 8 file PHP + _consuntivo_ore_tabelle.html + notes.txt/storico_note.json (generati a richiesta).
I template per la creazione di nuovi cantieri si trovano in app/templates/cantieri_in_esecuzione/.
Gli 8 file obbligatori nell’ordine di §2: index.php, diario_di_cantiere.php, consuntivo_ore.php, rese_di_posa.php, programma.php, analisi_fattibilita_consegna.php, previsioni_meteo.php, storico_note.php. Obbligatorio anche _consuntivo_ore_tabelle.html (incluso da consuntivo_ore.php). Esiste un template per ogni file incluso rese_di_posa.php.template. In ogni cartella cantiere: notes.txt e storico_note.json (schema Note Silos). Opzionali: sopralluogo_tecnico.php, cartella Documenti_Cantiere/.
Consuntivo ore: consuntivo_ore.php deve includere (tramite include o file_get_contents) esattamente il file _consuntivo_ore_tabelle.html nella sezione #registrazione-ore. Non usare altri nomi di file per le tabelle presenze.
[ANNO], [NOME_CANTIERE_SNAKE], [NOME_CANTIERE_DISPLAY], [DATA_CONSEGNA], [PERIODO_INIZIO], [PERIODO_FINE], [GIORNATE_LAVORATIVE], [COMUNE], [COMUNE_LOWERCASE], [PROVINCIA], [DATA_CREAZIONE], [DATA_AGGIORNAMENTO], [DESCRIZIONE_CANTIERE]
Prompt creazione cantiere: Vedi prompt «Creazione nuovo cantiere» in app/cursor/ai_prompt/prompts.csv. Sorgente unica: app/templates/cantieri_in_esecuzione/ (non usare cantieri esistenti come modello).
⚠️ IMPORTANTE:
app/templates/cantieri_in_esecuzione/ (sorgente unica; non usare cantieri esistenti come modello)users_db_list_cantieri_available() (app/config/users_db.php) lo rilevi correttamente, affinché sia assegnabile ai nuovi utenti clienti in app/gestione_utenti.php. La creazione di un cantiere (cartella in cantieri/ANNO/in_esecuzione/SLUG/) aggiorna automaticamente l'elenco dei cantieri assegnabili nella pagina gestione utenti (lista generata in tempo reale dal file system).consuntivo_ore.php deve includere (include/file_get_contents) solo il file _consuntivo_ore_tabelle.html per le tabelle presenze — nessun altro nome fileStandard per Compilazione Diario di Cantiere
Questo protocollo definisce lo standard invalicabile per la compilazione del Diario Giornaliero. Ogni giornata lavorativa deve seguire questo schema per garantire completezza e coerenza dei dati.
| Campo | Valore | Alert |
|---|---|---|
| Data | Martedì 20 Gennaio 2026 | |
| Meteo | Sole, 12°C | |
| Supervisore | Davide Gobbi (presente, 8.5h) | |
| Totale Ore Uomo | 42.5 ore uomo (5 operai × 8.5h) | |
| Lavorazione Prevalente | Posa isolante sopra perlina (42.5 ore uomo) | |
| Resa Giornaliera | 50 mq posati - 1.18 mq/ora per operaio | |
| Note Assenze | Tutti presenti | |
| Materiali Ricevuti | Nessuna consegna |
📌 COME USARE QUESTO PROTOCOLLO:
Automatismo: Ogni volta che si aggiorna il diario o si forniscono note giornaliere, questo schema SOP-01 deve essere seguito senza eccezioni.
Richiamo: Se il protocollo non viene rispettato, richiamare esplicitamente questo documento.
⚠️ LOGICA SEZIONI DIARIO (Regola di pulizia automatica):
La sezione "Lavorazioni da Eseguire" (To-Do List) è una lista dinamica rivolta al futuro. Non appena una lavorazione viene dichiarata conclusa (100%), è OBBLIGATORIO spostarla nello storico "Lavorazioni Ultimate". È vietato mantenere voci al 100% nella To-Do List per evitare rumore nei calcoli del Programma Lavori. Questa verifica deve essere eseguita ogni volta che si integra una nota di "Giornata Conclusa".
📅 ATTIVO DAL: 27/01/2026 | VERSIONE: 1.0 | REVISIONE: Annuale
Quando un operaio della squadra ha 0 ore registrate in una giornata lavorativa, la motivazione dell'assenza è OBBLIGATORIA e deve essere registrata nel Diario.
Se un operaio ha 0 ore in una giornata lavorativa:
✅ ESEMPIO CORRETTO:
Operai previsti: Davide, Nicola, Luca, Omar, Endrit
Ore registrate: Nicola 0h, altri 8.5h
Note utente: "Nicola ha la febbre"
→ Tabella: Note Assenze: "Nicola: febbre. Altri tutti presenti" | Alert: "" ✓
❌ ESEMPIO ERRATO:
Operai previsti: Davide, Nicola, Luca, Omar, Endrit
Ore registrate: Nicola 0h, altri 8.5h
Note utente: [nessuna menzione di Nicola]
→ Tabella: Note Assenze: "Altri tutti presenti" | Alert: "🚨 MOTIVARE ASSENZA (Nicola 0 ore)"
In caso di cantiere fermo (es. mancanza materiale, mancanza tegole, maltempo, ecc.), la motivazione inserita nel diario deve essere automaticamente propagata come giustificativo assenza per tutti gli operai nel file consuntivo ore. Questo evita falsi positivi negli alert "Assenze senza motivazione" in Home, poiché la motivazione della fermata cantiere vale come giustificativo collettivo per tutto il team assegnato.
Regola assoluta: MAI lasciare la colonna "Note" vuota quando un operaio è assente - le motivazioni sono informazioni molto importanti per la gestione amministrativa e legale.
Il file programma.php deve contenere SOLO il futuro, eliminando cronistoria e testi narrativi. Il formato è TABELLARE con calcoli matematici rigorosi basati sulle rese reali del diario.
Struttura:
Ore_Uomo = Quantità / Resa_Reale_DiarioEsempio Elenco Lavorazioni:
<h3>Lavorazioni Rimanenti</h3>
<ul>
<li><strong>Posa isolante sopra perlina:</strong> 300 mq rimanenti</li>
<li><strong>Telo traspirante:</strong> 511 mq (non iniziata)</li>
<li><strong>Assi di ventilazione:</strong> 511 mq (non iniziata)</li>
<li><strong>Listoni fermategola:</strong> 511 mq (non iniziata)</li>
<li><strong>Posa tegole:</strong> 511 mq (non iniziata)</li>
</ul>
<strong>FONTE:</strong> Estrai SEMPRE dal diario_di_cantiere.php, sezione "Lavorazioni Restanti"
Esempio Tabella HTML:
<table>
<thead>
<tr>
<th>Data</th>
<th>Fascia</th>
<th>Lavorazione</th>
<th>Squadra</th>
<th>Target</th>
</tr>
</thead>
<tbody>
<tr>
<td>Martedì 21/01</td>
<td>08:00-12:30</td>
<td>Posa isolante sopra perlina</td>
<td>5 operai</td>
<td>81 mq</td>
</tr>
<tr>
<td>Martedì 21/01</td>
<td>12:30-17:00</td>
<td>Posa isolante sopra perlina</td>
<td>5 operai</td>
<td>81 mq</td>
</tr>
</tbody>
</table>
Esempio Commenti Calcoli:
<!-- CALCOLI MATEMATICI PROGRAMMA --> <!-- Resa isolante sopra perlina: 3.6 mq/ora per operaio (fonte: diario cantiere, sezione Rese Effettive) --> <!-- Quantità rimanente: 300 mq --> <!-- Operai disponibili: 5 --> <!-- Ore necessarie: 300 ÷ 3.6 = 83.3 ore uomo = 1.96 giorni (2 giorni arrotondati) --> <!-- Target giornaliero: 5 operai × 8.5 ore × 3.6 mq/ora = 153 mq/giorno -->
⚠️ SCOPO: Questi commenti permettono di verificare la correttezza dei calcoli e rendono il programma auditable.
📌 NOTA IMPORTANTE: Usa queste rese SOLO se non disponibili nel diario di cantiere. Le rese effettive registrate hanno SEMPRE priorità.
| Tipo Posa | Resa (mq/giornata 8h) | Caratteristiche |
|---|---|---|
| Posa semplice | 80-110 mq/giornata | Solo tegole, tetto semplice, pochi tagli |
| Posa media | 60-100 mq/giornata | Operai esperti, geometria standard |
| Posa complessa | 40-60 mq/giornata | Molti tagli, pendenze, abbaini, camini |
| Resa media tetto complesso | ~70 mq/giornata | Media ponderata per preventivi |
Giornate = superficie_mq ÷ resa_mq_giornata Ore lavorative = giornate × 8.5 ore/giorno Ore uomo = ore_lavorative × numero_operai Esempio: 511 mq ÷ 70 mq/giornata = 7.3 giorni 7.3 giorni × 8.5 ore = 62 ore lavorative 62 ore × 4 operai = 248 ore uomo totali
📊 FONTE DATI:
diario_di_cantiere.php (specifiche del cantiere)amministrazione/prezzario.php (dati storici aziendali)Quando una giornata lavorativa è sospesa per maltempo (o altri motivi), esistono regole precise per la registrazione nel sistema.
⚠️ PERCHÉ: Il sistema di alert in homepage controlla il Registro Ore. Se mancano le righe per una data lavorativa, genera alert "mancano ORE E PRESENZE OPERAI". Anche con 0 ore, le righe DEVONO essere presenti per evitare alert inutili.
<tr>
<td rowspan="6"><strong>28/01/2026</strong></td>
<td>Davide Gobbi</td>
<td>0 ore</td>
<td></td>
<td>Cantiere chiuso per maltempo</td>
</tr>
<tr>
<td>Nicola Pedrazzoli</td>
<td>0 ore</td>
<td></td>
<td>Cantiere chiuso per maltempo</td>
</tr>
[... ripetere per tutti gli operai della squadra ...]
Gli operai presenti nel cantiere fanno solitamente sempre 8.5 ore al giorno quando non sono assenti, a meno che non venga indicato chiaramente differentemente.
Usa sempre 8.5 ore come default per operai presenti. Solo se vengono specificate esplicitamente ore diverse (es: "sono andati via alle 14:30 e hanno fatto 6.5 ore"), usa quelle ore specifiche.
diario_di_cantiere.php)registro-mese-pdfSe un operaio lavora meno ore del previsto, specificare nella colonna Note:
Zero stime, solo calcoli verificabili. Questo pilastro fondamentale garantisce l'accuratezza e la coerenza di tutti i dati inseriti nel sistema.
notes.txt o nello storico_note.php. Se un'attività è citata nelle note (es. "posa tegole") ma manca la quantità (mq), il file rese_di_posa.php NON deve essere aggiornato per quella data. L'allucinazione di dati numerici è una violazione gravissima che porta al fallimento del task.Istruzione operativa per Cursor/Agenti AI: prima di scrivere un numero in rese_di_posa.php, dichiarare la fonte esatta del valore (citazione testuale da notes.txt o storico_note.php). Se la fonte numerica non è presente, fermarsi e chiedere conferma all'utente.
Scenario: Utente scrive: "restano 50 mq di isolante"
Dati cantiere:
Calcolo automatico:
Già posato = Totale - Rimanente
Già posato = 500 mq - 50 mq = 450 mq ← Questa è la verità
⚠️ IMPORTANTE: NON inventare i mq posati oggi, calcola dalla differenza con il giorno precedente. Se ieri erano stati posati 420 mq e oggi "già fatto" = 450 mq, allora oggi sono stati posati 30 mq.
La dashboard home (index.php) usa un layout Bento Grid moderno con CSS Grid a 4 colonne su desktop.
I box della dashboard possono avere dimensioni diverse usando le seguenti classi CSS:
| Classe CSS | Dimensione | Descrizione |
|---|---|---|
small |
1×1 | Box standard (default) |
medium-wide |
2×1 | Largo 2 colonne |
medium-tall |
1×2 | Alto 2 righe |
large |
2×2 | Box grande |
wide |
3×1 | Largo 3 colonne |
extra-wide |
4×1 | Largo 4 colonne (intera larghezza) |
Box Note nella Dashboard:
includeComponent('notes-modal')BASE_PATH . 'app/api/notes.php'Il sistema di monitoraggio (Homepage + Telegram) esegue il parsing SOLO del file consuntivo_ore.php. Il diario è ignorato per il conteggio delle ore e per le presenze/assenze. Non dipende dall'apertura del gestionale: legge sempre i file da disco.
index.phpPer ogni cantiere in cantieri/[anno]/in_esecuzione/ (fonte: solo consuntivo_ore.php):
#registrazione-ore del consuntivo. Per gli ultimi 7 giorni lavorativi, verifica che ogni giorno abbia almeno una riga con data DD/MM/YYYY. Se manca → alert.id="registrazione-ore" o non ci sono date nelle tabelle → alert.Requisiti tecnici per consuntivo_ore.php (e file inclusi): ogni riga della tabella ore deve avere 4 colonne; il tag <h2 id="registrazione-ore"> è obbligatorio per l'aggancio degli script di parsing in app/includes/. Dati consuntivo: le tabelle presenze devono risiedere solo in _consuntivo_ore_tabelle.html (vedi §2 Struttura Standard).
app/includes/cantieri-alert.php (funzione verificaAssenzeSenzaMotivazione) determina quali note nelle colonne "Note Assenze" sono considerate valide. Include: cantiere fermo, mancanza tegole, mancanza materiale, mancanza forza, malattia, permesso, ferie, maltempo, ecc. Se si introduce una nuova variante di motivazione (es. altro motivo di fermata cantiere), aggiornare la whitelist in cantieri-alert.php per evitare falsi positivi negli alert.
Regola: Da le 15:30 (ora Italia), il sistema considera oggi come giorno da verificare. Prima delle 15:30, considera solo fino a ieri. Questo evita alert falsi quando il consuntivo non è ancora stato aggiornato nella mattinata.
| File | Ruolo |
|---|---|
app/includes/cantieri-alert.php |
Logica centrale: legge solo consuntivo_ore.php (non il diario). getCantieriAlertData(), verificaGiorniConDati(), verificaAssenzeSenzaMotivazione(). Estrae la sezione da <h2 id="registrazione-ore"> fino a </section> o prossimo <h2 id= (include TUTTE le tabelle mensili). |
index.php |
Include cantieri-alert e chiama generateCantieriAlert() per mostrare il box in bacheca. |
app/scripts/telegram_notifier.php |
Eseguito da 2 Cron (19:00 e 7:40 Lun-Ven). Usa getCantieriAlertData(). Se ci sono alert: formatta con Groq AI → invia push Telegram. Finestre: 7:00–8:59, 17:00–20:59. |
app/index.php (sezione Telegram) |
Setup credenziali, Cron Job, troubleshooting. |
Due invii giornalieri (Lun–Ven):
Cron Job (configurare 2 job):
0 19 * * 1-5 → Lun-Ven ore 19:00 40 7 * * 1-5 → Lun-Ven ore 7:40 (sabato non incluso)
Flusso:
getCantieriAlertData() — stessa logica della bacheca.⚠️ IMPORTANTE – Registro Ore (consuntivo) per giornate sospese:
Se una giornata è sospesa (es. maltempo), creare comunque le righe nel consuntivo ore con 0 ore per tutti gli operai e nota "Cantiere chiuso per maltempo". Senza le righe, il sistema segnala "mancano ORE E PRESENZE" anche se la giornata è stata deliberatamente sospesa. Vedi anche §6 Logica Meteo.
Nessun dato deve andare perso. Quando analizzi il file app/data/notes.txt, identifica TUTTI i seguenti elementi.
| Tipo Dato | Esempi Input | Output Richiesto |
|---|---|---|
| ✅ Date | "Lunedì 19 gennaio", "19/01/2026" | Formato standard: DD/MM/YYYY (tabelle), "Giorno DD Mese YYYY" (diario) |
| ✅ Cantiere | "Legnano", "cantiere di Milano" | Identificare cantiere corretto (esplicito o implicito) |
| ✅ Presenze operai | "Presenti: Nicola e Alfredo", "Assente: Luca" | Elenco COMPLETO presenze/assenze con motivazioni |
| ✅ Ore lavorate | "6.5 ore ciascuno", "fino alle 14:30" | Calcolare ore per OGNI operaio presente |
| ✅ Lavorazioni | "posa isolante", "applicazione prodotto" | Identificare TUTTE le lavorazioni svolte |
| ✅ Quantità | "10 metri quadri", "restano 10 metri" | Estrarre mq (se presenti) |
| ✅ Rese | "resa: 3.3 mq/ora", "calcolo cumulativo resa" | Calcolare se dati completi (mq / ore uomo) |
| ✅ Note organizzative | "priorità gronda", "sopralluogo lattoniere" | Note per aggiornamento programma |
| ✅ Presenze future | "Luca sarà ancora a casa", "Domani Luca assente" | Aggiornare programma giorni successivi |
| ✅ Completamenti | "quasi finito", "lavorazione finita" | Aggiornare stato lavorazioni |
| ✅ Eventi/condizioni | "appuntamento avvocato", "febbre" | Note nel diario |
Se hai mq + ore + operai, calcola automaticamente:
resa_per_operaio = mq / (ore × operai) Esempio: 50 mq posati, 5 operai, 8.5 ore ciascuno resa_per_operaio = 50 / (8.5 × 5) = 50 / 42.5 = 1.18 mq/ora per operaio
Prima di cancellare le note: Verifica mentalmente che TUTTI i dati della checklist sopra siano stati salvati nei file appropriati (diario, programma, analisi).
cantieri/ANNO/in_esecuzione/SLUG/notes.txt. Leggi il file della cartella cantiere (cerca notes.txt sotto cantieri/*/in_esecuzione/*/). All'inizio cerca il tag [CANTIERE: nome_slug] (es. [CANTIERE: legnano_via_milano]). Quel tag è la prova suprema. Applica le modifiche solo a quella cartella. Ignora ogni ipotesi diversa.notes.txt del cantiere identificato_consuntivo_ore_tabelle.html): ore per operaio, motivazioni assenze. Aggiorna Diario: SOLO cronaca + Tabella SOP-01 (Totale Ore Uomo = somma consuntivo; no mq/h nel Diario)rese_di_posa.php (doppio binario): (1) Registrazione giornaliera: ogni voce del diario con dati numerici di produzione (data, lavorazione, quantità del giorno, ore uomo del giorno, resa giornaliera, note) va trascritta nella Sezione A – Registro Cronologico Rese [Data | Lavorazione | Quantità del Giorno | Ore Uomo del Giorno | Resa Giornaliera | Note]. (2) Riepilogo: aggiornare (ricalcolare) la media nella Sezione B – Riepilogo Consolidato per la lavorazione interessata. Lavorazione completata (100%): spostala in Diario dalla To-Do List alla Sezione 3; in Diario mantieni solo descrizione e data. Non inserire rese analitiche nel Diario.notes.php con action=archive. Altrimenti: php app/scripts/archive_notes_cli.php <slug>. Vedi protocollo ARCHIVIAZIONE sopra.⚠️ Per i 3 file cantiere: Leggi COMPLETAMENTE, usa MASSIMA potenza.
update_all_meteo.php anno corrente⚠️ Risultato atteso: File COMPLETAMENTE RIGENERATI, matematica rigorosa, zero cronistoria nel programma.