- PSXBPSMS ;BIRM/BSR - BPS (ECME) Utilities ;10/29/98 2:13 PM
- ;;2.0;CMOP;**48,77,81,91**;11 Apr 97;Build 33
- ;Reference to $$RXFLDT^PSOBPSUT supported by IA 4701
- ;Reference to LOG^BPSOSL supported by ICR# 6764
- ;Reference to IEN59^BPSOSRX supported by ICR# 4412
- ;Reference to ELIGDISP^PSOREJP1 supported by ICR# 6763
- ;
- ; PSXBPSMS sends an email at the conclusion of the CMOP process to
- ; communicate to the users which prescriptions were left in the
- ; suspense queue and not sent to the CMOP facility. There are two
- ; scenarios that could lead to this; either the prescription is
- ; non-billable, or a response from the third party payer was not
- ; received by the time the CMOP process stopped waiting for
- ; responses (see SDT^PSXRPPL and CHKDFN^PSXRPPL2). Each of the
- ; prescriptions listed in ^TMP("PSXEPHIN" are included in this email.
- ; That global is set only in EPH^PSXRPPL2, which is called only
- ; by EPHARM^PSXRPPL2.
- ;
- EN ;Main entry point.
- N DFN,DIV,EMCNT,ORCNT,PATCNT,PATNM,PSXACTIVITY,PSXELIG,PTLST,RFL,RX,SSN,VADM
- K ^TMP("PSXEPHOUT",$J)
- S ^XTMP("PSXBPSMS",0)=$$FMADD^XLFDT(DT,35)_"^"_DT
- S (EMCNT,ORCNT,PATCNT)=0
- ;
- S DIV=""
- F S DIV=$O(^TMP("PSXEPHIN",$J,DIV)) Q:DIV="" D
- . D HEADER(DIV)
- . S RX=""
- . F S RX=$O(^TMP("PSXEPHIN",$J,DIV,RX)) Q:RX="" D
- . . S RFL=+$G(^TMP("PSXEPHIN",$J,DIV,RX))
- . . S ^XTMP("PSXBPSMS",1,RX,RFL,DT)=""
- . . ;
- . . ; Add an entry to the developer's log, BPS LOG, file# 9002313.12.
- . . ;
- . . D LOG^BPSOSL($$IEN59^BPSOSRX(RX,RFL),$T(+0)_"-Prescription being left on CMOP queue") ; ICR #4412,6764
- . . ;
- . . ; Add an entry to the Activity Log for this Rx (sub-file# 52.3).
- . . ;
- . . I $$STATUS^PSOBPSUT(RX,RFL)="IN PROGRESS" D ; ICR #4701
- . . . S PSXELIG=$$ELIGDISP^PSOREJP1(RX,RFL) ; ICR #6763
- . . . I PSXELIG="" S PSXELIG="Veteran"
- . . . S PSXACTIVITY=PSXELIG_"-Rx placed on Suspense due to ECME IN PROGRESS status"
- . . . D RXACT^PSOBPSU2(RX,RFL,PSXACTIVITY,"M",DUZ) ; ICR # 4970
- . . ;
- . . ; Determine the SSN and Patient Name.
- . . ;
- . . S DFN=+$P(^PSRX(RX,0),"^",2) D DEM^VADPT
- . . S SSN=$E($P(VADM(2),U),6,9),PATNM=(VADM(1))
- . . ;
- . . ; Increment the count of orders (Rxs) and unique patients.
- . . ;
- . . S ORCNT=$G(ORCNT)+1
- . . D PATCNT(PATNM_SSN)
- . . ;
- . . D FORMAT
- . D FOOTER(DIV)
- D MAIL,CLEAN
- Q
- ;
- ; Format Row
- FORMAT ;
- N LTXT
- S LTXT=$$GET1^DIQ(52,RX,.01)_"/"_RFL
- S $E(LTXT,17)=$E(PATNM,1,18)_"("_SSN_")",$E(LTXT,42)=$E($$GET1^DIQ(52,RX,6),1,23)
- S $E(LTXT,67)=$$TRANS(RX,RFL)
- D STORELN(LTXT)
- Q
- ;
- ;Count patients.
- PATCNT(NAMSSN) ;
- I '$D(PTLST(NAMSSN)) D
- .S PTLST(NAMSSN)=""
- .S PATCNT=$G(PATCNT)+1
- Q
- ;
- ;Build header.
- D STORELN("Division: "_$$GET1^DIQ(59,DIV,.01))
- D STORELN($TR($J("",79)," ","-"))
- D STORELN(" NOT TRANSMITTED")
- D STORELN("RX#/Fill PATIENT(LAST4) DRUG 1ST DT #DAYS")
- D STORELN($TR($J("",79)," ","-"))
- Q
- ;
- ;Output patient count & prescriptions count & division number
- D STORELN(" ")
- D STORELN("Total "_$$GET1^DIQ(59,DIVN,.01)_": "_PATCNT_" Patients and "_ORCNT_" Prescriptions.")
- D STORELN(" ")
- K PTLST S (ORCNT,PATCNT)=0
- Q
- ;
- ; MAIL builds the email message and sends it to users who hold the
- ; key PSXMAIL (or PSXCMOPMGR).
- ;
- MAIL ;
- ;
- N DIV,M1,PSBMSG,SITES,USER,XMDUZ,XMSUB,XMTEXT,XMY,Y
- ;
- S PSBMSG(1)="The prescriptions listed in this message did not transmit to CMOP for one of"
- S PSBMSG(2)="the reasons below:"
- S PSBMSG(3)=" "
- S PSBMSG(4)=" A response from the third party payer was not received"
- S PSBMSG(5)=" "
- S PSBMSG(6)=" OR"
- S PSBMSG(7)=" "
- S PSBMSG(8)=" The prescriptions are non-billable in VistA"
- S PSBMSG(9)=" "
- S PSBMSG(10)="The prescriptions will remain in the CMOP queue and will transmit when the"
- S PSBMSG(11)="response from the third party payer is received, or the non-billable issue"
- S PSBMSG(12)="is resolved."
- S PSBMSG(13)=" "
- S M1=14
- ;
- S Y=""
- F S Y=$O(^TMP("PSXEPHOUT",$J,"M",Y)) Q:Y="" D
- . S PSBMSG(M1)=$P(^TMP("PSXEPHOUT",$J,"M",Y),"^")
- . S M1=M1+1
- ;
- ; Setup the list of recipients (XMY). Send the email to all users
- ; holding the security key PSXMAIL, if any; otherwise, send to all
- ; users holding the key PSXCMOPMGR.
- ;
- S USER=0
- I $D(^XUSEC("PSXMAIL")) D
- .F S USER=$O(^XUSEC("PSXMAIL",USER)) Q:'USER S XMY(USER)=""
- E D
- .F S USER=$O(^XUSEC("PSXCMOPMGR",USER)) Q:'USER S XMY(USER)=""
- ;
- ; Set the subject (XMSUB), indicate the array containing the text of
- ; the message is PSBMSG, and set the sender to be POSTMASTER (.5).
- ;
- S DIV="",SITES=""
- F S DIV=$O(^TMP("PSXEPHIN",$J,DIV)) Q:DIV="" S SITES=SITES_$$GET1^DIQ(59,DIV_",",.01,"E")_","
- S XMSUB=$E("ePharmacy CMOP Not TRANSMITTED Rxs - "_$E(SITES,1,$L(SITES)-1),1,65)
- S XMTEXT="PSBMSG("
- S XMDUZ=.5
- ;
- D ^XMD
- ;
- Q
- ;
- ;Store E-mail line for later use.
- STORELN(LINE) ;
- S EMCNT=EMCNT+1
- S ^TMP("PSXEPHOUT",$J,"M",EMCNT)=LINE
- Q
- ;
- TRANS(RX,RFL) ;
- I '$G(RX) Q ""
- I $G(RFL)="" Q ""
- N TDT,CNT,FDT
- S CNT=0,FDT=9999999
- S TDT="" F S TDT=$O(^XTMP("PSXBPSMS",1,RX,RFL,TDT)) Q:'TDT D
- . S CNT=CNT+1
- S FDT=$O(^XTMP("PSXBPSMS",1,RX,RFL,""))
- I FDT=9999999 S FDT=" "
- E S FDT=$E(FDT,4,5)_"/"_$E(FDT,6,7)_"/"_($E(FDT,2,3))
- Q FDT_$E(" ",1,5-$L(CNT))_CNT
- ;
- ;Clean all remaining arrays and variables
- ;Purge ^XTMP data older than 30 days
- CLEAN ;
- K ^TMP("PSXEPHOUT",$J),^TMP("PSXEPHIN",$J)
- ; Purge ^XTMP data older than 30 days
- N FDT,RX,RFL,TDT
- S FDT=$$FMADD^XLFDT(DT,-30)
- S RX="" F S RX=$O(^XTMP("PSXBPSMS",1,RX)) Q:'RX D
- . S RFL="" F S RFL=$O(^XTMP("PSXBPSMS",1,RX,RFL)) Q:RFL="" D
- .. S TDT="" F S TDT=$O(^XTMP("PSXBPSMS",1,RX,RFL,TDT)) Q:'TDT D
- ... I TDT<FDT K ^XTMP("PSXBPSMS",1,RX,RFL,TDT)
- Q
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSXBPSMS 5917 printed Mar 13, 2025@20:48:12 Page 2
- PSXBPSMS ;BIRM/BSR - BPS (ECME) Utilities ;10/29/98 2:13 PM
- +1 ;;2.0;CMOP;**48,77,81,91**;11 Apr 97;Build 33
- +2 ;Reference to $$RXFLDT^PSOBPSUT supported by IA 4701
- +3 ;Reference to LOG^BPSOSL supported by ICR# 6764
- +4 ;Reference to IEN59^BPSOSRX supported by ICR# 4412
- +5 ;Reference to ELIGDISP^PSOREJP1 supported by ICR# 6763
- +6 ;
- +7 ; PSXBPSMS sends an email at the conclusion of the CMOP process to
- +8 ; communicate to the users which prescriptions were left in the
- +9 ; suspense queue and not sent to the CMOP facility. There are two
- +10 ; scenarios that could lead to this; either the prescription is
- +11 ; non-billable, or a response from the third party payer was not
- +12 ; received by the time the CMOP process stopped waiting for
- +13 ; responses (see SDT^PSXRPPL and CHKDFN^PSXRPPL2). Each of the
- +14 ; prescriptions listed in ^TMP("PSXEPHIN" are included in this email.
- +15 ; That global is set only in EPH^PSXRPPL2, which is called only
- +16 ; by EPHARM^PSXRPPL2.
- +17 ;
- EN ;Main entry point.
- +1 NEW DFN,DIV,EMCNT,ORCNT,PATCNT,PATNM,PSXACTIVITY,PSXELIG,PTLST,RFL,RX,SSN,VADM
- +2 KILL ^TMP("PSXEPHOUT",$JOB)
- +3 SET ^XTMP("PSXBPSMS",0)=$$FMADD^XLFDT(DT,35)_"^"_DT
- +4 SET (EMCNT,ORCNT,PATCNT)=0
- +5 ;
- +6 SET DIV=""
- +7 FOR
- SET DIV=$ORDER(^TMP("PSXEPHIN",$JOB,DIV))
- if DIV=""
- QUIT
- Begin DoDot:1
- +8 DO HEADER(DIV)
- +9 SET RX=""
- +10 FOR
- SET RX=$ORDER(^TMP("PSXEPHIN",$JOB,DIV,RX))
- if RX=""
- QUIT
- Begin DoDot:2
- +11 SET RFL=+$GET(^TMP("PSXEPHIN",$JOB,DIV,RX))
- +12 SET ^XTMP("PSXBPSMS",1,RX,RFL,DT)=""
- +13 ;
- +14 ; Add an entry to the developer's log, BPS LOG, file# 9002313.12.
- +15 ;
- +16 ; ICR #4412,6764
- DO LOG^BPSOSL($$IEN59^BPSOSRX(RX,RFL),$TEXT(+0)_"-Prescription being left on CMOP queue")
- +17 ;
- +18 ; Add an entry to the Activity Log for this Rx (sub-file# 52.3).
- +19 ;
- +20 ; ICR #4701
- IF $$STATUS^PSOBPSUT(RX,RFL)="IN PROGRESS"
- Begin DoDot:3
- +21 ; ICR #6763
- SET PSXELIG=$$ELIGDISP^PSOREJP1(RX,RFL)
- +22 IF PSXELIG=""
- SET PSXELIG="Veteran"
- +23 SET PSXACTIVITY=PSXELIG_"-Rx placed on Suspense due to ECME IN PROGRESS status"
- +24 ; ICR # 4970
- DO RXACT^PSOBPSU2(RX,RFL,PSXACTIVITY,"M",DUZ)
- End DoDot:3
- +25 ;
- +26 ; Determine the SSN and Patient Name.
- +27 ;
- +28 SET DFN=+$PIECE(^PSRX(RX,0),"^",2)
- DO DEM^VADPT
- +29 SET SSN=$EXTRACT($PIECE(VADM(2),U),6,9)
- SET PATNM=(VADM(1))
- +30 ;
- +31 ; Increment the count of orders (Rxs) and unique patients.
- +32 ;
- +33 SET ORCNT=$GET(ORCNT)+1
- +34 DO PATCNT(PATNM_SSN)
- +35 ;
- +36 DO FORMAT
- End DoDot:2
- +37 DO FOOTER(DIV)
- End DoDot:1
- +38 DO MAIL
- DO CLEAN
- +39 QUIT
- +40 ;
- +41 ; Format Row
- FORMAT ;
- +1 NEW LTXT
- +2 SET LTXT=$$GET1^DIQ(52,RX,.01)_"/"_RFL
- +3 SET $EXTRACT(LTXT,17)=$EXTRACT(PATNM,1,18)_"("_SSN_")"
- SET $EXTRACT(LTXT,42)=$EXTRACT($$GET1^DIQ(52,RX,6),1,23)
- +4 SET $EXTRACT(LTXT,67)=$$TRANS(RX,RFL)
- +5 DO STORELN(LTXT)
- +6 QUIT
- +7 ;
- +8 ;Count patients.
- PATCNT(NAMSSN) ;
- +1 IF '$DATA(PTLST(NAMSSN))
- Begin DoDot:1
- +2 SET PTLST(NAMSSN)=""
- +3 SET PATCNT=$GET(PATCNT)+1
- End DoDot:1
- +4 QUIT
- +5 ;
- +6 ;Build header.
- +1 DO STORELN("Division: "_$$GET1^DIQ(59,DIV,.01))
- +2 DO STORELN($TRANSLATE($JUSTIFY("",79)," ","-"))
- +3 DO STORELN(" NOT TRANSMITTED")
- +4 DO STORELN("RX#/Fill PATIENT(LAST4) DRUG 1ST DT #DAYS")
- +5 DO STORELN($TRANSLATE($JUSTIFY("",79)," ","-"))
- +6 QUIT
- +7 ;
- +8 ;Output patient count & prescriptions count & division number
- +1 DO STORELN(" ")
- +2 DO STORELN("Total "_$$GET1^DIQ(59,DIVN,.01)_": "_PATCNT_" Patients and "_ORCNT_" Prescriptions.")
- +3 DO STORELN(" ")
- +4 KILL PTLST
- SET (ORCNT,PATCNT)=0
- +5 QUIT
- +6 ;
- +7 ; MAIL builds the email message and sends it to users who hold the
- +8 ; key PSXMAIL (or PSXCMOPMGR).
- +9 ;
- MAIL ;
- +1 ;
- +2 NEW DIV,M1,PSBMSG,SITES,USER,XMDUZ,XMSUB,XMTEXT,XMY,Y
- +3 ;
- +4 SET PSBMSG(1)="The prescriptions listed in this message did not transmit to CMOP for one of"
- +5 SET PSBMSG(2)="the reasons below:"
- +6 SET PSBMSG(3)=" "
- +7 SET PSBMSG(4)=" A response from the third party payer was not received"
- +8 SET PSBMSG(5)=" "
- +9 SET PSBMSG(6)=" OR"
- +10 SET PSBMSG(7)=" "
- +11 SET PSBMSG(8)=" The prescriptions are non-billable in VistA"
- +12 SET PSBMSG(9)=" "
- +13 SET PSBMSG(10)="The prescriptions will remain in the CMOP queue and will transmit when the"
- +14 SET PSBMSG(11)="response from the third party payer is received, or the non-billable issue"
- +15 SET PSBMSG(12)="is resolved."
- +16 SET PSBMSG(13)=" "
- +17 SET M1=14
- +18 ;
- +19 SET Y=""
- +20 FOR
- SET Y=$ORDER(^TMP("PSXEPHOUT",$JOB,"M",Y))
- if Y=""
- QUIT
- Begin DoDot:1
- +21 SET PSBMSG(M1)=$PIECE(^TMP("PSXEPHOUT",$JOB,"M",Y),"^")
- +22 SET M1=M1+1
- End DoDot:1
- +23 ;
- +24 ; Setup the list of recipients (XMY). Send the email to all users
- +25 ; holding the security key PSXMAIL, if any; otherwise, send to all
- +26 ; users holding the key PSXCMOPMGR.
- +27 ;
- +28 SET USER=0
- +29 IF $DATA(^XUSEC("PSXMAIL"))
- Begin DoDot:1
- +30 FOR
- SET USER=$ORDER(^XUSEC("PSXMAIL",USER))
- if 'USER
- QUIT
- SET XMY(USER)=""
- End DoDot:1
- +31 IF '$TEST
- Begin DoDot:1
- +32 FOR
- SET USER=$ORDER(^XUSEC("PSXCMOPMGR",USER))
- if 'USER
- QUIT
- SET XMY(USER)=""
- End DoDot:1
- +33 ;
- +34 ; Set the subject (XMSUB), indicate the array containing the text of
- +35 ; the message is PSBMSG, and set the sender to be POSTMASTER (.5).
- +36 ;
- +37 SET DIV=""
- SET SITES=""
- +38 FOR
- SET DIV=$ORDER(^TMP("PSXEPHIN",$JOB,DIV))
- if DIV=""
- QUIT
- SET SITES=SITES_$$GET1^DIQ(59,DIV_",",.01,"E")_","
- +39 SET XMSUB=$EXTRACT("ePharmacy CMOP Not TRANSMITTED Rxs - "_$EXTRACT(SITES,1,$LENGTH(SITES)-1),1,65)
- +40 SET XMTEXT="PSBMSG("
- +41 SET XMDUZ=.5
- +42 ;
- +43 DO ^XMD
- +44 ;
- +45 QUIT
- +46 ;
- +47 ;Store E-mail line for later use.
- STORELN(LINE) ;
- +1 SET EMCNT=EMCNT+1
- +2 SET ^TMP("PSXEPHOUT",$JOB,"M",EMCNT)=LINE
- +3 QUIT
- +4 ;
- TRANS(RX,RFL) ;
- +1 IF '$GET(RX)
- QUIT ""
- +2 IF $GET(RFL)=""
- QUIT ""
- +3 NEW TDT,CNT,FDT
- +4 SET CNT=0
- SET FDT=9999999
- +5 SET TDT=""
- FOR
- SET TDT=$ORDER(^XTMP("PSXBPSMS",1,RX,RFL,TDT))
- if 'TDT
- QUIT
- Begin DoDot:1
- +6 SET CNT=CNT+1
- End DoDot:1
- +7 SET FDT=$ORDER(^XTMP("PSXBPSMS",1,RX,RFL,""))
- +8 IF FDT=9999999
- SET FDT=" "
- +9 IF '$TEST
- SET FDT=$EXTRACT(FDT,4,5)_"/"_$EXTRACT(FDT,6,7)_"/"_($EXTRACT(FDT,2,3))
- +10 QUIT FDT_$EXTRACT(" ",1,5-$LENGTH(CNT))_CNT
- +11 ;
- +12 ;Clean all remaining arrays and variables
- +13 ;Purge ^XTMP data older than 30 days
- CLEAN ;
- +1 KILL ^TMP("PSXEPHOUT",$JOB),^TMP("PSXEPHIN",$JOB)
- +2 ; Purge ^XTMP data older than 30 days
- +3 NEW FDT,RX,RFL,TDT
- +4 SET FDT=$$FMADD^XLFDT(DT,-30)
- +5 SET RX=""
- FOR
- SET RX=$ORDER(^XTMP("PSXBPSMS",1,RX))
- if 'RX
- QUIT
- Begin DoDot:1
- +6 SET RFL=""
- FOR
- SET RFL=$ORDER(^XTMP("PSXBPSMS",1,RX,RFL))
- if RFL=""
- QUIT
- Begin DoDot:2
- +7 SET TDT=""
- FOR
- SET TDT=$ORDER(^XTMP("PSXBPSMS",1,RX,RFL,TDT))
- if 'TDT
- QUIT
- Begin DoDot:3
- +8 IF TDT<FDT
- KILL ^XTMP("PSXBPSMS",1,RX,RFL,TDT)
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +9 QUIT