| 1 | PSXRPPL ;BIR/WPB,BAB-Gathers data for the CMOP Transmission ;13 Mar 2002  10:31 AM | 
|---|
| 2 | ;;2.0;CMOP;**3,23,33,28,40,42,41,48,62,58**;11 Apr 97;Build 2 | 
|---|
| 3 | ;Reference to ^PS(52.5,  supported by DBIA #1978 | 
|---|
| 4 | ;Reference to ^PSRX(     supported by DBIA #1977 | 
|---|
| 5 | ;Reference to ^PSOHLSN1  supported by DBIA #2385 | 
|---|
| 6 | ;Reference to ^PSORXL    supported by DBIA #1969 | 
|---|
| 7 | ;Reference to ^PSOLSET   supported by DBIA #1973 | 
|---|
| 8 | ;Reference to %ZIS(1     supported by DBIA #290 | 
|---|
| 9 | ;Reference to %ZIS(2     supported by DBIA #2247 | 
|---|
| 10 | ;Reference to ^PSSLOCK   supported by DBIA #2789 | 
|---|
| 11 | ;Reference to ^XTMP("ORLK-" supported by DBIA #4001 | 
|---|
| 12 | ;Reference to ^PSOBPSUT supported by DBIA #4701 | 
|---|
| 13 | ;Reference to ^PSOREJUT supported by DBIA #4706 | 
|---|
| 14 | ;Reference to ^BPSUTIL supported by DBIA #4410 | 
|---|
| 15 | ;Called from PSXRSUS -Builds ^PSX(550.2,,15,"C" , and returns to PSXRSUS or PSXRTRAN | 
|---|
| 16 | ; | 
|---|
| 17 | SDT K ^TMP($J,"PSX"),^TMP($J,"PSXDFN"),ZCNT,PSXBAT D:$D(XRTL) T0^%ZOSV | 
|---|
| 18 | S PSXTDIV=PSOSITE,PSXTYP=$S(+$G(PSXCS):"C",1:"N") | 
|---|
| 19 | ; | 
|---|
| 20 | ; - Submitting prescriptions to ECME (Electronic Claims Mgmt Engine) - 3rd pary | 
|---|
| 21 | I $$ECMEON^BPSUTIL(PSXTDIV),$$CMOPON^BPSUTIL(PSXTDIV) D | 
|---|
| 22 | . N BPSCNT S BPSCNT=$$SBTECME^PSXRPPL1(PSXTYP,PSXTDIV,PRTDT,PSXDTRG) | 
|---|
| 23 | . ; - Wait 15 seconds per prescription sent to ECME (max of 2 hours) | 
|---|
| 24 | . I BPSCNT>0 H 60+$S((BPSCNT*15)>7200:7200,1:(BPSCNT*15)) | 
|---|
| 25 | ; | 
|---|
| 26 | ; - Transmitting prescription to CMOP (up to THROUGH DATE) | 
|---|
| 27 | K ^TMP("PSXEPHIN",$J) | 
|---|
| 28 | S SDT=0 F  S SDT=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT)) S XDFN=0 Q:(SDT>PRTDT)!(SDT'>0)  D | 
|---|
| 29 | . F  S XDFN=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,XDFN)) S REC=0 Q:(XDFN'>0)!(XDFN="")  D | 
|---|
| 30 | . . F  S REC=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,XDFN,REC)) Q:(REC'>0)!(REC="")  D | 
|---|
| 31 | . . . D GETDATA D:$G(RXN) PSOUL^PSSLOCK(RXN),OERRLOCK(RXN) | 
|---|
| 32 | ; | 
|---|
| 33 | ; - Pulling prescriptions ahead (parameter in OUTPATIENT SITE file #59) | 
|---|
| 34 | I $G(PSXBAT),'$G(PSXRTRAN) D CHKDFN | 
|---|
| 35 | ; | 
|---|
| 36 | ; - Sends a Mailman message if there were transmission problems with the 3rd Party Payer | 
|---|
| 37 | I $D(^TMP("PSXEPHIN",$J)) D ^PSXBPSMS K ^TMP("PSXEPHIN",$J) | 
|---|
| 38 | ; | 
|---|
| 39 | EXIT ; | 
|---|
| 40 | K SDT,DFN,REC,RXNUM,PSXOK,FILNUM,REF,PNAME,CNAME,DIE,DR,NDFN,%,CNT,COM,DTTM,FILL,JJ,PRTDT,PSXDIV,XDFN,NFLAG,CIND,XDFN | 
|---|
| 41 | K CHKDT,DAYS,DRUG,DRUGCHK,NM,OPDT,PHARCLK,PHY,PSTAT,PTRA,PTRB,QTY,REL,RXERR,RXF,SFN,PSXDGST,PSXMC,PSXMDT | 
|---|
| 42 | S:$D(XRT0) XRTN=$T(+0) D:$D(XRT0) T1^%ZOSV | 
|---|
| 43 | K ^TMP("PSXEPHIN",$J) | 
|---|
| 44 | Q | 
|---|
| 45 | GETDATA ;Screens rxs and builds data | 
|---|
| 46 | ;PSXOK=1:NOT CMOP DRUG OR DO NOT MAIL,2:TRADENAME,3:WINDOW,4:PRINTED,5:NOT SUSPENDED | 
|---|
| 47 | ;PSXOK=6:ALREADY RELEASED,7:DIFFERENT DIVISION,8:BAD DATA IN 52.5 | 
|---|
| 48 | ;9:CS Mismatch,10:DEA 1 or 2 | 
|---|
| 49 | I '$D(^PS(52.5,REC,0)) K ^PS(52.5,"AQ",SDT,XDFN,REC),^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,XDFN,REC) Q | 
|---|
| 50 | I $P(^PS(52.5,REC,0),"^",7)="" K ^PS(52.5,"AQ",SDT,XDFN,REC),^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,XDFN,REC) Q | 
|---|
| 51 | I ($P(^PS(52.5,REC,0),"^",3)'=XDFN) K ^PS(52.5,"AQ",SDT,XDFN,REC),^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,XDFN,REC) Q | 
|---|
| 52 | N DFN S DFN=XDFN D DEM^VADPT | 
|---|
| 53 | I $G(VADM(6))'="" D DELETE K VADM Q | 
|---|
| 54 | S PSXOK=0,NFLAG=0 | 
|---|
| 55 | S RXN=$P($G(^PS(52.5,REC,0)),"^",1) I RXN="" S PSXOK=8 Q | 
|---|
| 56 | S RFL=+$$GET1^DIQ(52.5,REC,9,"I") | 
|---|
| 57 | I '$D(^TMP($J,"PSXBAI",DFN)) D | 
|---|
| 58 | .S PSXGOOD=$$ADDROK^PSXMISC1(RXN) | 
|---|
| 59 | .I 'PSXGOOD S PSXFIRST=1 D  I 'PSXFIRST S PSXOK=8 | 
|---|
| 60 | ..D CHKACT^PSXMISC1(RXN) | 
|---|
| 61 | I PSXOK=8 K RXN Q | 
|---|
| 62 | ; | 
|---|
| 63 | N EPHQT S EPHQT=0 | 
|---|
| 64 | I $$PATCH^XPDUTL("PSO*7.0*148") D  I EPHQT Q | 
|---|
| 65 | . I $$DOUBLE^PSXRPPL1(RXN,RFL) S EPHQT=1 Q | 
|---|
| 66 | . I $$RETRX^PSOBPSUT(RXN,RFL),SDT>DT S EPHQT=1 Q | 
|---|
| 67 | . I $$FIND^PSOREJUT(RXN,RFL) S EPHQT=1 Q | 
|---|
| 68 | . I $$STATUS^PSOBPSUT(RXN,RFL)="IN PROGRESS" D  Q | 
|---|
| 69 | . . S ^TMP("PSXEPHIN",$J,$$RXSITE^PSOBPSUT(RXN),RXN)=RFL,EPHQT=1 | 
|---|
| 70 | ; | 
|---|
| 71 | D CHKDATA^PSXMISC1 | 
|---|
| 72 | SET Q:(PSXOK=7)!(PSXOK=8)!(PSXOK=9) | 
|---|
| 73 | S PNAME=$G(VADM(1)) | 
|---|
| 74 | I ($G(PSXCSRX)=1)&($G(PSXCS)=1) S ^XTMP("PSXCS",PSOSITE,DT,RXN)="" | 
|---|
| 75 | I (PSXOK=0)&(PSXFLAG=1) S ^TMP($J,"PSXDFN",XDFN)="",NFLAG=4 D DQUE,RX550215 Q | 
|---|
| 76 | I (PSXOK=0)&(PSXFLAG=2) D RX550215 Q | 
|---|
| 77 | I (PSXOK>0)&(PSXOK<7)!(PSXOK=10) D DELETE Q | 
|---|
| 78 | Q | 
|---|
| 79 | DELETE ; deletes the CMOP STATUS field in PS(52.5, reindex 'AC' x-ref | 
|---|
| 80 | L +^PS(52.5,REC):600 Q:'$T | 
|---|
| 81 | N DR,DIE,DA S DIE="^PS(52.5,",DA=REC,DR="3///@" D ^DIE | 
|---|
| 82 | S ^PS(52.5,"AC",$P(^PS(52.5,REC,0),"^",3),$P(^PS(52.5,REC,0),"^",2),REC)="" | 
|---|
| 83 | L -^PS(52.5,REC) | 
|---|
| 84 | Q | 
|---|
| 85 | ;the rest of the sub-routines go through the ^PSX(550.2,,15,"C" | 
|---|
| 86 | ;global and checks for RXs within the days ahead range and | 
|---|
| 87 | ;builds the ^PSX(550.2,PSXBAT, | 
|---|
| 88 | CHKDFN ; use the patient 'C' index under RX multiple in file 550.2 to GET dfn to gather Patients' future RXs | 
|---|
| 89 | I '$D(^PSX(550.2,PSXBAT,15,"C")) Q | 
|---|
| 90 | S PSXPTNM="" F  S PSXPTNM=$O(^PSX(550.2,PSXBAT,15,"C",PSXPTNM)) Q:PSXPTNM=""  D | 
|---|
| 91 | . S XDFN=0 F  S XDFN=$O(^PSX(550.2,PSXBAT,"15","C",PSXPTNM,XDFN)) Q:(XDFN'>0)  D | 
|---|
| 92 | . . S SDT=PRTDT F  S SDT=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT)),NDFN=0 Q:(SDT>PSXDTRG)!(SDT="")  D | 
|---|
| 93 | . . . F  S NDFN=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,NDFN)),REC=0 Q:NDFN'>0  I NDFN=XDFN D | 
|---|
| 94 | . . . . F  S REC=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,NDFN,REC)) Q:REC'>0  D | 
|---|
| 95 | . . . . . D GETDATA D:$G(RXN) PSOUL^PSSLOCK(RXN),OERRLOCK(RXN) | 
|---|
| 96 | Q | 
|---|
| 97 | BEGIN ; Select print device | 
|---|
| 98 | I '$D(PSOPAR) D ^PSOLSET | 
|---|
| 99 | I $D(PSOLAP),($G(PSOLAP)'=ION) S PSLION=PSOLAP G PROFILE | 
|---|
| 100 | W ! S %ZIS("A")="PRINTER 'LABEL' DEVICE:  ",%ZIS("B")="",%ZIS="MQN" D ^%ZIS S PSLION=ION G:POP EXIT | 
|---|
| 101 | I $G(IOST)["C-" W !,"You must select a printer!",! G BEGIN | 
|---|
| 102 | F J=0,1 S @("PSOBAR"_J)="" I $D(^%ZIS(2,^%ZIS(1,IOS,"SUBTYPE"),"BAR"_J)) S @("PSOBAR"_J)=^("BAR"_J) | 
|---|
| 103 | S PSOBARS=PSOBAR1]""&(PSOBAR0]"")&$P(PSOPAR,"^",19) | 
|---|
| 104 | K PSOION,J D ^%ZISC I $D(IO("Q")) K IO("Q") | 
|---|
| 105 | PROFILE I $D(PSOPROP),($G(PSOPROP)'=ION) Q | 
|---|
| 106 | I $P(PSOPAR,"^",8) S %ZIS="MNQ",%ZIS("A")="Select PROFILE PRINTER: " D ^%ZIS K %ZIS,IO("Q"),IOP G:POP EXIT S PSOPROP=ION D ^%ZISC | 
|---|
| 107 | I $G(PSOPROP)=ION W !,"You must select a printer!",! G PROFILE | 
|---|
| 108 | Q | 
|---|
| 109 | PRT ; w auto error trapping | 
|---|
| 110 | D NOW^%DTC S DTTM=% K % | 
|---|
| 111 | S NM="" F  S NM=$O(^PSX(550.2,PSXBAT,15,"C",NM)) Q:NM=""  D DFN,PPL ;gather patient RXs, print patient RXs | 
|---|
| 112 | S DIK="^PSX(550.2,",DA=PSXBAT D ^DIK K PSXBAT | 
|---|
| 113 | K CHKDT,CIND,DAYS,DRUG,DRUGCHK,NFLAG,NM,ORD,PDT,PHARCLK,PHY,PSTAT,PTRA,PTRB,QTY,REL,RXERR,RXF,SFN,SIG,SITE,SUS,SUSPT | 
|---|
| 114 | Q | 
|---|
| 115 | DFN S DFN=0,NFLAG=2 | 
|---|
| 116 | F  S DFN=$O(^PSX(550.2,PSXBAT,15,"C",NM,DFN)),RXN=0 Q:(DFN="")!(DFN'>0)  D | 
|---|
| 117 | .F  S RXN=$O(^PSX(550.2,PSXBAT,15,"C",NM,DFN,RXN)),RXF="" Q:(RXN="")!(RXN'>0)  D | 
|---|
| 118 | ..F  S RXF=$O(^PSX(550.2,PSXBAT,15,"C",NM,DFN,RXN,RXF)) Q:RXF=""  D BLD | 
|---|
| 119 | Q | 
|---|
| 120 | BLD ; | 
|---|
| 121 | S BATRXDA=$O(^PSX(550.2,PSXBAT,15,"B",RXN,0)) D NOW^%DTC S DTTM=% | 
|---|
| 122 | S REC=$P(^PSX(550.2,PSXBAT,15,BATRXDA,0),U,5),SUS=$O(^PS(52.5,"B",RXN,0)) | 
|---|
| 123 | I SUS=REC,+SUS'=0 I 1 ;rx still valid in suspense | 
|---|
| 124 | E  D  Q  ;rx gone | 
|---|
| 125 | . N DA,DIK S DIK=550.2,DA(1)=PSXBAT,DA=BATRXDA | 
|---|
| 126 | . D ^DIK | 
|---|
| 127 | S PSOSU(DFN,SUS)=RXN,RXCNTR=$G(RXCNTR)+1,NFLAG=2 | 
|---|
| 128 | S $P(^PSRX(RXN,0),U,15)=0,$P(^PSRX(RXN,"STA"),U,1)=0 | 
|---|
| 129 | K % S COM="CMOP Suspense Label "_$S($G(^PS(52.5,SUS,"P"))=0:"Printed",$G(^PS(52.5,SUS,"P"))="":"Printed",1:"Reprinted")_$S($G(^PSRX(RXN,"TYPE"))>0:" (PARTIAL)",1:"") | 
|---|
| 130 | D EN^PSOHLSN1(RXN,"SC","ZU",COM) | 
|---|
| 131 | S DA=SUS D DQUE K DA | 
|---|
| 132 | ACTLOG F JJ=0:0 S JJ=$O(^PSRX(RXN,"A",JJ)) Q:'JJ  S CNT=JJ | 
|---|
| 133 | S RFCNT=0 F RF=0:0 S RF=$O(^PSRX(RXN,1,RF)) Q:'RF  S RFCNT=$S(RF<6:RF,1:RF+1) | 
|---|
| 134 | S CNT=CNT+1,^PSRX(RXN,"A",0)="^52.3DA^"_CNT_"^"_CNT | 
|---|
| 135 | LOCK L +^PSRX(RXN):600 G:'$T LOCK | 
|---|
| 136 | S ^PSRX(RXN,"A",CNT,0)=DTTM_"^S^"_DUZ_"^"_RFCNT_"^"_COM L -^PSRX(RXN) | 
|---|
| 137 | K CNT,COM,RFCNT,%,JJ,RF,Y,RXCNTR | 
|---|
| 138 | Q | 
|---|
| 139 | PPL K PPL,PPL1 S ORD="" F  S ORD=$O(PSOSU(ORD)) Q:(ORD="")!(ORD'>0)  D PPL1 | 
|---|
| 140 | Q | 
|---|
| 141 | PPL1 ; print patient labels | 
|---|
| 142 | F SFN=0:0 S SFN=$O(PSOSU(ORD,SFN)) Q:'SFN  D | 
|---|
| 143 | . S:$L($G(PPL))<240 PPL=$P(PSOSU(ORD,SFN),"^")_","_$G(PPL) | 
|---|
| 144 | . S:$L($G(PPL))>239 PPL1=$P(PSOSU(ORD,SFN),"^")_","_$G(PPL1) | 
|---|
| 145 | . S DFN=$P(^PS(52.5,SFN,0),"^",3) | 
|---|
| 146 | S SUSPT=1,PSNP=$S($P(PSOPAR,"^",8):1,1:0) S:$D(PSOPROP) PFIO=PSOPROP | 
|---|
| 147 | D QLBL^PSORXL | 
|---|
| 148 | I $D(PPL1) S PSNP=0,PPL=PPL1 D QLBL^PSORXL | 
|---|
| 149 | K PPL,PPL1,PSOSU(ORD) | 
|---|
| 150 | Q | 
|---|
| 151 | DQUE ; sets the CMOP indicator field, and printed field in 52.5 | 
|---|
| 152 | L +^PS(52.5,REC):600 G:'$T DQUE | 
|---|
| 153 | I NFLAG=4 D | 
|---|
| 154 | . S DA=REC,DIE="^PS(52.5,",DR="3////L;4////"_DT D ^DIE K DIE,DA,DR L -^PS(52.5,REC)  ; the rest moved into PSXRTR | 
|---|
| 155 | S CIND=$S(NFLAG=1:"X",NFLAG=2:"P",NFLAG=3:"@",1:0) | 
|---|
| 156 | I $G(NFLAG)'=2 D | 
|---|
| 157 | .S DA=REC,DIE="^PS(52.5,",DR="3////"_CIND_";4////"_DT | 
|---|
| 158 | .D ^DIE K DIE,DA,DR | 
|---|
| 159 | .S ^PS(52.5,REC,"P")=1,^PS(52.5,"ADL",DT,REC)="" | 
|---|
| 160 | I $G(NFLAG)=2 D  ;print label cycle | 
|---|
| 161 | . S DA=REC,DIE="^PS(52.5,",DR="3////"_CIND_";4////"_DTTM_";5////"_DUZ_";7////"_RXCNTR | 
|---|
| 162 | . D ^DIE K DIE,DA,DR | 
|---|
| 163 | . S ^PS(52.5,REC,"P")=1,^PS(52.5,"ADL",$E($P(^PS(52.5,REC,0),"^",8),1,7),REC)="" | 
|---|
| 164 | L -^PS(52.5,REC) | 
|---|
| 165 | I $G(NFLAG)=2 D EN^PSOHLSN1(RXN,"SC","ZU","CMOP Suspense Label Printed") | 
|---|
| 166 | Q | 
|---|
| 167 | RX550215 ; put RX into RX multiple TRANS 550.215 for PSXBAT | 
|---|
| 168 | I '$G(PSXBAT) D BATCH^PSXRSYU ; first time through create batch, & return PSXBAT | 
|---|
| 169 | K DD,DO,DIC,DA,DR,D0 | 
|---|
| 170 | S:'$D(^PSX(550.2,PSXBAT,15,0)) ^PSX(550.2,PSXBAT,15,0)="^550.215P^^" | 
|---|
| 171 | S X=RXN,DA(1)=PSXBAT | 
|---|
| 172 | S DIC="^PSX(550.2,"_PSXBAT_",15,",DIC("DR")=".02////^S X=RXF;.03////^S X=DFN;.05////^S X=REC",DIC(0)="ZF" | 
|---|
| 173 | D FILE^DICN | 
|---|
| 174 | S PSXRXTDA=+Y ;RX DA within PSXBAT 'T'ransmission | 
|---|
| 175 | K DD,DO,DIC,DA,DR,D0 | 
|---|
| 176 | Q | 
|---|
| 177 | OERRLOCK(RXN) ; set XTMP for OERR/CPRS order locking | 
|---|
| 178 | I $G(PSXBAT),$G(RXN),$G(PSXRXTDA) I 1 | 
|---|
| 179 | E  Q | 
|---|
| 180 | I $P(^PSX(550.2,PSXBAT,15,PSXRXTDA,0),U,1)'=RXN Q | 
|---|
| 181 | RXNSET ; set ^XTMP("ORLK-"_ORDER per IA 4001 needs RXN | 
|---|
| 182 | Q:'$G(RXN) | 
|---|
| 183 | N ORD,NOW,NOW1 S ORD=+$P($G(^PSRX(+$G(RXN),"OR1")),"^",2) | 
|---|
| 184 | Q:'ORD | 
|---|
| 185 | S NOW=$$NOW^XLFDT,NOW1=$$FMADD^XLFDT(NOW,1) | 
|---|
| 186 | S ^XTMP("ORLK-"_+ORD,0)=NOW1_U_NOW_"^CPRS/CMOP RX/Order Lock",^(1)=DUZ_U_$J | 
|---|
| 187 | Q | 
|---|
| 188 | RXNCLEAR ; needs RXN | 
|---|
| 189 | Q:'$G(RXN) | 
|---|
| 190 | N ORD S ORD=+$P($G(^PSRX(+$G(RXN),"OR1")),"^",2) Q:'ORD | 
|---|
| 191 | I $D(^XTMP("ORLK-"_ORD,0)),^(0)["CPRS/CMOP" K ^XTMP("ORLK-"_ORD) | 
|---|
| 192 | Q | 
|---|