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:
- Scorre le prestazioni della commessa (LODCMRIG)
- Per ciascuna, esporta su ARPLODCMPREST con sequenza progressiva (
b45-lcp-seq) - Esporta le fasi collegate (ARPLODCMFASI)
- Esporta i materiali collegati (ARPLODCMMAT)
- 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:
- Scrive su ARPPRESCRDET un record con
APRD-KEY = 'ACTIVATE_FOLLOW'eAPRD-DATO-X = '1' - Chiama il daemon via CURL su
/gestionale/attiva_follow.phpper creare la struttura di chat - La configurazione
AZIONE-INIZIALE-AUTOMATICAcontrolla 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)¶
-
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. -
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 chiamatoCOGZ60NOcon parametroz60-tip = "M"per generare i movimenti di magazzino dei materiali associati. Aggiuntacopy "utilz60.cpy". -
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 tabellac2-tabella-fasi-toccateper tracciamento fasi avanzate (max 50, senza duplicati); al termine dell'avanzamento commessa, chiamata aCOGZ60NOper ciascuna fase toccata per scarico materiali su magazzino. Aggiunta copybookutilz60.cpy| | 2026/0604 | 03/06 | TASK-4649:APRT-DATA-INSora viene composta concatenando la data prescrizione (LPM-DATA) con l'ora di inserimento (LC2-DI-TIMEda LODCMAG2), invece di forzare sempre00:00:00.000000. Aggiunta variabile di redefinew-di-time(hh/mm/ss/cc). | | 2026/0604 | 03/06 | Logica nome paziente generalizzata anche per NEXXTA (rimossa condizioneaz-personal = "GL"): per tutti i clienti, seaprt-nome-pazientee' vuoto si usaaprt-cf-paziente, altrimenti si usa il nome. | | 2026/0604 | 03/06 |b45-esporta-fasi-prestazioneeseguito solo per righe cont-lcp-stato = "N"o spazio, coerentemente con la delete precedente che filtrain (' ','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