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

PSOSUPOE.m

Go to the documentation of this file.
  1. PSOSUPOE ;BIR/RTR - Suspense pull via Listman ;Jan 20, 2022@11:21:55
  1. ;;7.0;OUTPATIENT PHARMACY;**8,21,27,34,130,148,281,287,289,358,385,403,427,496,544,562,441**;DEC 1997;Build 208
  1. ;External references PSOL and PSOUL^PSSLOCK supported by DBIA 2789
  1. SEL I '$G(PSOCNT) S VALMSG="This patient has no Prescriptions!" S VALMBCK="" Q
  1. N PSOGETF,PSOGET,PSOGETFN,ORD,ORN,MW,PDUZ,PSLST,PSOSQ,PSOSQRTE,PSOSQMTH,PSPOP,PSOX1,PSOX2,RXLTOP,RXREC,SFN,SORD,SORN,VALMCNT
  1. K DIR,DUOUT,DTOUT S DIR("A")="Select Orders by number",DIR(0)="LO^1:"_PSOCNT D ^DIR K DIR I $D(DTOUT)!($D(DUOUT))!('Y) S VALMSG="Nothing pulled from suspense!",VALMBCK="" Q
  1. S PSLST=Y
  1. SELQ D FULL^VALM1
  1. K DIR S DIR("A")="Select routing for Rx(s)",DIR(0)="S^M:MAIL;W:WINDOW",DIR("B")="WINDOW" D ^DIR K DIR I Y["^"!($D(DTOUT))!($D(DUOUT)) G END
  1. S PSOSQRTE=Y I $G(PSOSQRTE)="W",$P(PSOPAR,"^",12) K DIR S DIR(0)="FO^2:60",DIR("A")="METHOD OF PICK-UP" D ^DIR S PSOSQMTH=$G(Y) K DIR I Y["^"!($D(DTOUT))!($D(DUOUT)) G END
  1. W ! K DIR S DIR(0)="Y",DIR("A")="Pull Rx(s) and delete from suspense",DIR("B")="YES" D D ^DIR K DIR I Y'=1 G END
  1. .S DIR("?",1)="Enter Yes to pull selected Rx(s) from suspense. Since(Rx(s) pulled early from",DIR("?",2)="suspense are not associated with a printed batch, these Rx(s) cannot be"
  1. .S DIR("?",3)="reprinted from suspense using the 'Reprint batches from suspense' option.",DIR("?")="Therefore, any Rx(s) pulled early from suspense will be deleted from suspense."
  1. Q:$G(PULLONE)
  1. F SORD=1:1:$L(PSLST,",") Q:$P(PSLST,",",SORD)']"" S SORN=$P(PSLST,",",SORD) D:+PSOLST(SORN)=52 BEG
  1. S VALMBCK="R"
  1. I '$G(PSOSQ) S VALMSG="No Rx's pulled from suspense!"
  1. Q
  1. BEG ;
  1. S RXREC=$P(PSOLST(SORN),"^",2)
  1. BEGQ Q:'$D(^PSRX(+$G(RXREC),0))
  1. D PSOL^PSSLOCK(RXREC) I '$G(PSOMSG) W !!,$S($P($G(PSOMSG),"^",2)'="":$P($G(PSOMSG),"^",2),1:"Another person is editing Rx "_$P($G(^PSRX(RXREC,0)),"^")),! K PSOMSG D DIR Q
  1. K PSOMSG I $P($G(^PSRX(RXREC,"STA")),"^")'=5 W !!,"Rx# ",$P(^PSRX(RXREC,0),"^")," is not on Suspense",$S($G(^PSRX(RXREC,"PARK")):" and needs to be UNPARKED to be filled",1:""),"!" D DIR,ULRX Q ;p441 mwa added unparked message
  1. S SFN=$O(^PS(52.5,"B",RXREC,0)) I 'SFN D DIR,ULRX Q
  1. S PDUZ=DUZ I +$G(^PS(52.5,SFN,"P")) W !,">>> Rx #",$P(^PSRX(+$P(^(0),"^"),0),"^")," ALREADY PRINTED FROM SUSPENSE.",!,?5,"USE THE REPRINT OPTION TO REPRINT LABEL." D DIR,ULRX Q
  1. I +$P($G(^PSRX(RXREC,2)),"^",6)<DT,+$P($G(^("STA")),"^")<11 D S DIE=52,DA=RXREC,DR="100///11" D ^DIE S DA=SFN,DIK="^PS(52.5," D ^DIK K DIE,DA,DIK W !,"Rx # "_$P(^PSRX(RXREC,0),"^")_" has expired!" D DIR,ULRX Q
  1. .N PSCOU,AAA,VVV,QQQ,PSOPRT,PSOEXPI D EX^PSOSUTL
  1. I $D(RXRP(RXREC)) W !!,"A reprint has already been requested for Rx # ",$P($G(^PSRX(RXREC,0)),"^") D DIR,ULRX Q
  1. I $D(RXPR(RXREC)) W !!,"A partial has already been requested for Rx # ",$P($G(^PSRX(RXREC,0)),"^") D DIR,ULRX Q
  1. S PSPOP=0 I $G(PSODIV),$P($G(^PS(52.5,SFN,0)),"^",6)'=$G(PSOSITE) D CKDIV I $G(PSPOP) D DIR,ULRX Q
  1. ;
  1. ; PSO*427-Check if Label Log indicates a label was already printed.
  1. N PRNTED,RFL
  1. S RFL=$P($G(^PS(52.5,SFN,0)),"^",13)
  1. S PRNTED=$$PRINTED^PSOSULBL(SFN,RXREC,RFL)
  1. ; PSO*427-If previously printed, ask user whether to continue. If NO (0), remove from suspense. If NO (0) or exit (-1), unlock and quit
  1. I PRNTED N CONT S CONT=$$PRTQUES^PSOSUPRX(RXREC,RFL) I CONT'=1 D Q
  1. . I CONT=0 D REMOVE^PSOSULBL(SFN,RXREC,RFL,DUZ,1,PRNTED)
  1. . I CONT=-1 W !,"This prescription will not be pulled but will be left on suspense."
  1. . D DIR,ULRX
  1. ;
  1. ; Submitting Rx to ECME for 3rd Party Billing and checking the outcome
  1. ; If there are unresolved DUR, Refill Too Soon, or TRICARE/CHAMPVA rejects, we will not add the RX to the
  1. ; list of RXs that are pulled from suspense
  1. ; We also need to quit if the user discontinued from the reject notification screen as the RX Suspense record
  1. ; is deleted by a discontinue
  1. ;
  1. ; Do not send a claim if the last submission was rejected and
  1. ; all rejects have been closed.
  1. ;
  1. N ACTION S ACTION=""
  1. N RFL S RFL=$G(RXFL(RXREC)) I RFL="" S RFL=$$LSTRFL^PSOBPSU1(RXREC)
  1. I '$D(RXPR(RXREC)),$$SEND^PSOBPSU2(RXREC,RFL) D I ACTION="Q"!(ACTION="D") D ULRX Q
  1. . D ECMESND^PSOBPSU1(RXREC,RFL,,"PP")
  1. . ; Quit if there is an unresolved TRICARE/CHAMPVA non-billable reject code, PSO*7*358
  1. . I $$PSOET^PSOREJP3(RXREC,RFL) S ACTION="Q" W !!,"Pull early cannot be done for non-billable TRICARE/CHAMPVA Rx on the worklist" D DIR Q
  1. . ; Check for unresolved rejects
  1. . I $$FIND^PSOREJUT(RXREC,RFL) S ACTION=$$HDLG^PSOREJU1(RXREC,RFL,"79,88,943","PP","IOQ","Q")
  1. . ; Check for TRICARE/CHAMPVA that are not complete
  1. . I $$TRIC^PSOREJP1(RXREC,RFL),$P($$STATUS^PSOBPSUT(RXREC,RFL),U)="IN PROGRESS" S ACTION="Q" W !!,"Pull early cannot be done for IN PROGRESS TRICARE/CHAMPVA Rx" D DIR Q
  1. ;
  1. S:$P(^PS(52.5,SFN,0),"^",5) RXPR(RXREC)=$P(^(0),"^",5) S:$P(^PS(52.5,SFN,0),"^",12) RXRP(RXREC)=1
  1. S RXFL(RXREC)=$P($G(^PS(52.5,SFN,0)),"^",13),RXRS(RXREC)=$G(PSODFN),RXLTOP=1
  1. S RXRS(RXREC)=$G(RXRS(RXREC))_"^"_$S($P($G(^PS(52.5,SFN,0)),"^",4)="W":"W",1:"M")_"^"_$P($G(^PSRX(RXREC,"MP")),"^") S PSOGET="M" D GETMW
  1. S RXRS(RXREC)=$G(RXRS(RXREC))_"^"_$G(PSOGETF)_"^"_$G(PSOGETFN)_"^"_$S($G(PSOGET)="W":"W",1:"M")
  1. S $P(^PS(52.5,SFN,0),"^",4)=$G(PSOSQRTE) S MW=$G(PSOSQRTE) N RR,RFCNT D MAILS^PSOSUPAT I $D(PSOSQMTH) S $P(^PSRX(RXREC,"MP"),"^")=$G(PSOSQMTH)
  1. S PSOSQ=1
  1. ;
  1. D ULRX K PSOGET,PSOGETF
  1. Q
  1. WIND ;
  1. N RRT,RRTT,XXXX,JJJJ,PSINTRX,RTETEST,PSOPSO,SSSS
  1. S PBINGRTE=0,PSINTRX=RXREC
  1. I $G(RXPR(RXREC)) S RTETEST=$P($G(^PSRX(RXREC,"P",RXPR(PSINTRX),0)),"^",2) S:RTETEST="W" PBINGRTE=1 Q
  1. S PSOPSO=0 F SSSS=0:0 S SSSS=$O(^PSRX(PSINTRX,1,SSSS)) Q:'SSSS S PSOPSO=SSSS
  1. I 'PSOPSO S RTETEST=$P($G(^PSRX(PSINTRX,0)),"^",11) S:RTETEST="W" PBINGRTE=1 Q
  1. I PSOPSO S RTETEST=$P($G(^PSRX(PSINTRX,1,PSOPSO,0)),"^",2) S:RTETEST="W" PBINGRTE=1 Q
  1. Q
  1. DIR ;
  1. W ! K DIR S DIR(0)="E",DIR("A")="Press Return to Continue" D ^DIR K DIR Q
  1. END S VALMSG="Nothing pulled from suspense!",VALMBCK="R" S:$G(PULLONE)=1 PULLONE=2 Q
  1. ADD ;Add Rx to SPSORX array
  1. I $G(SPSORX("PSOL",1))']"" S SPSORX("PSOL",1)=RXREC_"," Q
  1. F PSOX1=0:0 S PSOX1=$O(SPSORX("PSOL",PSOX1)) Q:'PSOX1 S PSOX2=PSOX1
  1. I $L(SPSORX("PSOL",PSOX2))+$L(RXREC)<220 S SPSORX("PSOL",PSOX2)=SPSORX("PSOL",PSOX2)_RXREC_"," Q
  1. S SPSORX("PSOL",PSOX2+1)=RXREC_","
  1. Q
  1. BBADD ;
  1. N PSOX1,PSOX2
  1. I $G(BBRX(1))']"" S BBRX(1)=RXREC_"," Q
  1. F PSOX1=0:0 S PSOX1=$O(BBRX(PSOX1)) Q:'PSOX1 S PSOX2=PSOX1
  1. I $L(BBRX(PSOX2))+$L(RXREC)<220 S BBRX(PSOX2)=BBRX(PSOX2)_RXREC_"," Q
  1. S BBRX(PSOX2+1)=RXREC_","
  1. Q
  1. PPLADD ;
  1. ; This function will move entries from the RXRS array (which has RXs that were pulled
  1. ; from supense via the PP action on the Medication profile) to the list of RXs that
  1. ; will get a label (PPL variable and possible PSORX array).
  1. ; Note that arrays RXRS and PSORX and variable PPL are pre-existing
  1. N SZZ,SPSOX1,SPSOX2,LSFN
  1. I $G(PPL)'="",$E(PPL,$L(PPL))'="," S PPL=PPL_","
  1. ;
  1. ; Loop through entries in the RXRS array and process
  1. S SZZ=0 F S SZZ=$O(RXRS(SZZ)) Q:'SZZ D
  1. .; If SZZ is already set in the PPL variable do not set it again
  1. .I $G(PPL)[SZZ Q
  1. .; Check if label already printed per the RX SUSPENSE file
  1. .S LSFN=$O(^PS(52.5,"B",SZZ,0))
  1. .Q:'$G(LSFN)
  1. .Q:$G(^PS(52.5,LSFN,"P"))
  1. .; The following function checks for ECME conditions where we do not want a label
  1. .; This is probably redundant as the RXRS array entry should not have been created if any of these
  1. .; conditions existed but things might have changed after the entry was created
  1. .I $$ECMECHK^PSOREJU3(SZZ) Q
  1. .; Add to list of RXs that should get a label
  1. .I $G(PPL)="" S PPL=SZZ_"," Q
  1. .I $L(PPL)+$L(SZZ)<220 S PPL=PPL_SZZ_"," Q
  1. .I $G(PSORX("PSOL",2))']"" S PSORX("PSOL",2)=SZZ_"," Q
  1. .F SPSOX1=1:0 S SPSOX1=$O(PSORX("PSOL",SPSOX1)) Q:'SPSOX1 S SPSOX2=SPSOX1
  1. .I $L(PSORX("PSOL",SPSOX2))+$L(SZZ)<220 S PSORX("PSOL",SPSOX2)=PSORX("PSOL",SPSOX2)_SZZ_"," Q
  1. .S PSORX("PSOL",SPSOX2+1)=SZZ_","
  1. Q
  1. CKDIV ;
  1. I '$P($G(PSOSYS),"^",2) W !!?10,"Rx # ",$P(^PSRX(RXREC,0),"^")," is not a valid choice (Different Division)" S PSPOP=1 Q
  1. I $P($G(PSOSYS),"^",3) W !!?10 K DIR S DIR("A")="Rx # "_$P(^PSRX(RXREC,0),"^")_" is from another division. OK to Pull",DIR(0)="Y",DIR("B")="YES" D ^DIR K DIR I $G(DIRUT)!('Y) S PSPOP=1
  1. Q
  1. SELONE ;Pull one Rx through Listman
  1. I $G(PSOBEDT) W $C(7),$C(7) S VALMSG="Invalid Action at this time !",VALMBCK="" Q
  1. N ORD,MW,PDUZ,PSLST,PSOSQ,PSOSQRTE,PSOSQMTH,PSPOP,PSOX1,PSOX2,PULLONE,RXLTOP,RXREC,SFN,SORD,SORN,VALMCNT
  1. S PULLONE=1
  1. I +PSOLST(ORN)'=52 S VALMBCK="" Q
  1. I +PSOLST(ORN)=52,$P($G(^PSRX($P(PSOLST(ORN),"^",2),"STA")),"^")'=5 S VALMSG="Rx is not on Suspense"_$S($G(^PSRX($P(PSOLST(ORN),"^",2),"PARK")):" and needs to be UNPARKED",1:"")_"!",VALMBCK="" Q ;p441 mwa added unparked message
  1. I +PSOLST(ORN)=52,$D(RXRS($P(PSOLST(ORN),"^",2))) S VALMSG="Pull early has already been requested!",VALMBCK="" Q
  1. N EHOLDQ,ESIEN,ERXIEN S ERXIEN=$P(PSOLST(ORN),"^",2),ESIEN="",ESIEN=$O(^PS(52.5,"B",ERXIEN,ESIEN))
  1. I $G(ESIEN),$$GET1^DIQ(52.5,ESIEN,10)'="" D EHOLD Q:$G(EHOLDQ)
  1. K EHOLDQ,ESIEN,ERXIEN
  1. D SELQ I $G(PULLONE)=2 S VALMSG="Rx# "_$P($G(^PSRX($P(PSOLST(ORN),"^",2),0)),"^")_" not pulled from suspense!" Q
  1. I +PSOLST(ORN)=52 S RXREC=$P(PSOLST(ORN),"^",2)
  1. D BEGQ S VALMSG="Rx# "_$P($G(^PSRX(+$G(RXREC),0)),"^")_$S($G(PSOSQ):" pulled",1:" not pulled")_" from Suspense!"
  1. S VALMBCK="R"
  1. Q
  1. RESET ;
  1. N RSDA,RXMW,RXMP,RXSP,RXR,DA,RXPSRX,RXFILL,RXFILLN
  1. F RSDA=0:0 S RSDA=$O(RXRS(RSDA)) Q:'RSDA D
  1. .S RXSP=$O(^PS(52.5,"B",RSDA,0)) Q:'RXSP
  1. .Q:'$D(^PS(52.5,RXSP,0))
  1. .S RXMW=$S($P($G(RXRS(RSDA)),"^",2)="":"M",1:$P($G(RXRS(RSDA)),"^",2)),RXMP=$P($G(RXRS(RSDA)),"^",3),RXFILL=$P($G(RXRS(RSDA)),"^",4),RXFILLN=$P($G(RXRS(RSDA)),"^",5),RXPSRX=$S($P($G(RXRS(RSDA)),"^",6)="":"M",1:$P($G(RXRS(RSDA)),"^",6))
  1. .I RXMW'="" S $P(^PS(52.5,RXSP,0),"^",4)=RXMW D
  1. ..I RXFILL="P" D Q
  1. ...I $D(^PSRX(RSDA,"P",+$G(RXFILLN),0)) S $P(^PSRX(RSDA,"P",+$G(RXFILLN),0),"^",2)=$G(RXPSRX),$P(^PSRX(RSDA,"MP"),"^")=RXMP
  1. ..I RXFILL="R",$G(RXFILLN) S DA(1)=RSDA,DA=RXFILLN,DIE="^PSRX("_DA(1)_",1,",DR="2////"_RXPSRX D ^DIE K DIE
  1. ..I RXFILL="O" S DA=RSDA,DIE="^PSRX(",DR="11////"_RXPSRX D ^DIE K DIE
  1. ..S $P(^PSRX(RSDA,"MP"),"^")=RXMP
  1. Q
  1. GETMW ;
  1. N GETPAR,GETRX,GETCNT
  1. S PSOGETF="O",PSOGETFN=""
  1. S GETPAR=$P($G(^PS(52.5,SFN,0)),"^",5)
  1. I GETPAR S PSOGET=$P($G(^PSRX(RXREC,"P",GETPAR,0)),"^",2),PSOGETF="P",PSOGETFN=GETPAR Q
  1. I '$O(^PSRX(RXREC,1,0)) S PSOGET=$P($G(^PSRX(RXREC,0)),"^",11) Q
  1. S GETRX=0 F GETCNT=0:0 S GETCNT=$O(^PSRX(RXREC,1,GETCNT)) Q:'GETCNT S GETRX=GETCNT
  1. S PSOGET=$P($G(^PSRX(RXREC,1,+$G(GETRX),0)),"^",2),PSOGETF="R",PSOGETFN=+$G(GETRX)
  1. Q
  1. ULRX ;
  1. I '$G(RXREC) Q
  1. D PSOUL^PSSLOCK(RXREC)
  1. Q
  1. EHOLD ;
  1. Q:'$G(ERXIEN)
  1. Q:$$GET1^DIQ(52,ERXIEN,86)=""
  1. D FULL^VALM1
  1. W !,"This is an ePharmacy billable fill which is Suspended until "_$$GET1^DIQ(52.5,ESIEN,10)_", based"
  1. W !,"on the 3/4 Days rule.",!
  1. K DIR S EHOLDQ=0,DIR(0)="YA",DIR("A")="Do you wish to continue? "
  1. D ^DIR I $D(DIRUT)!('Y) S EHOLDQ=1 K DIR
  1. S VALMSG="No action taken.",VALMBCK="R"
  1. Q
  1. ;