# 01 — Lavorazioni (hub)

## 1. Identità

| Proprietà | Valore |
|-----------|--------|
| tabid | 114 |
| name / label | Lavorazioni |
| version | 1.1.0 |
| presence | 0 (attivo) |
| isentitytype | 1 |
| customized | 1 |
| parent menu (manifest) | Support |
| SPDX | Pantarei Informatica Srl |
| Record vivi / deleted | 0 / 1 |
| Numerazione | `vte_modentity_num`: prefix `LAV-`, start 1, cur_id **2**, active |

## 2. Ruolo e ciclo di vita

Modulo CRM per **raccolta dati produzione macchina**: collega una lavorazione a una commessa, a un operatore (anche via barcode), a un codice macchina e a un programma/disegno; tiene stato, durata, errori tecnici e sessioni figlie.

Flusso utente tipico:

1. **ListView** (filtro All) → colonne nome, data, codice macchina, commessa, programma, stato
2. **Edit/Create** → campi obbligatori (data, codice macchina, joborder, programma, stato) + operatore/barcode opzionali + tabella Sessioni
3. **Save** → `CRMEntity::save` → `saveentity` (hub + main + cf) → `save_module` (sync nome + durata)
4. **DetailView** → widget Commenti, Note, Processi + related Documents/Calendar/Processes
5. **Delete** → soft-delete `vte_crmentity.deleted=1`

Routing UI: **nessun** `ListView.php`/`DetailView.php`/`EditView.php` propri → fallback [`modules/VteCore/`](../../../vte23083_2711/modules/VteCore/).

## 3. File chiave

| Path | Ruolo |
|------|--------|
| [`modules/Lavorazioni/Lavorazioni.php`](../../../vte23083_2711/modules/Lavorazioni/Lavorazioni.php) | Classe entity |
| [`modules/Lavorazioni/install.php`](../../../vte23083_2711/modules/Lavorazioni/install.php) | postinstall/postupdate |
| [`modules/Lavorazioni/uninstall.php`](../../../vte23083_2711/modules/Lavorazioni/uninstall.php) | disable/preuninstall |
| [`modules/Lavorazioni/manifest.xml`](../../../vte23083_2711/modules/Lavorazioni/manifest.xml) | Pacchetto vtlib |
| [`modules/Lavorazioni/schema.xml`](../../../vte23083_2711/modules/Lavorazioni/schema.xml) | Schema ADODB |
| [`modules/Lavorazioni/OperatoreBarcodeAjax.php`](../../../vte23083_2711/modules/Lavorazioni/OperatoreBarcodeAjax.php) | Endpoint JSON barcode |
| [`modules/Lavorazioni/Lavorazioni.js`](../../../vte23083_2711/modules/Lavorazioni/Lavorazioni.js) | HEADERSCRIPT autofill (registrato in `vte_links`) |
| [`modules/Lavorazioni/Lavorazioni_v15.js`](../../../vte23083_2711/modules/Lavorazioni/Lavorazioni_v15.js) | Copia/variante non collegata in `vte_links` |
| `language/it_it.lang.php`, `en_us.lang.php` | Label |

`vtlib_handler` delega a install/uninstall su eventi module.*.

## 4. Modello dati

### Tabelle fisiche (`$tab_name`)

1. `vte_crmentity` PK `crmid` — ownership, timestamps, soft-delete, `setype='Lavorazioni'`
2. `vte_lavorazioni` PK `lavorazioniid` (= crmid)
3. `vte_lavorazionicf` PK `lavorazioniid` — custom fields (oggi solo PK, vuota)

### Colonne live `vte_lavorazioni`

| Colonna | Tipo | Campo VTE | Note |
|---------|------|-----------|------|
| lavorazioniid | bigint PK | — | = crmid |
| lavorazionename | varchar(255) | lavorazionename | Entity name; sync = `lavorazioni_no` |
| lavorazioni_no | varchar(100) | lavorazioni_no | uitype 4 auto-number `LAV-n` |
| data_lavorazione | date | data_lavorazione | obbligatorio |
| codice_macchina | varchar(100) | codice_macchina | obbligatorio; testo, non FK |
| joborder_id | bigint | joborder_id | uitype 10 → JobOrder, obbligatorio |
| operatore_id | bigint | operatore_id | uitype 10 → Operatori, opzionale |
| barcode_operatore | varchar(100) | barcode_operatore | testo |
| programma_nome | varchar(255) | programma_nome | obbligatorio |
| inizio / fine | timestamp | inizio / fine | **displaytype 3** (nascosti UI) |
| durata_secondi | int | durata_secondi | displaytype 2 (readonly detail) |
| numero_esecuzioni | int | numero_esecuzioni | sync JS da conteggio righe ModLight |
| stato_lavorazione | varchar(100) | stato_lavorazione | picklist |
| errore_codice / errore_descrizione | varchar / longtext | … | displaytype 3 |
| id_evento_esterno | varchar(255) | id_evento_esterno | per integrazioni |
| description | longtext | description | |
| mlLavorazioniSess | int | mlLavorazioniSess | uitype **220** table field |

### Picklist `stato_lavorazione`

- In corso
- Completata
- Non Conformità
- Annullata

### Blocchi UI

1. `LBL_LAVORAZIONI_INFORMATION` — campi principali
2. `LBL_DESCRIPTION_INFORMATION` — description
3. `LBL_SESSIONI_INFORMATION` — campo ModLight

### Sharing / actions (manifest)

- Default share: `public_readwritedelete`
- Import / Export / DuplicatesHandling: enabled

## 5. Lettura dati

### Detail / Edit retrieve

`CRMEntity::retrieve*` carica in sequenza le tre tabelle in `$tab_name` filtrando `vte_crmentity.deleted=0` e applicando ACL. I campi vengono da `vte_field` (uitype, typeofdata).

Riferimenti uitype 10:

- `joborder_id` → join/label da JobOrder (`vte_fieldmodulerel`)
- `operatore_id` → Operatori (`vcf_14_1` come nome)

### ListView

`QueryGenerator` + filtro custom view **All** (colonne: lavorazionename, data_lavorazione, codice_macchina, joborder_id, programma_nome, stato_lavorazione). In install sono stati rimossi dalla vista All: `assigned_user_id`, `inizio`, `fine`, `durata_secondi`.

Ordine default classe: `data_lavorazione DESC`.

### Related lists (uscita da Lavorazioni)

| Destinazione | Metodo | Actions |
|--------------|--------|---------|
| Documents | get_attachments | ADD, SELECT |
| Calendar | get_activities | ADD |
| Processes | get_dependents_list | (nessuna action esplicita) |

## 6. Scrittura dati

### Path standard

```
EditView POST → Save (VteCore)
  → CRMEntity::save('Lavorazioni')
    → eventi beforesave*
    → saveentity():
         insertIntoCrmEntity  → vte_crmentity
         insertIntoEntityTable → vte_lavorazioni (+ numbering uitype 4)
         insertIntoEntityTable → vte_lavorazionicf
         save ModLight rows (uitype 220) via Motore ModLight
    → save_module():
         syncNameWithNumber()
         updateDurataSecondi()
    → eventi aftersave* (+ Processes queue se abilitata)
```

### `syncNameWithNumber()`

Dopo il save legge `lavorazioni_no` e fa:

```sql
UPDATE vte_lavorazioni SET lavorazionename = ? WHERE lavorazioniid = ?
```

poi aggiorna cache `EntityNameUtils`. Così l’utente non digita un nome: l’identificativo leggibile è sempre `LAV-n`.

### `updateDurataSecondi()`

Se `inizio` e `fine` valorizzati e coerenti:

```sql
UPDATE vte_lavorazioni SET durata_secondi = ? WHERE lavorazioniid = ?
```

con `durata = strtotime(fine) - strtotime(inizio)`.

Nota: i campi inizio/fine sono **nascosti** in UI (displaytype 3); la durata “utile” operativa sulle sessioni è sul ModLight (calcolo anche in JS).

### Delete

Soft-delete su `vte_crmentity`. Uninstall non cancella i record storici a meno di rimozione ModLight.

## 7. Install / update / uninstall

### install.php (punti salienti)

1. Allinea entity name a numero automatico
2. Importa traduzioni via `SDK::setLanguageEntry`
3. `JobOrder->setRelatedList(Lavorazioni, …)` — **senza guardia anti-duplicato** (causa related list ripetute)
4. Forza `operatore_id` related modules = Operatori
5. Crea/aggiorna ModLight Sessioni (`ModLightUtils`)
6. Nasconde inizio/fine/errore_*; mostra operatore/barcode; durata displaytype 2
7. Aggiorna filtro All; widget ModComments/MyNotes; `Processes::enable`; ModuleHomeView; related Documents
8. Registra HEADERSCRIPT `Lavorazioni.js` in `vte_links`
9. Invalida cache lingue (DB reload_* + APCu + file cache)

### uninstall.php

Rimuove ModLight, unset related JobOrder, cancella HEADERSCRIPT, delete language entries, invalida cache.

## 8. Client-side (Lavorazioni.js)

Registrato come link `HEADERSCRIPT` / label `LavorazioniAutofill` su tabid 114.

Funzioni:

1. Hook `vtlib_setvalue_from_popup` — se target è `mlLavorazioniSess_operatore_id_{row}` → Ajax barcode
2. Blur/Enter su `mlLavorazioniSess_barcode_operatore_{row}` → resolve Operatore
3. Calcolo durata riga da `sessione_inizio` / `sessione_fine`
4. Sync `numero_esecuzioni` = conteggio righe tabella ModLight (hook `TableField.add/delete/duplicate` + MutationObserver)
5. Fix validazione: tipi sessione da `T` a `DT~O`, uitype 1022

**Incongruenza:** dopo il piano “operatore sul padre”, i campi riga ModLight non sono più in `vte_field`, quindi gli hook 1–2 possono non trovare input UI; i campi padre `operatore_id` / `barcode_operatore` **non** sono cablati in questo JS.

Ajax: `index.php?module=Lavorazioni&action=LavorazioniAjax&file=OperatoreBarcodeAjax` (vedi file 04).

## 9. SDK

- File presente: `modules/SDK/src/modules/Lavorazioni/ReturnOperatoreBarcode.php`
- Tabella `sdk_popup_return_funct`: **nessuna riga** per Lavorazioni → popup return SDK non attivo
- Traduzioni: molte entry in `sdk_language` (install)

## 10. Evidenze / anomalie

1. Zero record produttivi; solo 1 deleted → numerazione già a `LAV-2`
2. Related JobOrder duplicate (vedi 03)
3. Drift ModLight fisico vs metadata (vedi 02)
4. JS vs schema padre/figlio disallineati
5. `Lavorazioni_v15.js` non referenziato nei links
