Gestione Template - Guida Dettagliata

Gestione Template - Guida Dettagliata

Data: 22 Ottobre 2025 Focus: Pattern Matching, SQL Query, Response Template

---

🎯 Cos'è un Template?

Un template Γ¨ una "ricetta" che dice all'AI Assistant:

1. QUANDO usarmi β†’ Pattern Matching (regex) 2. COSA fare β†’ SQL Query (recupera dati) 3. COME rispondere β†’ Response Template (formatta risposta)

---

πŸ” PARTE 1: Pattern Matching

A Cosa Serve

Il pattern matching rileva se la query dell'utente corrisponde a questo template.

Come Funziona

Input: Query utente (es: "Qual Γ¨ stata la produzione di ieri?") Process: Confronta con pattern regex Output: Match βœ… oppure No Match ❌

---

Esempi Pratici

Esempio 1: Pattern Semplice

Pattern: ``

produzione di ieri
</code>`<code></p><p><strong>Match</strong>:
<ul><li>βœ… &quot;Qual Γ¨ stata la produzione di ieri?&quot;</li>
<li>βœ… &quot;Voglio sapere la produzione di ieri&quot;</li>
<li>βœ… &quot;Dimmi la produzione di ieri&quot;</li></p><p><strong>NO Match</strong>:
<li>❌ &quot;Produzione di oggi&quot; (non c&#039;è &quot;ieri&quot;)</li>
<li>❌ &quot;Ieri quanti pezzi?&quot; (non c&#039;è &quot;produzione&quot;)</li></p><p>---</p><p><h4><strong>Esempio 2: Pattern con Varianti</strong></h4></p><p><strong>Pattern</strong>:
` produzione di (ieri|oggi) `

Match:

  • βœ… "Produzione di ieri"
  • βœ… "Produzione di oggi"
  • ❌ "Produzione di questa settimana" (non prevista)
  • Cosa significa (ieri|oggi)?

  • | = OR (oppure)
  • (...) = gruppo
  • Significa: "ieri" OPPURE "oggi"
  • ---

    Esempio 3: Pattern Flessibile

    Pattern: ` (?:qual|quant)[ieaè]? (?:è |stata |la )?produzione (?:di )?(ieri|oggi|questa settimana) `

    Match:

  • βœ… "Qual Γ¨ la produzione di ieri?"
  • βœ… "Quanta produzione ieri?"
  • βœ… "Produzione oggi"
  • βœ… "Qual Γ¨ stata la produzione questa settimana?"
  • Sintassi Regex:

  • (?:...) = gruppo non catturante
  • [ieaΓ¨]? = una lettera tra quelle, opzionale
  • ? = opzionale (puΓ² esserci o no)
  • | = OR
  • ---

    Come Scrivere Pattern Efficaci

    Regola 1: Parti dal Semplice

    ❌ Troppo complesso: ` (?:qual[ieè]|quant[oiae]|dimmi|mostrami|visualizza).{0,50}produzione `

    βœ… Semplice ed efficace: ` produzione di (ieri|oggi|questa settimana) `

    ---

    Regola 2: Usa Varianti per Sinonimi

    Query possibili:

  • "Produzione di ieri"
  • "Pezzi di ieri"
  • "QuantitΓ  di ieri"
  • Pattern: ` (produzione|pezzi|quantitΓ ) (?:di )?(ieri|oggi) `

    ---

    Regola 3: Ignora Parole Non Essenziali

    Query utente spesso contiene:

  • "Qual Γ¨..."
  • "Voglio sapere..."
  • "Dimmi..."
  • "Per favore..."
  • Soluzione: Pattern ignora queste parti

    ` produzione di ieri `

    Match anche:

  • "Qual Γ¨ la produzione di ieri?"
  • "Voglio sapere la produzione di ieri"
  • "Dimmi la produzione di ieri per favore"
  • PerchΓ©? PerchΓ© il pattern cerca solo la parte essenziale!

    ---

    Pattern Library - Costrutti Comuni

    Periodi Temporali

    `regex (ieri|oggi|questa settimana|scorsa settimana|questo mese|scorso mese) `

    Confronti

    `regex confronta?.* (?:con|vs|rispetto a?) `

    Operatori

    `regex (?:chi|quale) (?:Γ¨|ha) (?:l')?operatore `

    Metriche

    `regex (produzione|pezzi|operazioni|lavorazioni|quantitΓ ) `

    Domande

    `regex (?:qual|quant|come|perch[eΓ©]|quando) `

    ---

    πŸ—ƒοΈ PARTE 2: SQL Query

    A Cosa Serve

    La query SQL recupera i dati dal database per rispondere alla domanda.

    ---

    Struttura Database (Recap)

    Tabella principale: machine_operations_log

    Colonne fisse:

  • id β†’ ID operazione
  • machine_id β†’ ID macchina
  • profile_id β†’ Profilo import usato
  • timestamp β†’ Data/ora operazione
  • csv_import_id β†’ Da quale import CSV
  • Colonna dinamica:

  • raw_data β†’ JSON con TUTTI i dati dell'operazione
  • Esempio raw_data: `json { "TotalPieces": 150, "Duration": 2.5, "UserLog": "Mario Rossi", "NumberOfPlies": 12, "Material": "Cartone", "ProfileName": "Taglio Standard" } `

    I campi in raw_data cambiano per ogni macchina/profilo!

    ---

    Query SQL - Esempi Pratici

    Esempio 1: Totale Pezzi di Ieri

    Cosa vogliamo:

  • Somma di tutti i TotalPieces di ieri
  • Per una specifica macchina
  • Query SQL: `sql SELECT SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL(15,2))) as total_quantity FROM machine_operations_log WHERE machine_id = :machine_id AND DATE(timestamp) = CURDATE() - INTERVAL 1 DAY `

    Spiegazione riga per riga:

    Riga 1-2: Somma il campo TotalPieces da JSON `sql SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL)) `

  • JSON_EXTRACT(raw_data, '$.TotalPieces') β†’ Estrae valore da JSON
  • JSON_UNQUOTE(...) β†’ Rimuove virgolette
  • CAST(... AS DECIMAL) β†’ Converte in numero
  • SUM(...) β†’ Somma tutti i valori
  • Riga 3: Dalla tabella operations `sql FROM machine_operations_log `

    Riga 4: Solo per la macchina specificata `sql WHERE machine_id = :machine_id ` :machine_id = parametro che verrΓ  sostituito automaticamente

    Riga 5: Solo operazioni di ieri `sql AND DATE(timestamp) = CURDATE() - INTERVAL 1 DAY `

  • CURDATE() = data di oggi
  • - INTERVAL 1 DAY = meno 1 giorno = ieri
  • ---

    Esempio 2: Conteggio Operazioni + Media Durata

    Cosa vogliamo:

  • Numero totale operazioni
  • Durata media
  • Query SQL: `sql SELECT COUNT(*) as total_operations, AVG(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.Duration')) AS DECIMAL(15,2))) as avg_duration FROM machine_operations_log WHERE machine_id = :machine_id AND timestamp BETWEEN :date_from AND :date_to `

    Nuovi concetti:

  • COUNT(*) β†’ Conta righe
  • AVG(...) β†’ Media
  • BETWEEN :date_from AND :date_to β†’ Range date
  • ---

    Esempio 3: Ranking Operatori

    Cosa vogliamo:

  • Top 5 operatori per pezzi prodotti
  • Query SQL: `sql SELECT JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.UserLog')) as operator, COUNT(*) as operations, SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL)) as total_pieces FROM machine_operations_log WHERE machine_id = :machine_id AND timestamp BETWEEN :date_from AND :date_to GROUP BY operator ORDER BY total_pieces DESC LIMIT 5 `

    Nuovi concetti:

  • GROUP BY operator β†’ Raggruppa per operatore
  • ORDER BY total_pieces DESC β†’ Ordina per pezzi (piΓΉ alto primo)
  • LIMIT 5 β†’ Solo primi 5 risultati
  • ---

    Parametri Standard

    Sempre disponibili in ogni query:

    | Parametro | Descrizione | Esempio | |-----------|-------------|---------| | :machine_id | ID macchina corrente | 5 | | :date_from | Data inizio periodo | 2025-10-21 00:00:00 | | :date_to | Data fine periodo | 2025-10-21 23:59:59 |

    Sistema sostituisce automaticamente in base al contesto!

    ---

    Template SQL Pronti (Copia-Incolla)

    Template 1: Somma Campo JSON

    `sql SELECT SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.{CAMPO}')) AS DECIMAL)) as total FROM machine_operations_log WHERE machine_id = :machine_id AND timestamp BETWEEN :date_from AND :date_to `

    Sostituisci {CAMPO} con: TotalPieces, Duration, NumberOfPlies, etc.

    ---

    Template 2: Conteggio + Media

    `sql SELECT COUNT(*) as total_ops, AVG(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.{CAMPO}')) AS DECIMAL)) as avg_value FROM machine_operations_log WHERE machine_id = :machine_id AND timestamp BETWEEN :date_from AND :date_to `

    ---

    Template 3: Group By Campo

    `sql SELECT JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.{CAMPO_GROUP}')) as label, COUNT(*) as count, SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.{CAMPO_SUM}')) AS DECIMAL)) as total FROM machine_operations_log WHERE machine_id = :machine_id AND timestamp BETWEEN :date_from AND :date_to GROUP BY label ORDER BY total DESC LIMIT 10 `

    Sostituisci:

  • {CAMPO_GROUP} β†’ Campo per raggruppare (es: UserLog, Material)
  • {CAMPO_SUM} β†’ Campo da sommare (es: TotalPieces)
  • ---

    Template 4: Confronto 2 Periodi

    `sql SELECT DATE(timestamp) as date, SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL)) as daily_total FROM machine_operations_log WHERE machine_id = :machine_id AND timestamp >= DATE_SUB(NOW(), INTERVAL 14 DAY) GROUP BY date ORDER BY date `

    ---

    πŸ’¬ PARTE 3: Response Template

    A Cosa Serve

    Il response template formatta la risposta per l'utente usando i dati della query SQL.

    ---

    Come Funziona

    SQL restituisce: `json { "total_quantity": 1850, "total_operations": 23, "avg_duration": 2.3 } `

    Response Template: ` πŸ“Š Produzione di {periodo}:

    βœ… Totale pezzi: {total_quantity} πŸ“ˆ Operazioni: {total_operations} ⏱️ Durata media: {avg_duration}h `

    Output finale: ` πŸ“Š Produzione di ieri:

    βœ… Totale pezzi: 1.850 πŸ“ˆ Operazioni: 23 ⏱️ Durata media: 2.3h `

    ---

    Placeholder Disponibili

    1. Risultati SQL (automatici)

    Ogni colonna del SELECT diventa un placeholder:

    `sql SELECT SUM(...) as total_quantity, ← placeholder: {total_quantity} COUNT(*) as total_ops, ← placeholder: {total_ops} AVG(...) as avg_value ← placeholder: {avg_value} `

    Usa nel template: ` Totale: {total_quantity} Operazioni: {total_ops} Media: {avg_value} `

    ---

    2. EntitΓ  Estratte (da pattern)

    Se il pattern cattura gruppi:

    Pattern: ` produzione di (ieri|oggi) gruppo_1 ↑ `

    Query: "Produzione di ieri"

    EntitΓ  estratta: `

    {periodo} = &quot;ieri&quot;
    </code>`<code></p><p>Usa nel template:
    </code>`<code>
    Produzione di {periodo}: {total} pezzi
    </code>`<code></p><p>Output:
    </code>`<code>
    Produzione di ieri: 1.850 pezzi
    </code>`<code></p><p>---</p><p><h3><strong>Formattazione Response</strong></h3></p><p><h4><strong>Usa Emoji</strong> (rendono leggibile)</h4></p><p></code>`<code>
    πŸ“Š Statistiche
    βœ… Successo
    ❌ Errore
    ⚠️ Attenzione
    πŸ“ˆ In crescita
    πŸ“‰ In calo
    πŸ‘₯ Operatori
    ⏱️ Tempo
    🎯 Obiettivo
    `

    Usa Grassetto (nei messaggi)

    Nelle interfacce web, puoi usare markdown: ` Totale: {total} pezzi `

    O semplice maiuscolo: ` TOTALE: {total} pezzi `

    Aggiungi Contesto (molto importante!)

    ❌ Risposta secca: ` Totale: 1.850 pezzi `

    βœ… Risposta con contesto: ` Totale: 1.850 pezzi

    Rispetto alla media degli ultimi 30 giorni (1.750 pezzi), sei +5.7% πŸ“ˆ. Ottimo lavoro! `

    ---

    Template Esempi Completi

    Template 1: Produzione Giornaliera

    Response Template: ` πŸ“Š Produzione di {periodo}:

    βœ… Totale pezzi: {total_quantity} πŸ“ˆ Operazioni: {total_operations} ⏱️ Durata media: {avg_duration}h

    Rispetto alla media degli ultimi 30 giorni ({avg_30d} pezzi), sei {delta_percent}% {emoji_trend}. `

    Placeholder:

  • {periodo} β†’ Estratto da pattern (ieri/oggi)
  • {total_quantity} β†’ Da SQL (SUM TotalPieces)
  • {total_operations} β†’ Da SQL (COUNT)
  • {avg_duration} β†’ Da SQL (AVG Duration)
  • {avg_30d} β†’ Calcolato dal sistema (context enrichment)
  • {delta_percent} β†’ Calcolato dal sistema
  • {emoji_trend} β†’ Calcolato (πŸ“ˆ se positivo, πŸ“‰ se negativo)
  • ---

    Template 2: Ranking Operatori

    Response Template: ` πŸ‘₯ Top 5 Operatori ({periodo}):

    πŸ₯‡ 1. {operator_1} - {pieces_1} pezzi ({ops_1} operazioni) πŸ₯ˆ 2. {operator_2} - {pieces_2} pezzi ({ops_2} operazioni) πŸ₯‰ 3. {operator_3} - {pieces_3} pezzi ({ops_3} operazioni) 4. {operator_4} - {pieces_4} pezzi ({ops_4} operazioni) 5. {operator_5} - {pieces_5} pezzi ({ops_5} operazioni)

    ⚑ {operator_1} è il più produttivo con {pieces_per_hour} pezzi/ora. `

    Placeholder:

  • {operator_1}, {operator_2}, etc. β†’ Da SQL (risultati multipli)
  • {pieces_1}, {pieces_2}, etc. β†’ Da SQL
  • {ops_1}, etc. β†’ Da SQL
  • {pieces_per_hour} β†’ Calcolato dal sistema
  • ---

    Template 3: Confronto Periodi

    Response Template: ` βš–οΈ Confronto {periodo_1} vs {periodo_2}:

    πŸ“Š {periodo_1}: {value_1} pezzi πŸ“Š {periodo_2}: {value_2} pezzi

    πŸ“ˆ Variazione: {delta_abs} pezzi ({delta_percent}% {emoji})

    {insight_message} `

    Placeholder:

  • {periodo_1}, {periodo_2} β†’ Estratti da pattern
  • {value_1}, {value_2} β†’ Da SQL (2 query)
  • {delta_abs} β†’ Calcolato (value_1 - value_2)
  • {delta_percent} β†’ Calcolato
  • {emoji} β†’ πŸ“ˆ o πŸ“‰
  • {insight_message} β†’ Auto-generato dal sistema
  • ---

    πŸ”— COME SI COLLEGANO I 3 COMPONENTI

    Flusso Completo - Esempio Pratico

    INPUT UTENTE:

    ` "Qual Γ¨ stata la produzione di ieri?" `

    ---

    STEP 1: Pattern Matching

    Pattern nel template: ` produzione di (ieri|oggi) `

    Matching:

  • βœ… Match trovato!
  • Gruppo catturato: (ieri)
  • EntitΓ  estratte: `php [ 'periodo' => 'ieri', 'date_from' => '2025-10-21 00:00:00', 'date_to' => '2025-10-21 23:59:59', ] `

    ---

    STEP 2: SQL Query

    Query nel template: `sql SELECT SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL)) as total_quantity, COUNT(*) as total_operations, AVG(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.Duration')) AS DECIMAL)) as avg_duration FROM machine_operations_log WHERE machine_id = :machine_id AND timestamp BETWEEN :date_from AND :date_to `

    Sistema sostituisce parametri: `sql WHERE machine_id = 5 AND timestamp BETWEEN '2025-10-21 00:00:00' AND '2025-10-21 23:59:59' `

    Esegue query β†’ Risultato: `json { "total_quantity": 1850, "total_operations": 23, "avg_duration": 2.3 } `

    ---

    STEP 3: Response Template

    Template: ` πŸ“Š Produzione di {periodo}:

    βœ… Totale pezzi: {total_quantity} πŸ“ˆ Operazioni: {total_operations} ⏱️ Durata media: {avg_duration}h `

    Sistema sostituisce placeholder: ` {periodo} β†’ "ieri" (da entitΓ ) {total_quantity} β†’ 1850 (da SQL) {total_operations} β†’ 23 (da SQL) {avg_duration} β†’ 2.3 (da SQL) `

    Output finale: ` πŸ“Š Produzione di ieri:

    βœ… Totale pezzi: 1.850 πŸ“ˆ Operazioni: 23 ⏱️ Durata media: 2.3h `

    ---

    πŸ“ ESEMPIO COMPLETO: Template "Produzione Giornaliera"

    Compilazione Form

    `

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Template ID: prod_daily                                     β”‚
    β”‚                                                             β”‚
    β”‚ Ambito: πŸ“Š Produzione                                       β”‚
    β”‚                                                             β”‚
    β”‚ Pattern Matching:                                          β”‚
    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚ β”‚ produzione di (ieri|oggi)                               β”‚β”‚
    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚ Cache TTL: [3600] secondi (1 ora)                         β”‚
    β”‚                                                             β”‚
    β”‚ ☐ Richiede LLM                                            β”‚
    β”‚                                                             β”‚
    β”‚ ─────────────────────────────────────────────────────────  β”‚
    β”‚                                                             β”‚
    β”‚ Query SQL:                                                 β”‚
    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚ β”‚ SELECT                                                  β”‚β”‚
    β”‚ β”‚   SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(                  β”‚β”‚
    β”‚ β”‚     raw_data, &#039;$.TotalPieces&#039;)) AS DECIMAL)) as total, β”‚β”‚
    β”‚ β”‚   COUNT(*) as ops,                                      β”‚β”‚
    β”‚ β”‚   AVG(CAST(JSON_UNQUOTE(JSON_EXTRACT(                  β”‚β”‚
    β”‚ β”‚     raw_data, &#039;$.Duration&#039;)) AS DECIMAL)) as avg_dur   β”‚β”‚
    β”‚ β”‚ FROM machine_operations_log                             β”‚β”‚
    β”‚ β”‚ WHERE machine_id = :machine_id                          β”‚β”‚
    β”‚ β”‚   AND timestamp BETWEEN :date_from AND :date_to        β”‚β”‚
    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚ ─────────────────────────────────────────────────────────  β”‚
    β”‚                                                             β”‚
    β”‚ Response Template:                                         β”‚
    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚ β”‚ πŸ“Š Produzione di {periodo}:                            β”‚β”‚
    β”‚ β”‚                                                         β”‚β”‚
    β”‚ β”‚ βœ… Totale pezzi: {total}                              β”‚β”‚
    β”‚ β”‚ πŸ“ˆ Operazioni: {ops}                                   β”‚β”‚
    β”‚ β”‚ ⏱️ Durata media: {avg_dur}h                           β”‚β”‚
    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚ ─────────────────────────────────────────────────────────  β”‚
    β”‚                                                             β”‚
    β”‚ Follow-Up Suggestions:                                     β”‚
    β”‚ 1. [Confronta con ieri___________________________]        β”‚
    β”‚ 2. [Mostrami il trend settimanale_______________]        β”‚
    β”‚ 3. [Chi ha prodotto di piΓΉ?____________________]        β”‚
    β”‚                                                             β”‚
    β”‚ ─────────────────────────────────────────────────────────  β”‚
    β”‚                                                             β”‚
    β”‚ [Annulla]                          [πŸ’Ύ Crea Template]     β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    `

    ---

    ❓ Domande Frequenti

    1. Come scopro quali campi ho in raw_data?

    Opzione A: Guarda i profili import

  • Menu β†’ I40 β†’ Profili Import
  • Vedi colonne configurate
  • Opzione B: Query database `

    sql
    SELECT raw_data 
    FROM machine_operations_log 
    WHERE machine_id = 1 
    LIMIT 1;
    </code>`<code></p><p><strong>Opzione C</strong>: AI Inspector (da implementare)
    <li>Mostra tutti i campi disponibili</li>
    <li>Con esempi di valori</li></p><p>---</p><p><h3><strong>2. Cosa succede se il campo non esiste?</strong></h3></p><p>Se query cerca </code>$.TotalPieces<code> ma non esiste nel raw_data:
    <li>MySQL restituisce </code>NULL<code></li>
    <li>SUM(NULL) = </code>0<code></li>
    <li>Response mostra: &quot;0 pezzi&quot;</li></p><p><strong>Soluzione</strong>: Usa campi che sai esistere (da profilo import)</p><p>---</p><p><h3><strong>3. Come testo il pattern prima di salvare?</strong></h3></p><p><strong>Attualmente</strong>: Manuale (provi dopo aver creato)</p><p><strong>Da implementare</strong>: Test inline
    <li>Scrivi pattern</li>
    <li>Inserisci query test</li>
    <li>Vedi se match βœ… o ❌</li></p><p>---</p><p><h3><strong>4. Posso modificare template dopo creazione?</strong></h3></p><p><strong>SΓ¬!</strong> Usa il bottone &quot;Modifica&quot; nella lista template.</p><p>Puoi cambiare:
    <li>βœ… Pattern</li>
    <li>βœ… SQL</li>
    <li>βœ… Response template</li>
    <li>βœ… Suggestions</li>
    <li>βœ… Ambito</li>
    <li>❌ Template ID (non modificabile)</li></p><p>---</p><p><h2>πŸŽ“ Best Practices</h2></p><p><h3><strong>Pattern Matching</strong></h3></p><p>βœ… <strong>DO</strong>:
    <li>Parti semplice, raffina dopo</li>
    <li>Usa varianti per sinonimi</li>
    <li>Testa con query reali</li></p><p>❌ <strong>DON&#039;T</strong>:
    <li>Pattern troppo specifici (match solo 1 query)</li>
    <li>Pattern troppo generici (match tutto)</li>
    <li>Regex complesse senza testare</li></p><p>---</p><p><h3><strong>SQL Query</strong></h3></p><p>βœ… <strong>DO</strong>:
    <li>Usa sempre i parametri
    :machine_id
    , </code>:date_from<code>, </code>:date_to<code></li>
    <li>Aggiungi alias chiari (</code>as total_quantity<code>)</li>
    <li>Limita risultati (LIMIT)</li>
    <li>Testa query in phpMyAdmin prima</li></p><p>❌ <strong>DON&#039;T</strong>:
    <li>Valori hardcoded (WHERE machine_id = 5)</li>
    <li>Query senza WHERE (troppo lente)</li>
    <li>SELECT * (specifica colonne)</li></p><p>---</p><p><h3><strong>Response Template</strong></h3></p><p>βœ… <strong>DO</strong>:
    <li>Usa emoji per chiarezza</li>
    <li>Aggiungi contesto (confronti, medie)</li>
    <li>Formatta numeri (1.850 invece di 1850)</li>
    <li>Suggerisci follow-up</li></p><p>❌ <strong>DON&#039;T</strong>:
    <li>Risposte troppo lunghe (&gt;10 righe)</li>
    <li>Solo numeri senza spiegazione</li>
    <li>Placeholder non esistenti</li></p><p>---</p><p><h2>πŸš€ Prossimi Miglioramenti</h2></p><p><h3><strong>1. AI Generator</strong> (Automatizza Tutto)</h3></p><p><strong>Input</strong>: Solo query esempio  
    <strong>Output</strong>: Template completo (pattern + SQL + response)  
    <strong>Tempo</strong>: 2 min invece di 15 min</p><p>---</p><p><h3><strong>2. Schema Browser</strong></h3></p><p><strong>Pannello laterale</strong> che mostra:
    <li>Tabelle disponibili</li>
    <li>Campi in raw_data per ogni macchina</li>
    <li>Esempi di valori</li>
    <li>Template SQL copy-paste</li></p><p>---</p><p><h3><strong>3. Pattern Tester</strong></h3></p><p><strong>Test inline</strong> mentre scrivi:
    ` Pattern: produzione di (ieri|oggi)

    Test Query: [Produzione di ieri_________]

    Risultato: βœ… Match! Gruppo 1: "ieri" `

    </p><p>---</p><p><h3><strong>4. SQL Builder Visuale</strong></h3></p><p><strong>Drag &amp; drop</strong> invece di scrivere SQL:
    </code>`<code>
    Campo: [TotalPieces β–Ό]
    Aggregazione: [SUM β–Ό]
    Alias: [total]</p><p>[Aggiungi Campo]</p><p>Filtri:
    β˜‘ machine_id = :machine_id
    β˜‘ timestamp BETWEEN :date_from AND :date_to</p><p>[Genera SQL] β†’ Crea query automaticamente
    ``

    ---

    πŸ’‘ Come Procedere

    Opzione 1: Manuale Guidato (Impari facendo)

    1. Creo 5 template esempio completi con spiegazioni 2. Tu li copi e modifichi per altre query 3. Impari struttura pattern/SQL/response 4. Dopo 5-10 template β†’ Capisci la logica

    Tempo: 1-2 giorni per 10 template Beneficio: Capisci tutto in profonditΓ 

    ---

    Opzione 2: AI Generator (Veloce)

    1. Implemento generatore automatico 2. Tu inserisci solo query esempio 3. AI genera tutto (pattern + SQL + response) 4. Tu revisioni e salvi

    Tempo: 1 ora per 30 template Beneficio: KB popolata rapidamente

    ---

    Opzione 3: Ibrido ⭐ CONSIGLIATO

    1. Oggi: Crei 3-5 template manualmente (con mio aiuto) 2. Domani: Implemento AI Generator 3. Dopodomani: Generi altri 20-30 template con AI

    Beneficio:

  • βœ… Capisci la struttura (template manuali)
  • βœ… Velocizzi dopo (AI generator)
  • βœ… Meglio di entrambe le altre opzioni
  • ---

    ❓ Vuoi Iniziare?

    Posso aiutarti a creare il primo template insieme, passo-passo:

    1. Scegli una query da gestire (es: "Produzione di ieri") 2. Io ti guido a scrivere pattern, SQL e response 3. Tu capisci la logica 4. Poi crei gli altri autonomamente (o con AI Generator)

    Ti va bene questo approccio? Dimmi la query che vuoi gestire per prima! πŸš€

    Analisi Codice

    Blocco 1
    produzione di ieri
    
    Blocco 2
    produzione di (ieri|oggi)
    
    Blocco 3
    (?:qual|quant)[ieaè]? (?:è |stata |la )?produzione (?:di )?(ieri|oggi|questa settimana)
    
    Blocco 4
    (?:qual[ieè]|quant[oiae]|dimmi|mostrami|visualizza).{0,50}produzione
    
    Blocco 5
    produzione di (ieri|oggi|questa settimana)
    
    Blocco 6
    (produzione|pezzi|quantitΓ ) (?:di )?(ieri|oggi)
    
    Blocco 7
    produzione di ieri
    
    Blocco 8 regex
    (ieri|oggi|questa settimana|scorsa settimana|questo mese|scorso mese)
    
    Blocco 9 regex
    confronta?.* (?:con|vs|rispetto a?)
    
    Blocco 10 regex
    (?:chi|quale) (?:Γ¨|ha) (?:l')?operatore
    
    Blocco 11 regex
    (produzione|pezzi|operazioni|lavorazioni|quantitΓ )
    
    Blocco 12 regex
    (?:qual|quant|come|perch[eΓ©]|quando)
    
    Blocco 13 json
    {
      "TotalPieces": 150,
      "Duration": 2.5,
      "UserLog": "Mario Rossi",
      "NumberOfPlies": 12,
      "Material": "Cartone",
      "ProfileName": "Taglio Standard"
    }
    
    Blocco 14 sql
    SELECT 
      SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL(15,2))) as total_quantity
    FROM machine_operations_log
    WHERE machine_id = :machine_id
      AND DATE(timestamp) = CURDATE() - INTERVAL 1 DAY
    
    Blocco 15 sql
    SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL))
    
    Blocco 16 sql
    FROM machine_operations_log
    
    Blocco 17 sql
    WHERE machine_id = :machine_id
    
    Blocco 18 sql
    AND DATE(timestamp) = CURDATE() - INTERVAL 1 DAY
    
    Blocco 19 sql
    SELECT 
      COUNT(*) as total_operations,
      AVG(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.Duration')) AS DECIMAL(15,2))) as avg_duration
    FROM machine_operations_log
    WHERE machine_id = :machine_id
      AND timestamp BETWEEN :date_from AND :date_to
    
    Blocco 20 sql
    SELECT 
      JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.UserLog')) as operator,
      COUNT(*) as operations,
      SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL)) as total_pieces
    FROM machine_operations_log
    WHERE machine_id = :machine_id
      AND timestamp BETWEEN :date_from AND :date_to
    GROUP BY operator
    ORDER BY total_pieces DESC
    LIMIT 5
    
    Blocco 21 sql
    SELECT 
      SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.{CAMPO}')) AS DECIMAL)) as total
    FROM machine_operations_log
    WHERE machine_id = :machine_id
      AND timestamp BETWEEN :date_from AND :date_to
    
    Blocco 22 sql
    SELECT 
      COUNT(*) as total_ops,
      AVG(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.{CAMPO}')) AS DECIMAL)) as avg_value
    FROM machine_operations_log
    WHERE machine_id = :machine_id
      AND timestamp BETWEEN :date_from AND :date_to
    
    Blocco 23 sql
    SELECT 
      JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.{CAMPO_GROUP}')) as label,
      COUNT(*) as count,
      SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.{CAMPO_SUM}')) AS DECIMAL)) as total
    FROM machine_operations_log
    WHERE machine_id = :machine_id
      AND timestamp BETWEEN :date_from AND :date_to
    GROUP BY label
    ORDER BY total DESC
    LIMIT 10
    
    Blocco 24 sql
    SELECT 
      DATE(timestamp) as date,
      SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL)) as daily_total
    FROM machine_operations_log
    WHERE machine_id = :machine_id
      AND timestamp >= DATE_SUB(NOW(), INTERVAL 14 DAY)
    GROUP BY date
    ORDER BY date
    
    Blocco 25 json
    {
      "total_quantity": 1850,
      "total_operations": 23,
      "avg_duration": 2.3
    }
    
    Blocco 26
    πŸ“Š Produzione di {periodo}:
    
    βœ… Totale pezzi: {total_quantity}
    πŸ“ˆ Operazioni: {total_operations}
    ⏱️ Durata media: {avg_duration}h
    
    Blocco 27
    πŸ“Š Produzione di ieri:
    
    βœ… Totale pezzi: 1.850
    πŸ“ˆ Operazioni: 23
    ⏱️ Durata media: 2.3h
    
    Blocco 28 sql
    SELECT 
      SUM(...) as total_quantity,  ← placeholder: {total_quantity}
      COUNT(*) as total_ops,       ← placeholder: {total_ops}
      AVG(...) as avg_value        ← placeholder: {avg_value}
    
    Blocco 29
    Totale: {total_quantity}
    Operazioni: {total_ops}
    Media: {avg_value}
    
    Blocco 30
    produzione di (ieri|oggi)
              gruppo_1 ↑
    
    Blocco 31
    {periodo} = "ieri"
    
    Blocco 32
    Produzione di {periodo}: {total} pezzi
    
    Blocco 33
    Produzione di ieri: 1.850 pezzi
    
    Blocco 34
    πŸ“Š Statistiche
    βœ… Successo
    ❌ Errore
    ⚠️ Attenzione
    πŸ“ˆ In crescita
    πŸ“‰ In calo
    πŸ‘₯ Operatori
    ⏱️ Tempo
    🎯 Obiettivo
    
    Blocco 35
    **Totale**: {total} pezzi
    
    Blocco 36
    TOTALE: {total} pezzi
    
    Blocco 37
    Totale: 1.850 pezzi
    
    Blocco 38
    Totale: 1.850 pezzi
    
    Rispetto alla media degli ultimi 30 giorni (1.750 pezzi),
    sei +5.7% πŸ“ˆ. Ottimo lavoro!
    
    Blocco 39
    πŸ“Š Produzione di {periodo}:
    
    βœ… Totale pezzi: {total_quantity}
    πŸ“ˆ Operazioni: {total_operations}
    ⏱️ Durata media: {avg_duration}h
    
    Rispetto alla media degli ultimi 30 giorni ({avg_30d} pezzi),
    sei {delta_percent}% {emoji_trend}.
    
    Blocco 40
    πŸ‘₯ Top 5 Operatori ({periodo}):
    
    πŸ₯‡ 1. {operator_1} - {pieces_1} pezzi ({ops_1} operazioni)
    πŸ₯ˆ 2. {operator_2} - {pieces_2} pezzi ({ops_2} operazioni)
    πŸ₯‰ 3. {operator_3} - {pieces_3} pezzi ({ops_3} operazioni)
       4. {operator_4} - {pieces_4} pezzi ({ops_4} operazioni)
       5. {operator_5} - {pieces_5} pezzi ({ops_5} operazioni)
    
    ⚑ {operator_1} è il più produttivo con {pieces_per_hour} pezzi/ora.
    
    Blocco 41
    βš–οΈ Confronto {periodo_1} vs {periodo_2}:
    
    πŸ“Š {periodo_1}: {value_1} pezzi
    πŸ“Š {periodo_2}: {value_2} pezzi
    
    πŸ“ˆ Variazione: {delta_abs} pezzi ({delta_percent}% {emoji})
    
    {insight_message}
    
    Blocco 42
    "Qual Γ¨ stata la produzione di ieri?"
    
    Blocco 43
    produzione di (ieri|oggi)
    
    Blocco 44 php
    [
      'periodo' => 'ieri',
      'date_from' => '2025-10-21 00:00:00',
      'date_to' => '2025-10-21 23:59:59',
    ]
    
    Blocco 45 sql
    SELECT 
      SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.TotalPieces')) AS DECIMAL)) as total_quantity,
      COUNT(*) as total_operations,
      AVG(CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data, '$.Duration')) AS DECIMAL)) as avg_duration
    FROM machine_operations_log
    WHERE machine_id = :machine_id
      AND timestamp BETWEEN :date_from AND :date_to
    
    Blocco 46 sql
    WHERE machine_id = 5
      AND timestamp BETWEEN '2025-10-21 00:00:00' AND '2025-10-21 23:59:59'
    
    Blocco 47 json
    {
      "total_quantity": 1850,
      "total_operations": 23,
      "avg_duration": 2.3
    }
    
    Blocco 48
    πŸ“Š Produzione di {periodo}:
    
    βœ… Totale pezzi: {total_quantity}
    πŸ“ˆ Operazioni: {total_operations}
    ⏱️ Durata media: {avg_duration}h
    
    Blocco 49
    {periodo} β†’ "ieri" (da entitΓ )
    {total_quantity} β†’ 1850 (da SQL)
    {total_operations} β†’ 23 (da SQL)
    {avg_duration} β†’ 2.3 (da SQL)
    
    Blocco 50
    πŸ“Š Produzione di ieri:
    
    βœ… Totale pezzi: 1.850
    πŸ“ˆ Operazioni: 23
    ⏱️ Durata media: 2.3h
    
    Blocco 51
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Template ID: prod_daily                                     β”‚
    β”‚                                                             β”‚
    β”‚ Ambito: πŸ“Š Produzione                                       β”‚
    β”‚                                                             β”‚
    β”‚ Pattern Matching:                                          β”‚
    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚ β”‚ produzione di (ieri|oggi)                               β”‚β”‚
    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚ Cache TTL: [3600] secondi (1 ora)                         β”‚
    β”‚                                                             β”‚
    β”‚ ☐ Richiede LLM                                            β”‚
    β”‚                                                             β”‚
    β”‚ ─────────────────────────────────────────────────────────  β”‚
    β”‚                                                             β”‚
    β”‚ Query SQL:                                                 β”‚
    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚ β”‚ SELECT                                                  β”‚β”‚
    β”‚ β”‚   SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(                  β”‚β”‚
    β”‚ β”‚     raw_data, '$.TotalPieces')) AS DECIMAL)) as total, β”‚β”‚
    β”‚ β”‚   COUNT(*) as ops,                                      β”‚β”‚
    β”‚ β”‚   AVG(CAST(JSON_UNQUOTE(JSON_EXTRACT(                  β”‚β”‚
    β”‚ β”‚     raw_data, '$.Duration')) AS DECIMAL)) as avg_dur   β”‚β”‚
    β”‚ β”‚ FROM machine_operations_log                             β”‚β”‚
    β”‚ β”‚ WHERE machine_id = :machine_id                          β”‚β”‚
    β”‚ β”‚   AND timestamp BETWEEN :date_from AND :date_to        β”‚β”‚
    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚ ─────────────────────────────────────────────────────────  β”‚
    β”‚                                                             β”‚
    β”‚ Response Template:                                         β”‚
    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚ β”‚ πŸ“Š Produzione di {periodo}:                            β”‚β”‚
    β”‚ β”‚                                                         β”‚β”‚
    β”‚ β”‚ βœ… Totale pezzi: {total}                              β”‚β”‚
    β”‚ β”‚ πŸ“ˆ Operazioni: {ops}                                   β”‚β”‚
    β”‚ β”‚ ⏱️ Durata media: {avg_dur}h                           β”‚β”‚
    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚ ─────────────────────────────────────────────────────────  β”‚
    β”‚                                                             β”‚
    β”‚ Follow-Up Suggestions:                                     β”‚
    β”‚ 1. [Confronta con ieri___________________________]        β”‚
    β”‚ 2. [Mostrami il trend settimanale_______________]        β”‚
    β”‚ 3. [Chi ha prodotto di piΓΉ?____________________]        β”‚
    β”‚                                                             β”‚
    β”‚ ─────────────────────────────────────────────────────────  β”‚
    β”‚                                                             β”‚
    β”‚ [Annulla]                          [πŸ’Ύ Crea Template]     β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    
    Blocco 52 sql
    SELECT raw_data 
    FROM machine_operations_log 
    WHERE machine_id = 1 
    LIMIT 1;
    
    Blocco 53
    Pattern: produzione di (ieri|oggi)
    
    Test Query: [Produzione di ieri_________]
    
    Risultato: βœ… Match!
    Gruppo 1: "ieri"
    
    Blocco 54
    Campo: [TotalPieces β–Ό]
    Aggregazione: [SUM β–Ό]
    Alias: [total]
    
    [Aggiungi Campo]
    
    Filtri:
    β˜‘ machine_id = :machine_id
    β˜‘ timestamp BETWEEN :date_from AND :date_to
    
    [Genera SQL] β†’ Crea query automaticamente