Vai al contenuto

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:

  1. Working storage: nuova tabella w-cogr19-ordini (100 occorrenze) per memorizzare la chiave dell'ordine e un flag di modifica per ciascuno; salvataggio w-sav-tor-chia per preservare il riferimento durante la cancellazione griglia.
  2. Inizializzazione: a-carica-dettaglio-bolla azzera la tabella e il contatore wr ad ogni apertura.
  3. Tracciamento: ogni riga di griglia che cita un ordine viene registrata in w-cogr19-ordini se non gia' presente; le routine di modifica (wr-cogmoag3) e cancellazione riga DDT alzano il flag w-cogr19-modifica a "S" per la chiave corrispondente.
  4. Innesco a chiusura: nella sezione di salvataggio finale, se a-operazione = k-ope-modifica viene fatto loop su w-cogr19-ordini e 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

  5. 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-doc usa ora l'indice corretto jj (era n-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:

  1. 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-if

    Cosi' il DDT resta modificabile anche se collegato a una fattura gia' emessa.

  2. Salto acquisizione Cliente destinatario (a-tm-destina): il Cliente non e' modificabile in questo contesto. Con f2 si torna al magazzino (a-tm-mag), altrimenti si prosegue verso il brand (a-tm-brand).

  3. Salto acquisizione Committente (a-tm-committente): analogamente il Committente non e' modificabile; con f2 si 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-* usano vbx-msg-critico-cliente per le anomalie (riga DDT, S/N, descrizione errore) e vbx-msg-warning per 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-merce usa i primi 9 byte di gnr-des per 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 operazione RIC-ORDI (una per ordine impattato, tramite utilcogr19.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 a fl-doc-fat not = "S", eseguendoli solo per i DDT non ancora fatturati (TASK-5283, build 2026/0604).
  • Riferimento: dettaglio bug - ClickUp.