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':
- Standalone (lancio diretto da
COGV60): l'operatore sceglie cliente e bolle, e il programma stesso popola il transito. - Come sottoprogramma con transito gia' pronto: il chiamante (es.
COGV6A,COGV84,COGV40) ha gia' scritto intran-v60i DDT da fatturare e li passa concogv60-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¶
apri—z-99-init-program, lettura azienda (rd-azi), apertura file, costruzione nometran-v60(con PID) e del file listaw-ltd-nome, attivazione tasti funzione e toolbar. Copia dei parametricogv60-*inw-dc-*. Caricamento configurazioni (x99-confi).a4…a-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-*).a-fine-dati-conferma-bis— sew-dc-transito-pronto = "S"apretran-v60in 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-bdpper proforma da BDP).a-grid-ini/a-grid— caricamento e gestione della griglia DDT: selezione righe, tasti funzione, dettaglio documento.aggiorna— conferma fatturazione (F3): chiude i file di lavoro condivisi e richiamaCOGV61(creazione documenti tipo "S" / accettazione no-merci e marcatura bolle selezionate con "X").a-90-loop/a-100— ciclo sul transito e creazione effettiva della fattura viaCOGF26(operazione"Creazione"), con eventuale raggruppamento bolle (COGU21, operazioneRagg-BV), affogamento resi, gestione banca/bonifico, ritenuta d'acconto, sconto bonus fiscale, protocollo forzato.a100-stampa— stampa/anteprima del documento; in modalita' pre-stampa (w-dc-pre-stampa = "SI") genera solo il fac-simile.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 testataCOGTESBO(tes-chia3 = trs-v60-bolla) e tiene il massimo dites-padre(inw-sav2-tes-padre) e dites-dst-id-idx/tes-dst-id-tip(inw-sav2-dst-id). - Bolle "S" (
trs-v60-tip = "S"): rilegge la testata e — se i valori massimi non sono zero — le valorizza conw-sav2-tes-padre(sutes-padre) ew-sav2-dst-id(sutes-dst-id-tip/tes-dst-id-idx), poirwr-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¶
- 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.
- 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).
- Transito univoco per processo: il file
tran-v60ha nome#$COGV60_<pid>.<operatore>; cosi' istanze concorrenti non collidono (TASK-5374). La famiglia COGV60 (COGV6A, COGV84, COGV40, COGV61, COGX20, COGU81, COGV60TA) condivide la convenzione. - Post-it cliente: quando il lancio proviene da COGV6A, all'impostazione dell'intestatario viene mostrato il Post-it del cliente.
- 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. - Creazione effettiva: la fattura e' creata da
COGF26(operazione "Creazione") dopo cheCOGV61ha 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-msga 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"eana-piva not = 0, viene mostrato un messaggio di avviso all'operatore. La soppressione della P.IVA in stampa fattura e' gestita daCOGP41L(stessa TASK-5356). - Riferimento: dettaglio bug | ClickUp 869dq1zmq