Vai al contenuto

COGZCQ — Ricostruzione impegni

Sorgente: cbl/cogzcq.cbl | Program-ID: cogzcq | Tipo: Programma interattivo GUI a maschera (con modalita' batch automatica)

Menu: Lab.Odont. > Operativo > Impegni > Ricostruzione impegni


Scopo

Ricalcola da zero gli impegni degli operatori sulle commesse di laboratorio. Per ogni riga commessa aperta, il programma cancella l'impegno esistente e ne ricostruisce uno nuovo assegnando l'operatore, la data e le ore piu' opportune, appoggiandosi alla subroutine di gestione impegni COGZC5. Al termine produce un documento Word/XML (cogzcq.doc) con l'elenco delle commesse elaborate e degli eventuali errori (commesse che non rispettano i tempi di consegna, operatori non trovati).

Puo' essere selezionata una singola commessa (studio/paziente/progetto o numero commessa) oppure lavorare su tutte le commesse aperte. Se il parametro di lancio (wo-parametro) inizia con "A", il programma gira in modalita' automatica senza interfaccia (ricalcolo dal giorno successivo alla data di sistema), tipicamente da schedulatore.

Il programma e' attivo solo se il parametro di configurazione labod-impegni (gruppo abilita) vale "A"; in caso contrario esce subito.


File e tabelle

File Copybook Accesso Scopo
LODIMPDT (via cogzcq.select/.prc) Lettura/riscrittura sequenziale (chia2) Impegni dettaglio: sorgente degli impegni da cancellare e ricostruire
LODCMTES Lettura diretta e sequenziale Testate commesse (stato impegno, piano, coefficiente)
LODCMRIG Lettura sequenziale (notmin) Righe commessa: azione, reparto, elementi, stato
LODPRESC lodpresc.k04 Lettura per chiave (chia4 per numero) Prescrizioni: stato, tipo lavoro, data/ora consegna, medico
LODPNRIG Lettura diretta Righe piano di fabbricazione (flag check "C", tipo "T"/"X")
CLOCMRIG Lettura sequenziale (notmin) Righe commessa di consegna (data/ora consegna prevista)
LODAZION Lettura diretta Anagrafica azioni (tempo standard/aggiunto, coefficiente tempo, reparto)
LODAZOPE Lettura diretta e sequenziale Collegamento azione-operatore (assegnazione per azione)
COGANAPP Lettura diretta Dati estesi anagrafica cliente (giorni in prova gg-in-prova = 99)
PRNTOPER Lettura sequenziale (notmin) Operatori: candidati all'assegnazione dell'impegno
COGTRANS FD interno + cogtrans.k01/.k02 I-O temporaneo (indexed) Transito impegni ricostruiti (chiave per commessa/riga e per data/ora)
COGTRANS2 FD interno + cogtran2.k01/.k02 I-O temporaneo (indexed) Transito per commessa: prima data/ora impegno, chiave per data

I due file di transito COGTRANS e COGTRANS2 sono file indicizzati temporanei con record ridefiniti direttamente nel sorgente (SELECT + FD manuali). I nomi fisici sono costruiti in apri come ext-tmp-dir/$#cogzcq.{operatore} e ext-tmp-dir/#$cogzcq.{operatore}.


Programmi chiamati (CALL)

Programma Condizione Scopo
COGZC5 ripetutamente Subroutine di gestione impegni: cancella ("x"), ricerca ("S"), forza ("F") e imposta stato ("I") l'impegno di una riga commessa; chiusura file con cogzc5-chiudi-files
COGS98W accept campi chiave Gestione del gruppo di campi prescrizione (studio/paziente/progetto/numero) sulla maschera
WORDMDL stampa-dati Generazione documento Word da modello XML: apre (Apri-XML), aggiunge tag (Aggiungi-XML), chiude (Chiudi-XML), esegue (Esegui) con modello cogzcq.doc
DTPRG / PRGDT vari Conversione data ↔ progressivo per calcoli di scorrimento giorni
RNEWCONF x99-confi Lettura dei 6 parametri di configurazione

Copybook incluse

Working Storage

feurtab.fd, cogfiles.cpy, cogzcq.fd, cogzcq.select, cogzcq.wrk, k-personal.cpy, wgrave.cpy, wnscr.cpy, wopenf.cpy, wstato.cpy, cogazien.cpy, utils52.cpy, utilncnf.cpy, utilwordmdl.cpy, utilcogzcf.cpy, utilcogzc5.cpy, utils98.cpy

Linkage / Screen

wcont.cpy, wcont1.cpy, cogzcq-01.scr

Procedure Division

cogzcq.decla, grave.cpy, mmmask.cpy, opengen.cpy, stato.cpy, stato1.cpy, winmsg.cpy, cogzcq.prc, lodpresc.k04, lodimpdt.k02, cogtrans.k01/.k02, cogtran2.k01/.k02


Parametri di configurazione (RNEWCONF)

Caricati in x99-confi (gruppo "C" = gestore):

Gruppo Chiave Variabile interna Effetto
labimp assegnazione-operatori tm-cfg-assegnazione-ope Modalita' assegnazione: "R" = per reparto/sottoreparto, "M" = per minuti/tempo standard azione, altro = per azione-operatore
abilita labod-impegni tm-cfg-labod-impegni Deve valere "A" perche' il programma sia attivo
labimp ore ritardo consentite tm-cfg-ore-ritardo Ore di ritardo tollerate (spostamento data/ora nel confronto con l'impegno precedente)
labimp file-ricalcolo-impegno tm-cfg-file-ricalcolo Percorso di salvataggio del documento prodotto (con macro $data$ sostituita dalla data di sistema)
labimp gg-lavoro-in-prova tm-cfg-gg-lav-in-prova Se = 99 forza la logica "lavoro in prova" (flag fl-prova-99)
labimp tipo-ricalcolo-impegno tm-cfg-tipo-ricalcolo Se "D" esegue carica-ordine per riordinare le commesse per data consegna

Logica di elaborazione

  1. Apertura (apri): inizializza maschera e transiti, verifica abilitazione, imposta data (giorno successivo alla data di sistema). In modalita' automatica salta l'interfaccia e va diretto al calcolo.
  2. carica-trs: scorre LODIMPDT; per ogni impegno non chiuso di una commessa/riga valida (testata e riga esistenti, stato non "C", stato impegno non "F") copia i dati su COGTRANS, aggiorna in COGTRANS2 la prima data/ora della commessa e cancella l'impegno originale via COGZC5 (cancella-riga). Le righe chiuse (imd-stato = "C" o riga chiusa) vengono annullate anche nella relativa attivita' (COGZCF).
  3. carica-altri: aggiunge a COGTRANS2 le commesse aperte (stato impegno non "N"/"F", prescrizione non chiusa/evasa, tipo lavoro ≠ "K") non ancora presenti, con data fittizia 99999999.
  4. carica-ordine (solo tipo-ricalcolo = "D"): riordina le commesse in COGTRANS2 per data/ora di consegna della prescrizione.
  5. tratta-trs2tratta-commessa: per ogni commessa scorre le righe (LODCMRIG); per ogni riga da impegnare determina se provvisoria ("P"/LODPNRIG tip "X") o definitiva ("D"/tip "T"), cerca prima l'operatore che aveva l'impegno precedente (cerca-ope-prec) e in mancanza il miglior operatore disponibile (cerca-ope) secondo la modalita' di assegnazione, quindi forza l'impegno via COGZC5 ("F"). Se non trova un operatore ma l'impegno e' calcolabile (calcola-impegno > 0) registra l'errore "Non trovato operatore".
  6. ctrl-commessa / cerca-data-cons / cerca-impdt: verifica che gli impegni ricostruiti rispettino la data/ora di consegna; in caso contrario registra l'errore "Commessa non rispetta tempi" e imposta lo stato "I" sull'impegno via COGZC5.
  7. Produzione documento: tutte le righe commessa e gli errori vengono scritti come tag XML (scrivi-tag) e trasformati in documento Word tramite WORDMDL.

Paragrafi chiave

Paragrafo Scopo
apri Inizializzazione, pulsanti, nomi transiti, configurazione, abilitazione
a-inizio-calcolo Ricrea (open output → i-o) i due file di transito e avvia stampa-dati
stampa-dati Orchestrazione: carica-trs, carica-altri, carica-ordine, stampa-trs2, tratta-trs2, generazione documento
carica-trs Copia gli impegni esistenti su transito e li cancella
carica-altri Aggiunge le commesse aperte prive di impegno
tratta-commessa Ricostruisce gli impegni riga per riga
cerca-ope-prec Cerca l'operatore che aveva l'impegno precedente
cerca-ope Cerca il miglior operatore disponibile (per reparto o per azione)
sistema-ore Applica il ritardo consentito allo scorrimento data/ora
calcola-impegno Calcola il tempo impegno dall'azione ("F" fisso, "U" unitario) — nota: se modificato verificare anche COGZC8
ctrl-commessa / cerca-impdt Verifica rispetto dei tempi di consegna
x99-confi / sistema-nome-file Caricamento configurazione e risoluzione del nome file di salvataggio

Note

  • Il paragrafo calcola-impegno reca un commento esplicito: eventuali modifiche vanno replicate in COGZC8 (che ospita la stessa logica di calcolo).
  • La generazione del documento Word finale (WORDMDL con Esegui) e' cablata alla personalizzazione az-personal = k-personal-lab-kronos e viene eseguita solo in modalita' non automatica.
  • Il codice fa ampio uso di PERFORM ... THRU e GO TO (stile legacy del programma originale del 2010): in caso di manutenzione prestare attenzione allo scope dei loop.