COGV50W -- Inserimento/Gestione DDT di Vendita (versione grafica)¶
Sorgente: cbl/cogv50w.cbl | Tipo: Programma interattivo a maschera | Program-ID: COGV50W
Scopo¶
Inserimento e gestione delle bolle di vendita (DDT) in versione grafica. E' il programma principale di emissione bolle: testata, righe merce/prestazioni, magazzini su testata o su riga, gestione lotti/scadenze, gestione numeri seriali (S/N), spese accessorie, fatturazione contestuale o differita.
Posizione menu: Vendite > Bolle > Inserimento/Gestione.
File principali coinvolti (estratto)¶
| Tabella | Ruolo |
|---|---|
COGTESBO (tes-*) |
Testata bolla |
COGRIGBO (rig-*) |
Righe bolla |
COGRACCO (rac-*) |
Raccordi (bolla -> fattura, prelievi, ecc.) |
| COGRACBB / COGGENER | Raccordi bolla-bolla / dati generali (CM/CS S/N) |
COGMATRI (mtr-*) |
Matricole/articoli |
| COGU07 | Sub di ubicazione S/N |
COGTRANS / COGTRANS2 / COGTRANS3 (trs-*) |
Tabelle di transito per BdP -> bolla |
| TRAN-S16 / TRAN-S47 / TRAN-M96 / TRAN-U30 | Strutture di servizio temporanee |
Modifiche introdotte (build 2026-06-04)¶
Refactor: estrazione valida-ubicazione-sn¶
Il blocco di controlli "U07 vs causale uscita" e "U07 vs magazzino testata/riga" che si trovava inline nel ramo di acquisizione S/N e' stato estratto in un nuovo paragrafo riusabile valida-ubicazione-sn. Output: w-ubicazione-sn-ok (S/N).
Comportamento invariato per il chiamante originale (a-tm-sn-uscita), che ora chiama:
perform valida-ubicazione-sn
if w-ubicazione-sn-ok = "N"
go to a-tm-sn-uscita
end-if
Nuova feature: caricamento S/N da raccordi CM/CS del BdP origine¶
Quando una riga della bolla viene generata a partire da un BdP (presente in trs2-bdp-*) e la merce gestisce S/N (mer-fl-sn = "T") con configurazione tm-cfg-movimentazione-sn = "S", viene attivata una nuova catena di paragrafi che pre-carica i S/N nella griglia:
| Paragrafo | Ruolo |
|---|---|
carica-sn-da-bdp-merce |
Entry point: prepara contatori w-sn-out-trovati-cm/cs/scartati, invoca carica-sn-da-bdp-tipo per CM e CS |
carica-sn-da-bdp-tipo |
Scan COGGENER per gnr-tip = w-gnr-tip e gnr-parte-1 = bdp-chia1; filtra per gnr-cm-merce = w-sn-in-merce e instrada a carica-sn-cm o segnala-sn-cs |
carica-sn-cm |
Risolve la matricola via COGMATRI (mtr-mat -> mtr-sn), interroga COGU07 con cerca-sn-link, valida l'ubicazione con valida-ubicazione-sn, evita duplicati con lettura di COGV50-T-SN, scrive il S/N nel transito e lo aggiunge in griglia (z-aggiungi-sn-a-griglia + wr-cogv50-t-sn) |
segnala-sn-cs |
Per i raccordi CS (S/N "presente sul BdP ma non esistente"), emette warning di servizio senza aggiungerlo in griglia |
Aree di working aggiunte:
77 w-ubicazione-sn-ok pic x(01).
77 w-gnr-tip pic x(02).
01 w-sn-input.
02 w-sn-in-bdp-chia1.
03 w-sn-in-bdp-mag pic x(01).
03 w-sn-in-bdp-aa pic 9(04).
03 w-sn-in-bdp-num pic 9(06).
03 w-sn-in-bdp-mm pic 9(02).
03 w-sn-in-bdp-gg pic 9(02).
02 w-sn-in-merce pic x(09).
02 w-sn-in-riga-grid pic 9(04).
01 w-sn-output.
02 w-sn-out-trovati-cm pic 9(04).
02 w-sn-out-trovati-cs pic 9(04).
02 w-sn-out-scartati pic 9(04).
Trigger nel paragrafo che importa le righe BdP nella bolla:
if mer-fl-sn = "T" and
tm-cfg-movimentazione-sn = "S" and
trs2-bdp-num not = zero
...
move i to sav-i
move n-r to i
perform carica-sn-da-bdp-merce
move sav-i to i
end-if
L'indice di griglia i viene temporaneamente sostituito con n-r durante l'esecuzione (i paragrafi carica-sn-* lavorano su i per agganciarsi all'infrastruttura griglia esistente).
TASK-5283 -- Controllo Plafond lettera d'intento solo se DDT non ancora fatturato¶
Nei tre punti in cui veniva emesso il messaggio "Attenzione, l'imponibile documento supera il residuo della lettera d'intento" (con suffissi !, !!, !!!), il controllo + interruzione (perform vbx-msg + go to x-ritorna) e' stato condizionato a:
if fl-doc-fat not = "S"
...
end-if
Motivazione: per i DDT gia' fatturati il controllo plafond non e' piu' pertinente (lo scarico plafond e' avvenuto sul ddt originale al momento della fatturazione). Le segnalazioni gesdebug-write verso il log vengono mantenute solo quando il messaggio viene emesso.
Controllo plafond sul solo incremento dell'imponibile (w-tot-non-ivato-sav)¶
E' stata introdotta la variabile w-tot-non-ivato-sav (pic s9(12)v999999), inizializzata insieme a w-tot-non-ivato e valorizzata una sola volta con l'imponibile non IVA presente all'apertura del documento:
perform x2-calc-totali
if w-tot-non-ivato-sav = 0
move w-tot-non-ivato to w-tot-non-ivato-sav
end-if
Nel controllo plafond "in corso di gestione" (variante !) il confronto con il residuo della lettera d'intento avviene ora sul solo incremento dell'imponibile rispetto a quanto gia' presente all'apertura:
compute w-tot-non-ivato-spe = w-tot-non-ivato +
w-imp-spese -
w-tot-non-ivato-sav
if w-tot-non-ivato-spe > w-residuo-lti
...
In questo modo, rientrando in modifica di un DDT gia' esistente di un cliente con lettera d'intento, l'imponibile gia' acquisito (e gia' scaricato sul plafond) non viene riconteggiato: l'avviso di superamento scatta solo se la modifica in corso aggiunge nuovo imponibile oltre il residuo disponibile.
Minor: rimossa initialize util-ncnf ridondante in x99-src-cfg¶
x99-src-cfg non re-inizializza piu' util-ncnf (la prima initialize e' commentata): l'utility veniva gia' inizializzata altrove, e la doppia inizializzazione perdeva eventuali raccordi gia' caricati.
Modifiche introdotte (build 2026-06-09)¶
TASK-5282 -- Ricostruzione quantita' evasa ordini quando si modificano DDT¶
Quando in gestione DDT si modificano o si cancellano righe collegate a un ordine cliente (tm-d-ord-num (i) not = zero), all'uscita del programma viene inneschato COGR19 con operazione "RIC-ORDI" per ricalcolare la quantita' evasa sull'ordine impattato.
Implementazione:
- Working storage: nuova tabella
w-cogr19-ordini(100 occorrenze) per memorizzare la chiave dell'ordine e un flag di modifica per ciascuno; salvataggiow-sav-tor-chiaper preservare il riferimento durante la cancellazione griglia. - Inizializzazione:
a-carica-dettaglio-bollaazzera la tabella e il contatorewrad ogni apertura. - Tracciamento: ogni riga di griglia che cita un ordine viene registrata in
w-cogr19-ordinise non gia' presente; le routine di modifica (wr-cogmoag3) e cancellazione riga DDT alzano il flagw-cogr19-modificaa "S" per la chiave corrispondente. -
Innesco a chiusura: nella sezione di salvataggio finale, se
a-operazione = k-ope-modificaviene fatto loop suw-cogr19-ordinie per ogni voce con flag "S" si chiama:cobol initialize u-cogr19-dati move "RIC-ORDI" to u-cogr19-ope move w-cogr19-tor-tipo to u-cogr19-tor-tipo move w-cogr19-tor-anno to u-cogr19-tor-anno move w-cogr19-tor-numero to u-cogr19-tor-numero move w-cogr19-tor-progr to u-cogr19-tor-progr perform set-win-appoggio call "COGR19" using stringhe cancel "COGR19" perform close-win-appoggio -
Copybook aggiunto:
utilcogr19.cpy(interfaccia parametri verso COGR19).
Vedi anche COGR19 per la nuova modalita' di chiamata RIC-ORDI.
Modifiche introdotte (build 2026-06-22)¶
TASK-5392 -- Importazione di piu' BdP con stessa merce: qta non azzerata¶
Ticket #592894 (Blutekna). Nel ramo di importazione righe da BdP, quando una merce era gia' presente in griglia e veniva trovata su un secondo BdP con la stessa merce, la tm-rar-qta-doc poteva risultare azzerata. Le correzioni:
- la somma dell'importo (
add trs2-imp to tm-importo (jj)) e' stata spostata accanto alla somma quantita' sulla riga gia' presente (jj); - la riga di aggiornamento
tm-rar-qta-docusa ora l'indice correttojj(eran-r) e, se il risultato e' zero, ripiega sulla quantita' di riga:
move tm-qta-ord (jj) to tm-rar-qta-doc (jj)
if tm-rar-qta-doc (jj) = zero
move tm-qta (jj) to tm-rar-qta-doc (jj)
end-if
TASK-5342 -- BdP collegato a ordine: descrizioni aggiuntive della riga ordine¶
Quando una riga BdP importata risulta collegata a un ordine (trs2-ord-num > zero), oltre a valorizzare tm-qta-ord e il flag tm-fl-ordini-da-bdp viene ora eseguito a5-dor per trattare le descrizioni aggiuntive (DAG) della riga ordine: si imposta w-i2 = n-r, si valorizza ror-rec con la chiave ordine/merce/riga della riga BdP e si invoca a5-dor thru ex-a5, che scandisce COGDESOR (dor-tip = "O") e riversa le descrizioni aggiuntive dell'ordine nel transito trs-s47. In questo modo la riga di bolla derivata da BdP viene allineata alle descrizioni aggiuntive previste sulla riga ordine.
Modifiche introdotte (build 2026-07-28)¶
TASK-5717 -- Sostituzione riga DDT con rif. ordine con riga senza ordine¶
Nella sostituzione di una riga di griglia (paragrafo z-cancella-riga-grid-det-i, invocato quando una riga viene svuotata/rimpiazzata) non veniva inneschata la ricostruzione della quantita' evasa quando una riga DDT collegata a un ordine veniva sostituita con una nuova riga senza riferimento a ordine. In quel caso la vecchia chiave ordine andava persa prima che le routine di modifica/cancellazione potessero alzare il flag di ordine modificato, e la quantita' evasa dell'ordine restava disallineata.
La correzione anticipa il marcamento dell'ordine come modificato all'inizio dello svuotamento riga, prima che i dati della riga (compresa la chiave ordine tm-d-ord-*) vengano azzerati:
z-cancella-riga-grid-det-i.
move tm-riga (i) to tm-riga-sav
move tm-chia (i) to tm-chia-sav
* TASK-5717: alziamo il flag di ordine modificato in questo punto
if tm-d-ord-num (i) not = zero
move zero to wr
perform 100 times
add 1 to wr
if tm-d-ord-tip (i) = w-cogr19-tor-tipo (wr) and
tm-d-ord-ann (i) = w-cogr19-tor-anno (wr) and
tm-d-ord-num (i) = w-cogr19-tor-numero (wr) and
tm-d-ord-pro (i) = w-cogr19-tor-progr (wr)
move "S" to w-cogr19-modifica (wr)
exit perform
end-if
end-perform
end-if
Il flag alzato qui confluisce nello stesso vettore w-cogr19-ordini gia' introdotto con TASK-5282 (build 2026/0609): all'uscita del programma, per ogni ordine con flag "S" viene inneschato COGR19 con operazione RIC-ORDI. Sono state inoltre disattivate (con ****) le vecchie righe che salvavano/ripristinavano tm-d-ord-rif (i) in w-sav-tor-chia, non piu' necessarie con la nuova logica di marcamento anticipato.
Vedi anche COGR19 per l'operazione RIC-ORDI.
Modifiche introdotte (build 2026-08-05)¶
TASK-5767 -- Modifica DDT gia' fatturato dalla gestione DDT della fattura¶
COGV50W puo' ora essere richiamato da COGV07D (il gestore dei DDT collegati a una fattura, aperto con F7 da COGV07) per modificare un DDT anche se gia' fatturato. COGV07D richiama COGV50W in variazione passando l'area utilv56.cpy con v56-prog-caller = "COGV07D-CALLER".
Il valore viene propagato nella variabile di lavoro w-dc-prog-caller (nuovo campo pic x(16) in w-dati-called), letto da v56-prog-caller:
move v56-prog-caller to w-dc-prog-caller
Quando w-dc-prog-caller = "COGV07D-CALLER" il comportamento cambia in tre punti:
-
Forzatura modificabilita' del documento gia' fatturato: nel blocco che valorizza
w-dc-fl-mod-fat(in base a personalizzazione azienda/ventilazione) viene forzato:cobol if w-dc-prog-caller = "COGV07D-CALLER" move "S" to w-dc-fl-mod-fat end-ifCosi' il DDT resta modificabile anche se collegato a una fattura gia' emessa.
-
Salto acquisizione Cliente destinatario (
a-tm-destina): il Cliente non e' modificabile in questo contesto. Conf2si torna al magazzino (a-tm-mag), altrimenti si prosegue verso il brand (a-tm-brand). -
Salto acquisizione Committente (
a-tm-committente): analogamente il Committente non e' modificabile; conf2si va al brand, altrimenti al tipo fattura (a-tm-tipo-fat).
In sintesi, dal flusso "Modifica fattura -> Gestione DDT (F7) -> Gestione DDT (F6)" l'operatore puo' correggere il contenuto di un DDT gia' fatturato senza poterne cambiare intestatario (Cliente) e Committente.
Vedi anche COGV07D e COGV07 per il flusso completo.
Note implementative¶
- I paragrafi
carica-sn-*usanovbx-msg-critico-clienteper le anomalie (riga DDT, S/N, descrizione errore) evbx-msg-warningper i CS. Le segnalazioni sono indirizzate al cliente perche' indicano un'incongruenza tra BdP/Modula e magazzino fisico - Il filtro
gnr-cm-merce = w-sn-in-merceusa i primi 9 byte dignr-desper i tipi CM/CS (vedi commento*>DOC:nel sorgente) - La griglia S/N (
COGV50-T-SN) e' un file di transito locale: il caricamento da BdP riusa la stessa pipeline dell'inserimento manuale (z-aggiungi-sn-a-griglia)
Storico modifiche¶
| Build | Descrizione |
|---|---|
| 2026/0604 | Refactor: estratto valida-ubicazione-sn come paragrafo riusabile. Nuova catena carica-sn-da-bdp-merce / carica-sn-da-bdp-tipo / carica-sn-cm / segnala-sn-cs per pre-caricare i S/N in griglia partendo dai raccordi CM/CS del BdP origine. TASK-5283: controllo plafond lettera d'intento disattivato per DDT gia' fatturati (fl-doc-fat = "S"). Rimossa initialize util-ncnf ridondante in x99-src-cfg |
| 2026/0609 | TASK-5282: traccia ordini collegati alle righe DDT (w-cogr19-ordini, 100 occorrenze) e all'uscita innesca COGR19 con operazione RIC-ORDI per ricalcolare la quantita' evasa di ogni ordine impattato da modifiche/cancellazioni. Copybook utilcogr19.cpy aggiunto |
| 2026/0619 | TASK-5283 (rifinitura): aggiunta w-tot-non-ivato-sav (imponibile all'apertura del documento). Il controllo plafond "in corso di gestione" (variante !) confronta col residuo della lettera d'intento il solo incremento dell'imponibile (w-tot-non-ivato + w-imp-spese - w-tot-non-ivato-sav), evitando di riconteggiare l'imponibile gia' acquisito quando si rientra in modifica di un DDT esistente |
| 2026/0622 | TASK-5392 (Ticket #592894 Blutekna): in importazione di piu' BdP con stessa merce corretto l'azzeramento di tm-rar-qta-doc (indice jj, fallback su tm-qta) e spostata la somma importo sulla riga gia' presente. TASK-5342: per le righe BdP collegate a un ordine viene eseguito a5-dor per riversare le descrizioni aggiuntive (DAG) della riga ordine (COGDESOR) nella riga di bolla |
| 2026/0728 | TASK-5717: in z-cancella-riga-grid-det-i il flag di ordine modificato (w-cogr19-modifica) viene alzato all'inizio dello svuotamento riga, prima che la chiave ordine tm-d-ord-* venga azzerata. Cosi' la ricostruzione quantita' evasa (COGR19 RIC-ORDI) scatta anche quando si sostituisce una riga DDT con riferimento a ordine con una nuova riga senza ordine. Disattivate le vecchie righe di salvataggio/ripristino tm-d-ord-rif in w-sav-tor-chia |
| 2026/0805 | TASK-5767: nuovo campo w-dc-prog-caller (pic x(16), da v56-prog-caller). Quando il chiamante e' "COGV07D-CALLER" (gestione DDT da fattura via COGV07D) il DDT e' modificabile anche se gia' fatturato (w-dc-fl-mod-fat forzato a "S") e vengono saltate le acquisizioni di Cliente destinatario (a-tm-destina) e Committente (a-tm-committente) |
Casistica problemi noti¶
CS MED - Ordine collegato a bolla modificata: qta consegnata "sporca"¶
- Sintomo: evadendo un ordine con DDT e poi modificando il DDT (riduzione quantita' di riga o cancellazione di righe), rientrando in modifica dell'ordine compariva il blocco "La quantita' indicata e' inferiore alla quantita' gia' consegnata in bolla o in buoni di prelievo".
- Causa: la modifica del DDT collegato all'ordine non ricostruiva la quantita' evasa sulla riga ordine/consegna, che restava al valore originario.
- Correzione: in modifica di un DDT, COGV50W traccia gli ordini collegati alle righe interessate da variazioni o cancellazioni (vettore
w-cogr19-ordini). All'uscita innesca COGR19 con operazioneRIC-ORDI(una per ordine impattato, tramiteutilcogr19.cpy) per riallineare la quantita' consegnata sulla riga ordine al contenuto effettivo del DDT. - Riferimento: dettaglio bug - ClickUp.
Array - Warning superamento Plafond su bolla gia' fatturata¶
- Sintomo: entrando in gestione di un DDT gia' fatturato di un cliente con lettera d'intento il cui plafond sta per essere superato, compariva comunque il messaggio di possibile superamento del plafond. Per un documento gia' fatturato (non piu' modificabile) la segnalazione e' fuorviante.
- Causa: il controllo del plafond della lettera d'intento veniva eseguito incondizionatamente all'ingresso del DDT, senza distinguere i documenti gia' fatturati (per i quali lo scarico plafond e' gia' avvenuto sul documento originale al momento della fatturazione).
- Correzione: nei tre punti di emissione del messaggio (
!,!!,!!!) il controllo e l'interruzione sono condizionati afl-doc-fat not = "S", eseguendoli solo per i DDT non ancora fatturati (TASK-5283, build 2026/0604). - Riferimento: dettaglio bug - ClickUp.