Vai al contenuto

SWN117 - Prescrizioni e commesse

Nome programma SWN117 Linkage section UTILAGPRG - Linkage comune Id processo: 117 Nome processo: LO-COMMESSE Tabelle principali gestite

AREA AREAGATE Direzione
LODPRESC
LODCMTES
LODCMA*
LODCMART
ARPPRESCRTES
ARPPRESCRART
------>
<------

Logica generale Sincronizzazione delle prescrizioni e delle commesse di laboratorio. Esportazione Esportazione di tutte le commesse effettivamente modificate: * Testata (per aggiornare eventualmente lo stato) * Allegati Importazione Verranno importate attualmente solo le nuove prescrizioni richieste da un medico: * Testata (ARPPRESCRTES) * Articoli (ARPPRESCRART) * Allegati (APCOGARIDX) Successivamente verrà implementata la possibilità di importare anche i lavori che rientrano dopo un controllo utente Configurazioni possibili

Gruppo Parametro Note
abilita attiva-areaapp
areaapp cod-azienda
areaapp db-conn-string
areaapp agg-postgres-online
odonto documento-accompagnamento
arc-ott archiviazione-remota
odonto classe-categoria
odonto data-prima-exp-commesse
db db-log-level Livello di log database
odonto numero-commessa-automatico Numerazione commessa automatica
areaapp swa004-codice-server-ftp Codice server FTP per trasferimento
assist gestione-gruppo-aziende Gestione gruppi aziende
odonto AZIONE-INIZIALE-AUTOMATICA Azione iniziale automatica per attivazione follow chat

Elaborazione Tipi di segnalazione: Vedi Tipi di segnalazione A - Controllo di esecuzione Vedi Controllo di esecuzione A.1 - Aggiornamento KEEP-ALIVE Per il momento non lo eseguiamo: il keep-alive viene tenuto aggiornato dal thread autonomo di aglancio; se il programma venisse chiamato in "tempo reale" dal programma di gestione, non necessita comunque del keep-alive. A.2 - Apertura A.2.1 Apertura tabelle Tentare l'apertura della tabella da sincronizzare: ARPPRESCRTES Se fallita inviare una Segnalazione critica e chiudere.

C - Importazione aggiornamenti Effettuare una query per estrarre tutti gli elementi aggiornati su APP: SELECT * FROM ARPPRESCRTES WHERE aprt_azi = azienda AND (aprt_agg_app <> ' ') Se APRT-FL-CANC = 'C' significa che la prescrizione è stata cancellata prima che il gestionale potesse importarla. Quindi in questo caso si imposta: - APRT-AGG-APP = ' ' Quindi si salva e si esce Se APRT-COMM = ' ' * C.1 Nuova prescrizione * C.2 Aggiornamento commessa C.1 - Nuova prescrizione Il cliente ha inserito una nuova prescrizione, nella quale possono essere stati richiesti uno o più dispositivi (articoli) per lo stesso paziente. Quindi si deve procedere con l'inserimento di una nuova commessa. C.1.1 - Numerazione Effettuare una chiamata a COGZA6 per attrbuire un nuovo numero commessa:

Dato Contenuto
COGZA6-DATA-PRESCRIZIONE APRT-DATA-PRESCR
COGZA6-MAG-COD COGANAPP.AAP2-SEDE (prelevato dall'anagrafica studio)

Verrà restituito ZA6-COMMESSA Quindi procedere con l'inserimento commessa C.1.2 - LODPRESC

Dato Contenuto
LPM-MED APRT-ANA (2:5)
LPM-PAZ APRT-CF-PAZIENTE
Se vuoto, usare APRT-NOME-PAZIENTE
LPM-PRO ZA6-COMMESSA
LPM-NUM ZA6-COMMESSA
LPM-COD APRT-NUM-PRESCR
LPM-DOTTORE APRT-MEDICO
LPM-DATA APRT-DATA-PRESCR
LPM-RIF-PAZIENTE " "
LPM-DATA-CNS APRT-DATA-CONS
LPM-ORA-CNS APRT-ORA-CONS
LPM-FL-PREVENTIVO "N"
LPM-FL-PROGETTO "N"
LPM-TIP-DSP " "
LPM-TIP-LAV "C"
LPM-N-ARCHIVIO " "
LPM-ANNI 0
LPM-STATO "N"
LPM-PAZ-ESTESO APRT-NOME-PAZIENTE
LPM-PAZ-INDI " "
LPM-TIP-DOC "odonto"-"documento-accompagnamento"
LPM-FL-ESTRATTA "N"

Se l'inserimento fallisce ritentare con un nuovo numero commessa C.1.3 - Creazione paziente Effettuare una chiamata a COGS94W per la creazione del paziente

Dato Contenuto
S94-I-STU-TIP "C"
S94-I-STU-COD LPM-MED
S94-C LPM-PAZ
S94-LPZ-NOME LPM-PAZ-ESTESO
S94-LPZ-INDIRIZZO LPM-PAZ-INDI
S94-LPZ-DATA-NASCITA 0
S94-LPZ-TELEFONO " "
S94-FUN "write"

C.1.4 - Creazione LODCMTES

Dato Contenuto
LCT-NUM LPM-COD
LCT-CHIA2 LPM-CHIA1
LCT-FL-DA-SPEDIRE "N"
LCT-STATO-IMPEGNO "N"
LCT-RESP 0
LCT-CASSETTA " "
LCT-COEFF 0
LCT-DST-ID 0
LCT-CASSETTA APRT-CASSETTA

C.1.4 - Creazione LODCMAGG

Dato Contenuto
LCG-COD LPM-NUM
LCG-CP-TIP APRT-PRESCR-TIP
LCG-CP-COD APRT-PRESCR-COD
LCG-DISTRETTO " "
LCG-COM-4 LPM-NUM
LCG-COM-5 LPM-NUM
LCG-IMP-PREVENTIVO 0
LCG-DIVISA W-CURRENCY-CONTO
LCG-OPE-INS 0
LCG-ORA-INGRESSO Ora di sistema

C.1.5 - Altri dati commessa C.1.5.1 - Creazione LODCMAG2

Dato Contenuto
LC2-COD LPM-NUM
LC2-ID-PRESCR APRT-ID
LC2-DATA-PREN APRT-DATA-PREN
LC2-DATA-CONS-EFF APRT-CONS-EFF-DATA
LC2-ORA-CONS-EFF APRT-CONS-EFF-ORA

C.1.5.2 - Note dispositivo

Dato Contenuto
LDE-TIP "T1"
LDE-COD LPM-NUM
LDE-PRO 1
LDE-DES APRT-NOTE-DISPOSITIVO
LDE-LEN Lunghezza effettiva delle note (Si può usare GESSTR)

C.1.6 - Acquisizione articoli Effettuare una ricerca dei record presenti su ARPPRESCRART per la prescrizione, con la query SELECT * FROM ARPPRESCRART WHERE apra_azi = azienda AND apra_id = Id prescrizione (ARPT-ID) Per ciascun record trovato inserire un record su LODCMART:

Dato Contenuto
LCA-COMMESSA LPM-NUM
LCA-PROG APRA-PROG
LCA-FL-CANC " "
LCA-ARTICOLO APRA-ARTICOLO
LCA-QTA APRA-QTA
LCA-DENTI APRA-DENTI
LCA-PROVENIENZA "W"

C.1.6.1 - Aggiornamento tipo dispositivo commessa Aggiornare LODPRESC, impostando il tipo dispositivo collegato al primo articolo selezionato. * Ricerca della categoria dell'articolo collegata a classe-categoria * Il codice categoria trovato rappresenta il tipo dispositivo C.1.7 - Acquisizione documenti Effettuare una query per estrarre tutti i documenti provvisori collegati alla prescrizione: SELECT * FROM apcogaridx WHERE a_arx_azienda = azienda AND a_arx_id_dispositivo > 0 AND a_arx_fl_canc <> 'C' AND (a_arx_doc_classe = 'PT' or a_arx_doc_classe like 'L%') AND a_arx_key_oggetto_dest = '_LP+aprt_id' Per ciascun documento trovato: C.1.7.1 - Modifica riferimento gestionale Usando una query diretta (per non perdere il puntatore sul ciclo) modificare il riferimento alla prescrizione: _UPDATE apcogaridx set a_arx_key_oggetto_dest = '_lpm-num' WHERE_ _arx_azienda = azienda AND a_arx_id_dispositivo = A-ARX-ID-DISPOSITIVO AND a_arx_idd_prog \= A-ARX-IDD-PROG C.1.7.2 - Acquisizione indici e modifica documento remoto Effettuare una chiamata a COGU06:

Dato Contenuto
U06-OPE "ACQ-PROVV-REMOTO"
U06-ID-DISPOSITIVO A_ARX_ID_DISPOSITIVO
U06-IDD-PROG A_ARX_IDD_PROG
U06-PATH-DOCUMENTO labod/PR+aprt-id

Il programma restituirà U06-ESITO = "OK" se l'operazione è andata a buon fine. Altrimenti restituirà un messaggio di errore in U06-MSG C.1.7.3 - Creazione raccordo Inserire un record su LODRACCO, solo per la classse "PT" (a_arx_doc_classe)

Dato Contenuto
LRC-TIP "PI"
LRC-KEY-1 Numero commessa
LRC-KEY-2 U06-PROG-DOCUMENTO su 10 cifre
LRC-LEN 50
LRC-DATI Unire:
- A-ARX-DES su 40 caratteri
- A-ARX-DATA-ARC su 8 caratteri
- "PT"

Il programma restituirà U06-ESITO = "OK" se l'operazione è andata a buon fine. Altrimenti restituirà un messaggio di errore in U06-MSG C.1.9 - Aggiornamento ARPPRESCRTES Al termine dell'importazione ci sono alcune informazioni da aggiornare:

Dato Contenuto
APRT-COMM LPM-NUM
APRT-AGG-APP " "

C.2 - Aggiornamento prescrizione esistente In questo caso per il momento verrà effettuata solo l'acquisizione dei documenti remoti che sono stati aggiunti alla commessa successivamente C.2.6 - Acquisizione documenti Effettuare una query per estrarre tutti i documenti provvisori collegati alla prescrizione: SELECT * FROM apcogaridx WHERE a_arx_azienda = azienda AND a_arx_id_dispositivo > 0 AND a_arx_fl_canc <> 'C' AND (a_arx_doc_classe = 'PT' or a_arx_doc_classe like 'L%') AND a_arx_key_oggetto_dest = '_LP+aprt_id' Per ciascun documento trovato: C.2.6.1 - Modifica riferimento gestionale Usando una query diretta (per non perdere il puntatore sul ciclo) modificare il riferimento alla prescrizione: _UPDATE apcogaridx set a_arx_key_oggetto_dest = '_lpm-num' WHERE_ _arx_azienda = azienda AND a_arx_id_dispositivo = A-ARX-ID-DISPOSITIVO AND a_arx_idd_prog \= A-ARX-IDD-PROG C.2.6.2 - Acquisizione indici e modifica documento remoto Effettuare una chiamata a COGU06:

Dato Contenuto
U06-OPE "ACQ-PROVV-REMOTO"
U06-ID-DISPOSITIVO A_ARX_ID_DISPOSITIVO
U06-IDD-PROG A_ARX_IDD_PROG
U06-PATH-DOCUMENTO labod/PR+aprt-id

Il programma restituirà U06-ESITO = "OK" se l'operazione è andata a buon fine. Altrimenti restituirà un messaggio di errore in U06-MSG C.2.6.3 - Creazione raccordo Inserire un record su LODRACCO, solo per la classse "PT" (a_arx_doc_classe)

Dato Contenuto
LRC-TIP "PI"
LRC-KEY-1 Numero commessa
LRC-KEY-2 U06-PROG-DOCUMENTO su 10 cifre
LRC-LEN 50
LRC-DATI Unire:
- A-ARX-DES su 40 caratteri
- A-ARX-DATA-ARC su 8 caratteri
- "PT"

Il programma restituirà U06-ESITO = "OK" se l'operazione è andata a buon fine. Altrimenti restituirà un messaggio di errore in U06-MSG

C2-ACQUISIZIONE AVANZAMENTO

Acquisizione avanzamenti

Questa sezione si basa sulla lettura della tabella ARPLODCMAVANZ: a valle di questa ci sono altre tabelle che contengono, per ciascuna sessione di avanzamento: * Gli operatori che hanno effettuato l'avanzamento (ARPLODCMAVAOP) * Le prestazioni avanzate (ARPLODCMAVAPR)

Importazione prestazioni avanzate

Per ciascuna prestazione qui il programma legge le fasi collegate alla prestazione su ARPLODCMFASI. Per ciascuna esegue C2-AVANZA-FASE-COMMESSA

C2-AVANZA-FASE-COMMESSA

Per ciascuna fase viene creato o aggiornato: * LODCMDET * LODCMRIG * Stato commessa su LODCMTES

Importazione quantita' avanzata (27/05/2025 - TASK-1241)

Ora, se la quantita' indicata sulla prestazione e' 0, sul web sara' possibile impostare la quantita', che qui dovra' essere importata. Quindi, posizionati su ciascuna fase della prestazione (LODCMRIG), cerchiamo tutti i record collegati alla fase di LODPNMAT, con LMT-TIP = 'P' Se ne troviamo 1 con LMT-PRS-ID = A-LCAP-PRS-ID, questo e' il record su cui aggiornare la quantita': LMT-QTA La quantita' va prelevata dal record "prestazione" ARPLODCMPREST: * A-LCP-AZIENDA * A-LCP-COMMESSA * A-LCP-PRS-ID

L'aggiornamento avviene solo se la quantita' indicata sul web e' diversa da zero. In questo caso il valore viene trasferito direttamente su LODPNMAT.

C.2.1 - Registrazione commesse avanzate

Durante il ciclo di avanzamento, salvare su una tabella interna l'elenco delle commesse interessate all'avanzamento (500 elementi). Se il numero commesse supera la dimensione, emettere una segnalazione critica e proseguire

C.2.2 - Tracciamento fasi toccate

Durante il ciclo di avanzamento di una commessa, le fasi (righe di LODCMRIG) che vengono create o aggiornate vengono registrate in una tabella interna di working storage c2-tabella-fasi-toccate (max 50 elementi). Ogni fase viene registrata senza duplicati: prima di inserire una nuova voce si verifica che il numero fase non sia gia' presente.

C.2.3 - Scarico materiali su magazzino (COGZ60NO)

Al termine del ciclo di avanzamento per ciascuna commessa, per ogni fase registrata in c2-tabella-fasi-toccate viene eseguita una chiamata a COGZ60NO per effettuare lo scarico dei materiali su magazzino.

La struttura dei parametri e' definita dalla copybook utilz60.cpy. I campi impostati sono:

Campo Contenuto
z60-tip "M" (materiali)
z60-com Codice commessa in elaborazione
z60-riga Numero fase (dalla tabella c2-tabella-fasi-toccate)

La chiamata avviene tramite CALL "COGZ60NO".

C3 - Acquisizione note di avanzamento

Rileggere la tabella "commesse avanzate", per ciascuna: * Leggere le note interne della commessa (da loddescr, tipo T2) * Tenere solo la parte di note prima della riga di separazione "--NOTE AVANZAMENTO--" * Scorrere le prestazioni della commessa su ARPLODCMPREST * Per ciascuna, accodare le note alle note interne, mettendo prima la riga di separazione , che va messa solo se ci sono note di avanzamento * Scrivere il tutto su loddescr tipo T2

B - Esportazione informazioni aggiornate

  • ID SINCRO: gestito
  • Esportazione differenziale: gestita e non ottimizzata,
  • Cancellazione logica: non gestita In questa fase si dovrà tenere conto di
  • Limite record
  • Limite errori
  • "Esporta tutto" B.1 - Stato sincronizzazione Sulla tabella APSTATOSYN, leggere il record relativo alla tabella/oggetto da sincronizzare "ARPPRESCRTES"; se il record non esiste, crearlo impostando
Dato Contenuto
A_SYN_AZIENDA Codice azienda
A_SYN_TABELLA "ARPPRESCRTES"
A_SYN_DA_GES_DATA 0
A_SYN_DA_GES_ORA 0
A_SYN_DA_ID_SINCRO 1
A-SYN-VERSIONE 2

Qui otterremo due informazioni importanti: * Data/ora ultima esportazione da gestionale a postgres (A_SYN_DA_GES_DATA e A_SY_DA_GES_ORA) * Prossimo ID sincronizzazione da memorizzare sulla tabella (A_SYN_ID_SINCRO) B.2 - Ricerca record da esportare B.2.1 Ricerca record da esportare

Tipo di elaborazione Condizione Cosa fare
Singolo record AGPRG-KEY <> " " Si legge direttamente la commessa da esportare su LODCMTES
Verrà eseguita se agg-postgres-online è attiva
Se viene sincronizzato un record cancellato, verrà effettuata la cancellazione logica
Esportazione totale AGPRG-ESPORTA-TUTTO = "S" B.2.1.1
Esportazione standard B.2.2.2
Pulizia AGPRG-OPE = "PULIZIA" Si esegue il punto B.3

NB: Per ora limitiamo l'esportazione delle commesse a quelle che hanno data inserimento al di sopra di una data configurata data-prima-exp-commesse Se la data non è significativa l'esportazione non avrà luogo. B.2.1.1 Esportazione totale Scorrere tutti i record di LODCMTES; per ciascuno leggere i record collegati: * LODPRESC * LODCMAGG * LODCMAG2 B.2.1.2 Esportazione standard (differenziale) Eseguire una start su LODCMAG2, impostando LC2-FL-ESPORTATA = " " Scorrere tutti i record di LODCMTES; per ciascuno leggere i record collegati: * LODPRESC * LODCMTES * LODCMAGG B.2.2 Filtri Nessun filtro ulteriore B.2.3 Verifica ed esportazione record Una commessa generalmente nasce su gestionale. In questo caso si avrà LC2-ID-PRESCRIZIONE numerico e = 0 Se invece viene acquisita da Odontoconnect il campo LC2-ID-PRESCRIZIONE è > 0.

Quindi, per avere la certezza della congruenza dei dati, faremo sempre la ricerca in entrambi i modi: B.2.3.1 Ricerca con numero commessa Start su ARPPRESCRTES, con APRT-CHIA3

Dato Contenuto
APRT-AZI Codice azienda
APRT-COMM LC2-COD

Potrà esistere al massimo 1 record con queste informazioni B.2.3.2 Ricerca con id prescrizione Se LC2-ID-PRESCRIZIONE è significativo, ricerca diretta su ARPPRESCRTES, con APRT-CHIA1

Dato Contenuto
APRT-AZI Codice azienda
APRT-ID LC2-ID-PRESCRIZIONE

In questo caso se LC2-ID-PRESCRIZIONE è significativo, il record deve esistere B.2.3.3 Confronto dei risultati Le situazioni possibili sono:

Ricerca con PRESCRIZIONE Esito ricerca con prescrizione Esito ricerca con COMMESSA Operazione Note
Non effettuata Non trovata Inserimento Situazione normale di commessa non ancora esportata
Non effettuata Trovata Aggiornamento Situazione anomala: segnalare con un errore critico e procedere con l'aggiornamento
Aggiornare LODCMAG2 collegando LC2-ID-PRESCRIZIONE con APRT-ID
Effettuata Non trovata Non trovata Commessa importata da Odontoconnect, ma la prescrizione su WEB non è stata trovata.
Situazione che non dovrebbe verificarsi. Segnalare con errore critico cliente
Non fare nulla, ma non nemmeno marcare la commessa come esportata
Effettuata Non trovata Trovata Commessa importata da Odontoconnect, ma ora risulta collegata ad una prescrizione diversa.
Situazione che non dovrebbe verificarsi. Segnalare con errore critico cliente
Non fare nulla, ma nemmeno marcare la commessa come esportata
Effettuata Trovata Trovata (stessa prescrizione) Aggiornamento Situazione normale di commessa acquisita da Odontoconnect, oppure creata da Area e già esportata normalmente
Effettuata Trovata Trovata (prescrizione diversa) Commessa importata da Odontoconnect, ma ora risulta collegata ad una prescrizione diversa.
Situazione che non dovrebbe verificarsi. Segnalare con errore critico cliente
Non fare nulla, ma nemmeno marcare la commessa come esportata

In base al riscontro della tabella precedente, procedere con l'esportazione di una nuova commessa o l'aggiornamento. Anche per questo programma procedere con l'eventuale aggiornamento solo in base al confronto delle informazioni da aggiornare sui record di destinazione, quindi se c'è una effettiva modifica. Suggerimento Invece di popolare direttamente i dati del record di destinazione, portarli su delle copie in w/s. Al termine confrontare i dati sulla destinazione con la copia in w/s. Inserimento Se necessario effettuare l'esportazione di una nuova commessa, l'unica differenza da sottolineare rispetto all'inserimento è che è necessario attribuire un numero random a APRT-ID, usando l'apposita funzione "FUNCTION RANDOM" (vedi altri programmi che la usano). Dopo aver attribuito il numero random effettuare subito la scrittura del record: se fallisce, tentare la ricerca di un nuovo numero random. Durante l'inserimento del record impostare

Dato Contenuto
APRT-AZI Codice azienda
APRT-ID ID Prescrizione
APRT-MITT-TIP "G"
APRT-MITT-ID LC2-DI-OPE
APRT-PROVENIENZA "A"

Aggiornamento Dopo l'eventuale inserimento, procedere con l'aggiornamento del record ARPPRESCRTES Questo dovrà avvenire se: * Uno dei campi da confrontare è diverso * E' stata richiesta l'elaborazione totale * Una delle tabelle figlie risulta da esportare (vedi B.4)

Dato Contenuto Confronto?
APRT-AZI Codice azienda
APRT-ID ID Prescrizione
APRT-COMM LC2-COD
APRT-ANA "C"+LCT-MED Si
APRT-DATA-INS LPM-DATA Si
APRT-DATA-PRESCR LPM-DATA Si
APRT-NUM-PRESCR LPM-COD Si
APRT-MEDICO LPM-MEDICO Si
APRT-NOME-PAZIENTE LPM-PAZ-ESTESO Si
APRT-NOTE-DISPOSITIVO Note trovate su LODDESCR, con tipo "T1" Si(*)
APRT-DATA-PREN LC2-DATA-PREN Si
APRT-DATA-CONS LPM-DATA-CNS Si
APRT-ORA-CONS LPM-ORA-CNS Si
APRT-FL-CANC " " Si
APRT-STATO LPM-STATO
Viene esclusa l'esportazione di questo dato se



B.4.4

Si
APRT-FL-STAMPA-PDF
APRT-AGG-APP
APRT-ID-SINCRO Ultimo ID Sincro + 1
NB: Aggiornare l'id sincro su APSTATOSYN ad ogni commessa esportata
APRT-PRESCR-TIP LCG-CP-TIP
APRT-PRESCR-COD LCG-CP-COD
APRT-CASSETTA LCT-CASSETTA
APRT-CONS-EFF-DATA LC2-DATA-CONS-EFF
APRT-CONS-EFF-ORA LC2-ORA-CONS-EFF

(*) Questi campi dovranno essere parsati con GESSTR prima del confronto

B.4 Controllo ed esportazione tabelle figlie Durante la fase di controllo iniziale, dobbiamo verificare se sono stati aggiunti o cancellati documenti sulla commessa: questo sarà una condizione che attiva l'esportazione, anche se non ci sono modifiche alla parte di testata. Usare quindi una tabella di working che conterrà i record di APCOGARIDX collegati alla commessa. Vedi ad esempio TAB-PRESTAZIONI-ESEGUITE-INTERVENTO su SWN037 Questa fase dovrà essere precedente all'esportazione della testata vera e propria: all'interno delle sezioni di aggiornamento delle singole tabelle figlie verrà alzato un flag che permette di capire se è stato effettuato un aggiornamento su almeno una tabella figlia, e di conseguenza aggiornare anche la testata anche se non è stata aggiornata direttamente: lo scopo finale di questo ragionamento è che sulla commessa in questo caso verrà aumentato l'id sincro Questo metodo è quello usato per l'esportazione in SWN037, e permette proprio la massima efficienza nel controllo di cosa deve essere esportato, per evitare aggiornamenti inutili, e di conseguenza da parte dell'APP di importazioni inutili. B.4.1 Controllo ed esportazione articoli In questa fase si dovrà: * Esportare le nuove righe * Aggiornare le righe modificate (comprese le righe cancellate logicamente Se si verifica una di queste condizioni, alzare un flag che consenta anche l'esportazione della testata

Per ciascuna riga da esportare (nuova o modificata):

Dato Contenuto
APRA-AZI Codice azienda
APRA-ID Id prescrizione in elaborazione
APRA-PROG LCA-PROG
APRA-FL-CANC LCA-FL-CANC
APRA-ARTICOLO LCA-ARTICOLO
APRA-QTA LCA-QTA
APRA-DENTI LCA-DENTI

B.4.1.1 Controllo ed esportazione sottoarticoli e impegni Verranno esportate le tabelle: - LODCMASV -> ARPLODCMASV - LODCMASI -> ARPLODCMASI B.4.2 Controllo ed esportazione documenti Questa fase va eseguita sia in caso di l'archiviazione remota configurata: archiviazione-remota = "S" che non, ma si comporterà in modo diverso a seconda della situazione Diamo per scontato in questo caso che se è attiva, siano state attivate tutte le classi documento relative alla commessa di laboratorio). In questa fase si dovrà: * Esportare i nuovi documenti * Cancellare i documenti non più presenti Se si verifica una di queste condizioni, alzare un flag che consenta anche l'esportazione della testata B.4.2.1 Controllo ed esportazione documenti I documenti presenti sulla commessa sono trovati attraverso una start su LODRACCO, impostando:

Dato Contenuto
LRC-TIP "PI"
LRC-KEY-1 Numero commessa

Per ciascun record effettuare una chiamata a COGU06, con operazione "Cerca-esistenza-doc", impostando

Dato Contenuto
U06-TIP-DOC LRC-DATI (49:2)
U06-DOC-COGE Vedi COGZ51, procedura A21-IMPOSTA-DOCUMENTO-COGU06

Questa chiamata dovrebbe restituire in U06-PROGRESSIVO il progressivo di archiviazione del documento, con cui cercare il corrispondente record su APCOGARIDX:

Dato Contenuto
A-ARX-AZIENDA Azienda
A-ARX-ID-DISPOSITIVO 0
A-ARX-IDD-PROG 0
A-ARX-PROGRESSIVO U06-PROGRESSIVO

Se non trovato: B.4.2.1.1 Esportazione nuovo documento Questa condizione sarà vera solo in caso di archiviazione locale: in caso di archiviazione remota il record APCOGARIDX è già presente Effettuare una chiamata a COGU06:

Dato Contenuto
U06-OPE "ESPORTA-SU-WEB"
U06-PROGRESSIVO Progressivo di documento da esportare

Se l'esito non è positivo mandare una segnalazione critica B.4.2.1.2 Nuovo record su ARPCHATMSG Se non ancora presente, dobbiamo aggiungere ad ARPCHATMSG un record che attesta l'inserimento del documento. Questa operazione va fatta solo per i documenti creati da gestionale; quindi solo se A-ARX-ID-DISPOSITIVO-ORIG > 0 Quindi come prima cosa, tramite una query specifica, verifichiamo l'esistenza di un record che risponda ai seguenti requisiti:

Dato Contenuto
A-CHT-AZIENDA Codice azienda
A-CHT-OGGETTO "PR"+Id prescrizione
A-CHT-OPE " "
A-CHT-PROGRESSIVO A-ARX-PROGRESSIVO

Se non esiste, proseguire inserendo un record su ARPCHATMSG:

Dato Contenuto
A-CHT-AZIENDA Codice azienda
A-CHT-OGGETTO "PR"+Id prescrizione
A-CHT-PROG Ultimo id esistente per l'oggetto + 1
A-CHT-MITT-TIP "G"
A-CHT-MITT-ID WO-OPER
A-CHT-OPE " "
A-CHT-THREAD 0
A-CHT-TIP "A"
A-CHT-CONTENT " "
A-CHT-ID-DISPOSITIVO 0
A-CHT-IDD-PROG 0
A-CHT-PROGRESSIVO A-ARX-PROGRESSIVO

B.4.3 Cancellazione documenti remoti eliminato da gestionale Dando per scontato che un eventuale nuovo documento sulla commessa sia stato già acquisito nella fase precedente, per verificare se esistono documenti ufficiali eliminati effettuare una query su APCOGARIDX: SELECT * FROM apcogaridx WHERE a_arx_azienda = azienda AND a_arx_id_dispositivo = 0 AND (a_arx_doc_classe = 'PT' or a_arx_doc_classe like 'L%') AND a_arx_key_oggetto_dest = '_commessa'_ In caso di archiviazione remota una cancellazione da gestionale del documento avrà effettuato anche la cancellazione logica su questa tabella. Quindi proseguire in ogni caso con la ricerca su COGARIDX

Dato Contenuto
ARX-PROGRESSIVO A-ARX-PROGRESSIVO

Se il record non esiste effettuare la cancellazione logica del documento su APCOGARIDX, impostando

Dato Contenuto
A-ARX-FL-CANC "C"

(se non è già cancellato logicamente) Quindi, proseguiamo solo se a questo punto il record è cancellato logicamente: Verifichiamo l'esistenza di un record che risponda ai seguenti requisiti:

Dato Contenuto
A-CHT-AZIENDA Codice azienda
A-CHT-OGGETTO "PR"+Id prescrizione
A-CHT-OPE "C"
A-CHT-PROGRESSIVO A-ARX-PROGRESSIVO

Se non esiste proseguire inserendo un record su ARPCHATMSG:

Dato Contenuto
A-CHT-AZIENDA Codice azienda
A-CHT-OGGETTO "PR"+Id prescrizione
A-CHT-PROG Ultimo id esistente per l'oggetto + 1
A-CHT-MITT-TIP "G"
A-CHT-MITT-ID WO-OPER
A-CHT-OPE "C"
A-CHT-THREAD 0
A-CHT-TIP "A"
A-CHT-CONTENT " "
A-CHT-ID-DISPOSITIVO 0
A-CHT-IDD-PROG 0
A-CHT-PROGRESSIVO A-ARX-PROGRESSIVO

B.4.4 Notifica "Commessa evasa" Quando la commessa da esportare è "Evasa" e sul db invece non lo è, si deve inserire una notifica specifica su ARPNOTIFICHE:

Dato Contenuto
ANTP-AZI Azienda attiva
ANTP-CLASSE "LO"
ANTP-ID-OGGETTO Codice commessa
ANTP-ID-TECNICO 0
ANTP-TIP 1
ANTP-ESITO 0

B.4.5 Controllo ed esportazione raccordo con ddt/buoni (aggiornamento 08/05/2025)

In questa fase si dovra': * Esportare i nuovi raccordi * Cancellare i raccordi non piu' presenti Se si verifica una di queste condizioni, alzare un flag che consenta anche l'esportazione della testata. I documenti di magazzino collegati alla commessa sono registrati su COGRACBB

Dato Contenuto
RBB-TIP "CD"
RBB-A-BOL Codice commessa

Per ciascun record trovato inserire un record su ARPRACCORDI, o se presente, aggiornarlo

Dato Contenuto
A-RAC-AZIENDA Codice azienda
A-RAC-P-DOC-CLASSE K-DOC-TIP-COMM-LAB
A-RAC-P-DOC-KEY Codice commessa
A-RAC-F-DOC-CLASSE K-DOC-TIP-MAG-CLIENTE
A-RAC-F-DOC-KEY RBB-B-BOL
A-RAC-VAL " "

I record non piu' esistenti vanno cancellati logicamente

B.4.5.1 Verifica esistenza documento archiviato

Per ogni raccordo inserito/aggiornato, verificare se esiste un documento archiviato sul documento di uscita tramite query:

SELECT * from APCOGARIDX WHERE A_ARX_AZIENDA = azienda AND A_ARX_DOC_CLASSE = 'BU' AND A_ARX_DOC_OGGETTO_GEST = documento

B.4.5.2 Nuovo record su ARPCHATMSG

Se il documento archiviato esiste e si e' inserito un nuovo record su ARPRACCORDI, aggiungere ad ARPCHATMSG un record di notifica (se non gia' presente). La struttura e' identica a quella gia' sviluppata per i documenti collegati alla commessa (B.4.2.1.2).

B.4.6 Esportazione prestazioni/materiali/fasi (aggiornamento 08/05/2025)

Utilizza un file di transito temporaneo (clone di ARPLODCMPREST) per staging dei dati. Per ogni commessa esportata:

  1. Scorre le prestazioni della commessa (LODCMRIG)
  2. Per ciascuna, esporta su ARPLODCMPREST con sequenza progressiva (b45-lcp-seq)
  3. Esporta le fasi collegate (ARPLODCMFASI)
  4. Esporta i materiali collegati (ARPLODCMMAT)
  5. Traccia le corrispondenze tramite ID sequenziale

Le tabelle coinvolte: LODCMRIG → ARPLODCMPREST, LODPNRIG → ARPLODCMFASI, LODPNMAT → ARPLODCMMAT.

B.X Chat Follow Activation (aggiornamento 07/10/2025 - TASK-2226)

Quando una nuova commessa viene creata o quando il tipo dispositivo (TIP-DSP) passa da vuoto a valorizzato:

  1. Scrive su ARPPRESCRDET un record con APRD-KEY = 'ACTIVATE_FOLLOW' e APRD-DATO-X = '1'
  2. Chiama il daemon via CURL su /gestionale/attiva_follow.php per creare la struttura di chat
  3. La configurazione AZIONE-INIZIALE-AUTOMATICA controlla l'abilitazione di questa funzionalita'

Questo attiva automaticamente il "follow" (thread di discussione) per la chat della commessa sul web

B.9 - Aggiornamento id syncro Al termine dell'elaborazione, aggiornare il record APSTATOSYN:

Dato Contenuto
A-SYN-AZIENDA Codice azienda
A-SYN-TABELLA "ARPPRESCRTES"
A-SYN-DA-GES-DATA Data/ora dell'ultimo record aggiornato
A-SYN-DA-GES-ORA
A-SYN-DA-ID-SINCRO Ultimo id sincro + 1
A-SYN-VERSIONE 2

D - Cancellazione completa commessa Scorrere COGEVLOG per gli eventi di tipo "002" (vedi SWL001) Per ciascun record esistente: D.1 - Cancellazione commessa Cercare la prescrizione collegata alla commessa, leggendo ARPPRESCRTES, usando APRT-CHIA3 - APRT-AZI - APRT-COMM (EVL-CHIAVE, primi 10 caratteri) Si trova il primo record contenente APRT-ID che è l'id prescrizione Effettuare la cancellazione di tutti i record collegati alla prescrizione: * Documenti archiviati (D.2.1) * ARPCHATMSG * Start impostando: * A-CHT-AZIENDA * A-CHT-OGGETTO = "PR"+APRT-ID * ARPPRESCRART * Start impostando: * APRA-AZI * APRA-ID = APRT-ID * ARPPRESCRTES D.1.1 - Rimozione documenti archiviati In questa situazione - commessa già cancellata lato gestionale - a prescindere dalla modalità di archiviazione lato web posso trovare: * I record di APCOGARIDX, cancellati logicamente o meno * I documenti su AWS, se l'archiviazione è locale Tramite una query cercare tutti i documenti collegati alla prescrizione: SELECT * FROM apcogaridx WHERE a_arx_azienda = azienda AND (a_arx_doc_classe = 'PT' or a_arx_doc_classe like 'L%') AND a_arx_key_oggetto_dest = '_commessa'_ Per ciascun documento trovato: * Ricerca e cancellazione del documento su AWS, se presente, in base al percorso trovato su APCOGARIDX -> In questo caso non segnalo nessun errore in caso di operazione fallita, perchè il documento potrebbe essere stato rimosso * Cancellazione fisica del record APCOGARIDX D.9 - Rimozione evento Al termine, se EVL-ELABORATO-1: * \= "S": cancellare il record * <> "S": aggiornare il record impostando EVL-ELABORATO-2 = 'S'

Utilità

Query di controllo

Questa query permette di capire se ci sono record di arpchatmsg con lo stesso a_cht_progressivo (la chiave del documento archiviato) a fronte di commesse diverse Se succede cercare di analizzare il log di processo per la commessa e vedere se rimane omogeneo il codice commessa

SELECT a_cht_azienda, a_cht_progressivo,STRING_AGG(a_cht_timestamp::text, ', ' ORDER BY a_cht_timestamp) as data_c, COUNT(a_cht_progressivo)
        FROM arpchatmsg
        WHERE a_cht_ope <> 'C'
        GROUP BY a_cht_azienda, a_cht_progressivo
        HAVING COUNT(a_cht_progressivo) > 1
        ORDER BY data_c DESC

Query successive di analisi dei dati

Ricerca delle commesse collegate ai documenti che hanno evidenziato il problema (da daemon di controllo di Nat)

select * from arpprescrtes where aprt_azi = 'C02010' and aprt_id in (
    SELECT SUBSTRING(a_cht_oggetto FROM 3)::BIGINT
        FROM arpchatmsg
        WHERE a_cht_azienda = 'C02010'
        AND a_cht_progressivo = 3660278
    )

Storico Modifiche Recenti

Build Data Descrizione
2025/0223 28/05 TASK-1241: importazione quantita' avanzata — aggiornamento sempre della qta proveniente da WEB
2025/0321 13/10 Chiamata al demone per creazione struttura follow chat in caso di commessa nuova o modifica tipo dispositivo
2025/0414 01/12 TASK-2551: importazione note di avanzamento; log aggiuntivo per diagnosi collegamento allegati errati

Storico modifiche

Logica nome paziente generalizzata e scarico materiali per fase (aprile 2026)

  1. Nome paziente: rimossa la condizione az-personal = "GL" che applicava la logica invertita nome/codice fiscale paziente solo alla personalizzazione Rota. La logica (se nome paziente vuoto usa CF, altrimenti usa nome) e' ora applicata a tutti i clienti.

  2. Scarico materiali per fase avanzata: durante l'avanzamento fasi commessa (sezione C2), le fasi toccate vengono registrate in una tabella (c2-tabella-fasi-toccate, max 50, senza duplicati). Al termine dell'avanzamento, per ogni fase toccata viene chiamato COGZ60NO con parametro z60-tip = "M" per generare i movimenti di magazzino dei materiali associati. Aggiunta copy "utilz60.cpy".

  3. Export fasi prestazione filtrato: l'esportazione delle fasi prestazione (b45-esporta-fasi-prestazione) viene ora eseguita solo per le righe con stato "N" (non avanzata) o spazio, coerentemente con la delete precedente che filtra lo stesso criterio. | 2025/0464 | 19/12 | TASK-2169: inversione logica importazione nome paziente; composizione oggetto ARPCHATMSG senza zero iniziale per prescrizioni < 11 cifre | | 2026/0037 | 09/02 | Correzione per evitare di creare record ARPCHATMSG alla commessa errata | | 2026/0426 | 19/04 | Aggiunta tabella c2-tabella-fasi-toccate per tracciamento fasi avanzate (max 50, senza duplicati); al termine dell'avanzamento commessa, chiamata a COGZ60NO per ciascuna fase toccata per scarico materiali su magazzino. Aggiunta copybook utilz60.cpy | | 2026/0604 | 03/06 | TASK-4649: APRT-DATA-INS ora viene composta concatenando la data prescrizione (LPM-DATA) con l'ora di inserimento (LC2-DI-TIME da LODCMAG2), invece di forzare sempre 00:00:00.000000. Aggiunta variabile di redefine w-di-time (hh/mm/ss/cc). | | 2026/0604 | 03/06 | Logica nome paziente generalizzata anche per NEXXTA (rimossa condizione az-personal = "GL"): per tutti i clienti, se aprt-nome-paziente e' vuoto si usa aprt-cf-paziente, altrimenti si usa il nome. | | 2026/0604 | 03/06 | b45-esporta-fasi-prestazione eseguito solo per righe con t-lcp-stato = "N" o spazio, coerentemente con la delete precedente che filtra in (' ','N'). Evita di sovrascrivere prestazioni gia' avanzate. |


Casistica problemi noti

ROTA OC: modifica materiali liberi su prestazioni avanzate (maggio 2026)

  • Sintomo: cancellando una prestazione gia' evasa da Areagate e ricreandola, il nuovo record assumeva un nuovo id; se invece la prestazione veniva ricreata identica prima dell'esportazione, veniva riaperta con lo stesso id. Comportamento incoerente che impediva la modifica dei materiali "liberi" inseriti dal tecnico, causando disallineamenti in stampa scheda commessa e in DC.
  • Causa: SWN117 ricostruiva integralmente le prestazioni avanzate da ARPLODCMAVAN. Lato web non era prevista una modifica differenziale dei materiali ARPLODCMMAT su prestazione gia' avanzata: l'unico modo per correggere un materiale era cancellare e ricreare la prestazione, con cambio id e perdita di coerenza.
  • Correzione: introdotto canale di modifica differenziale dei materiali. Lato web la modifica scrive direttamente su ARPLODCMMAT e marca ARPLODCMAVAN con a_lca_agg_app = "M" (avanzamento precedente modificato). SWN117 in import riconosce il marcatore e acquisisce solo le modifiche ai materiali, mantenendo l'id della prestazione avanzata.
  • Riferimento: dettaglio - Task ClickUp 869ay30a8

Estratto da documentazione interna ClickUp