Passa al contenuto principale

Sincronizzazione Liste di Carico Zucchetti ↔ Soluziona

Obiettivo

La gestione delle liste di carico nasce nel gestionale Zucchetti e prosegue operativamente in Soluziona, tramite applicazione tablet.

Il flusso previsto è:

Zucchetti
    ↓
SincronizzaListeDaZucchettiASoluziona
    ↓
Soluziona - Documento TipoDocumento = 29
    ↓
Compilazione tramite Tablet
    ↓
SincronizzaListeDaSoluzionaAZucchetti
    ↓
Zucchetti

La sincronizzazione deve consentire a Zucchetti di continuare a modificare le liste fino alla loro conclusione, senza però perdere o sovrascrivere le informazioni già raccolte dal tablet.


Tabelle coinvolte

Zucchetti / SoluzionaComside

Testata lista

TestaListaDiCaricoTb

Chiave:

S2serial

Campi principali:

S2serial
StatoLettura
Note
Eliminato

Righe lista

RigaListaDiCaricoTb

Chiave:

S2serial + S2rownum

Campi principali:

S2serial
S2rownum
s2codcli
IdArticolo
DesArticolo
UmArticolo
Quantita
QuantitaLetta
Note
StatoLettura

Tabelle Soluziona

Le liste di carico vengono trasformate in documenti Soluziona con:

TipoDocumento = 29

Le tabelle coinvolte sono:

DocumentoTb
DettDocumentoTb
DecodificaGestionaleEsternoTb

In DettDocumentoTb:

QntDaLeggere

rappresenta la quantità prevista proveniente da Zucchetti.

Qnt

rappresenta la quantità effettivamente letta tramite tablet.


Regola cliente

In Zucchetti il cliente è presente sulla singola riga della lista.

In Soluziona, invece, il cliente appartiene alla testata del documento.

La regola applicativa è:

1 Documento Soluziona = 1 Cliente

Di conseguenza, se una lista Zucchetti contiene righe appartenenti a clienti diversi, vengono creati più documenti Soluziona.

Esempio:

Lista Zucchetti L00001

Riga 1 → Cliente A
Riga 2 → Cliente A
Riga 3 → Cliente B
Riga 4 → Cliente A

diventa:

Documento Soluziona A
Cliente A
├─ Riga 1
├─ Riga 2
└─ Riga 4

Documento Soluziona B
Cliente B
└─ Riga 3

Entrambi i documenti continuano comunque a derivare dalla stessa lista Zucchetti:

S2serial = L00001

Stati della lista

Gli stati utilizzati sono:

Stato Significato
0 ND
1 Attivo
2 Da convalidare
3 Convalidato
4 Autorizzato

Gli stati hanno significati differenti durante il passaggio tra Zucchetti e Soluziona.

Creazione

La lista viene inizialmente creata in Zucchetti con:

StatoLettura = 0

La sincronizzazione crea i relativi documenti Soluziona.

Finché la lista non viene iniziata dal tablet, Zucchetti rimane completamente autorevole sui dati.


Inizio lavorazione dal tablet

Alla prima lettura effettuata tramite tablet, Soluziona porta la lista a:

Stato = 2

La sincronizzazione:

SincronizzaListeDaSoluzionaAZucchetti

deve quindi portare la lista Zucchetti a:

StatoLettura = 1

Da questo momento la lista è considerata operativamente iniziata.


Chiusura della lista

Alla chiusura della lista tramite tablet, Soluziona imposta:

Stato = 3

La sincronizzazione inversa deve quindi portare Zucchetti a:

StatoLettura = 4

Quando Zucchetti raggiunge:

StatoLettura = 4

il processo è considerato concluso.

La sincronizzazione:

SincronizzaListeDaZucchettiASoluziona

non deve più modificare i documenti Soluziona relativi alla lista.


Sincronizzazione Zucchetti → Soluziona

La sincronizzazione cambia comportamento in base allo stato della lista.


Lista non ancora iniziata

Condizione:

Zucchetti StatoLettura = 0

e corrispondente documento Soluziona ancora non operativo:

Stato = 0 oppure 1

In questa fase Zucchetti è completamente autorevole.

Possono quindi essere aggiornati direttamente:

Cliente
Articolo
Descrizione articolo
Unità di misura
Quantità prevista
Note
Numero riga
altri dati provenienti da Zucchetti

La quantità prevista viene sincronizzata in:

DettDocumentoTb.QntDaLeggere

La quantità letta:

DettDocumentoTb.Qnt

non deve essere valorizzata da Zucchetti.

Alla creazione della riga:

QntDaLeggere = Quantita Zucchetti
Qnt = 0

Eliminazione di una riga prima dell'inizio

Se una riga precedentemente sincronizzata non è più presente in Zucchetti e la lista non è ancora stata iniziata, la riga Soluziona viene eliminata logicamente:

DettDocumentoTb.IsEliminato = 1

Il relativo mapping viene disattivato:

DecodificaGestionaleEsternoTb.IsAttivo = 0

Non viene effettuato un DELETE fisico.


Cambio articolo prima dell'inizio

Se la lista è ancora in stato iniziale, Zucchetti può modificare direttamente l'articolo della riga.

La sincronizzazione può quindi aggiornare la stessa DettDocumentoTb:

IdArticolo
Descrizione
IdUM
QntDaLeggere
Note

Non è necessario creare una nuova riga Soluziona perché nessuna lavorazione tablet è ancora iniziata.


Cambio cliente prima dell'inizio

Anche il cliente può essere modificato liberamente finché la lista non è stata iniziata.

Poiché in Soluziona il cliente appartiene alla testata del documento, la sincronizzazione deve assicurarsi che la riga appartenga al documento corretto.

In questa fase la riga può essere spostata sul documento del nuovo cliente.

Se il documento per:

S2serial + nuovo cliente

non esiste, viene creato.


Lista già iniziata

Quando il tablet ha iniziato la lavorazione:

Soluziona Stato = 2

e successivamente:

Zucchetti StatoLettura = 1

la sincronizzazione continua a recepire le modifiche provenienti da Zucchetti, ma deve preservare i dati operativi raccolti dal tablet.

I dati protetti sono:

Qnt
Note

Questi campi non devono più essere sovrascritti da:

SincronizzaListeDaZucchettiASoluziona

Quantità prevista modificata dopo l'inizio

QntDaLeggere continua invece a essere controllata da Zucchetti e può cambiare anche dopo l'inizio della lavorazione.

Esempio iniziale:

Zucchetti Quantita = 10

Soluziona:
QntDaLeggere = 10
Qnt = 4

Zucchetti modifica la quantità:

Quantita = 15

Dopo la sincronizzazione:

QntDaLeggere = 15
Qnt = 4

La quantità letta rimane invariata.


Note dopo l'inizio

Una volta iniziata la lavorazione, le note presenti in Soluziona appartengono al processo tablet.

Di conseguenza:

DettDocumentoTb.Note

non deve più essere sovrascritta dalla sincronizzazione proveniente da Zucchetti.


Cambio articolo dopo l'inizio

Dopo l'inizio della lavorazione l'articolo non può essere sostituito direttamente sulla stessa riga Soluziona.

La riga potrebbe infatti contenere quantità già lette riferite al vecchio articolo.

Esempio:

Riga Soluziona
Articolo A
QntDaLeggere = 10
Qnt = 4

Zucchetti modifica la stessa riga in:

Articolo B
Quantita = 8

La sincronizzazione deve:

  1. mantenere la vecchia riga;

  2. impostare:

QntDaLeggere = 0

sulla vecchia riga;

  1. non modificare:

Qnt
Note
Articolo

della vecchia riga;

  1. creare una nuova DettDocumentoTb per il nuovo articolo:

Articolo B
QntDaLeggere = 8
Qnt = 0

La nuova riga diventa la rappresentazione attiva della riga Zucchetti.


Cambio cliente dopo l'inizio

Il cambio cliente segue la stessa filosofia del cambio articolo.

La riga già lavorata non deve essere spostata da un documento all'altro.

Esempio iniziale:

Documento Cliente A

Riga X
Articolo A
QntDaLeggere = 10
Qnt = 4

Zucchetti cambia il cliente della riga:

Cliente B

La sincronizzazione deve lasciare la vecchia riga nel documento del Cliente A:

Documento Cliente A

Riga X
QntDaLeggere = 0
Qnt = 4

e creare una nuova riga nel documento del Cliente B:

Documento Cliente B

Nuova Riga
QntDaLeggere = 10
Qnt = 0

Se il documento del Cliente B non esiste, deve essere creato.

In questo modo non viene alterato lo storico delle letture già effettuate.


Eliminazione di una riga dopo l'inizio

Se una riga viene eliminata da Zucchetti quando la lavorazione è già iniziata, non deve essere eliminata in Soluziona.

La sincronizzazione deve invece impostare:

QntDaLeggere = 0

La riga mantiene:

Qnt
Note
Articolo
Descrizione

e gli altri dati storici necessari a rappresentare ciò che il tablet aveva già lavorato.

Il mapping della riga viene disattivato:

IsAttivo = 0

Tabella di mapping

La relazione tra i record Zucchetti e quelli Soluziona viene gestita tramite:

DecodificaGestionaleEsternoTb

La tabella deve permettere di risalire sia ai documenti sia alle singole righe.

Per le righe il riferimento esterno è:

S2serial + S2rownum

La tabella contiene almeno:

IdSoluziona
IdGestionaleEsterno
IdRigaGestionaleEsterno
TipoDocumento
TipoEntita
GestionaleEsterno
IdAzienda
IsAttivo

dove:

IdGestionaleEsterno = S2serial
IdRigaGestionaleEsterno = S2rownum
TipoDocumento = 29

Mapping storico delle righe

Dopo l'inizio della lavorazione, una stessa riga Zucchetti può generare più righe Soluziona.

Esempio:

S2serial = L00001
S2rownum = 10

può avere:

DettDocumento A → Articolo A → IsAttivo = 0
DettDocumento B → Articolo B → IsAttivo = 0
DettDocumento C → Articolo C → IsAttivo = 1

Questo accade, ad esempio, quando Zucchetti modifica più volte l'articolo o il cliente dopo l'inizio della lavorazione.

Per questo motivo:

S2serial + S2rownum

non deve essere vincolato a una sola DettDocumentoTb.

Deve invece esistere una sola associazione corrente:

IsAttivo = 1

mentre le precedenti rimangono nello storico con:

IsAttivo = 0

Disattivazione mapping

È stata scelta la seguente regola:

Quando una riga non esiste più in Zucchetti, il relativo mapping corrente viene disattivato.

Quindi:

IsAttivo = 0

La scelta vale sia quando la riga viene eliminata logicamente da Soluziona prima dell'inizio, sia quando viene mantenuta storicamente con QntDaLeggere = 0 dopo l'inizio.

La stessa regola viene applicata quando un cambio articolo o cliente produce una nuova versione della riga.

Il vecchio mapping viene disattivato e ne viene creato uno nuovo per la nuova DettDocumentoTb.


Regole riassuntive

Lista non iniziata

Zucchetti Stato = 0

È possibile:

modificare cliente
modificare articolo
modificare descrizione
modificare UM
modificare QntDaLeggere
modificare note
eliminare logicamente righe
spostare righe tra documenti

Qnt non viene mai alimentata dalla sincronizzazione Zucchetti → Soluziona.


Lista iniziata

Soluziona Stato = 2
Zucchetti Stato = 1

È possibile aggiornare:

QntDaLeggere
Descrizione
UM
altri dati provenienti da Zucchetti

Non possono essere sovrascritti:

Qnt
Note

Cambio articolo:

vecchia riga → QntDaLeggere = 0
nuova riga → nuovo articolo

Cambio cliente:

vecchia riga → QntDaLeggere = 0
nuova riga → documento del nuovo cliente

Eliminazione riga:

QntDaLeggere = 0
IsAttivo mapping = 0

Lista completata

Soluziona Stato = 3

La sincronizzazione inversa porta:

Zucchetti Stato = 4

Da quel momento:

SincronizzaListeDaZucchettiASoluziona

non deve più effettuare modifiche sulla lista.

Il processo è considerato concluso.


Principio generale

La sincronizzazione segue questo principio:

Prima dell'inizio della lavorazione, Zucchetti è completamente autorevole sulla struttura della lista. Dopo l'inizio, Zucchetti continua a essere autorevole sui dati previsti, mentre Soluziona diventa autorevole sui dati operativi raccolti dal tablet.

In particolare:

Zucchetti
    ↓
QntDaLeggere
Articolo
Cliente
UM
Descrizione
struttura prevista della lista

mentre:

Tablet / Soluziona
    ↓
Qnt
Note
storico della lavorazione effettuata

Le modifiche strutturali effettuate da Zucchetti dopo l'inizio non alterano retroattivamente le righe già lavorate: le vecchie righe vengono mantenute come storico e neutralizzate tramite QntDaLeggere = 0, mentre vengono create nuove righe per rappresentare la nuova situazione.