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

PSOERPT1.m

Go to the documentation of this file.
  1. PSOERPT1 ;BIRM/MFR - eRx Single Patient Medication Queue Supporting API's ; 12/10/22 10:57am
  1. ;;7.0;OUTPATIENT PHARMACY;**700,750,746,769**;DEC 1997;Build 26
  1. ;
  1. SETHDR() ; - Displays the Header Line
  1. N HDR,SRTORD,SRTPOS
  1. ;
  1. S HDR="#",$E(HDR,5)="ERX ID",$E(HDR,19)="DRUG NAME",$E(HDR,42)="PROVIDER NAME",$E(HDR,59)="REC.DATE"
  1. S $E(HDR,68)="STA",$E(HDR,72)="PT",$E(HDR,75)="PR",$E(HDR,78)="DR "
  1. D INSTR^VALM1(IORVON_HDR_IOINORM,1,4)
  1. S SRTORD=$S(PSORDER="A":"^",1:"v")
  1. I PSOSRTBY="ALL" D
  1. . D INSTR^VALM1(IOINHI_IORVON_SRTORD_IOINORM,74,4)
  1. . D INSTR^VALM1(IOINHI_IORVON_SRTORD_IOINORM,77,4)
  1. . D INSTR^VALM1(IOINHI_IORVON_SRTORD_IOINORM,80,4)
  1. E D
  1. . S SRTPOS=$S(PSOSRTBY="ID":11,PSOSRTBY="DR":28,PSOSRTBY="PR":55,PSOSRTBY="RE":67,PSOSRTBY="STA":71,PSOSRTBY="PAM":74,PSOSRTBY="PRM":77,1:80)
  1. . D INSTR^VALM1(IOINHI_IORVON_SRTORD_IOINORM,SRTPOS,4)
  1. Q
  1. ;
  1. SETSORT(FIELD) ;Sets the data sorted by the FIELD specified
  1. ; Input: FIELD - Sort By Field
  1. N RECDAT,ERXIEN,CSGROUP,SORT,RELMSGID
  1. K ^TMP("PSOERPTS",$J),^TMP("PSOERINC",$J)
  1. ; Loading eRx's (file #52.49)
  1. S ERXIEN=0,RECDAT=$$FMADD^XLFDT(DT,-PSOLKBKD)
  1. F S RECDAT=$O(^PS(52.49,"PAT2",EPATIEN,RECDAT)) Q:'RECDAT D
  1. . F S ERXIEN=$O(^PS(52.49,"PAT2",EPATIEN,RECDAT,ERXIEN)) Q:'ERXIEN D
  1. . . D SETITEM(ERXIEN,FIELD) S ^TMP("PSOERINC",$J,ERXIEN)=""
  1. . . S RELMSGID=0 F S RELMSGID=$O(^PS(52.49,ERXIEN,201,"B",RELMSGID)) Q:'RELMSGID D
  1. . . . I $$GET1^DIQ(52.49,RELMSGID,.03,"I")<$$FMADD^XLFDT(DT,-PSOLKBKD) Q
  1. . . . I $D(^TMP("PSOERINC",$J,RELMSGID)) Q
  1. . . . D SETITEM(RELMSGID,FIELD) S ^TMP("PSOERINC",$J,RELMSGID)=""
  1. K ^TMP("PSOERINC",$J)
  1. Q
  1. ;
  1. SETITEM(ERXIEN,FIELD) ; Adds an eRx Record to the Sorted List
  1. ; Input: ERXIEN - eRx IEN - Pointer to #52.49
  1. ; FIELD - Sort By field
  1. N STATUS,MSGTYPE,ERXID,DRUG,CSGROUP,PROVIDER,PATMTCH,PROMTCH,DRUMTCH,Z,X,MSGDTTM
  1. S STATUS=$$GET1^DIQ(52.49,ERXIEN,1)
  1. ; Actionable/Non-Actionable Status
  1. I '$G(PSOALLST),$F(",RJ,RM,REM,PR,E,RXA,CXA,CAA,CAN,CXP,RXP,RXA,ICA,CNP,CRP,CRC,RRC,CXC,CNE,CRN,CRR,CRX,CXQ,RXA,RXC,RRN,RRX,RRR,RRP,IRA,",","_$E(STATUS,1,3)_",") Q
  1. S MSGTYPE=$$GET1^DIQ(52.49,ERXIEN,.08,"I")
  1. S MSGDTTM=$$GET1^DIQ(52.49,ERXIEN,.03,"I")
  1. ; Skip Change Request records w/ Processing Error Status
  1. I '$G(PSOALLST),MSGTYPE="CR",STATUS="CRE" Q
  1. ; Skip Inbound errors except RRE or CRE records
  1. I '$G(PSOALLST),MSGTYPE="IE",(STATUS'="RRE"),(STATUS'="CRE") Q
  1. ; Related Institution Filter (Non-MbM sites only)
  1. I '$G(MBMSITE),PSNPINST'=+$$GET1^DIQ(52.49,ERXIEN,24.1,"I") Q
  1. ; Controlled Substance Prompts Filter
  1. I $G(PSOCSERX)="CS",'$$GET1^DIQ(52.49,ERXIEN,95.1,"I") Q
  1. I $G(PSOCSERX)="Non-CS",$$GET1^DIQ(52.49,ERXIEN,95.1,"I") Q
  1. I '$$CSFILTER^PSOERXUT(ERXIEN) Q
  1. S ERXID=$$GET1^DIQ(52.49,ERXIEN,.01)
  1. S DRUG=$$GETDRUG^PSOERXU5(ERXIEN) I DRUG="" S DRUG=$S(MSGTYPE="IE":"<<INBOUND ERROR>>",1:"N/A")
  1. S CSGROUP=$S('PSOCSGRP:"ALL",$$GET1^DIQ(52.49,ERXIEN,95.1,"I"):"CS",1:"NON-CS")
  1. S PROVIDER=$$GET1^DIQ(52.49,ERXIEN,2.1) I PROVIDER="" S PROVIDER=$$GET1^DIQ(52.48,$$GETPROV^PSOERXU5(ERXIEN),.01)
  1. S PATMTCH=$$MATCH^PSOERPT2("PAM",ERXIEN)
  1. S PROMTCH=$$MATCH^PSOERPT2("PRM",ERXIEN)
  1. S DRUMTCH=$$MATCH^PSOERPT2("DRM",ERXIEN)
  1. S Z="",$P(Z,"^")=$E(DRUG,1,34),$P(Z,"^",2)=$E(PROVIDER,1,16),$P(Z,"^",3)=$$FMTE^XLFDT(MSGDTTM\1,"2Z")
  1. S $P(Z,"^",4)=STATUS,$P(Z,"^",5)=PATMTCH,$P(Z,"^",6)=PROMTCH,$P(Z,"^",7)=DRUMTCH
  1. I FIELD="ID" S SORT=$S(ERXID:1000000000000+ERXID,1:ERXID)_" "_ERXIEN
  1. I FIELD="DR" S SORT=$$UP^XLFSTR(DRUG)_" "_ERXIEN
  1. I FIELD="PR" S SORT=PROVIDER_" "_ERXIEN
  1. I FIELD="RE" S SORT=MSGDTTM_" "_ERXIEN
  1. I FIELD="STA" S SORT=STATUS_" "_RECDAT
  1. I FIELD="PAM" S X=$P(PATMTCH,"^"),SORT=$S(X="":1,X="M":2,1:3)_ERXIEN
  1. I FIELD="PRM" S X=$P(PROMTCH,"^"),SORT=$S(X="":1,X="M":2,1:3)_ERXIEN
  1. I FIELD="DRM" S X=$P(DRUMTCH,"^"),SORT=$S(X="":1,X="M":2,1:3)_ERXIEN
  1. I FIELD="ALL" S SORT=$$MATCHSRT^PSOERPT2($P(PATMTCH,"^"),$P(PROMTCH,"^"),$P(DRUMTCH,"^"))_ERXIEN
  1. S ^TMP("PSOERPTS",$J,CSGROUP,SORT)=Z
  1. S ^TMP("PSOERPTS",$J,CSGROUP,SORT,"ERXIEN")=ERXIEN
  1. I $P(PATMTCH,"^",2) S ^TMP("PSOERPTS",$J,CSGROUP,SORT,"PATAM")=1
  1. I $P(PROMTCH,"^",2) S ^TMP("PSOERPTS",$J,CSGROUP,SORT,"PROAM")=1
  1. I $P(PROMTCH,"^",3) S ^TMP("PSOERPTS",$J,CSGROUP,SORT,"PROAV")=1
  1. I $P(DRUMTCH,"^",2) S ^TMP("PSOERPTS",$J,CSGROUP,SORT,"DRUAM")=1
  1. Q
  1. ;
  1. MATCHSUG(ERXIEN,VIEW) ; Match Suggestion Prompt
  1. ; Input: ERXIEN - Pointer to ERX HOLDING QUEUE file (#52.49)
  1. ; (o)VIEW - View Only Mode (1:YES,0/null: NO)
  1. ;Output: VISTAPAT - VistA Patient (Pointer to #2) or 0 (Not selected or no suggestion on file)
  1. ;
  1. N MATCHSUG,MATCHCNT,LSTMTCH,LSTERXID,CNT,ERXPAT,VPAT,QUIT,DIR,DIRUT,DIROUT,X,Y,II,ERXID
  1. S ERXPAT=+$$GET1^DIQ(52.49,+$G(ERXIEN),.04,"I") I 'ERXPAT Q 0
  1. S (MATCHSUG,MATCHCNT,CNT,VPAT,QUIT)=0
  1. F S VPAT=$O(^PS(52.49,"APATVPAT",ERXPAT,VPAT)) Q:'VPAT S:'$$DEAD^PSONVARP(VPAT) MATCHCNT=MATCHCNT+1
  1. I MATCHCNT>3 S MATCHCNT=3
  1. S VPAT=0 F S VPAT=$O(^PS(52.49,"APATVPAT",ERXPAT,VPAT)) Q:'VPAT D I MATCHSUG!(CNT>2)!QUIT Q
  1. . I $$DEAD^PSONVARP(VPAT) Q
  1. . S LSTERXID=0,LSTMTCH=9999999 F S LSTMTCH=$O(^PS(52.49,"APATVPAT",ERXPAT,VPAT,LSTMTCH),-1) Q:'LSTMTCH D I LSTERXID Q
  1. . . S ERXID=$O(^PS(52.49,"APATVPAT",ERXPAT,VPAT,LSTMTCH,0)) Q:(ERXID=ERXIEN) S LSTERXID=ERXID
  1. . I 'LSTERXID Q
  1. . S CNT=CNT+1
  1. . D CMPPAT(ERXIEN,VPAT,LSTERXID,CNT_"^"_MATCHCNT)
  1. . K DIR S DIR(0)="SOA^"_$S('$G(VIEW):"A:ACCEPT;",1:"")_$S(MATCHCNT>1&(MATCHCNT'=CNT):"N:NEXT;",1:"")_"F:FORGET;E:EXIT"
  1. . S DIR("A")="ACTION on SUGGESTION: "_$S('$G(VIEW):"(A)CCEPT ",1:"")_$S(MATCHCNT>1&(MATCHCNT'=CNT):"(N)EXT ",1:"")_"(F)ORGET (E)XIT: "
  1. . S DIR("B")=$S(MATCHCNT>1&(MATCHCNT'=CNT):"NEXT",1:"EXIT")
  1. . S II=0
  1. . I '$G(VIEW) D
  1. . . S II=II+1,DIR("?",II)=" ACCEPT - Accepts the suggested VistA Patient and matches it to the eRx"
  1. . I MATCHCNT>1&(MATCHCNT'=CNT) D
  1. . . S II=II+1,DIR("?",II)=" NEXT - Ignores this suggested VistA Patient and view the next one"
  1. . S II=II+1,DIR("?",II)=" FORGET - Forgets this suggested VistA Patient so that it is not presented"
  1. . S II=II+1,DIR("?",II)=" again in the future to any user"
  1. . S DIR("?")=" EXIT - Exit and proceed to match the VistA Patient manually"
  1. . D ^DIR I $D(DIRUT)!$D(DIROUT)!(Y="E") S QUIT=1 Q
  1. . I Y="A" S MATCHSUG=VPAT Q
  1. . I Y="N" W ! Q
  1. . I Y="F" D
  1. . . K DIR S DIR(0)="SA^Y:YES;N:NO",DIR("B")="NO"
  1. . . S DIR("A")="Are you sure this validated match should be forgotten? "
  1. . . S DIR("?")="This VistA Patient was previously matched and validated as a valid match for this eRx Patient. Once you forget this match it will no longer be suggested as a match for this eRx patient."
  1. . . W ! D ^DIR I $D(DIRUT)!$D(DIROUT)!(Y="N") S VPAT=VPAT-1,CNT=CNT-1 W ! Q
  1. . . W !?50,"Forgetting..." K ^PS(52.49,"APATVPAT",ERXPAT,VPAT) H 1 W "done." W ! Q
  1. Q MATCHSUG
  1. ;
  1. CMPPAT(ERXIEN,VISTAPAT,LSTERXID,COUNTER) ; Display the Comparison Between eRx and VistA Patients
  1. ;Input: ERXIEN - Pointer to ERX HOLDING QUEUE file (#52.49)
  1. ; VISTAPAT - VistA Patient (Pointer to #2)
  1. ; (o)LSTERXID - Last eRx IEN with the Match (Pointer to #52.49)
  1. ; (o)COUNTER - P1: Entry # | P2: Number of Entries
  1. I '$D(^PS(52.49,+$G(ERXIEN),0))!'$D(^DPT(+$G(VISTAPAT),0)) Q
  1. N X,XX,LINE
  1. I $G(LSTERXID) D
  1. . W !?55,"|Sugg. " W $G(IOINHI)_+$G(COUNTER)_$G(IOINORM)_" of "_$G(IOINHI)_$P($G(COUNTER),"^",2)_$G(IOINORM)
  1. . W " - ",$G(IOINHI)_$$FMTE^XLFDT($$GET1^DIQ(52.49,LSTERXID,1.14,"I")\1,"2Z")_$G(IOINORM),"|"
  1. W !,$G(IORVON)_"ERX PATIENT"_$G(IORVOFF),?41,$G(IORVON)_"VISTA PATIENT"_$G(IORVOFF)
  1. I $G(LSTERXID) W ?55,"|From eRx#: "_$G(IOINHI)_$$GET1^DIQ(52.49,LSTERXID,.01)_$G(IOINORM),?79,"|"
  1. S $P(XX,"_",81)="" W !,XX
  1. D SETPAT^PSOERUT0("RS",ERXIEN,VISTAPAT)
  1. Q
  1. ;
  1. CSERXS() ; Returns whether there are CS eRx on the list or not
  1. N CSERXS,LINE,ERXIEN
  1. S CSERXS=0
  1. S LINE=0 F S LINE=$O(^TMP("PSOERPT0",$J,LINE)) Q:'LINE D I CSERXS Q
  1. . S SEQ=+$G(^TMP("PSOERPT0",$J,LINE,0)) I 'SEQ Q
  1. . S ERXIEN=+$G(^TMP("PSOERPT0",$J,SEQ,"ERXIEN"))
  1. . ;DO NOT FILL record
  1. . I $$GET1^DIQ(52.49,+$G(ERXIEN),10.5,"I")=2 Q
  1. . I $$GET1^DIQ(52.49,ERXIEN,95.1,"I") S CSERXS=1
  1. Q CSERXS
  1. ;
  1. VAPATIEN() ; Returns the VistA Patient IEN or 0 (No VistA Patient Selected) or -1 (Different VistA Patients Selected)
  1. N VAPATIEN,LINE,ERXIEN,DFN,SEQ
  1. S VAPATIEN=""
  1. S LINE=0 F S LINE=$O(^TMP("PSOERPT0",$J,LINE)) Q:'LINE D I VAPATIEN=-1 Q
  1. . S SEQ=+$G(^TMP("PSOERPT0",$J,LINE,0)) I 'SEQ Q
  1. . S ERXIEN=+$G(^TMP("PSOERPT0",$J,SEQ,"ERXIEN"))
  1. . S DFN=+$$GET1^DIQ(52.49,ERXIEN,.05,"I") I DFN,'VAPATIEN S VAPATIEN=DFN
  1. . I DFN,DFN'=VAPATIEN S VAPATIEN=-1
  1. Q VAPATIEN
  1. ;
  1. OPACCESS(OPTION,USER,LIST) ; Returns whether the current user has priviledge to Perform a given action on a list of entries
  1. ; Input: OPTION - Option to be checked
  1. ; USER - Pointer to NEW PERSON file (#200)
  1. ; LIST - List of eRX Records to be checked
  1. ;Output: 1 - User has access | 0 - User does not have access
  1. N OPACCESS,SEQ,ERXIEN,PSOIEN
  1. S OPACCESS=1
  1. S SEQ=0 F S SEQ=$O(LIST(SEQ)) Q:'SEQ D I 'OPACCESS Q
  1. . S ERXIEN=+LIST(SEQ)
  1. . ;DO NOT FILL record
  1. . I $$GET1^DIQ(52.49,+$G(ERXIEN),10.5,"I")=2 S OPACCESS=0
  1. . S PSOIEN=ERXIEN
  1. . S OPACCESS=$$OPACCESS^PSOERXU7(OPTION,USER,ERXIEN)
  1. Q OPACCESS
  1. ;
  1. ALRDYVAL() ; Returns whether at least one record from the list has already been validated
  1. N ALRDYVAL,LINE,ERXIEN,SEQ
  1. S ALRDYVAL=0
  1. S LINE=0 F S LINE=$O(^TMP("PSOERPT0",$J,LINE)) Q:'LINE D I ALRDYVAL Q
  1. . S SEQ=+$G(^TMP("PSOERPT0",$J,LINE,0)) I 'SEQ Q
  1. . S ERXIEN=+$G(^TMP("PSOERPT0",$J,SEQ,"ERXIEN"))
  1. . ;DO NOT FILL record
  1. . I $$GET1^DIQ(52.49,+$G(ERXIEN),10.5,"I")=2 Q
  1. . S ALRDYVAL=+$$GET1^DIQ(52.49,ERXIEN,1.7,"I")
  1. Q ALRDYVAL
  1. ;
  1. VIDEO() ; Changes the Video Attributes for the list
  1. N I,LN,POS
  1. ; The command below is used to circumvent a bug with Reverse Video in ListMan
  1. ; (Related to Filtered BY line in the header)
  1. D CNTRL^VALM10(1,1,79,IORVOFF,IOINORM)
  1. ;
  1. I '$D(IORVOFF)!'$D(VALMEVL) Q
  1. F I=0:1:LINE D CNTRL^VALM10(I,1,80,IOINORM,IOINORM)
  1. ; - Highlighting the PRESCRIPTION line if SIG is displayed
  1. F I=1:1:LINE D
  1. . I $D(HIGHLN(I)),$D(UNDLN(I)) D CNTRL^VALM10(I,1,80,IOUON_IOINHI,IOUOFF_IOINORM) Q
  1. . I $D(HIGHLN(I)) D CNTRL^VALM10(I,1,80,IOINHI,IOINORM)
  1. . I $D(UNDLN(I)) D CNTRL^VALM10(I,1,80,IOUON,IOINORM)
  1. ; - Highlighting the group lines (order type and status)
  1. I $D(GRPLN) D
  1. . S LN=0 F I=1:1 S LN=$O(GRPLN(LN)) Q:'LN D
  1. . . S LBL=GRPLN(LN),POS=41-($L(LBL)\2)
  1. . . D CNTRL^VALM10(LN,1,POS-1,IOUON,IOINORM)
  1. . . D CNTRL^VALM10(LN,POS,$L(LBL),IORVON,IORVOFF_IOINORM)
  1. . . D CNTRL^VALM10(LN,POS+$L(LBL),81-POS-$L(LBL),IOUON,IOINORM)
  1. ; - Highlighting Auto To Manual Match
  1. S LN=0 F I=1:1 S LN=$O(PTMTCHLN(LN)) Q:'LN D
  1. . D CNTRL^VALM10(LN,72,1,IOINHI,IOINORM)
  1. S LN=0 F I=1:1 S LN=$O(PRMTCHLN(LN)) Q:'LN D
  1. . D CNTRL^VALM10(LN,75,1,IOINHI,IOINORM)
  1. S LN=0 F I=1:1 S LN=$O(PRVALLN(LN)) Q:'LN D
  1. . D CNTRL^VALM10(LN,76,1,IOINHI,IOINORM)
  1. S LN=0 F I=1:1 S LN=$O(DRMTCHLN(LN)) Q:'LN D
  1. . D CNTRL^VALM10(LN,78,1,IOINHI,IOINORM)
  1. Q
  1. ;
  1. ERXLST(RANGE,ERXLST) ; Given a Range of List Item returns the list of eRx's in an Array
  1. ; Input: RANGE - User Selected Range (ex: '1-5'; '2,5,8,10'; '1-5,11-15', etc)
  1. ;Output: ERXLST - Array with the selected list of eRx IEN's (Pointer to #52.49) - ERXLST(ERXIEN)
  1. ;
  1. N L1,LINE,INVALID,SEG
  1. S INVALID=0 K ERXLST
  1. F L1=1:1:$L(RANGE,",") D
  1. . S SEG=$P(RANGE,",",L1) I SEG="" Q
  1. . I SEG["-" D
  1. . . F LINE=+$P(SEG,"-"):1:+$P(SEG,"-",2) D
  1. . . . S ERXIEN=+$G(^TMP("PSOERPT0",$J,LINE,"ERXIEN")) I 'ERXIEN S INVALID=1 Q
  1. . . . S ERXLST(LINE)=ERXIEN
  1. . E D
  1. . . S ERXIEN=+$G(^TMP("PSOERPT0",$J,+SEG,"ERXIEN")) I 'ERXIEN S INVALID=1 Q
  1. . . S ERXLST(+SEG)=ERXIEN
  1. K:INVALID ERXLST
  1. Q
  1. ;
  1. LSTERXS(ERXLST,ISSONLY,DISPSEQ) ; Given a list of eRx IENs (array passed in by Reference) it displays a list
  1. ;Input: (r) ERXLST - Array with the list of eRx IEN's to be listed(Pointer to #52.49) - ERXLST(ERXIEN)
  1. ; (o) ISSONLY - List Entries with Issues Only? (1: YES | 0: NO)
  1. ; (o) DISPSEQ - Display the Sequence #? (1: YES | 0: NO)
  1. N SEQ,ERXIEN,HDR,XX,CNT,DIR
  1. S HDR=$S(DISPSEQ:"#",1:""),$E(HDR,$S(DISPSEQ:5,1:1))="ERX ID",$E(HDR,17)="DRUG NAME",$E(HDR,52)="PROVIDER",$E(HDR,75)="STS"
  1. S $P(XX,"-",80)="" W !,HDR,!,XX
  1. S (SEQ,CNT)=0 F S SEQ=$O(ERXLST(SEQ)) Q:'SEQ D
  1. . S ERXIEN=+ERXLST(SEQ)
  1. . I $G(ISSONLY),$P($G(ERXLST(SEQ)),"^",2)="" Q
  1. . W !,$S(DISPSEQ:SEQ_$S($$GET1^DIQ(52.49,ERXIEN,95.1,"I"):"]",1:"."),1:""),?$S(DISPSEQ:4,1:0),$$GET1^DIQ(52.49,ERXIEN,.01)
  1. . W ?16,$E($S($$GETDRUG^PSOERXU5(ERXIEN)'="":$$GETDRUG^PSOERXU5(ERXIEN),1:"N/A"),1,34)
  1. . W ?51,$E($$GET1^DIQ(52.49,ERXIEN,2.1),1,22)
  1. . W ?74,$$GET1^DIQ(52.49,ERXIEN,1)
  1. . I $P($G(ERXLST(SEQ)),"^",2)'="" D
  1. . . S CNT=CNT+1 W !,"REASON: ",$P($G(ERXLST(SEQ)),"^",2)
  1. . S CNT=CNT+1 I '(CNT#18) D PAUSE^VALM1 W !,HDR,!,XX
  1. Q
  1. ;
  1. PATIDS ; Patient Lookup Identifiers Display (set on DIC("W"))
  1. N Z
  1. W " ",$$FMTE^XLFDT($P(^(0),U,3),"5Z")," ",$P(^(0),U,9)
  1. S Z=$G(^(.11)) I $P(Z,U,4)'="" W " ",$P(Z,U,4) I $P(Z,U,5) W ",",$P(^DIC(5,+$P(Z,U,5),0),U,2)
  1. Q