Vai al contenuto

COGV60NO — Motore di creazione fatture da Bolle/Buoni di Consegna

Sorgente: cbl/cogv60no.cbl | Tipo: Programma interattivo a griglia (testata fattura + griglia DDT), normalmente richiamato come sottoprogramma

Menu: - Lab.Odont. > Fatturazione > A Singolo Cliente > Fattura da Bolle/Buoni Consegna - Vendite > Fatturazione > A Singolo Cliente > Inserimento - Vendite > Fatturazione > Ingrosso > Inserimento


Scopo

E' il motore di creazione delle fatture a singolo cliente a partire dalle bolle (DDT) e dai buoni di consegna selezionati. Riceve dal programma chiamante un file di transito (tran-v60) con i documenti da fatturare, presenta all'operatore i dati di testata (intestatario, agente, cliente di consegna, data, divisa, pagamento, tipo documento, commessa, ecc.) e la griglia dei DDT, e — alla conferma (F3) — costruisce le testate/righe della fattura raggruppando i documenti coerenti in un unico documento fiscale.

Il programma puo' essere usato in due modalita':

  1. Standalone (lancio diretto da COGV60): l'operatore sceglie cliente e bolle, e il programma stesso popola il transito.
  2. Come sottoprogramma con transito gia' pronto: il chiamante (es. COGV6A, COGV84, COGV40) ha gia' scritto in tran-v60 i DDT da fatturare e li passa con cogv60-transito-pronto = "S"; COGV60NO apre il transito in I-O, carica la griglia e procede.

Supporta anche la pre-stampa fac-simile (cogv60-pre-stampa = "SI"): genera l'anteprima della fattura senza creare il documento ne' modificare lo stato dei DDT.


Modalita' di chiamata (linkage util-cogv60)

Il programma e' pilotato dalla struttura util-cogv60 (copybook utilcogv60.cpy), passata in stringhe. Campi principali:

Campo Tipo Direzione Significato
cogv60-called x(13) IN Se = "COGV60-CALLED" il programma e' richiamato da un chiamante che fornisce i parametri di testata
cogv60-cli-nonno 9(5) IN Cliente nonno (intestatario) della fattura
cogv60-cli-padre 9(5) IN Cliente padre (sede/cliente di consegna)
cogv60-commessa x(10) IN Commessa a cui agganciare la fattura
cogv60-data-fat 9(8) IN Data fattura proposta
cogv60-transito-pronto x(1) IN "S" = il chiamante ha gia' riempito tran-v60 con i documenti da fatturare; il programma apre il transito in I-O e va direttamente alla griglia
cogv60-pre-stampa x(2) IN "SI" = genera solo l'anteprima fac-simile, senza creare la fattura
cogv60-caller x(6) IN Nome del programma chiamante (es. "COGV6A"); usato per comportamenti specifici (vedi Post-it cliente)
cogv60-fattura-creata x(1) OUT "S" se la fattura e' stata effettivamente creata
cogv60-new-fat-chia1 gruppo OUT Chiave (tipo/anno/numero) della fattura creata

All'ingresso (apri) i campi vengono copiati nelle variabili di lavoro w-dc-* (w-dc-called, w-dc-cli-nonno, w-dc-cli-padre, w-dc-data-fat, w-dc-transito-pronto, w-dc-pre-stampa, w-dc-caller).


File di transito tran-v60

tran-v60 (copybook tran-v60.cpy, FD tran-v60.fd, chiave tran-v60.k01) e' un file ISAM temporaneo in dir temporanea, che fa da canale di scambio tra i programmi di selezione documenti e questo motore. Ogni record rappresenta un DDT/buono da fatturare; campi chiave usati nella logica:

Campo Tipo Significato
trs-v60-chia1 / trs-v60-bolla gruppo Chiave documento (con trs-v60-tip = tipo bolla)
trs-v60-tip x(1) Tipo bolla; "S" = bolla "No merci" (solo servizi/spese)
trs-v60-flag x(1) Stato riga: "F" selezionata, "X" gia' lavorata, "S" no-merci
trs-v60-tipo-fat x(2) Tipo fatturazione
trs-v60-name Nome fisico del file temporaneo (vedi naming sotto)

Naming del file temporaneo (TASK-5374)

Il nome fisico del transito e' costruito in apri con:

ext-tmp-dir + ext-os-slash + "#$COGV60_" + ext-pid + "." + wo-oper

cioe' <dir-temp>/#$COGV60_<pid>.<operatore>.

Prima della TASK-5374 il nome era <dir-temp>/#$COGV60.<operatore> (senza PID). L'aggiunta di ext-pid (PID del processo) rende il nome univoco per processo: due istanze concorrenti — anche dello stesso operatore, o di operatori diversi che condividono area temporanea — non collidono piu' sullo stesso file. La collisione causava in precedenza un falso errore "Funzione gia' in uso dall'operatore" quando l'open output tran-v60 falliva perche' un altro processo deteneva il file omonimo.

L'intera famiglia COGV60 condivide questa convenzione di naming: il transito #$COGV60_<pid>.<operatore> e' scritto/letto in modo coordinato da COGV6A, COGV84, COGV40, COGV61, COGX20, COGU81, COGV60TA (oltre a COGV60NO). Il PID e' stato aggiunto in tutti questi programmi per la TASK-5374, in modo che la chiave di naming resti coerente tra chiamante e motore.


Flusso principale

  1. apriz-99-init-program, lettura azienda (rd-azi), apertura file, costruzione nome tran-v60 (con PID) e del file lista w-ltd-nome, attivazione tasti funzione e toolbar. Copia dei parametri cogv60-* in w-dc-*. Caricamento configurazioni (x99-confi).
  2. a4a-fine-dati — accept dei campi di testata (intestatario, agente, cliente di consegna, data fattura, divisa, pagamento, banca, tipo documento, commessa, tipo pre-fattura, sconto bonus fiscale, riferimento amministrativo, ecc.), con relative validazioni (x-controlla-*).
  3. a-fine-dati-conferma-bis — se w-dc-transito-pronto = "S" apre tran-v60 in I-O e salta alla griglia; altrimenti crea il transito (open output tran-v60) e lo popola con la ricerca bolle (b-ricerca / e-ricerca-bdp per proforma da BDP).
  4. a-grid-ini / a-grid — caricamento e gestione della griglia DDT: selezione righe, tasti funzione, dettaglio documento.
  5. aggiorna — conferma fatturazione (F3): chiude i file di lavoro condivisi e richiama COGV61 (creazione documenti tipo "S" / accettazione no-merci e marcatura bolle selezionate con "X").
  6. a-90-loop / a-100 — ciclo sul transito e creazione effettiva della fattura via COGF26 (operazione "Creazione"), con eventuale raggruppamento bolle (COGU21, operazione Ragg-BV), affogamento resi, gestione banca/bonifico, ritenuta d'acconto, sconto bonus fiscale, protocollo forzato.
  7. a100-stampa — stampa/anteprima del documento; in modalita' pre-stampa (w-dc-pre-stampa = "SI") genera solo il fac-simile.
  8. fine / z-chiudi — chiusura file, close/delete file tran-v60, restituzione esito al chiamante (cogv60-fattura-creata, cogv60-new-fat-chia1).

Programmi chiamati (CALL)

Programma Quando Scopo
COGV61 aggiorna (se non proforma da BDP) Marcatura bolle selezionate con "X", accettazione movimenti no-merci e inserimento documento tipo "S". E' lo step che "consuma" il transito prima della creazione fattura
COGF26 a-100 Creazione effettiva della fattura (operazione "Creazione"): testata e righe, gestione banca, ritenuta d'acconto, sconto bonus fiscale, protocollo
COGU21 ciclo transito / a-100 Raggruppamento bolle (operazione "Ragg-BV") e calcolo dati di raggruppamento per fattura
COGS65W accept campi testata (intestatario, agente, padre) Selettore/help anagrafica a campo (F8)
COGU10W calcolo/formattazione importi Formattazione importi
COGGA4 varie accept Lettura/decodifica anagrafica e tabelle a supporto dei campi
COGU02 varie Decodifica documento/numerazione
COGU18 griglia Gestione griglia/colonne
COGV61 / COGF26 / COGU21 (vedi sopra) Catena di creazione fattura
COGB50 accept/elaborazione Utility contabile/anagrafica
COGC56 elaborazione Utility documento
COGE22 / WIN023 / WIN067 / WIN016.COB tasti funzione / dettaglio Finestre di dettaglio e ricerca
COGP41 elaborazione Utility
COGS52W accept Selettore commessa/dati
COGZS1 / COGZDE / COGZ82 elaborazione Lettura commessa lotto / dati estesi
COGS15 / COGS87.COB elaborazione Calcolo totali documento
CRM030 elaborazione Lettura informazioni CRM cliente
COGU78 / COGF26 stampa Stampa fattura/anteprima
GRIDADMN S-F4 / init griglia Personalizzazione colonne griglia
DIALOGS conferme Finestre di dialogo
DTPRG elaborazione Utility data
POSTIT accept intestatario (vedi sotto) Visualizzazione Post-it cliente
RNEWCONF x99-confi Lettura parametri di configurazione

Post-it cliente quando chiamato da COGV6A

Quando COGV60NO e' richiamato da COGV6A (w-dc-caller = "COGV6A"), all'impostazione dell'intestatario (ramo else in a-tm-nonno-dopo-accept) viene richiamato il Post-it del cliente prima di proseguire:

180326   if w-dc-caller not = "COGV6A"
            go to a-tm-nonno-dopo-accept
          else
           initialize           util-wpost
           move "C"             to wpost-ana-tip
           move tm-nonno        to wpost-ana-cod
           move spaces          to wpost-area
           call 'POSTIT'        using stringhe util-wpost
           cancel 'POSTIT'
         end-if

Motivo (commento sorgente): "richiamiamo il Post-it ora perche' dopo cogs65 non lo richiamerebbe" — in questo percorso il flusso non passerebbe dal punto in cui il Post-it viene normalmente mostrato, quindi lo si richiama esplicitamente.

Struttura util-wpost

Definita inline nella working-storage del programma:

Campo Tipo Significato
wpost-chia gruppo Chiave del Post-it
wpost-ana-tip x(1) Tipo anagrafica ("C" = cliente)
wpost-ana-cod 9(5) Codice anagrafica (qui tm-nonno, l'intestatario)
wpost-merce gruppo (gru/sot/cod) Eventuale articolo collegato (non usato in questa chiamata)
wpost-area x(1) Area (qui spaces)

Ordinamento bolle "No merci" in coda alla fattura (TASK-3136 / TASK-4709)

Quando una fattura mescola bolle "No merci" (tipo "S", es. addebiti di sole spese) con bolle normali, le bolle "S" devono comparire come ultimi DDT della fattura. L'ordinamento e' ottenuto allineando le bolle "S" al cliente di "consegna" (padre) e alla destinazione con i valori piu' alti tra le bolle normali.

Variabili di appoggio (working-storage):

040526 01 w-sav2-tes-padre         pic 9(05).
       01 w-sav2-dst-id.
          03 w-sav2-dst-id-tip     pic x(01).
          03 w-sav2-dst-id-idx     pic 9(04).

Logica nel ciclo a-90-loop sui record tran-v60 (entrambe inizializzate in aggiorna prima del ciclo):

  • Bolle normali (trs-v60-tip <> "S"): rilegge la testata COGTESBO (tes-chia3 = trs-v60-bolla) e tiene il massimo di tes-padre (in w-sav2-tes-padre) e di tes-dst-id-idx/tes-dst-id-tip (in w-sav2-dst-id).
  • Bolle "S" (trs-v60-tip = "S"): rilegge la testata e — se i valori massimi non sono zero — le valorizza con w-sav2-tes-padre (su tes-padre) e w-sav2-dst-id (su tes-dst-id-tip/tes-dst-id-idx), poi rwr-cogtesbo.

Effetto: in una fattura che mescola una bolla "S" "No merci" con bolle normali, le bolle "S" ereditano il cliente di consegna e la destinazione con i valori piu' alti delle bolle normali, e vengono quindi esposte come ultimi DDT nella fattura. (Questa logica si affianca a quella della TASK-546 / 190925, che gia' allinea la destinazione diversa della bolla "S" ai riferimenti del primo DDT.)


File e tabelle principali

Transito

File Copybook Scopo
tran-v60 tran-v60.cpy Documenti da fatturare (canale di scambio con i chiamanti). Nome fisico #$COGV60_<pid>.<operatore>
lodtmdes lodtmdes.cpy File temporaneo descrizioni (usato in alcune personalizzazioni IP/GO)
cogragfa / cogrifbo / cogrresi cogragfa.cpy / cogrifbo.cpy / cogrresi.cpy File di appoggio fattura: raggruppamenti, riferimenti bolla, resi affogati

File ISAM principali (lettura/aggiornamento)

COGTESBO, COGTESBP, COGTESAP, COGRACCO, COGRACBB, COGRAGFA, COGRIGCM, COGRIGBP, COGRIFBO, COGRIFER, COGDESTI, COGDESOR, COGDESCR, COGGEANA, COGANAPP, COGANAP2, COGANCAP, COGTABEL, COGTCMAG, COGBRAND, COGBSTES, COGBSDAU, COGMOMAG, COGMOADG, COGMERCI, COGCONTR, COGCMMGP, COGMAGPE, COGPNCON, COGGENER, COGFATTU, COGFATT2, COGTESCM, NUTBANAS, ASNINTES, ASNINTE2, ASNCHTES, ASNINDMG, ASNINDAG, ASNAREAT, ASNRESPO, ASNSTCHM, ASNMATRI, LODCMTES.


Parametri di configurazione (RNEWCONF)

Caricati in x99-confi (oltre 40 chiavi). I principali:

Gruppo Chiave Effetto
fatturaz proforma-da-bdp Proforma generata da BDP
fatturaz comportamento-post-fattura Comportamento dopo creazione fattura
fatturaz sconto-bonus-fiscale Abilita sconto bonus fiscale
fatturaz sconto-conto-credito Conto contabile dello sconto bonus fiscale
fatturaz tipo-fat-default Tipo fatturazione di default
fatturaz dettaglio-dopo-desag Dettaglio dopo disaggregazione
contabil tipo-doc-iva-docmag-vendita Tipo raccordo "bolla contabilizzata"
contabil tipi-doc-per-causale Tipo documento per causale
azienda gestione-brand-marchio Gestione brand/marchio
abilita grp-az-azienda Azienda del gruppo
abilita altri-dati-gestionali Abilita gestione Altri Dati per XML
abilita merci-deperibili-art-62 Gestione merci deperibili art.62
assist gestione-gruppo-aziende Filtro DDT per azienda del gruppo
commesse tipo-numerazione-commesse Numerazione commesse

Copybook inclusi

Working Storage

feurtab.fd, cogv60no.fd, cogv60no.wrk, cogfiles.cpy, cogragfa.*, cogrifbo.*, cogrresi.*, lodtmdes.*, tran-v60.*, utilcogc56.cpy, utils87.cpy, wgrave.cpy, wnscr.cpy, wopenf.cpy, wstato.cpy, cogazien.cpy, k-personal.cpy, wgrid.cpy, utilgdad.cpy, utildlg.cpy, utilncnf.cpy, utile22.cpy, utilf26.cpy, utilp41.cpy, utils52.cpy, utils54.cpy, utils65.cpy, utilu01.cpy, utilu02.cpy, utilu10.cpy, utilu18.cpy, utilu21.cpy, utilu22.cpy, utilu78.cpy, utilu35w.cpy, utilw02.cpy, utilw23.cpy, utilw67.cpy, utilzde.cpy, utilzs1.cpy, utilcogga4.cpy, utilcrm030.cpy, utilcogb50.cpy, utilcogmah.cpy, utilcogv61.cpy, utilcogg4b.cpy

Linkage Section

wcont.cpy, utils15.cpy, utilz82.cpy, utilcogv60.cpy, wcont1.cpy

Procedure Division / Chiavi I/O

cogv60no.decla, cogv60no.prc, cogv60no-01.scr, call-u35.cpy, grave.cpy, mmmask.cpy, opengen.cpy, stato.cpy, stato1.cpy, winmsg.cpy, dtab.cpy, fscrol2.cpy, sendu22.cpy, sendw02.cpy; chiavi secondarie asnindmg.k02, asnmatri.k02, cogbsdau.k02, cogpadoc.k02, cogracbb.k02, cogracco.k02, cogrigcm.k02, cogtesbo.k03, cogtesbp.k04, cogtescm.k03.


Paragrafi chiave

Paragrafo Scopo
apri Inizializzazione, apertura file, costruzione nome tran-v60 (con PID), caricamento configurazioni
a4 Reset dati testata e impostazione default
a-tm-nonno / a-tm-nonno-dopo-accept Accept intestatario; richiamo Post-it se chiamato da COGV6A
a-tm-padre / a-tm-agente / a-tm-data-fattura / a-tm-divisa / a-tm-cond-pag / a-tm-pagamento / a-tm-t-doc Accept dei singoli campi di testata
a-fine-dati / a-fine-dati-conferma / a-fine-dati-conferma-bis Conferma testata; apertura/creazione transito (o I-O se gia' pronto)
a-grid-ini / a-grid / a-grid-fine Caricamento e gestione griglia DDT
aggiorna Conferma fatturazione: chiusura file, init w-sav2-*, chiamata COGV61
a-90-loop Ciclo sul transito: ordinamento bolle "No merci" (TASK-546, TASK-3136/4709), raggruppamento COGU21
a-100 Creazione fattura via COGF26, affogamento resi, banca, ritenuta, sconto fiscale
a100-stampa Stampa/anteprima documento
vc-vendita-cespiti Gestione vendita cespiti
x-controlla-dati / x-controlla-tm-* Validazioni dei campi di testata
x99-confi Caricamento parametri RNEWCONF
fine / z-chiudi Chiusura, cancellazione transito, restituzione esito al chiamante

Regole di business principali

  1. Univocita' fattura: i DDT raggruppati in una fattura devono essere coerenti (cliente, pagamento, divisa, raggruppamento, tipo fatturazione, ecc.); il controllo a monte e' del chiamante (es. COGV6A), il motore consolida il transito.
  2. Bolle "No merci" (tipo "S"): vengono esposte in coda agli altri DDT della fattura, ereditando cliente di consegna e destinazione con i valori piu' alti delle bolle normali (TASK-3136/TASK-4709).
  3. Transito univoco per processo: il file tran-v60 ha nome #$COGV60_<pid>.<operatore>; cosi' istanze concorrenti non collidono (TASK-5374). La famiglia COGV60 (COGV6A, COGV84, COGV40, COGV61, COGX20, COGU81, COGV60TA) condivide la convenzione.
  4. Post-it cliente: quando il lancio proviene da COGV6A, all'impostazione dell'intestatario viene mostrato il Post-it del cliente.
  5. Pre-stampa fac-simile: con cogv60-pre-stampa = "SI" il programma genera solo l'anteprima, senza creare la fattura ne' modificare lo stato dei DDT.
  6. Creazione effettiva: la fattura e' creata da COGF26 (operazione "Creazione") dopo che COGV61 ha consumato il transito (marcatura bolle "X", accettazione no-merci).

Storico modifiche

Data Descrizione
2026-06-30 TASK-5356 (marcatore 300626): all'accept dell'intestatario, se il cliente e' marcato Privato Consumatore (ana-privato = "P") ma ha una Partita IVA significativa (ana-piva not = 0), viene mostrato un messaggio di avviso all'operatore ("Attenzione: Cliente 'Privato Consumatore' con Partita Iva significativa ..."). Segnala l'incongruenza anagrafica; la relativa soppressione della P.IVA in stampa fattura e' gestita da COGP41L (stessa TASK).
2026-06-30 TASK-5325 (marcatore 300626): nei due punti in cui, leggendo COGTABEL per la causale della bolla, la causale non e' rintracciata, il messaggio "BOLLA: … ; CAUSALE NON RINTRACCIATA: …" (con relativo box-msg e go to b-10-loop) non viene piu' emesso per le bolle "No merci" (tes-tipob = "S"): per queste wb-msg viene lasciato a spazi e l'elaborazione prosegue. Le bolle normali mantengono il messaggio bloccante invariato.
2026-06-24 TASK-5374: il nome del file di transito tran-v60 e' stato reso univoco per processo aggiungendo ext-pid (PID): da <dir-temp>/#$COGV60.<operatore> a <dir-temp>/#$COGV60_<pid>.<operatore>. Elimina il falso errore "Funzione gia' in uso dall'operatore" causato dalla collisione del file temporaneo tra istanze/operatori concorrenti. La convenzione e' condivisa da tutta la famiglia COGV60 (COGV6A, COGV84, COGV40, COGV61, COGX20, COGU81, COGV60TA).
2026-06-24 Post-it cliente da COGV6A (marcatore 180326): quando w-dc-caller = "COGV6A", all'impostazione dell'intestatario viene richiamato POSTIT (util-wpost: wpost-ana-tip = "C", wpost-ana-cod = tm-nonno, wpost-area = spaces), perche' in questo percorso il Post-it non verrebbe altrimenti mostrato dopo COGS65.
2026-06-24 TASK-3136 / TASK-4709 (marcatore 040526): ordinamento delle bolle "No merci" (tipo "S") in coda alla fattura. Nuove variabili w-sav2-tes-padre e w-sav2-dst-id (tip x01 + idx 9(04)); nel ciclo a-90-loop le bolle normali aggiornano i valori massimi di tes-padre e tes-dst-id, le bolle "S" li ereditano (con rwr-cogtesbo), cosi' da essere esposte come ultimi DDT.

Casistica problemi noti

Bolle "No merci" (tipo "S"): messaggio "causale non rintracciata" bloccante (2026-07-03)

  • Sintomo: in fatturazione a singolo cliente, le fatture con bolle "No merci" (tipo "S") venivano interrotte dal messaggio bloccante "CAUSALE NON RINTRACCIATA", pur essendo bolle prive di causale merce (cliente Videopress).
  • Causa: nei due punti in cui la causale della bolla non veniva rintracciata su COGTABEL, il messaggio bloccante era emesso senza distinguere il tipo di bolla.
  • Correzione: per le bolle "No merci" (tes-tipob = "S") il messaggio non viene piu' emesso (wb-msg a spazi) e l'elaborazione prosegue; le bolle normali mantengono il messaggio bloccante. Modifica tracciata come TASK-5325 (vedi storico modifiche).
  • Riferimento: dettaglio bug | ClickUp 869dmzutu

Cliente "Privato Consumatore" con Partita IVA: avviso all'operatore (2026-07-03)

  • Sintomo: un cliente marcato "Privato Consumatore" con Partita IVA valorizzata non generava alcun avviso; si rischiava di emettere una fattura da privato quando doveva essere da ditta (o viceversa), con successiva nota di credito in fattura elettronica.
  • Causa: mancava un controllo sull'incongruenza anagrafica "Privato Consumatore + Partita IVA significativa".
  • Correzione: all'impostazione dell'intestatario, se ana-privato = "P" e ana-piva not = 0, viene mostrato un messaggio di avviso all'operatore. La soppressione della P.IVA in stampa fattura e' gestita da COGP41L (stessa TASK-5356).
  • Riferimento: dettaglio bug | ClickUp 869dq1zmq