| [613] | 1 | PSXRSUS ;BIR/WPB,BAB,HTW-CMOP Transmission Handler ;15 Dec 2001 | 
|---|
|  | 2 | ;;2.0;CMOP;**2,3,24,23,26,28,41,57,48**;11 Apr 97 | 
|---|
|  | 3 | ;Reference to ^PS(52.5 supported by DBIA #1978 | 
|---|
|  | 4 | ;Reference to ^PS(59   supported by DBIA #1976 | 
|---|
|  | 5 | ;Reference to routine DEV1^PSOSULB1 supported by DBIA #2478 | 
|---|
|  | 6 | ; | 
|---|
|  | 7 | ;Select CMOP Rx data from File 52.5,build HL7 segments, | 
|---|
|  | 8 | ;and transmit data | 
|---|
|  | 9 | ; This routine is called from PSOSULB1 'Print from Suspense' | 
|---|
|  | 10 | ; | 
|---|
|  | 11 | START I '$D(^XUSEC("PSXCMOPMGR",DUZ)) W !,"You are not authorized to use this option!" Q | 
|---|
|  | 12 | I '$D(^XUSEC("PSX XMIT",DUZ)) W !,"You are not authorized to use this option!" Q | 
|---|
|  | 13 | S (PSXFLAG,PSXTRANS)=0 | 
|---|
|  | 14 | L +^PSX(550.1):3 I '$T W !,"A lock on the RX QUEUE file was not obtainable. A transmission is in progress, try later." Q | 
|---|
|  | 15 | ; lock on 550.1 obtainable, clear flags | 
|---|
|  | 16 | I $D(^PSX(550,"TR","T")) F  S PSXSYS=$O(^PSX(550,"TR","T",0)) Q:PSXSYS'>0  S PSXSTAT="H" D PSXSTAT^PSXRSYU | 
|---|
|  | 17 | D SET^PSXSYS | 
|---|
|  | 18 | S STATUS=$P($G(^PSX(550,+PSXSYS,0)),"^",3) I STATUS'="H" W !,STATUS," no Manual Transmission nor Print CMOP Suspense allowed at this time" G EXIT | 
|---|
|  | 19 | QRY W ! K DIR | 
|---|
|  | 20 | S DIR(0)="NAO^1:5",DIR("A")="Select (1, 2, 3, 4, 5):  " | 
|---|
|  | 21 | S DIR("A",1)="  1 - Initiate Standard CMOP Transmission" | 
|---|
|  | 22 | S DIR("A",2)="  2 - Initiate CS CMOP Transmission" | 
|---|
|  | 23 | S DIR("A",3)="  3 - Print Current Division -  Standard CMOP from Suspense" | 
|---|
|  | 24 | S DIR("A",4)="  4 - Print Current Division -  CS CMOP from Suspense" | 
|---|
|  | 25 | S DIR("A",5)="  5 - Standard Print from Suspense" | 
|---|
|  | 26 | S DIR("A",6)=" " | 
|---|
|  | 27 | S DIR("?")="Enter a number between 1 and 5.",DIR("??")="^D MSG1^PSXRHLP" D ^DIR I (Y<0)!($D(DIRUT)) K DIR G EXIT | 
|---|
|  | 28 | W !!,DIR("A",X),! | 
|---|
|  | 29 | S REPLY=X K Y,X | 
|---|
|  | 30 | K DIRUT,DTOUT,DUOUT,DIROUT,DIR | 
|---|
|  | 31 | DIRECT ;Set PSXCS, PSXTRANS & PSXFLAG as per user choice | 
|---|
|  | 32 | I REPLY="5" G DEV1^PSOSULB1 | 
|---|
|  | 33 | I "24"[REPLY S PSXCS=1 | 
|---|
|  | 34 | I "12"[REPLY S (PSXTRANS,PSXFLAG)=1 | 
|---|
|  | 35 | I "34"[REPLY S PSXFLAG=2 | 
|---|
|  | 36 | K REPLY | 
|---|
|  | 37 | ; | 
|---|
|  | 38 | ASK ;Ask 'all divisions y/n' & date range for data transmission & checks for data | 
|---|
|  | 39 | W ! | 
|---|
|  | 40 | ;ask all divisions y/n | 
|---|
|  | 41 | I PSXFLAG=2 S PSXDIVML=0 G ASK2 | 
|---|
|  | 42 | K DIR S DIR(0)="Y",DIR("A")="Transmit Data for All Divisions ? ",DIR("B")="YES" | 
|---|
|  | 43 | S DIR("?",1)="Yes - Transmit/Print All Divisions" | 
|---|
|  | 44 | S DIR("?")="No  - Transmit/Print One Division:   "_$$GET1^DIQ(59,PSOSITE,.01) | 
|---|
|  | 45 | D ^DIR K DIR | 
|---|
|  | 46 | G:(Y<0)!($D(DIRUT)) EXIT | 
|---|
|  | 47 | N PSXDIVML S PSXDIVML=+Y | 
|---|
|  | 48 | ASK2 W ! | 
|---|
|  | 49 | S %DT="AEX",%DT("A")=$S(PSXFLAG=1:"TRANSMIT CMOP DATA THRU DATE:  ",PSXFLAG=2:"PRINT CMOP LABELS THRU DATE:  ",1:0),%DT("B")="TODAY" D ^%DT K %DT,%DT("A"),%DT("B") | 
|---|
|  | 50 | S:Y<0 PFLAG=1 G:Y<0 EXIT | 
|---|
|  | 51 | S (PDT,PRTDT,TPRTDT)=Y K Y S Y=PDT X ^DD("DD") S PDT=Y K Y | 
|---|
|  | 52 | S CHKDT=$O(^PS(52.5,"AQ","")) I CHKDT>PRTDT W !!,$S(PSXFLAG=1:"NOTHING THRU THIS DATE TO TRANSMIT.",PSXFLAG=2:"NOTHING THRU THIS DATE TO PRINT.",1:0) S PFLAG=1 G EXIT | 
|---|
|  | 53 | I '$O(^PS(52.5,"AQ",0)) W !!,$S(PSXFLAG=1:"NOTHING THRU THIS DATE TO TRANSMIT.",PSXFLAG=2:"NOTHING THRU THIS DATE TO PRINT.",1:0) S PFLAG=1 G EXIT | 
|---|
|  | 54 | ; | 
|---|
|  | 55 | W ! K DIR S DIR(0)="Y",DIR("B")="NO",DIR("A")="Are you sure you wish to continue" D ^DIR K DIR S STOP=Y G:Y=0!($D(DIRUT))!($D(DUOUT)) EXIT K Y | 
|---|
|  | 56 | S PSXSTAT="T" D PSXSTAT^PSXRSYU S PFLAG=0 I $G(PSXLOCK)>0 G EX1 | 
|---|
|  | 57 | ; | 
|---|
|  | 58 | DRIV ;calls the remaining routines to build the data for transmission and | 
|---|
|  | 59 | S PSXDAYS=$P(PSOPAR,"^",27),X1=TPRTDT,X2=PSXDAYS D C^%DTC S PSXDTRG=X K X,X1,X2 | 
|---|
|  | 60 | S PSXVENDR=$S($P(^PSX(550,+$G(PSXSYS),0),"^")["HINE":"SI BAKER",$P(^PSX(550,+$G(PSXSYS),0),"^")["MURF":"SI BAKER",1:"ELECTROCOM") | 
|---|
|  | 61 | ;set up queue device PSX or printer | 
|---|
|  | 62 | I PSXFLAG=2 D BEGIN^PSXRPPL G:$G(POP) EXIT ;select printer PSLION | 
|---|
|  | 63 | QUE ; QUEUE the group/individual PSOSITE jobs for trans or the single job for print labels one division | 
|---|
|  | 64 | S PSXDESC="CMOP "_$S($G(PSXCS)=1:"CS ",1:"NON-CS ")_"Transmission" | 
|---|
|  | 65 | ; | 
|---|
|  | 66 | S ZTDESC=$S(PSXFLAG=1:$G(PSXDESC),PSXFLAG=2:"Print CMOP Suspense",1:"") | 
|---|
|  | 67 | S:PSXFLAG=1 ZTIO="",ZTRTN="TRANDIVS^PSXRSUS" | 
|---|
|  | 68 | S:PSXFLAG=2 ZTIO=PSLION,ZTRTN="PRT^PSXRSUS" | 
|---|
|  | 69 | ; | 
|---|
|  | 70 | S PSXDUZ=DUZ,(PSOINST,PSXSITE)=+$P($G(PSXSYS),U,2) | 
|---|
|  | 71 | S ZTDTH=$H | 
|---|
|  | 72 | F X="PSXDIVML","PSOSITE","PSOLAP","PSOSYS","PSOPAR","PSXSYS","DUZ","PSXTRANS","PSXFLAG","PRTDT","PSOINST","PSXDUZ","PSXSITE","PSXVER" S ZTSAVE(X)="" | 
|---|
|  | 73 | F X="PSXCS","PSXDAYS","PSXDTRG","PSOBARS","PSOBAR1","PSOBAR0","PSOPROP","PSXVENDR","PSLION","TPRTDT" S ZTSAVE(X)="" | 
|---|
|  | 74 | ; | 
|---|
|  | 75 | K ZTSK | 
|---|
|  | 76 | D ^%ZTLOAD ;****TESTING switch to tasking vs foreground | 
|---|
|  | 77 | W:$G(ZTSK) !,"Tasked ",ZTSK H 4 | 
|---|
|  | 78 | ;D @ZTRTN ;****TESTING run foreground, comment out above two lines | 
|---|
|  | 79 | Q | 
|---|
|  | 80 | ; | 
|---|
|  | 81 | TRANDIVS ;Entry from transmission tasking; loop all divisions / or process only 1 | 
|---|
|  | 82 | ;process/transmit all divisions | 
|---|
|  | 83 | LOCK ; >>>**** LOCK OF FILE 550.1 ****<<< | 
|---|
|  | 84 | F I=1:1:3 L +^PSX(550.1):10 I $T S I=100 | 
|---|
|  | 85 | I I'=100 D CANMSG G EXIT ; could not get a lock in 18 minutes of waiting | 
|---|
|  | 86 | D STOREVAR^PSXRSUS1 ; store critical variables | 
|---|
|  | 87 | I $D(^PSX(550.2,"AQ")) D EN1^PSXRCVRY | 
|---|
|  | 88 | I PSXDIVML N PSOSITE,PSOPAR D  G EXIT | 
|---|
|  | 89 | . S PSOSITE=0 F  S PSOSITE=$O(^PS(59,PSOSITE)) Q:PSOSITE'>0  D | 
|---|
|  | 90 | .. I '$D(^XTMP("PSXAUTOERR")) N $ETRAP,$ESTACK S $ETRAP="D TRAPERR^PSXRSUS" | 
|---|
|  | 91 | .. D RESETVAR^PSXRSUS1 ;retrieve critical variables | 
|---|
|  | 92 | .. S PSOPAR=^PS(59,PSOSITE,1),PRTDT=TPRTDT | 
|---|
|  | 93 | .. S PSXDAYS=$P(PSOPAR,"^",27),X1=PRTDT,X2=PSXDAYS D C^%DTC S PSXDTRG=X K X,X1,X2 ;adjusts variables per divisional parameters. | 
|---|
|  | 94 | .. D TRANS | 
|---|
|  | 95 | ; process a single division | 
|---|
|  | 96 | D | 
|---|
|  | 97 | . I '$D(^XTMP("PSXAUTOERR")) N $ETRAP,$ESTACK S $ETRAP="D TRAPERR^PSXRSUS" | 
|---|
|  | 98 | . D TRANS | 
|---|
|  | 99 | G EXIT | 
|---|
|  | 100 | ; | 
|---|
|  | 101 | ;Called by Taskman to build CMOP PRINT data | 
|---|
|  | 102 | TRANS ;;Called by PSXAUTO Taskman to begin CMOP transmissions one division | 
|---|
|  | 103 | S PSXZTSK=$G(ZTSK),PSXERFLG=0,PSXDUZ=DUZ | 
|---|
|  | 104 | S PSXTST=0,PSXIN=$$GET1^DIQ(59,PSOSITE,2004,"I") | 
|---|
|  | 105 | S:PSXIN'=""&(PSXIN<(DT+.1)) PSXTST=1 | 
|---|
|  | 106 | Q:PSXTST  ;division inactivated | 
|---|
|  | 107 | ;VMP OIFO BAY PINES;ELR;PSX*2*57 CK IF ALL NECESSARY ELEMENTS OF DIVISION ARE HERE | 
|---|
|  | 108 | NEW PSXDIVER S PSXPRECK=1 D DIV^PSXBLD1 K PSXPRECK I $G(PSXDIVER) Q | 
|---|
|  | 109 | S PSXSTAT="T" D PSXSTAT^PSXRSYU | 
|---|
|  | 110 | I $G(PSXCS)=1 S X=$$FMADD^XLFDT(DT,+2) S ^XTMP("PSXCS"_PSOSITE,0)=X_U_DT_U_"CMOP CS TRANSMISSION" | 
|---|
|  | 111 | D SDT^PSXRPPL I PSXERFLG=1 S PSXJOB=7 D ^PSXERR | 
|---|
|  | 112 | I '$G(PSXBAT) D OERRCLR Q  ;no RXs found nor loaded into 550.2 | 
|---|
|  | 113 | RTR ; | 
|---|
|  | 114 | ;Clear 550.1 of entries (INSURE NO MERGE) prior to transmission | 
|---|
|  | 115 | K DIK,DA S DIK="^PSX(550.1,",DA=0 F  S DA=$O(^PSX(550.1,DA)) Q:DA'>0  D ^DIK ;****TESTING | 
|---|
|  | 116 | D EN^PSXBLD ; build entries into 550.1 by alpha patient | 
|---|
|  | 117 | I PSXERFLG=1 S PFLAG=1 D EN^PSXERR | 
|---|
|  | 118 | D EN^PSXRTR ;complete and send mailman message to CMOP | 
|---|
|  | 119 | ;Clear 550.1 of entries (INSURE NO MERGE) after transmission complete | 
|---|
|  | 120 | K DIK,DA S DIK="^PSX(550.1,",DA=0 F  S DA=$O(^PSX(550.1,DA)) Q:DA'>0  D ^DIK ;****TESTING | 
|---|
|  | 121 | D OERRCLR | 
|---|
|  | 122 | Q | 
|---|
|  | 123 | PRT ; print from CMOP suspense | 
|---|
|  | 124 | F I=1:1:3 L +^PSX(550.1):60 I $T S I=100 | 
|---|
|  | 125 | I I'=100 D CANMSG G EXIT ; could not get a lock in 3 minutes of waiting | 
|---|
|  | 126 | ; set auto error trapping | 
|---|
|  | 127 | D | 
|---|
|  | 128 | . I '$D(^XTMP("PSXAUTOERR")) N $ETRAP,$ESTACK S $ETRAP="D PRTERR^PSXRPPL1" | 
|---|
|  | 129 | . D PRT1 | 
|---|
|  | 130 | D OERRCLR | 
|---|
|  | 131 | G EX1 | 
|---|
|  | 132 | PRT1 S ZTREQ="@",PSXERFLG=0,NFLAG=2 | 
|---|
|  | 133 | D SDT^PSXRPPL | 
|---|
|  | 134 | I $G(PSXBAT),$D(^PSX(550.2,PSXBAT,15)) D PRT^PSXRPPL | 
|---|
|  | 135 | I PSXERFLG=1 S PSXJOB=7 D ^PSXERR | 
|---|
|  | 136 | ;remove the batch from the transmission file as it was used only to hold the RXs for printing and not transmission | 
|---|
|  | 137 | I $G(PSXBAT) K DIK,DA S DA=PSXBAT,DIK="^PSX(550.2," D ^DIK K DIK,DA ;****TESTING | 
|---|
|  | 138 | G EX1 | 
|---|
|  | 139 | EXIT ; | 
|---|
|  | 140 | I $G(POP) S PSXSTAT="H" D PSXSTAT^PSXRSYU ;exit from 'no printer selected' of print labels CMOP | 
|---|
|  | 141 | ;I $G(PFLAG)=1 S PSXSTAT="H" D PSXSTAT^PSXRSYU | 
|---|
|  | 142 | K DA,DIE,DR | 
|---|
|  | 143 | S DA=+PSXSYS,DIE="^PSX(550,",DR="9///@" | 
|---|
|  | 144 | L +^PSX(550,DA):600 D ^DIE L -^PSX(550,DA) | 
|---|
|  | 145 | K DA,DIE,DR | 
|---|
|  | 146 | S PSXSTAT="H" D PSXSTAT^PSXRSYU | 
|---|
|  | 147 | EX1 K ^PSX("CMOP TRAN") | 
|---|
|  | 148 | K CNAME,DFN,FILNUM,PNAME,PSXDAYS,PSXDTRG,^TMP($J,"PSX"),J,Y | 
|---|
|  | 149 | K PSXPTR,REC,REF,REPLY,SDT,X,X1,X2,Y,ANSWER,PSXOK,RXNUM,PSXSITE,DIR,DIRUT,DTOUT,DUOUT,DIROUT,PSXCS,TXT,TEXT | 
|---|
|  | 150 | K XDFN,STATUS,PSXSTAT,^TMP($J,"PSXDFN"),PDT,PSXDUZ,SITE,CHKDT,PSXERFLG,PSXRXERR,RXEX,FDATE,PSXJOB,PFLAG,PSXZTSK,PSXVENDR,ORSUB,ORST | 
|---|
|  | 151 | L -^PSX(550.1) | 
|---|
|  | 152 | Q | 
|---|
|  | 153 | OERRCLR ; clear any locks left in ^XTMP("OERR-" | 
|---|
|  | 154 | S (ORST,ORSUB)="ORLK-" | 
|---|
|  | 155 | F  S ORSUB=$O(^XTMP(ORSUB)) Q:ORSUB'[ORST  I ^XTMP(ORSUB,0)["CPRS/CMOP" K ^XTMP(ORSUB) | 
|---|
|  | 156 | Q | 
|---|
|  | 157 | CANMSG ; lock on 550.1 not achieved send transmission/print cancelled message | 
|---|
|  | 158 | S PSXCS=+$G(PSXCS) | 
|---|
|  | 159 | S XMSUB=$S($G(PSXCS):"",1:"NON-")_"CS Manual Scheduled Transmission Canceled" | 
|---|
|  | 160 | S:PSXFLAG=2 XMSUB="Print CMOP Suspense Cancelled." | 
|---|
|  | 161 | S XMTEXT="TXT(" | 
|---|
|  | 162 | S TXT(1,0)="The "_$S($G(PSXCS):"",1:"NON-")_"CS Manual Transmission was cancelled" | 
|---|
|  | 163 | S:PSXFLAG=2 TXT(1,0)="Print from CMOP Suspense was cancelled" | 
|---|
|  | 164 | S TXT(2,0)="It could not obtain a lock on the RX QUEUE file. #550.1" | 
|---|
|  | 165 | S TXT(3,0)="This indicates that a transmission was in progress." | 
|---|
|  | 166 | S TXT(6,0)=" " | 
|---|
|  | 167 | S TXT(7,0)="If you are getting this message frequently, please contact your IRM Group" | 
|---|
|  | 168 | D GRP1^PSXNOTE | 
|---|
|  | 169 | ;S XMY(DUZ)="" | 
|---|
|  | 170 | D ^XMD | 
|---|
|  | 171 | Q | 
|---|
|  | 172 | TRAPERR ; trap/process error | 
|---|
|  | 173 | S XXERR=$$EC^%ZOSV | 
|---|
|  | 174 | S PSXDIVNM=$$GET1^DIQ(59,PSOSITE,.01) | 
|---|
|  | 175 | ;save an image of the transient file 550.1 for 2 days | 
|---|
|  | 176 | D NOW^%DTC S DTTM=% | 
|---|
|  | 177 | ;VMP OIFO BAY PINES;ELR;PSX*2*57 CHANGE PURGE DAYS TO T+12 FROM T+2 | 
|---|
|  | 178 | S X=$$FMADD^XLFDT(DT,+12) S ^XTMP("PSXERR "_DTTM,0)=X_U_DT_U_"CMOP "_XXERR | 
|---|
|  | 179 | M ^XTMP("PSXERR "_DTTM,550.1)=^PSX(550.1) | 
|---|
|  | 180 | S XMSUB="CMOP Error "_PSXDIVNM_" "_$$GET1^DIQ(550.2,+$G(PSXBAT),.01) | 
|---|
|  | 181 | D GRP1^PSXNOTE | 
|---|
|  | 182 | ;S XMY(DUZ)="" | 
|---|
|  | 183 | S XMTEXT="TEXT(" | 
|---|
|  | 184 | S TEXT(1,0)=$S($G(PSXCS):"",1:"NON-")_"CS CMOP Transmission encountered the following error. Please investigate" | 
|---|
|  | 185 | S TEXT(2,0)="Division:         "_PSXDIVNM | 
|---|
|  | 186 | S TEXT(3,0)="Type/Batch        "_$S($G(PSXCS):"CS",1:"NON-CS")_" / "_$$GET1^DIQ(550.2,+$G(PSXBAT),.01) | 
|---|
|  | 187 | S TEXT(4,0)="Error:            "_XXERR | 
|---|
|  | 188 | S TEXT(5,0)="The prescriptions have been reset and other divisions' transmissions are continuing." | 
|---|
|  | 189 | S TEXT(6,0)="A copy of the file 550.1 can be found in ^XTMP(""PSXERR "_DTTM_""")" | 
|---|
|  | 190 | D ^%ZTER | 
|---|
|  | 191 | D ^XMD | 
|---|
|  | 192 | ;I $E(IOST)="C" F XX=1:1:5 W !,TEXT(XX,0) | 
|---|
|  | 193 | S PSXXDIV=PSOSITE | 
|---|
|  | 194 | D EN1^PSXRCVRY ;hopefully no errors will be experienced in recovery | 
|---|
|  | 195 | S PSOSITE=PSXXDIV | 
|---|
|  | 196 | G UNWIND^%ZTER | 
|---|
|  | 197 | Q | 
|---|
|  | 198 | STOPET ;disable auto error trapping | 
|---|
|  | 199 | S ^XTMP("PSXAUTOERR",0)=DT_U_DT_U_"disable PSX CMOP auto error trapping for today" | 
|---|
|  | 200 | Q | 
|---|
|  | 201 | STARTET ;enable auto error trapping | 
|---|
|  | 202 | K ^XTMP("PSXAUTOERR",0) | 
|---|
|  | 203 | Q | 
|---|