Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: PSXRPPL

PSXRPPL.m

Go to the documentation of this file.
  1. PSXRPPL ;BIR/WPB,BAB-Gathers data for the CMOP Transmission ;13 Mar 2002 10:31 AM
  1. ;;2.0;CMOP;**3,23,33,28,40,42,41,48,62,58,66,65,69,70,81,83,87,91**;11 Apr 97;Build 33
  1. ;Reference to ^PS(52.5, supported by DBIA #1978
  1. ;Reference to ^PSRX( supported by DBIA #1977
  1. ;Reference to ^PSOHLSN1 supported by DBIA #2385
  1. ;Reference to ^PSORXL supported by DBIA #1969
  1. ;Reference to ^PSOLSET supported by DBIA #1973
  1. ;Reference to %ZIS(1 supported by DBIA #290
  1. ;Reference to %ZIS(2 supported by DBIA #2247
  1. ;Reference to ^PSSLOCK supported by DBIA #2789
  1. ;Reference to ^XTMP("ORLK-" supported by DBIA #4001
  1. ;Reference to ^BPSUTIL supported by DBIA #4410
  1. ;Reference to ^PS(59 supported by DBIA #1976
  1. ;Reference to $$SELPRT^PSOFDAUT supported by DBIA #5740
  1. ;Reference to LOG^BPSOSL supported by ICR# 6764
  1. ;Reference to IEN59^BPSOSRX supported by ICR# 4412
  1. ;
  1. ;Called from PSXRSUS -Builds ^PSX(550.2,,15,"C" , and returns to PSXRSUS or PSXRTRAN
  1. ;
  1. SDT ;
  1. K ^TMP($J,"PSX"),^TMP($J,"PSXDFN"),^TMP("PSXEPHNB",$J)
  1. K PSXBAT,ZCNT
  1. I $D(XRTL) D T0^%ZOSV
  1. S PSXTDIV=PSOSITE,PSXTYP=$S(+$G(PSXCS):"C",1:"N")
  1. ;
  1. ; $$SBTECME^PSXRPPL1 goes through the suspense queue for either CS
  1. ; or non-CS prescriptions (according to PSXTYP), up to and including
  1. ; the through date (PRTDT). For each Rx, it will send a claim if
  1. ; the patient has insurance.
  1. ;
  1. I $$ECMEON^BPSUTIL(PSXTDIV),$$CMOPON^BPSUTIL(PSXTDIV) D
  1. . N BPSCNT S BPSCNT=$$SBTECME^PSXRPPL1(PSXTYP,PSXTDIV,PRTDT,PSXDTRG)
  1. . ; - Wait 15 seconds per prescription sent to ECME (max of 2 hours)
  1. . I BPSCNT>0 H 60+$S((BPSCNT*15)>7200:7200,1:(BPSCNT*15))
  1. ;
  1. ; After many additional checks, GETDATA^PSXRPPL will eventually add
  1. ; each prescription to this batch (see RS550215, below). Later in
  1. ; the process, either they will be sent to CMOP (EN^PSXRTR) or
  1. ; labels will be printed (PRT^PSXRPPL).
  1. ;
  1. K ^TMP("PSXEPHIN",$J)
  1. S SDT=0
  1. F S SDT=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT)),XDFN=0 Q:(SDT>PRTDT)!(SDT'>0) D
  1. . F S XDFN=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,XDFN)),REC=0 Q:(XDFN'>0)!(XDFN="") D
  1. . . F S REC=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,XDFN,REC)) Q:(REC'>0)!(REC="") D
  1. . . . D GETDATA D:$G(RXN) PSOUL^PSSLOCK(RXN),OERRLOCK(RXN)
  1. ;
  1. ; After making a first pass through the suspense queue (SBTECME^
  1. ; PSXRPPL1), it will now make a second pass (CHKDFN^PSXRPPL2) to look
  1. ; for additional Rxs for patients who already have an Rx in the batch.
  1. ; CHKDFN^PSXRPPL2 makes a pass and sends claims when appropriate, and
  1. ; CHKDFN^PSXRPPL makes the same pass and calls GETDATA, which condi-
  1. ; tionally adds each Rx to the batch.
  1. ;
  1. I $G(PSXBAT),'$G(PSXRTRAN) D CHKDFN^PSXRPPL2(PRTDT)
  1. I $G(PSXBAT),'$G(PSXRTRAN) D CHKDFN
  1. ;
  1. ; - Sends a Mailman message if there were transmission problems with the 3rd Party Payer
  1. I $D(^TMP("PSXEPHIN",$J)) D ^PSXBPSMS K ^TMP("PSXEPHIN",$J),^TMP("PSXEPHNB",$J)
  1. ;
  1. EXIT ;
  1. K SDT,DFN,REC,RXNUM,PSXOK,FILNUM,REF,PNAME,CNAME,DIE,DR,%,CNT,COM,DTTM,FILL,JJ,PRTDT,PSXDIV,XDFN,NFLAG,CIND
  1. K CHKDT,DAYS,DRUG,DRUGCHK,NM,OPDT,PHARCLK,PHY,PSTAT,PTRA,PTRB,QTY,REL,RXERR,RXF,SFN,PSXDGST,PSXMC,PSXMDT
  1. S:$D(XRT0) XRTN=$T(+0) D:$D(XRT0) T1^%ZOSV
  1. K ^TMP("PSXEPHIN",$J),^TMP("PSXEPHNB",$J)
  1. Q
  1. ;
  1. GETDATA ;Screens rxs and builds data
  1. ;PSXOK=1:NOT CMOP DRUG OR DO NOT MAIL,2:TRADENAME,3:WINDOW,4:PRINTED,5:NOT SUSPENDED
  1. ;PSXOK=6:ALREADY RELEASED,7:DIFFERENT DIVISION,8:BAD DATA IN 52.5
  1. ;9:CS Mismatch,10:DEA 1 or 2
  1. 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
  1. 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
  1. 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
  1. N DFN S DFN=XDFN D DEM^VADPT
  1. I $G(VADM(6))'="" D DELETE K VADM Q
  1. S PSXOK=0,NFLAG=0
  1. S RXN=$P($G(^PS(52.5,REC,0)),"^",1) I RXN="" S PSXOK=8 Q
  1. S RFL=+$$GET1^DIQ(52.5,REC,9,"I")
  1. I '$D(^TMP($J,"PSXBAI",DFN)) D
  1. .S PSXGOOD=$$ADDROK^PSXMISC1(RXN)
  1. .I 'PSXGOOD S PSXFIRST=1 D I 'PSXFIRST S PSXOK=8
  1. ..D CHKACT^PSXMISC1(RXN)
  1. I PSXOK=8 K RXN Q
  1. ;
  1. N EPHQT
  1. S EPHQT=0
  1. I $$PATCH^XPDUTL("PSO*7.0*148"),'$$TRICVANB^PSXRPPL1(RXN,RFL) D EPHARM^PSXRPPL2
  1. D LOG^BPSOSL($$IEN59^BPSOSRX(RXN,RFL),$T(+0)_"-GETDATA, EPHQT="_EPHQT) ; ICR #4412,6764
  1. I EPHQT Q
  1. ;
  1. D CHKDATA^PSXMISC1
  1. ;
  1. SET Q:(PSXOK=7)!(PSXOK=8)!(PSXOK=9)
  1. S PNAME=$G(VADM(1))
  1. I ($G(PSXCSRX)=1)&($G(PSXCS)=1) S ^XTMP("PSXCS",PSOSITE,DT,RXN)=""
  1. I (PSXOK=0)&(PSXFLAG=1) S ^TMP($J,"PSXDFN",XDFN)="",NFLAG=4 D DQUE,RX550215 Q
  1. I (PSXOK=0)&(PSXFLAG=2) D RX550215 Q
  1. I (PSXOK>0)&(PSXOK<7)!(PSXOK=10) D DELETE Q
  1. Q
  1. ;
  1. DELETE ; deletes the CMOP STATUS field in PS(52.5, reindex 'AC' x-ref
  1. L +^PS(52.5,REC):600 Q:'$T
  1. N DR,DIE,DA S DIE="^PS(52.5,",DA=REC,DR="3///@" D ^DIE
  1. S ^PS(52.5,"AC",$P(^PS(52.5,REC,0),"^",3),$P(^PS(52.5,REC,0),"^",2),REC)=""
  1. L -^PS(52.5,REC)
  1. Q
  1. ;
  1. CHKDFN ;
  1. I '$D(^PSX(550.2,PSXBAT,15,"C")) Q
  1. S PSXPTNM=""
  1. F S PSXPTNM=$O(^PSX(550.2,PSXBAT,15,"C",PSXPTNM)) Q:PSXPTNM="" D
  1. . S XDFN=0
  1. . F S XDFN=$O(^PSX(550.2,PSXBAT,"15","C",PSXPTNM,XDFN)) Q:(XDFN'>0) D
  1. . . S SDT=PRTDT
  1. . . F S SDT=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT)) Q:(SDT>PSXDTRG)!(SDT="") D
  1. . . . S REC=0
  1. . . . F S REC=$O(^PS(52.5,"CMP","Q",PSXTYP,PSXTDIV,SDT,XDFN,REC)) Q:REC'>0 D
  1. . . . . D GETDATA D:$G(RXN) PSOUL^PSSLOCK(RXN),OERRLOCK(RXN)
  1. Q
  1. ;
  1. BEGIN ; Select print device
  1. I '$D(PSOPAR) D ^PSOLSET
  1. I $D(PSOLAP),($G(PSOLAP)'=ION) S PSLION=PSOLAP G PROFILE
  1. W ! S %ZIS("A")="PRINTER 'LABEL' DEVICE: ",%ZIS("B")="",%ZIS="MQN" D ^%ZIS S PSLION=ION G:POP EXIT
  1. I $G(IOST)["C-" W !,"You must select a printer!",! G BEGIN
  1. F J=0,1 S @("PSOBAR"_J)="" I $D(^%ZIS(2,^%ZIS(1,IOS,"SUBTYPE"),"BAR"_J)) S @("PSOBAR"_J)=^("BAR"_J)
  1. S PSOBARS=PSOBAR1]""&(PSOBAR0]"")&$P(PSOPAR,"^",19)
  1. K PSOION,J D ^%ZISC I $D(IO("Q")) K IO("Q")
  1. ;
  1. PROFILE I $D(PSOPROP),($G(PSOPROP)'=ION) G FDAMG
  1. 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
  1. I $G(PSOPROP)=ION W !,"You must select a printer!",! G PROFILE
  1. ;
  1. FDAMG ; Selects FDA Medication Guide Printer
  1. I $$GET1^DIQ(59,PSOSITE,134)'="" N FDAPRT S FDAPRT="" D I FDAPRT="^"!($G(PSOFDAPT)="") S POP=1 G EXIT
  1. . F D Q:FDAPRT'=""
  1. . . S FDAPRT=$$SELPRT^PSOFDAUT($P($G(PSOFDAPT),"^"))
  1. . . I FDAPRT="" W $C(7),!,"You must select a valid FDA Medication Guide printer."
  1. . I FDAPRT'="",(FDAPRT'="^") S PSOFDAPT=FDAPRT
  1. Q
  1. ;
  1. PRT ; Print labels.
  1. D NOW^%DTC S DTTM=% K %
  1. S NM="" F S NM=$O(^PSX(550.2,PSXBAT,15,"C",NM)) Q:NM="" D DFN,PPL ;gather patient RXs, print patient RXs
  1. S DIK="^PSX(550.2,",DA=PSXBAT D ^DIK K PSXBAT
  1. K CHKDT,CIND,DAYS,DRUG,DRUGCHK,NFLAG,NM,ORD,PDT,PHARCLK,PHY,PSTAT,PTRA,PTRB,QTY,REL,RXERR,RXF,SFN,SIG,SITE,SUS,SUSPT
  1. Q
  1. ;
  1. DFN S DFN=0,NFLAG=2
  1. F S DFN=$O(^PSX(550.2,PSXBAT,15,"C",NM,DFN)),RXN=0 Q:(DFN="")!(DFN'>0) D
  1. .F S RXN=$O(^PSX(550.2,PSXBAT,15,"C",NM,DFN,RXN)),RXF="" Q:(RXN="")!(RXN'>0) D
  1. ..F S RXF=$O(^PSX(550.2,PSXBAT,15,"C",NM,DFN,RXN,RXF)) Q:RXF="" D BLD
  1. Q
  1. ;
  1. BLD ;
  1. S BATRXDA=$O(^PSX(550.2,PSXBAT,15,"B",RXN,0)) D NOW^%DTC S DTTM=%
  1. S REC=$P(^PSX(550.2,PSXBAT,15,BATRXDA,0),U,5),SUS=$O(^PS(52.5,"B",RXN,0))
  1. I SUS=REC,+SUS'=0 I 1 ;rx still valid in suspense
  1. E D Q ;rx gone
  1. . N DA,DIK S DIK=550.2,DA(1)=PSXBAT,DA=BATRXDA
  1. . D ^DIK
  1. S PSOSU(DFN,SUS)=RXN,RXCNTR=$G(RXCNTR)+1,NFLAG=2
  1. S $P(^PSRX(RXN,0),U,15)=0,$P(^PSRX(RXN,"STA"),U,1)=0
  1. 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:"")
  1. D EN^PSOHLSN1(RXN,"SC","ZU",COM)
  1. S DA=SUS D DQUE K DA
  1. ACTLOG F JJ=0:0 S JJ=$O(^PSRX(RXN,"A",JJ)) Q:'JJ S CNT=JJ
  1. 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)
  1. S CNT=CNT+1,^PSRX(RXN,"A",0)="^52.3DA^"_CNT_"^"_CNT
  1. LOCK L +^PSRX(RXN):600 G:'$T LOCK
  1. S ^PSRX(RXN,"A",CNT,0)=DTTM_"^S^"_DUZ_"^"_RFCNT_"^"_COM L -^PSRX(RXN)
  1. K CNT,COM,RFCNT,%,JJ,RF,Y,RXCNTR
  1. Q
  1. ;
  1. PPL K PPL,PPL1 S ORD="" F S ORD=$O(PSOSU(ORD)) Q:(ORD="")!(ORD'>0) D PPL1
  1. Q
  1. ;
  1. PPL1 ; print patient labels
  1. F SFN=0:0 S SFN=$O(PSOSU(ORD,SFN)) Q:'SFN D
  1. . S:$L($G(PPL))<240 PPL=$P(PSOSU(ORD,SFN),"^")_","_$G(PPL)
  1. . S:$L($G(PPL))>239 PPL1=$P(PSOSU(ORD,SFN),"^")_","_$G(PPL1)
  1. . S DFN=$P(^PS(52.5,SFN,0),"^",3)
  1. S SUSPT=1,PSNP=$S($P(PSOPAR,"^",8):1,1:0) S:$D(PSOPROP) PFIO=PSOPROP
  1. D QLBL^PSORXL
  1. I $D(PPL1) S PSNP=0,PPL=PPL1 D QLBL^PSORXL
  1. K PPL,PPL1,PSOSU(ORD)
  1. Q
  1. ;
  1. DQUE ; sets the CMOP indicator field, and printed field in 52.5
  1. L +^PS(52.5,REC):600 G:'$T DQUE
  1. I NFLAG=4 D
  1. . 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
  1. S CIND=$S(NFLAG=1:"X",NFLAG=2:"P",NFLAG=3:"@",1:0)
  1. I $G(NFLAG)'=2 D
  1. .S DA=REC,DIE="^PS(52.5,",DR="3////"_CIND_";4////"_DT
  1. .D ^DIE K DIE,DA,DR
  1. .S ^PS(52.5,REC,"P")=1,^PS(52.5,"ADL",DT,REC)=""
  1. I $G(NFLAG)=2 D ;print label cycle
  1. . S DA=REC,DIE="^PS(52.5,",DR="3////"_CIND_";4////"_DTTM_";5////"_DUZ_";7////"_RXCNTR
  1. . D ^DIE K DIE,DA,DR
  1. . S ^PS(52.5,REC,"P")=1,^PS(52.5,"ADL",$E($P(^PS(52.5,REC,0),"^",8),1,7),REC)=""
  1. L -^PS(52.5,REC)
  1. I $G(NFLAG)=2 D EN^PSOHLSN1(RXN,"SC","ZU","CMOP Suspense Label Printed")
  1. Q
  1. ;
  1. RX550215 ; put RX into RX multiple TRANS 550.215 for PSXBAT
  1. I '$G(PSXBAT) D BATCH^PSXRSYU ; first time through create batch, & return PSXBAT
  1. K DD,DO,DIC,DA,DR,D0
  1. S:'$D(^PSX(550.2,PSXBAT,15,0)) ^PSX(550.2,PSXBAT,15,0)="^550.215P^^"
  1. S X=RXN,DA(1)=PSXBAT
  1. S DIC="^PSX(550.2,"_PSXBAT_",15,",DIC("DR")=".02////^S X=RXF;.03////^S X=DFN;.05////^S X=REC",DIC(0)="ZF"
  1. D FILE^DICN
  1. S PSXRXTDA=+Y ;RX DA within PSXBAT 'T'ransmission
  1. K DD,DO,DIC,DA,DR,D0
  1. Q
  1. ;
  1. OERRLOCK(RXN) ; set XTMP for OERR/CPRS order locking
  1. I $G(PSXBAT),$G(RXN),$G(PSXRXTDA) I 1
  1. E Q
  1. I $P(^PSX(550.2,PSXBAT,15,PSXRXTDA,0),U,1)'=RXN Q
  1. RXNSET ; set ^XTMP("ORLK-"_ORDER per IA 4001 needs RXN
  1. Q:'$G(RXN)
  1. N ORD,NOW,NOW1 S ORD=+$P($G(^PSRX(+$G(RXN),"OR1")),"^",2)
  1. Q:'ORD
  1. S NOW=$$NOW^XLFDT,NOW1=$$FMADD^XLFDT(NOW,1)
  1. S ^XTMP("ORLK-"_+ORD,0)=NOW1_U_NOW_"^CPRS/CMOP RX/Order Lock",^(1)=DUZ_U_$J
  1. Q
  1. ;
  1. RXNCLEAR ; needs RXN
  1. Q:'$G(RXN)
  1. N ORD S ORD=+$P($G(^PSRX(+$G(RXN),"OR1")),"^",2) Q:'ORD
  1. I $D(^XTMP("ORLK-"_ORD,0)),^(0)["CPRS/CMOP" K ^XTMP("ORLK-"_ORD)
  1. Q
  1. ;