Procedura Pasticcerie - Documentazione tecnica¶
Architettura¶
La procedura Pasticcerie e' composta da:
- 8 programmi PSW (PSW001-PSW007 + PSW006A) per la sincronizzazione gestionale ↔ APP tablet
- 1 database PostgreSQL di frontiera con 12+ tabelle PSW*
- Processi residenti gestiti da AGLANCIO
- Programmi gestionali integrati (COGF64, COGQP0, COGP97, COGMAC/COGMAD)
- 2 programmi di archivio (PST001, PST003)
- 1 programma PLU (PSW007/YPWPLUME)
Configurazione master¶
| Gruppo | Parametro | Descrizione |
|---|---|---|
| gestione-pasticcerie | (flag) | Abilita le funzionalita' pasticcerie nel gestionale |
| abilita | attiva-areaapp | Abilita la comunicazione con l'APP tablet |
| areaapp | cod-azienda | Codice azienda nel DB frontiera |
| areaapp | db-conn-string | Connection string PostgreSQL |
| areaapp | agg-postgres-online | Sincronizzazione in tempo reale (S/N) |
| areaapp | giorni-esportazione-merci | Finestra temporale esportazione (9999=tutte) |
| dbfront | db-conn-string | Connection string DB frontiera |
| past | cau-bdc-trasformato | Causale per sterilizzazione pre-bolle (obbligatorio) |
| ecommerce | shop-attivo | Integrazione e-commerce (se presente) |
Programmi di sincronizzazione¶
Tutti i programmi PSW001-PSW004 e PSW006 sono gestiti da AGLANCIO come processi residenti. Usano la linkage section UTILAGPRG e seguono il pattern:
- Apertura tabelle
- Ciclo di elaborazione (esporta/importa)
- Test file "fspegni" per shutdown controllato
- Attesa N secondi → ripeti
PSW001 - Sincronizzazione clienti¶
| Aspetto | Dettaglio |
|---|---|
| Direzione | COGGEANA → PSWANAGR (solo esportazione) |
| Id processo | 90001 |
| APSTATOSYN | Tabella "PSWANAGR", versione 1 |
| Esportazione differenziale | Via COGANCAP (data/ora aggiornamento) |
| Cancellazione | Logica: scansione PSWANAGR, verifica esistenza su COGGEANA |
Tabelle lette: COGGEANA, COGAPPOG, COGANAPP, COGANCAP
Mapping esportazione:
| PSWANAGR | Origine | Note |
|---|---|---|
| P-ANA-TIPO | "C" (clienti) / "F" (fornitori) | |
| P-ANA-NOME | ANA-NOME + " " + ANA-NOME2 | Parsing via GESSTR |
| P-ANA-IND | ANA-IND | Parsing via GESSTR |
| P-ANA-LOCA | APP-LOCA (priorita'), altrimenti ANA-LOCA | Parsing via GESSTR |
| P-ANA-CAP | AAP-CAP (priorita'), altrimenti ANA-CAP | Parsing via GESSTR |
| P-ANA-PROV | ANA-PROV | |
| P-ANA-FL-CANC | ANA-VAL |
Protezione conflitti: se P-ANA-AGG-APP = "A" al momento dell'esportazione, il record viene saltato (modificato su APP nel frattempo).
PSW002 - Sincronizzazione destinazioni¶
| Aspetto | Dettaglio |
|---|---|
| Direzione | COGDESTI/COGDEST2 → PSWINDIR (solo esportazione) |
| Id processo | 90002 |
| APSTATOSYN | Tabella "PSWINDIR", versione 1 |
| Filtro | Solo DST-ID-TIP = "D" (destinazioni merce) |
| Cancellazione | Logica + fisica (gestisce entrambi i casi) |
Mapping esportazione:
| PSWINDIR | Origine | Note |
|---|---|---|
| P-DST-NOME | DST-RAG-SOC | Parsing via GESSTR |
| P-DST-IND | DST-IND | Parsing via GESSTR |
| P-DST-CAP | DST-CAP-ALFA | |
| P-DST-LOCA | DST-LOCA | Parsing via GESSTR |
| P-DST-PROV | DST-PROV | |
| P-DST-FL-CANC | DST-FL-CANC | |
| P-DST-GIRO | (da PSWINDIR) | Codice agente/giro |
| P-DST-GIRO-POS | (da PSWINDIR) | Posizione nel giro |
| P-DST-GIRO-FILA | (da PSWINDIR) | Fila nel mezzo di trasporto |
PSW003 - Sincronizzazione merci (bidirezionale)¶
| Aspetto | Dettaglio |
|---|---|
| Direzione | COGMERCI ↔ PSWMERCI, COGDBASE → PSWDBASE |
| Id processo | 90003 |
| APSTATOSYN | Tabella "PSWMERCI", versione 1 |
| Importazione | Raggruppamento 3 (dolce/salato/altro) e raggruppamento produzione |
| Filtro esportazione | Via SWAFME (filtro esportazione merci) |
Importazione (C - APP → gestionale):
- Query: SELECT * FROM PSWMERCI WHERE p_mer_agg_app = 'A'
- Aggiornamento COGMERAP.MAP-RAGR-3 ← P-MER-RAGR-3
- Aggiornamento COGANRAG classe "PR", tipo "M" ← P-MER-RAGR-PROD
- Se P-MER-RAGR-PROD vuoto: cancella record COGANRAG se esiste
- Verifica/creazione raggruppamento padre (classe "PR", tipo "R")
Esportazione (B - gestionale → APP):
| PSWMERCI | Origine |
|---|---|
| P-MER-CMA | RCM-COD-AVA |
| P-MER-DES | MER-DESCR |
| P-MER-DES-LINGUA | MAP-DESC |
| P-MER-CLASSE | MER-CLASSE |
| P-MER-STATO | MER-VAL |
| P-MER-UM | MER-UM |
| P-MER-RAGR-1/2/3 | MAP-RAGR-1/2/3 |
| P-MER-SCO-MIN | MER-SCO-MIN |
| P-MER-QTA-TEGLIA | MA2-QTA-X-BANCALE |
| P-MER-RGR-PROD | Classe "PR" da COGANRAG |
| P-MER-PADRE | MER-PADRE |
| P-MER-UNITA-PROD | MA3-UNITA-PRODUTTIVA |
| P-MER-RGR-TRAC | Classe "TR" da COGANRAG |
| P-MER-GESTIONE-LOTTI | MER-LOTTI |
Esportazione distinte base: cancellazione completa PSWDBASE per la merce + re-inserimento da COGDBASE.
Cancellazione merci: via COGEVLOG evento K-EVL-CANC-MERCI → P-MER-STATO = "C".
PSW004 - Esportazione documenti¶
| Aspetto | Dettaglio |
|---|---|
| Direzione | COGTESBO/COGMOMAG → PSWDOCTES/PSWDOCDET (solo esportazione) |
| Id processo | 90004 |
| APSTATOSYN | Tabella "PSWDOCTES-D", versione 1 |
| Filtro | Solo documenti TES-TIPOB = "I" o "D" |
| Scansione | COGTESAP chiave TSA-CHIA3 da data/ora ultimo sync |
Mapping testata (PSWDOCTES):
| Campo | Origine |
|---|---|
| P-DTES-DOC-TIP | "D" (fisso) |
| P-DTES-DOC-KEY | TES-CHIA3 |
| P-DTES-KEY-EDIT | Chiave editata "1/2023/I/000100" |
| P-DTES-DATA | TES-DATA |
| P-DTES-ANA | TES-NONNO |
| P-DTES-DST-TIP/IDX | TES-DST-ID-TIP/IDX |
| P-DTES-GIRO | TES-AGENTE |
| P-DTES-NOTE | TES-DESCR + TES-DESCR1 |
| P-DTES-STATO-PREP | "N" |
Mapping righe (PSWDOCDET): da COGMOMAG, escluse righe con merce avanzata "DESC" (riporti).
| Campo | Origine |
|---|---|
| P-DDET-DOC-RIGA | MAG-PROG |
| P-DDET-MERCE | MAG-MERCE3 |
| P-DDET-QTA-DOC | MAG-QTAMAGAZ |
| P-DDET-QTA-EVA | 0 |
| P-DDET-QTA-MANCANTE | 0 |
Protezione: se il documento esiste e P-DTES-STATO-PREP <> "N", skip con errore nel log.
Cancellazione documenti: via COGEVLOG evento K-EVL-CANC-COGTESBO → P-DTES-FL-CANC = "C" (solo se il documento non e' stato ricreato nel frattempo).
PSW005 - Operazioni su documento tablet (subroutine)¶
Programma non a menu, chiamato da altri programmi. Linkage: UTIL-PSW005.
| Operazione | Input | Output | Descrizione |
|---|---|---|---|
| DOC-STAMPABILE | Tipo + chiave documento | Esito S/N | Verifica se il DDT e' stampabile: NON stampabile se contiene righe con MER-PESO-VAR = "V" (peso variabile). Le righe sotto merce "DESC" (riporti) vengono ignorate |
| RIGA-LAVORATA | Tipo + chiave + riga | Esito S/N | Verifica flag P-DDET-FL-BILANCIA e P-DDET-FL-INCASSETTATO |
| RIAPRI-DOC | Tipo + chiave documento | Esito | Imposta P-DTES-STATO-PREP = "N" |
| CHIUDI-DBF | (nessuno) | Esito | Chiude la connessione al DB frontiera |
PSW006 - Importazione documenti da tablet¶
| Aspetto | Dettaglio |
|---|---|
| Tipo | Processo residente (no keep-alive su C00000) |
| Query | SELECT * FROM pswdoctes WHERE p_dtes_agg_app = 'S' |
| Ciclo | Ogni 5 secondi, con controllo file "fspegni" |
Flusso per ogni documento trovato:
B.1 - Aggiornamento righe¶
- Query PSWDOCDET per il documento
- Considera solo righe con P-DDET-FL-PESATO = "S"
- Per righe a peso variabile pesate:
- P-DDET-QTA-DOC = 0 → cancella riga da COGMOMAG
- P-DDET-QTA-DOC ≠ MAG-QTAMAGAZ → aggiorna COGMOMAG (quantita' + ricalcolo valore) e COGMOAGG
- Quantita' inferiore → nota "Mancanti ... pezzi"
- Quantita' zero → nota "Prodotto .... mancante" sull'ultima riga valida
- Aggiorna P-DTES-AGG-APP = "N"
B.2 - Trasformazione pre-bolla → DDT¶
Condizioni: TES-TIPOB = "B" e P-DTES-STATO-PREP = "C".
Tipo DDT risultante: - "I" se esistono gia' documenti "I" per la data - "D" se non esistono ancora documenti "I" per la data
Clonazione (8 tabelle):
| Tabella | Record |
|---|---|
| COGTESBO | 1 |
| COGTESAP | 1 |
| COGMOMAG | N |
| COGMOAGG | N |
| COGMOAG2 | N |
| COGDESAG | N |
| COGDESOR | 1 |
| COGMOVLT | N |
Sterilizzazione pre-bolla: la causale del documento originale viene sostituita con cau-bdc-trasformato (non incide su giacenza/fatturazione).
Aggiornamento DB frontiera (4 tabelle):
| Tabella | Query |
|---|---|
| PSWDOCTES | UPDATE SET p_dtes_tip = 'D', p_dtes_key = chiave_ddt |
| PSWDOCDET | UPDATE SET p_ddet_dtes_tip = 'D', p_ddet_dtes_key = chiave_ddt |
| PSWDOCCONFTES | UPDATE SET p_dct_dtes_tip = 'D', p_dct_dtes_key = chiave_ddt |
| PSWDOCCONFDET | UPDATE SET p_dcd_dtes_tip = 'D', p_dcd_dtes_key = chiave_ddt |
B.3 - Stampa¶
Se il documento completato contiene almeno un prodotto a peso variabile e tutti sono pesati → innesca stampa DDT.
PSW007 - Gestione tabella PLU-Merce¶
| Aspetto | Dettaglio |
|---|---|
| File | cbl/psw007.cbl |
| Gestore Screens | YPWPLUME |
| Tabella | PSWPLUME |
| Build | 2026/0028 (04/02) |
Gestisce la tabella di raccordo tra codici merce e codici PLU per le bilance. La chiave e' composta da: azienda + merce (gru/sot/cod) + codana + dst-tip + dst-idx.
Campi principali: P-PLU-CODICE (codice PLU, char 10), P-PLU-CMA (codice merce avanzato, char 30).
Database di frontiera (PostgreSQL)¶
Tabelle di sistema¶
| Tabella | Gestore | Funzione |
|---|---|---|
| PSWSTATOSYN | YPWSTSYN | Stato sincronizzazioni per tabella/azienda. Chiave: azienda + tabella. Campi: data/ora ultima sync, prossimo ID sincro, semaforo (" "/G/A), versione |
| PSWUTENTI | YPWUTENT | Utenti APP con profilo, magazzino, zona, flag admin, recapiti |
Tabelle anagrafiche¶
| Tabella | Gestore | Funzione | Chiave |
|---|---|---|---|
| PSWANAGR | YPWANAGR | Clienti/fornitori | azienda + codana + tipo |
| PSWINDIR | YPWINDIR | Destinazioni merce | azienda + codana + tip + idx |
| PSWMERCI | (PSWMERCI) | Anagrafica merci | azienda + codice |
| PSWDBASE | YPWDBASE | Distinte base | azienda + merce + tipo_distinta + versione + prog |
| PSWPLUME | YPWPLUME | PLU-Merce | azienda + merce + codana + dst-tip + dst-idx |
Tabelle di preparazione¶
| Tabella | Gestore | Funzione | Chiave |
|---|---|---|---|
| PSWAGENDE | YPWAGEND | Agende incassettamento (classe R=feriale, S=festivo) | azienda + classe + cod |
| PSWAGEDET | YPWAGEDT | Dettaglio agende (clienti, destinazioni, eccezioni merce) | azienda + classe + cod + ragr + prog |
Tabelle documenti¶
| Tabella | Gestore | Funzione | Chiave |
|---|---|---|---|
| PSWDOCTES | (PSWDOCTES) | Testata documenti (tip: O=ordine, D=DDT) | azienda + tip + key |
| PSWDOCDET | (PSWDOCDET) | Righe documenti (quantita', flag pesato/incassettato) | azienda + tip + key + riga |
| PSWDOCCONFTES | YPWDOCCT | Testata confezioni/vassoi per documento | azienda + tip + key + conf_prog |
| PSWDOCCONFDET | YPWDOCCD | Dettaglio contenuto confezioni (riga → vassoio) | azienda + tip + key + conf_prog + riga |
Campi comuni a tutte le tabelle¶
| Campo | Tipo | Descrizione |
|---|---|---|
| *_FL_CANC | char(1) | " " = valido, "C" = cancellato |
| *_AGG_APP | char(1) | " " = non aggiornato, "A" = aggiornato da APP, "N" = aggiornato da gestionale |
| *_ID_SINCRO | num(15) | ID progressivo di sincronizzazione |
| *_DI_DATA/TIME/OPE/PROG | vari | Audit inserimento |
| *_DA_DATA/TIME/OPE/PROG | vari | Audit modifica |
Programmi gestionali integrati¶
COGF64 - Scheda ordini distribuzione¶
File: cbl/cogf64.cbl (8585 righe)
Quando la gestione pasticcerie e' attiva, F1 diventa "Evadi (modo pasticceria)": - Chiama COGMA1 per la gestione ordine - Chiama COGD27 per la preparazione del transito DDT
Configurazione: legge gestione-pasticcerie per abilitare il comportamento specifico.
COGQP0 - Produzione giornaliera alimentari¶
File: cbl/cogqp0.cbl (8649 righe)
Processo in 6 fasi per la produzione giornaliera. Tabelle di produzione: PGTS (testata sessione), PGRI (righe richieste), PGFA (fabbisogni), PGLO (lotti), PGLG (legami lotti), PGDO (documenti creati).
Documentazione tecnica dettagliata: docs/dev/flussi/produzione-avanzata.md
COGP97 - Ristampa ordinata DDT¶
Stampa DDT ordinati per giro di consegna. Usa TES-AGENTE come codice giro e ordina per posizione/fila definite in PSWINDIR.
COGMAC / COGMAD - Preparazione e modifica giri¶
Gestione dei giri di consegna: raggruppamento DDT per giro, ordinamento per posizione, spostamento tra giri.
PST001 / PST003 - Archivi pasticcerie¶
| Programma | Funzione | Menu |
|---|---|---|
| PST001 | Configurazione percorsi 5 archivi (anagrafica bar, ordinazioni cartellino, ordinazioni diverse, note, legame lotti) | Sistema > Archivi > Archivi Pasticc. |
| PST003 | Inizializzazione/controllo stato archivi | Sistema > Archivi > Inizializzazioni/Controllo Stato |
PST001 legge la configurazione da "pstfiles" (non "cogfiles"). PST003 opera in due modalita': creazione fisica da zero o verifica esistenza/accessibilita'.
Pattern di sincronizzazione¶
Esportazione differenziale¶
Tutti i programmi di esportazione seguono lo stesso pattern:
- Lettura APSTATOSYN per data/ora ultima sync e prossimo ID sincro
- Scansione tabelle sorgente da data/ora ultima sync
- Per ogni record: confronto dati → se diversi, aggiornamento destinazione
- Aggiornamento APSTATOSYN a fine ciclo
Modalita' speciali: - Singolo record (AGPRG-KEY ≠ spaces): esportazione di un singolo record (per sync online) - Esportazione totale (AGPRG-ESPORTA-TUTTO = "S"): ignora confronto, esporta tutto - Pulizia (AGPRG-OPE = "PULIZIA"): solo giro di cancellazione logica
Protezione conflitti APP¶
Se un record ha *_AGG_APP = "A" al momento dell'esportazione, viene saltato con segnalazione nel log (l'APP lo ha modificato nel frattempo).
Semaforo tabella¶
PSWSTATOSYN.P_SYN_SEMAFORO: " " = libera, "G" = in uso da gestionale, "A" = in uso da APP.
Integrazione AGLANCIO¶
I processi PSW sono lanciati come thread residenti da AGLANCIO. Il keep-alive e' gestito dal thread autonomo di AGLANCIO (i PSW non aggiornano direttamente il C00000). Lo shutdown avviene tramite file "fspegni" controllato ad ogni ciclo.