# 03 — JobOrder (Commessa) collegato a Lavorazioni

## 1. Ruolo nel dominio Lavorazioni

`JobOrder` è la **commessa di produzione**. Ogni Lavorazione punta obbligatoriamente a una Commessa tramite `joborder_id` (uitype 10, typeofdata `I~M`).

Dal lato Commessa, in DetailView compare il tab correlato **Lavorazioni** (`get_dependents_list`: tutte le lavorazioni con `joborder_id = <questo id>`).

## 2. Identità modulo

| Proprietà | Valore |
|-----------|--------|
| tabid | 48 |
| IsCustomModule | true (pacchetto VTE JobOrder) |
| Tabelle | `vte_crmentity` + `vte_joborder` + `vte_jobordercf` |
| PK | `joborderid` |
| Entity name tipico | `jobordername` |
| Record vivi / deleted | 2 / 6 |

Classe: [`modules/JobOrder/JobOrder.php`](../../../vte23083_2711/modules/JobOrder/JobOrder.php) — `save_module` standard (nessuna logica specifica verso Lavorazioni nel PHP JobOrder).

## 3. Come comunica col DB rispetto a Lavorazioni

### Scrittura lato Lavorazioni

Al save di una Lavorazione, `joborder_id` viene scritto in `vte_lavorazioni.joborder_id` (stesso ID della Commessa). Non serve riga in `vte_crmentityrel`: è relazione **1–N via FK**.

Metadata: `vte_fieldmodulerel`  
`module=Lavorazioni`, `field=joborder_id`, `relmodule=JobOrder`.

### Lettura related list (lato JobOrder)

`get_dependents_list` costruisce una ListView delle Lavorazioni filtrate su `joborder_id = $id`, rispettando ACL. Actions configurate: ADD, SELECT.

## 4. Installazione del collegamento

In [`install.php`](../../../vte23083_2711/modules/Lavorazioni/install.php):

```php
$jobOrderModule->setRelatedList(
    $lavorazioniModule,
    'Lavorazioni',
    ['ADD', 'SELECT'],
    'get_dependents_list'
);
```

Chiamata **senza controllo** se la relation esiste già → ogni postupdate può aggiungere una nuova riga in `vte_relatedlists`.

### Anomalia live

Su DB risultano **19** related list identiche JobOrder → Lavorazioni (`relation_id` 674, 678–708…). Effetto UX: tab “Lavorazioni” ripetuto più volte in DetailView Commessa. Uninstall fa un solo `unsetRelatedList` (ne rimuove una).

## 5. Flusso funzionale

1. Utente apre/crea Commessa (JobOrder)
2. Da related list aggiunge Lavorazione (precompila `joborder_id`) oppure crea Lavorazione e seleziona Commessa dal popup
3. Tutte le sessioni/macchina/operatore restano sulla Lavorazione; la Commessa è il contenitore organizzativo

## 6. Cosa non fa JobOrder per Lavorazioni

- Nessun calcolo aggregato durata/stato delle lavorazioni nel PHP JobOrder analizzato
- Nessun cron dedicato JobOrder↔Lavorazioni
- Nessun SDK specifico trovato sul bridge

## 7. Lettura/scrittura JobOrder (cenni)

Come ogni entity: retrieve/save su `vte_crmentity` + `vte_joborder` + `vte_jobordercf`. Independente da Lavorazioni finché non si naviga il related o non si valorizza la FK.
