Cantieri - Protocolli e Cantieri in Esecuzione

🏗️ Cantieri in Esecuzione

🏗️
Demo Villa Monza
2026 - In Esecuzione

Varie

📋
Problemi da gestire
Elenco e tracciamento

🏗️ Gestione Cantieri - Protocolli e Strutture Standard

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).


🎯 ECCEZIONE - File di Cantiere (Agenti AI): Per diario_di_cantiere.php, rese_di_posa.php, programma.php, analisi_fattibilita_consegna.php usa MASSIMA potenza (leggi COMPLETAMENTE, ragionamento approfondito).

🛡️ Protocollo di Sicurezza e Regole Operative (Agenti AI)

⚠️ Dati di Resa – No nel Diario / Analisi Fattibilità: Durante la creazione di nuovi cantieri, non includere mai i dati di resa nel Diario o nell'Analisi Fattibilità. Le rese e la fattibilità numerica restano in rese_di_posa.php e nei file dedicati.

Protocollo integrale (post-mortem 18/02/2026)

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.

🔒 PROTOCOLLO PRIVACY E RESE 2.0 (Direttive inderogabili)

PRIVACY DIARIO

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.

FLUSSO DATI (Standard Magenta Cantieri 2.0 – 7 file)

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).

GESTIONE METEO (Script obbligatorio)

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»).

FORMATO DATI

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.

RESET INTEGRITÀ RESE (procedura bloccante)

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.

ARCHIVIAZIONE NOTE (Agenti AI)

⚠️ 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.


PARTE I - STRUTTURA ORGANIZZATIVA

1. Organizzazione Cantieri

I cantieri sono organizzati per anno e stato di avanzamento in una struttura gerarchica standardizzata.

📁 Struttura Directory (Standard Magenta Cantieri 2.0)

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]

📋 Criteri Organizzativi

💡 CONVENZIONE NOMI:

  • Minuscolo, no spazi, underscore per separare
  • Identificazione geografica chiara
  • Esempio: milano_via_ampere, legnano_via_milano

2. Struttura Standard Cantiere – Magenta Cantieri 2.0

🎯 STANDARD VINCOLANTE – 8 FILE PHP OBBLIGATORI + NOTE SILOS

Ogni 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.

📄 I 8 file (ordine e funzioni)

# 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.

🔒 Regole di Data Integrity

⚠️ OBBLIGHI INVALICABILI

  • Obbligo file dati: Le tabelle del consuntivo (presenze/ore) devono risiedere SOLO in _consuntivo_ore_tabelle.html. Lo script app/includes/cantieri-alert.php e le notifiche Telegram dipendono da questo nome.
  • Diario vs Consuntivo: Il diario è muto per i calcoli numerici (ore, presenze); il consuntivo è parlante. Alert Dashboard e Telegram leggono solo il consuntivo. Nessuna tabella ore uomo nel diario.
  • Nomenclatura: Non cambiare mai i nomi degli 8 file elencati sopra. Alert, PDF e altri script di sistema dipendono da questi nomi.
  • Privacy: Le rese analitiche (mq/h, ore uomo per lavorazione) devono sparire dal Diario non appena una lavorazione è conclusa e devono essere migrate in 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.

🔗 Breadcrumbs Standard

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
];

🎨 Template di Riferimento

Quando si crea un nuovo cantiere, utilizzare come riferimento:


2b. Sistema Note decentralizzato (Silos)

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).


3. Template Cantieri

I template per la creazione di nuovi cantieri si trovano in app/templates/cantieri_in_esecuzione/.

📄 File Template (ordine Magenta Cantieri 2.0)

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.

📋 Placeholder da sostituire

[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:

  • I file possono essere inizialmente vuoti, ma devono esistere
  • Quando si crea un nuovo cantiere, copiare solo da app/templates/cantieri_in_esecuzione/ (sorgente unica; non usare cantieri esistenti come modello)
  • Ogni volta che viene creato un nuovo cantiere, verificare che la funzione 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 file
  • Tutti i file devono avere i breadcrumbs corretti
  • I percorsi relativi nei breadcrumbs devono essere corretti in base alla posizione del file

PARTE II - PROTOCOLLI OPERATIVI

4. Protocollo SOP-01: Standard Diario di Cantiere

🎯 PROTOCOLLO OPERATIVO STANDARD SOP-01

Standard 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.

📊 Campi Obbligatori Tabella Standard

  1. Meteo: Condizioni meteo (es: "Sole", "Pioggia", "Nuvoloso", "Poco nuvoloso"). Includere temperatura e precipitazioni se disponibili.
  2. Supervisore: Nome supervisore (es: "Davide Gobbi") o "Assente" se non presente. Specificare ore se parziale.
  3. Totale Ore Uomo: Somma di TUTTE le ore lavorate nella giornata (es: "42.5 ore uomo (5 operai × 8.5h)")
  4. Lavorazione Prevalente: La voce principale del giorno con ore dedicate (es: "Travi perimetrali gronda (22.5 ore uomo)")
  5. Resa Giornaliera: Se applicabile, resa mq/h o unità/h. Se non calcolabile scrivere "Non applicabile" o "Non calcolata" con motivazione
  6. Note Assenze: Se un operaio della squadra manca, DEVE esserci la motivazione (es: "Luca: febbre", "Omar: ordine supervisore"). Se tutti presenti: "Tutti presenti"
  7. Materiali Ricevuti: Note su consegne materiali (es: "Chiodi del 70 consegnati") o "Nessuna consegna"
  8. Criticità Operative (opzionale): Eventi critici che hanno impattato la produttività (es: ritardi, problemi tecnici, condizioni avverse)

⚠️ Colonna Alert - Regole

📋 Esempio Tabella Standard

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


5. Obbligo Motivazioni Assenze

🚨 REGOLA CRITICA - MOTIVAZIONI ASSENZE OBBLIGATORIE

Quando un operaio della squadra ha 0 ore registrate in una giornata lavorativa, la motivazione dell'assenza è OBBLIGATORIA e deve essere registrata nel Diario.

🔍 Regola di Controllo

Se un operaio ha 0 ore in una giornata lavorativa:

  1. Cercare nelle note fornite la motivazione (Malattia, Ferie, Permesso, Infortunio, ecc.)
  2. Se trovata: scrivere la motivazione nella colonna "Note Assenze" della tabella
  3. Se mancante: inserire l'alert "🚨 MOTIVARE ASSENZA" nella colonna "Alert"

📝 Esempi Note Assenze

✅ 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)"

📋 Cantiere Fermo – Propagazione Motivazione

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.


6. Standard Tabellare Programma

📊 STANDARD MATEMATICO TABELLARE

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.

✅ Formato Programma Corretto

Struttura:

  1. Sezione iniziale: Elenco conciso delle lavorazioni rimanenti (senza cronistoria)
  2. Tabella HTML: Una tabella con le colonne [DATA | FASCIA | LAVORAZIONE | SQUADRA | TARGET]
  3. Calcoli matematici: Tutti i target devono essere calcolati con la formula ufficiale: Ore_Uomo = Quantità / Resa_Reale_Diario
  4. Commenti HTML: Sotto la tabella, commenti con i calcoli dettagliati per audit

Esempio 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.

⚠️ Rese Stimate per Posa Tegole

📌 NOTA IMPORTANTE: Usa queste rese SOLO se non disponibili nel diario di cantiere. Le rese effettive registrate hanno SEMPRE priorità.

📊 Rese Standard per Squadra 4 Operai
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
📐 Formula Calcolo Tempi
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
⚙️ Fattori che Influenzano la Resa

📊 FONTE DATI:

  • 1° PRIORITÀ: Rese effettive dal diario_di_cantiere.php (specifiche del cantiere)
  • 2° PRIORITÀ: Rese dal amministrazione/prezzario.php (dati storici aziendali)
  • 3° PRIORITÀ: Rese stimate qui sopra (solo per preventivi iniziali)

7. Logica Decisionale Meteo

☁️ PROTOCOLLO SOSPENSIONE LAVORI PER MALTEMPO

Quando una giornata lavorativa è sospesa per maltempo (o altri motivi), esistono regole precise per la registrazione nel sistema.

📋 Procedura Obbligatoria per Giornate Sospese

  1. Creare voce nel Diario Giornaliero con stato "⚠️ LAVORI SOSPESI PER MALTEMPO"
  2. CREARE LE RIGHE NEL REGISTRO ORE OPERAI con 0 ore per TUTTI gli operai della squadra
  3. Nella colonna "Note" scrivere "Cantiere chiuso per maltempo" (o motivo sospensione)

⚠️ 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.

📝 Esempio REGISTRO ORE per giornata sospesa (28/01/2026)

<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 ...]

8. Gestione Registro Ore Operai

⏰ Regola Base Ore Operai

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.

📊 Struttura Registro Ore

⚠️ Assenze Parziali

Se un operaio lavora meno ore del previsto, specificare nella colonna Note:


9. Logica di Calcolo e Verità Dati

🔢 MATEMATICA DETERMINISTICA (Anti-Errore)

Zero stime, solo calcoli verificabili. Questo pilastro fondamentale garantisce l'accuratezza e la coerenza di tutti i dati inseriti nel sistema.

🎯 Regole Assolute

  1. NON STIMARE MAI: Somma ogni riga della tabella ore. Non usare approssimazioni o "circa". Ogni dato deve essere calcolato o derivato da fonti verificabili.
  2. DIVIETO DI INVENZIONE DATI: L'AI non deve mai, in nessun caso, generare, stimare o dedurre quantità numeriche (mq, metri lineari, pezzi, rese) se non sono esplicitamente scritte dall'utente nel file 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.
  3. FONTE DI VERITÀ UTENTE: Se l'utente scrive "restano X mq", quel valore è la verità assoluta. Ricalcola il "già fatto" sottraendo X dal totale cantiere.
  4. ORDINE CRONOLOGICO: Mantieni SEMPRE l'ordine cronologico crescente (dal più vecchio al più recente) nelle sezioni "Rese Effettive Registrate" e "Diario Giornaliero".
  5. VERIFICA COERENZA: Dopo ogni aggiornamento, verifica che:
    • Totale posato = Somma di tutte le quantità giornaliere
    • Quantità rimanente = Totale superficie - Totale posato
    • Percentuale completamento = (Totale posato / Totale superficie) × 100

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.

📝 Esempio Pratico - Logica "Restano X mq"

Scenario: Utente scrive: "restano 50 mq di isolante"

Dati cantiere:

  • Totale cantiere = 500 mq

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.


10. Standard Interfaccia Dashboard

🎨 LAYOUT BENTO GRID (Stile Apple)

La dashboard home (index.php) usa un layout Bento Grid moderno con CSS Grid a 4 colonne su desktop.

📐 Classi CSS per Dimensioni Box

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)

📱 Comportamento Responsive

🔧 Implementazione

Box Note nella Dashboard:


11. Sistema Alert e Notifiche Telegram

🚨 ALERT BACHECA + NOTIFICHE PUSH TELEGRAM

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.

📊 Dove vengono mostrati gli Alert

🔍 Cosa verifica il sistema

Per ogni cantiere in cantieri/[anno]/in_esecuzione/ (fonte: solo consuntivo_ore.php):

  1. ORE E PRESENZE OPERAI MANCANTI: Controlla la sezione #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.
  2. ASSENZE SENZA MOTIVAZIONE: Se un operaio ha 0 ore in una giornata, deve avere una nota motivata (malattia, permesso, maltempo, ecc.). Se la nota manca → alert. Cantiere fermo: note come "Cantiere fermo", "mancanza tegole", "mancanza materiale" fungono da giustificativo collettivo per tutto il team → nessun alert.
  3. RESE ORA UOMO DA AGGIORNARE: Estratte dal box alert presente nel consuntivo (se presente).
  4. CONSUNTIVO ORE VUOTO: Se manca la sezione 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).

🤖 Agenti AI – Whitelist motivazioni assenza: La whitelist in 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.

⏰ Finestra oraria e "include oggi"

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.

🎨 Colore Alert in Bacheca

📁 File coinvolti

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.

📱 Notifiche Telegram – Orari e Flusso

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:

  1. Finestra oraria: Lo script invia solo tra 7:00–8:59 (mattina) o 17:00–20:59 (sera). Fuori da questi range esce senza inviare.
  2. Verifica: Chiama getCantieriAlertData() — stessa logica della bacheca.
  3. Se nessun alert: Esce senza inviare nulla.
  4. Se ci sono alert: Prepara testo tecnico → passa a Groq AI per formattare in messaggio colloquiale (max 3–4 righe) → invia su Telegram.

⚠️ 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.


12. Protocollo di Analisi Note

⚠️ CRITICO - Checklist Dati da Identificare

Nessun dato deve andare perso. Quando analizzi il file app/data/notes.txt, identifica TUTTI i seguenti elementi.

✅ Checklist Completa

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

🔢 Calcoli Automatici

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

✅ Verifica Finale

Prima di cancellare le note: Verifica mentalmente che TUTTI i dati della checklist sopra siano stati salvati nei file appropriati (diario, programma, analisi).


🤖 Prompt Ricorrenti

📝 Prompt: "Integra Note nel Sistema"

🎯 Obiettivi

  1. Identità cantiere (OBBLIGATORIO): Ogni cantiere ha 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.
  2. Leggi il resto delle note da notes.txt del cantiere identificato
  3. Aggiorna Meteo (script PHP, exit code 0 obbligatorio)
  4. Aggiorna Consuntivo (_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)
  5. Aggiorna Programma: SOLO FUTURO, tabellare
  6. Aggiorna Analisi: ore disponibili, gap, scenari
  7. Archiviazione in 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.
  8. Archiviazione finale: Svuota notes.txt. Se sessione disponibile: POST a 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.

🔄 Prompt: "Aggiorna Tutti i Cantieri in Esecuzione"

🎯 Obiettivi

  1. Esegui update_all_meteo.php anno corrente
  2. Per ogni cantiere: Aggiorna Diario, Programma (RIGENERAZIONE COMPLETA), Analisi

⚠️ Risultato atteso: File COMPLETAMENTE RIGENERATI, matematica rigorosa, zero cronistoria nel programma.