PSOERXUT ;ALB/MR - eRx CS utilities ;7/21/2020 9:57am
;;7.0;OUTPATIENT PHARMACY;**617,667,651,718,700,743**;DEC 1997;Build 24
Q
;
CSFILTER(ERXIEN) ; Check eRx against CS Filter Prompt Answers
; Global variables: PSOCSERX: CS Filter Selection | PSOCSSCH: Drug Schedule Filter Selection
; Input: (r)ERXIEN - Pointer to ERX HOLDING QUEUE (#52.49)
;Output: 1 - Include the eRx | 0 - Exclude the eRx
;
N DRGCSCH,ERXCSFLG
I $G(PSOCSERX)="B",$G(PSOCSSCH)=3 Q 1
S DRGCSCH=$P($G(^PS(52.49,ERXIEN,4)),"^",9)
S ERXCSFLG=+$G(^PS(52.49,ERXIEN,95))
I $G(PSOCSERX)="CS",'ERXCSFLG Q 0
I $G(PSOCSERX)="Non-CS",ERXCSFLG Q 0
I $G(PSOCSERX)="CS",+$G(PSOCSSCH)=1,DRGCSCH'="C48675" Q 0
I $G(PSOCSERX)="CS",+$G(PSOCSSCH)=2,"C48676 C48677 C48679"'[DRGCSCH Q 0
I $G(PSOCSERX)="B",ERXCSFLG,+$G(PSOCSSCH)=1,DRGCSCH'="C48675" Q 0
I $G(PSOCSERX)="B",ERXCSFLG,+$G(PSOCSSCH)=2,"C48676 C48677 C48679"'[DRGCSCH Q 0
Q 1
;
VALPTADD(DFN) ; Returns whether the patient has a valid address or not
; Input: (r)DFN - Pointer to the PATIENT file (#2)
;Output: 1: Valid Address on File (Zip Code or Postal Code value present) | 0: No Valid Address on File
;
N VAPA,I I '$G(DFN) Q 0
D ADD^VADPT I ((+$G(VAPA(25))=1!($G(VAPA(25))=""))&($G(VAPA(11))=""))!((+$G(VAPA(25))>1)&($G(VAPA(24))="")) Q 0
Q 1
;
CSKEYS(USER) ; Checks whether the user has a valid Security Key for CS Orders
; Input: (r)USER - Pointer to the NEW PERSON file (#200)
;Output: 1 - Yes, user is authorized to edit and Validate for CS eRx's | 0: Not authorized
;
I '$D(^XUSEC("PSDRPH",USER)),'$D(^XUSEC("PSO ERX ADV TECH",USER)),'$D(^XUSEC("PSO ERX TECH",USER)) Q 0
Q 1
;
PRDRVAL(RESULT,ACTION,ERXIEN,PROVIEN,DRUGIEN) ; API used to Verify Provider and Drug Selection/Validation for CS Prescriptions
; Input:(r)ACTION - Ation being peformed ("EP": Edit Provider | "VP": Validate Provider | "ED": Edit Drug | "VD": Validate Drug | "AC": Accept eRx)
; (r)ERXIEN - eRx IEN. Pointer to the ERX HOLDING QUEUE file (#52.49)
; (o)PROVIEN - Provider IEN. Pointer to the NEW PERSON file (#200)
; (o)DRUGIEN - Dispense Drug IEN. Pointer to the DRUG file (#50)
;Output: RESULT - 1 (Valid Selection) | 0 (Invalid Selection) ^ Compiled Restriction ("W": Warning / "B": Block)
; RESULT(1..n)=[Invalid Selection Reason]^Restriction (e.g., RESULT(1)="eRx Provider does not have a valid DEA#.")
N ERXPROV,DSERXFLG,ERXPRNPI,ERXPRDEA,VAPRNPI,RXWRDATE,VADRSCH,ERXDRSCH,VADEANUM,VACSDRUG,VADEADSP,VADEASUF,VADEASTR,VADEAEXP,VADEADFL
K RESULT S RESULT=1 S ERXIEN=+$G(ERXIEN),PROVIEN=+$G(PROVIEN),DRUGIEN=+$G(DRUGIEN)
I 'PROVIEN,$$GET1^DIQ(52.49,ERXIEN,2.3,"I")>0 S PROVIEN=+$$GET1^DIQ(52.49,ERXIEN,2.3,"I")
I 'DRUGIEN,$$GET1^DIQ(52.49,ERXIEN,3.2,"I")>0 S DRUGIEN=+$$GET1^DIQ(52.49,ERXIEN,3.2,"I")
I 'ERXIEN!('PROVIEN&'DRUGIEN) S RESULT="0^B",RESULT(1)="Invalid Parameters" Q
;
S ERXPROV=$$GET1^DIQ(52.49,ERXIEN,2.1,"I") ; eRx Provider IEN
S ERXPRNPI=$$GET1^DIQ(52.48,ERXPROV,1.5) ; eRx Provider NPI
S ERXPRDEA=$$UP^XLFSTR($$GET1^DIQ(52.48,ERXPROV,1.6)) ; eRx Provider DEA#
S DSERXFLG=$$GET1^DIQ(52.49,ERXIEN,95.1,"I") ; eRx Digitally Signed Flag
S ERXDRSCH=$$ERXDRSCH(ERXIEN) ; eRx DEA Drug Schedule
S RXWRDATE=$$GET1^DIQ(52.49,ERXIEN,5.9,"I") ; eRx Written Date
S VACSDRUG=0 ; VistA Drug is CS Flag
;
; Edit/Validate Provider & Accept eRx Checks
I ACTION="EP"!(ACTION="VP")!(ACTION="AC") D Q
. N ERXSUFF S ERXSUFF=0
. S VAPRNPI=$P($$NPI^XUSNPI("Individual_ID",PROVIEN),"^") S:VAPRNPI'>0 VAPRNPI=""
. I VAPRNPI'=ERXPRNPI,ACTION'="AC" D
. . S RESULT($O(RESULT(""),-1)+1)="Provider NPI mismatch (eRx: "_ERXPRNPI_" | VistA: "_VAPRNPI_")"
. ; Digitally Signed Order
. I DSERXFLG D
. . ; 743 - Check provider's profile for eRx DEA
. . S VADEADFL=$P($$UP^XLFSTR($$VADEA^PSOERXU8(PROVIEN,ERXIEN)),"^"),(VADEANUM,VADEADSP)=VADEADFL
. . S VADEAEXP=$$DEAXDT^XUSER($P(VADEANUM,"-"))
. . I VADEANUM="" D
. . . S RESULT($O(RESULT(""),-1)+1)="VistA Provider does not have a valid DEA# on file."
. . I ERXPRDEA="" D
. . . S RESULT($O(RESULT(""),-1)+1)="eRx Provider does not have a valid DEA#."
. . I ERXPRDEA'="",$L(VADEANUM)>3,(VADEANUM'=ERXPRDEA) D ; PSO*7*743
. . . I ($P(ERXPRDEA,"-")=$P(VADEANUM,"-")) S ERXSUFF=1 Q
. . . S RESULT($O(RESULT(""),-1)+1)="Provider DEA mismatch (eRx: "_ERXPRDEA_" | VistA: "_VADEADSP_")."
. . I ERXPRDEA'="",$L(VADEANUM)>3,($P(VADEANUM,"-")=$P(ERXPRDEA,"-")),(RXWRDATE>VADEAEXP) D ; PSO*7*743
. . . S RESULT($O(RESULT(""),-1)+1)="eRx Written Date/Issue Date is after the VistA Provider DEA expiration date ("_$$FMTE^XLFDT(VADEAEXP)_")."
. . ; VistA Drug Selected (Additional Checks for CS and Detox drugs)
. . I DRUGIEN D
. . . I $$VADRSCH(DRUGIEN)'="" D
. . . . N DEAFOUND S DEAFOUND=0
. . . . S VACSDRUG=1
. . . . S VADRSCH=$$VADRSCH(DRUGIEN)
. . . . I ERXPRDEA'="" S DEAFOUND=$$DEAFOUND^PSOERXU8(ERXPRDEA,PROVIEN) ; Does the DEA# exist on the provider's profile?
. . . . I DEAFOUND S VADEANUM=$$UP^XLFSTR($$SDEA^XUSER(0,PROVIEN,$P(VADRSCH,"^"),RXWRDATE,$P(ERXPRDEA,"-"))),VADEADSP=$P($$VADEA^PSOERXU8(PROVIEN,ERXIEN),"^") ; PSO*7*743 - If found, valid for drug?
. . . . I 'DEAFOUND D ; PSO*7*743 Begin - If eRx DEA is not found on provider's profile, find default DEA to display
. . . . . S:VADEADFL="" VADEADFL=$$DEA^XUSER(0,PROVIEN)
. . . . . S:VADEADFL="" (VADEANUM,VADEADSP)=1 ; No DEA on file
. . . . . I VADEADFL'="" S (VADEANUM,VADEADSP)=VADEADFL ; PSO*7*743 - Use matching DEA if present, default DEA if no match
. . . . . ; PSO*7*743 End
. . . . I $P(VADEANUM,"^")=2 D
. . . . . S RESULT($O(RESULT(""),-1)+1)="VistA Provider "_$$GET1^DIQ(200,PROVIEN,.01)_" is NOT authorized to write to the schedule ("_$P(VADRSCH,"^",3)_") of the VistA Drug selected."
. ; All checks are OK
. ; Add DEA Suffix mismatch message
. I $G(ERXSUFF) D Q
. . I '$O(RESULT(0)) D SUFFWARN(.RESULT,ERXPRDEA,$S($L($G(VADEADSP)):VADEADSP,1:VADEANUM),0) S RESULT="0^W" Q
. . I ACTION="EP"!(ACTION="VP"),'VACSDRUG D SUFFWARN(.RESULT,ERXPRDEA,$S($L($G(VADEADSP)):VADEADSP,1:VADEANUM),0) S RESULT="0^W" Q
. . I ACTION="EP" D SUFFWARN(.RESULT,ERXPRDEA,$S($L($G(VADEADSP)):VADEADSP,1:VADEANUM),0) S RESULT="0^W" Q
. . I ACTION="VP"!(ACTION="AC") D SUFFWARN(.RESULT,ERXPRDEA,$S($L($G(VADEADSP)):VADEADSP,1:VADEANUM),0) S RESULT="0^B" Q
. I '$O(RESULT(0)) S RESULT=1 Q
. ; VistA Drug is not Selected or it is not a CS Drug
. I ACTION="EP"!(ACTION="VP")!(ACTION="AC"),'VACSDRUG D Q
. . S RESULT="0^W"
. ; Editing Provider, VistA Drug is CS or Detox, Warning (soft stop)
. I ACTION="EP" D Q
. . S RESULT="0^W"
. ; Validating Provider/Accept eRx, VistA Drug is CS or Detox, Block (hard stop)
. I ACTION="VP"!(ACTION="AC") D Q
. . S RESULT="0^B"
;
; Edit/Validate Drug & Accept eRx Checks
I (ACTION="ED")!(ACTION="VD")!(ACTION="AC") D
. S VADRSCH=$$VADRSCH(DRUGIEN) I VADRSCH'="" S VACSDRUG=1
. I DSERXFLG,'VACSDRUG,ACTION'="AC" D
. . S RESULT="0^W"
. . I ERXDRSCH="" D
. . . S RESULT($O(RESULT(""),-1)+1)="eRx was digitally signed by the prescriber and VistA Drug selected is Non-CS. Please, review and make sure you selected the correct drug."
. . E D
. . . S RESULT($O(RESULT(""),-1)+1)="eRx Drug is indicated by the prescriber as CS ("_$P(ERXDRSCH,"^",2)_") and VistA Drug selected is Non-CS. Please, review and make sure you selected the correct drug."
. I 'DSERXFLG,VACSDRUG D
. . S RESULT="0^B"
. . I $P(VADRSCH,"^",2)="L" D
. . . S RESULT($O(RESULT(""),-1)+1)="eRx is not digitally signed and VistA drug is not matched to an NDF item marked with a CS Federal Schedule but is locally marked as a controlled substance ("_$P(VADRSCH,"^",3)_")."
. . E DO
. . . S RESULT($O(RESULT(""),-1)+1)="eRx is not digitally signed and VistA Drug is marked as CS ("_$P(VADRSCH,"^",3)_")."
. I VACSDRUG,ERXPRDEA="" D
. . S RESULT="0^B"
. . S RESULT($O(RESULT(""),-1)+1)="eRx Provider does not have a valid DEA#."
. ; VistA Provider Selected (Additional Checks)
. I PROVIEN D
. . ; CS VistA Drug
. . I VACSDRUG D
. . . N DEAFOUND S DEAFOUND=0 ; PSO*7*743 Begin
. . . I ERXPRDEA'="" S DEAFOUND=$$DEAFOUND^PSOERXU8(ERXPRDEA,PROVIEN) ; Does the DEA# exist on the provider's profile?
. . . I DEAFOUND S VADEANUM=$$UP^XLFSTR($$SDEA^XUSER(0,PROVIEN,$P(VADRSCH,"^"),RXWRDATE,$P(ERXPRDEA,"-"))),(VADEADSP,VADEADFL)=$P($$VADEA^PSOERXU8(PROVIEN,ERXIEN),"^") ; PSO*7*743 - If found, valid for drug?
. . . I 'DEAFOUND D ; PSO*7*743 Begin - If eRx DEA is not found on provider's profile, find default DEA to display
. . . . S VADEADFL=$P($$UP^XLFSTR($$VADEA^PSOERXU8(PROVIEN,ERXIEN)),"^") ; PSO*7*743
. . . . S:VADEADFL="" VADEADFL=$$DEA^XUSER(0,PROVIEN)
. . . . S:VADEADFL="" (VADEANUM,VADEADSP)=1 ; No DEA on file
. . . . I VADEADFL'="" S (VADEANUM,VADEADSP)=VADEADFL ; PSO*7*743 - Use matching DEA if present, default DEA if no match
. . . I $P(VADEANUM,"^")=1 D Q
. . . . S RESULT="0^B"
. . . . S RESULT($O(RESULT(""),-1)+1)="VistA Provider "_$$GET1^DIQ(200,PROVIEN,.01)_" does not have a valid DEA# on file."
. . . . D SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$G(ERXSUFF))
. . . I $P(VADEANUM,"^")=2 D Q
. . . . S RESULT="0^"_$S(ACTION="ED"&($P($G(RESULT),"^",2)'="B"):"W",1:"B")
. . . . S RESULT($O(RESULT(""),-1)+1)="VistA Provider "_$$GET1^DIQ(200,PROVIEN,.01)_" is NOT authorized to write to the schedule ("_$P(VADRSCH,"^",3)_") of the VistA Drug selected."
. . . . D SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$G(ERXSUFF))
. . . I $P(VADEANUM,"^")=4 D Q
. . . . S RESULT="0^"_$S(ACTION="ED"&($P($G(RESULT),"^",2)'="B"):"W",1:"B")
. . . . S RESULT($O(RESULT(""),-1)+1)="eRx Written Date/Issue Date is after the VistA Provider DEA expiration date ("_$$FMTE^XLFDT($P(VADEANUM,"^",2))_")." ; PSO*7*743
. . . . D SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$G(ERXSUFF))
. . . I ERXPRDEA'="",$L($P(VADEANUM,"^",1))>8,($P($P(VADEANUM,"^"),"-")'=$P(ERXPRDEA,"-")) D Q
. . . . S RESULT="0^B"
. . . . S RESULT($O(RESULT(""),-1)+1)="Provider DEA mismatch (eRx: "_ERXPRDEA_" | VistA: "_VADEANUM_")."
. . . . D SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$G(ERXSUFF))
. . . D SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$G(ERXSUFF))
. . . ; PSO*7*743 End
. . ; Detox VistA Drug
. . I $$DETOX^PSSOPKI(DRUGIEN),$$DETOX^XUSER(PROVIEN,RXWRDATE)'?1"X"1A7N D
. . . S RESULT="0^"_$S(ACTION="ED"&($P($G(RESULT),"^",2)'="B"):"W",1:"B")
. . . S RESULT($O(RESULT(""),-1)+1)="VistA Provider "_$$GET1^DIQ(200,PROVIEN,.01)_" does not have a valid DETOX#."
;
Q
;
ERXDRSCH(ERXIEN) ; Returns the CS Schedule for the eRx Drug (Internal^External Format)
; Input: (r) ERXIEN - Pointer to the ERX HOLDING QUEUE file (52.49)
;Output: ERXDRSCH - eRx DEA Schedule ^ Formatted eRx DEA Schedule (e.g., "2^[C-II]", "4^[C-IV], "", etc...)
;
N ERXDRSCH
I '$G(ERXIEN) Q ""
S ERXDRSCH=$$GET1^DIQ(52.49,+ERXIEN,4.9) I ERXDRSCH="" Q ""
Q (ERXDRSCH_"^[C-"_$S(ERXDRSCH="C48675":"II",ERXDRSCH="C48676":"III",ERXDRSCH="C48677":"IV",ERXDRSCH="C48679":"V",1:"")_"]")
;
VADRSCH(DRUGIEN) ; Returns the CS Schedule for the VistA Dispense Drug (Internal^External Format)
; Input: (r) DRUGIEN - Pointer to the DRUG file (#50)
;Output: VADRSCH - P1: Schedule (2, 2n, 3, ..5) | P2: "F"ederal or "L"ocally Marked CS | P3: Formatted eRx DEA Schedule (e.g., "3n^F^[C-II]", "5^L^[C-V]", "", etc...)
;
N VADRSCH,VAPRDIEN
I '$G(DRUGIEN) Q ""
S VAPRDIEN=+$$GET1^DIQ(50,+DRUGIEN,22,"I")
S VADRSCH=$S(VAPRDIEN:$$GET1^DIQ(50.68,VAPRDIEN,19,"I"),1:+$$GET1^DIQ(50,DRUGIEN,3))
I VADRSCH<1!(VADRSCH>5) Q ""
Q (VADRSCH_"^"_$S(VAPRDIEN:"F",1:"L")_"^[C-"_$S(VADRSCH=2:"II",VADRSCH="2n":"IIn",VADRSCH=3:"III",VADRSCH="3n":"IIIn",+VADRSCH=4:"IV",+VADRSCH=5:"V",1:"")_"]")
;
PAUSE ; Pauses screen until user hits Return
K DIR S DIR("A")="Press Return to continue",DIR(0)="E" D ^DIR
Q
;
ERXIEN(PORXIEN) ; Given the Pending Order (#52.41) or Prescription (#52) IEN, returns the eRx (#52.49) IEN or "" (null)
; Input: (r) PORXIEN - Pointer to either the PENDING ORDERS file (#52.41) (e.g., "139839P") or PRESCRIPTION file (#52) (e.g., 12930984)
;Output: ERXIEN - Pointer to the ERX HOLDING QUEUE file (#52.49) or "" (Not an eRx prescription)
;
N OR100IEN
I '$G(PORXIEN) Q ""
I PORXIEN'["P" S OR100IEN=$$GET1^DIQ(52,+PORXIEN,39.3,"I")
I PORXIEN["P" S OR100IEN=+$$GET1^DIQ(52.41,+PORXIEN,.01,"I")
I '$G(OR100IEN) Q ""
Q $S($$CHKERX^PSOERXU1(OR100IEN):$$CHKERX^PSOERXU1(OR100IEN),1:"")
;
AUDLOG(ERXIEN,FIELD,EDITBY,NEWVAL) ; Sets eRx Edit Audit Log
; Input: (r) ERXIEN - Pointer to ERX HOLDING QUEUE File (#52.49). eRx record being edited.
; (r) FIELD - Freetext eRx Field Name (e.g.,"DRUG", "PROVIDER", "PATIENT", Etc...). Field being edited.
; (r) EDITBY - Pointer to NEW PERSON File (#200). User who made the edit.
; (r) NEWVAL - Array containing the new value for the field being edited (Passed in by Reference)
;
N AUDLOG,SAVERES
S ERXIEN=+$G(ERXIEN),EDITBY=+$G(EDITBY)
I '$D(^PS(52.49,ERXIEN,0)) Q ; Invalid eRx IEN
I $G(FIELD)="" Q ; Invalid Field Name
I '$D(^VA(200,EDITBY,0)) Q ; Invalid Edit By value
I '$D(NEWVAL) Q ; No New Value
;
; Old value and new value are the same (no edit)
I $$EQUAL(ERXIEN,FIELD,.NEWVAL) Q
;
; Saving Data Element
S AUDLOG(52.4920,"+1,"_ERXIEN_",",.01)=$$NOW^XLFDT() ;Audit Log Date/Time
S AUDLOG(52.4920,"+1,"_ERXIEN_",",.02)=FIELD ;Element Name
S AUDLOG(52.4920,"+1,"_ERXIEN_",",.03)=EDITBY ;Data Format
S AUDLOG(52.4920,"+1,"_ERXIEN_",",.04)="NEWVAL" ;New Value
D UPDATE^DIE("","AUDLOG","SAVERES","")
Q
;
EQUAL(ERXIEN,FIELD,NEWVAL) ; Compare if the OLD and NEW values are the same
;Input: (r) ERXIEN - Pointer to ERX HOLDING QUEUE File (#52.49). eRx record being edited.
; (r) FIELD - Freetext eRx Field Name (e.g.,"DRUG", "PROVIDER", "PATIENT", Etc...). Field being edited.
; (r) NEWVAL - Array containing the new/current value for the field (Passed by Reference)
;Output: 1 - Values are equal | 0 - Values are different
;
N EQUAL,OLDVAL,I S EQUAL=1
; Retrieving the old/previous value
D OLDVAL(ERXIEN,FIELD,,.OLDVAL)
F I=1:1 Q:'$D(OLDVAL(I)) I $G(OLDVAL(I))'=$G(NEWVAL(I)) S EQUAL=0
I EQUAL F I=1:1 Q:'$D(NEWVAL(I)) I $G(NEWVAL(I))'=$G(OLDVAL(I)) S EQUAL=0
Q EQUAL
;
OLDVAL(ERXIEN,FIELD,STRTFROM,OLDVAL) ; Retrieves the Previous/Old Value for the eRx Field
; Input: (r) ERXIEN - Pointer to ERX HOLDING QUEUE File (#52.49). eRx record being edited.
; (r) FIELD - Freetext eRx Field Name (e.g.,"DRUG", "PROVIDER", "PATIENT", Etc...). Field being edited.
; (o) STRTFROM - Start From Audit Log IEN. Default: Lastest value for the field.
;Output: OLDVAL - Array containing the old/previous value for the field (Returned by Reference)
;
N AUDLOG,X K OLDVAL
S AUDLOG=$S(+$G(STRTFROM):STRTFROM,1:999999999)
F S AUDLOG=$O(^PS(52.49,ERXIEN,"AUD",AUDLOG),-1) Q:'AUDLOG D I $O(OLDVAL(0)) Q
. I $$GET1^DIQ(52.4920,AUDLOG_","_ERXIEN,.02)=FIELD D
. . F I=1:1 Q:'$D(^PS(52.49,ERXIEN,"AUD",AUDLOG,"VAL",I)) D
. . . S OLDVAL(I)=^PS(52.49,ERXIEN,"AUD",AUDLOG,"VAL",I,0)
Q
;
PROXYDUZ() ; Returns the Proxy DUZ for Audit Log entries from Auto-Matching
; Output: PROXYDUZ - Pointer to NEW PERSON file (#200)
N DIC,X,Y
S DIC="^VA(200,",DIC(0)="X",X="PSOAPPLICATIONPROXY,PSO" D ^DIC
Q $S(+$G(Y):+$G(Y),1:.5)
;
DONOTFIL(ERXIEN) ; Do Not Fill record
; Input: (r) ERXIEN - Pointer to ERX HOLDING QUEUE File (#52.49). eRx record being edited.
;Output: 1: 'Do Not Fill' eRx Record (Display Message on the Scrren) ! 0: Not a 'Do Not Fill' eRx Record
;
I $$GET1^DIQ(52.49,+$G(ERXIEN),10.5,"I")=2 D Q 1
. W !!,"This is a DO NOT FILL record. The only actions available are REMOVE or REJECT.",$C(7)
. D PAUSE^VALM1
Q 0
;
SUFFWARN(RESULT,ERXPRDEA,VADEADSP,HEADER) ; Append suffix warning to end of RESULT array
; Input: (r) ERXPRDEA - eRx DEA number
; (r) VADEADSP - VA DEA #
; (o) HEADER - Print Message Heading
; Output: RESULT - DEA Number suffix mismatch warning text
N RESCNT S RESCNT=$O(RESULT(""),-1)
I $G(HEADER)!RESCNT D
. S RESULT($O(RESULT(""),-1)+1)="******************************* WARNING(S) *******************************"
S RESULT($O(RESULT(""),-1)+1)="Provider DEA suffix mismatch (eRx: "_ERXPRDEA_" | VistA: "_VADEADSP_")."
Q
;
DEFROUTE(OIIEN) ; Returns the Default Route for Orderable Item
; Input: OIIEN - Orderable Item IEN - Pointer to PHARMACY ORDERABLE ITEM file (#50.7)
;Output: DEFROUTE - Default Route (e.g., "ORAL", "TOPICAL", etc..) or "" (No default route found)
I '$G(OIIEN)!'$D(^PS(50.7,+$G(OIIEN))) Q ""
N DEFROUTE,DFIEN,RTIEN S DEFROUTE=""
I $$GET1^DIQ(50.7,OIIEN,10,"I")="N" D ; OI uses Possible Med Route(s)
. S RTIEN=$O(^PS(50.7,OIIEN,3,0)) I 'RTIEN Q ; No Possible Routes Found
. I $O(^PS(50.7,OIIEN,3,RTIEN)) Q ; More than one Possible Med Route Found
. S DEFROUTE=$$GET1^DIQ(50.711,RTIEN_","_OIIEN,.01)
I $$GET1^DIQ(50.7,OIIEN,10,"I")="Y" D ; OI uses Dosage Form Med Route(s)
. S DFIEN=$$GET1^DIQ(50.7,OIIEN,.02,"I") I 'DFIEN Q ; No Dosage Form pointer Found
. S RTIEN=$O(^PS(50.606,DFIEN,"MR",0)) I 'RTIEN Q ; No Med Route for Dosage Form Found
. I $O(^PS(50.606,DFIEN,"MR",RTIEN)) Q ; More than one Med Route Found
. S DEFROUTE=$$GET1^DIQ(50.6061,RTIEN_","_DFIEN,.01)
;
; No Route Found above and Orderable Item has a Default Route
I DEFROUTE="",$$GET1^DIQ(50.7,OIIEN,.06)'="" Q $$GET1^DIQ(50.7,OIIEN,.06)
; Orderable Item has a Default Route that does not match the one found
I DEFROUTE'="",$$GET1^DIQ(50.7,OIIEN,.06)'="",DEFROUTE'=$$GET1^DIQ(50.7,OIIEN,.06) Q ""
;
Q DEFROUTE
;
ERXSIG(ERXIEN) ; Returns the eRx SIG
Q $$ERXSIG^PSOERXU8(ERXIEN)
;
VISTASIG(ERXIEN) ; Returns the VistA SIG, if present
Q $$VISTASIG^PSOERXU8(ERXIEN)
;
RENEWALS(ERXIEN) ; Returns whether Renewals are Prohibited or no
Q $$RENEWALS^PSOERXU8(ERXIEN)
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSOERXUT 18304 printed Dec 13, 2024@02:29:11 Page 2
PSOERXUT ;ALB/MR - eRx CS utilities ;7/21/2020 9:57am
+1 ;;7.0;OUTPATIENT PHARMACY;**617,667,651,718,700,743**;DEC 1997;Build 24
+2 QUIT
+3 ;
CSFILTER(ERXIEN) ; Check eRx against CS Filter Prompt Answers
+1 ; Global variables: PSOCSERX: CS Filter Selection | PSOCSSCH: Drug Schedule Filter Selection
+2 ; Input: (r)ERXIEN - Pointer to ERX HOLDING QUEUE (#52.49)
+3 ;Output: 1 - Include the eRx | 0 - Exclude the eRx
+4 ;
+5 NEW DRGCSCH,ERXCSFLG
+6 IF $GET(PSOCSERX)="B"
IF $GET(PSOCSSCH)=3
QUIT 1
+7 SET DRGCSCH=$PIECE($GET(^PS(52.49,ERXIEN,4)),"^",9)
+8 SET ERXCSFLG=+$GET(^PS(52.49,ERXIEN,95))
+9 IF $GET(PSOCSERX)="CS"
IF 'ERXCSFLG
QUIT 0
+10 IF $GET(PSOCSERX)="Non-CS"
IF ERXCSFLG
QUIT 0
+11 IF $GET(PSOCSERX)="CS"
IF +$GET(PSOCSSCH)=1
IF DRGCSCH'="C48675"
QUIT 0
+12 IF $GET(PSOCSERX)="CS"
IF +$GET(PSOCSSCH)=2
IF "C48676 C48677 C48679"'[DRGCSCH
QUIT 0
+13 IF $GET(PSOCSERX)="B"
IF ERXCSFLG
IF +$GET(PSOCSSCH)=1
IF DRGCSCH'="C48675"
QUIT 0
+14 IF $GET(PSOCSERX)="B"
IF ERXCSFLG
IF +$GET(PSOCSSCH)=2
IF "C48676 C48677 C48679"'[DRGCSCH
QUIT 0
+15 QUIT 1
+16 ;
VALPTADD(DFN) ; Returns whether the patient has a valid address or not
+1 ; Input: (r)DFN - Pointer to the PATIENT file (#2)
+2 ;Output: 1: Valid Address on File (Zip Code or Postal Code value present) | 0: No Valid Address on File
+3 ;
+4 NEW VAPA,I
IF '$GET(DFN)
QUIT 0
+5 DO ADD^VADPT
IF ((+$GET(VAPA(25))=1!($GET(VAPA(25))=""))&($GET(VAPA(11))=""))!((+$GET(VAPA(25))>1)&($GET(VAPA(24))=""))
QUIT 0
+6 QUIT 1
+7 ;
CSKEYS(USER) ; Checks whether the user has a valid Security Key for CS Orders
+1 ; Input: (r)USER - Pointer to the NEW PERSON file (#200)
+2 ;Output: 1 - Yes, user is authorized to edit and Validate for CS eRx's | 0: Not authorized
+3 ;
+4 IF '$DATA(^XUSEC("PSDRPH",USER))
IF '$DATA(^XUSEC("PSO ERX ADV TECH",USER))
IF '$DATA(^XUSEC("PSO ERX TECH",USER))
QUIT 0
+5 QUIT 1
+6 ;
PRDRVAL(RESULT,ACTION,ERXIEN,PROVIEN,DRUGIEN) ; API used to Verify Provider and Drug Selection/Validation for CS Prescriptions
+1 ; Input:(r)ACTION - Ation being peformed ("EP": Edit Provider | "VP": Validate Provider | "ED": Edit Drug | "VD": Validate Drug | "AC": Accept eRx)
+2 ; (r)ERXIEN - eRx IEN. Pointer to the ERX HOLDING QUEUE file (#52.49)
+3 ; (o)PROVIEN - Provider IEN. Pointer to the NEW PERSON file (#200)
+4 ; (o)DRUGIEN - Dispense Drug IEN. Pointer to the DRUG file (#50)
+5 ;Output: RESULT - 1 (Valid Selection) | 0 (Invalid Selection) ^ Compiled Restriction ("W": Warning / "B": Block)
+6 ; RESULT(1..n)=[Invalid Selection Reason]^Restriction (e.g., RESULT(1)="eRx Provider does not have a valid DEA#.")
+7 NEW ERXPROV,DSERXFLG,ERXPRNPI,ERXPRDEA,VAPRNPI,RXWRDATE,VADRSCH,ERXDRSCH,VADEANUM,VACSDRUG,VADEADSP,VADEASUF,VADEASTR,VADEAEXP,VADEADFL
+8 KILL RESULT
SET RESULT=1
SET ERXIEN=+$GET(ERXIEN)
SET PROVIEN=+$GET(PROVIEN)
SET DRUGIEN=+$GET(DRUGIEN)
+9 IF 'PROVIEN
IF $$GET1^DIQ(52.49,ERXIEN,2.3,"I")>0
SET PROVIEN=+$$GET1^DIQ(52.49,ERXIEN,2.3,"I")
+10 IF 'DRUGIEN
IF $$GET1^DIQ(52.49,ERXIEN,3.2,"I")>0
SET DRUGIEN=+$$GET1^DIQ(52.49,ERXIEN,3.2,"I")
+11 IF 'ERXIEN!('PROVIEN&'DRUGIEN)
SET RESULT="0^B"
SET RESULT(1)="Invalid Parameters"
QUIT
+12 ;
+13 ; eRx Provider IEN
SET ERXPROV=$$GET1^DIQ(52.49,ERXIEN,2.1,"I")
+14 ; eRx Provider NPI
SET ERXPRNPI=$$GET1^DIQ(52.48,ERXPROV,1.5)
+15 ; eRx Provider DEA#
SET ERXPRDEA=$$UP^XLFSTR($$GET1^DIQ(52.48,ERXPROV,1.6))
+16 ; eRx Digitally Signed Flag
SET DSERXFLG=$$GET1^DIQ(52.49,ERXIEN,95.1,"I")
+17 ; eRx DEA Drug Schedule
SET ERXDRSCH=$$ERXDRSCH(ERXIEN)
+18 ; eRx Written Date
SET RXWRDATE=$$GET1^DIQ(52.49,ERXIEN,5.9,"I")
+19 ; VistA Drug is CS Flag
SET VACSDRUG=0
+20 ;
+21 ; Edit/Validate Provider & Accept eRx Checks
+22 IF ACTION="EP"!(ACTION="VP")!(ACTION="AC")
Begin DoDot:1
+23 NEW ERXSUFF
SET ERXSUFF=0
+24 SET VAPRNPI=$PIECE($$NPI^XUSNPI("Individual_ID",PROVIEN),"^")
if VAPRNPI'>0
SET VAPRNPI=""
+25 IF VAPRNPI'=ERXPRNPI
IF ACTION'="AC"
Begin DoDot:2
+26 SET RESULT($ORDER(RESULT(""),-1)+1)="Provider NPI mismatch (eRx: "_ERXPRNPI_" | VistA: "_VAPRNPI_")"
End DoDot:2
+27 ; Digitally Signed Order
+28 IF DSERXFLG
Begin DoDot:2
+29 ; 743 - Check provider's profile for eRx DEA
+30 SET VADEADFL=$PIECE($$UP^XLFSTR($$VADEA^PSOERXU8(PROVIEN,ERXIEN)),"^")
SET (VADEANUM,VADEADSP)=VADEADFL
+31 SET VADEAEXP=$$DEAXDT^XUSER($PIECE(VADEANUM,"-"))
+32 IF VADEANUM=""
Begin DoDot:3
+33 SET RESULT($ORDER(RESULT(""),-1)+1)="VistA Provider does not have a valid DEA# on file."
End DoDot:3
+34 IF ERXPRDEA=""
Begin DoDot:3
+35 SET RESULT($ORDER(RESULT(""),-1)+1)="eRx Provider does not have a valid DEA#."
End DoDot:3
+36 ; PSO*7*743
IF ERXPRDEA'=""
IF $LENGTH(VADEANUM)>3
IF (VADEANUM'=ERXPRDEA)
Begin DoDot:3
+37 IF ($PIECE(ERXPRDEA,"-")=$PIECE(VADEANUM,"-"))
SET ERXSUFF=1
QUIT
+38 SET RESULT($ORDER(RESULT(""),-1)+1)="Provider DEA mismatch (eRx: "_ERXPRDEA_" | VistA: "_VADEADSP_")."
End DoDot:3
+39 ; PSO*7*743
IF ERXPRDEA'=""
IF $LENGTH(VADEANUM)>3
IF ($PIECE(VADEANUM,"-")=$PIECE(ERXPRDEA,"-"))
IF (RXWRDATE>VADEAEXP)
Begin DoDot:3
+40 SET RESULT($ORDER(RESULT(""),-1)+1)="eRx Written Date/Issue Date is after the VistA Provider DEA expiration date ("_$$FMTE^XLFDT(VADEAEXP)_")."
End DoDot:3
+41 ; VistA Drug Selected (Additional Checks for CS and Detox drugs)
+42 IF DRUGIEN
Begin DoDot:3
+43 IF $$VADRSCH(DRUGIEN)'=""
Begin DoDot:4
+44 NEW DEAFOUND
SET DEAFOUND=0
+45 SET VACSDRUG=1
+46 SET VADRSCH=$$VADRSCH(DRUGIEN)
+47 ; Does the DEA# exist on the provider's profile?
IF ERXPRDEA'=""
SET DEAFOUND=$$DEAFOUND^PSOERXU8(ERXPRDEA,PROVIEN)
+48 ; PSO*7*743 - If found, valid for drug?
IF DEAFOUND
SET VADEANUM=$$UP^XLFSTR($$SDEA^XUSER(0,PROVIEN,$PIECE(VADRSCH,"^"),RXWRDATE,$PIECE(ERXPRDEA,"-")))
SET VADEADSP=$PIECE($$VADEA^PSOERXU8(PROVIEN,ERXIEN),"^")
+49 ; PSO*7*743 Begin - If eRx DEA is not found on provider's profile, find default DEA to display
IF 'DEAFOUND
Begin DoDot:5
+50 if VADEADFL=""
SET VADEADFL=$$DEA^XUSER(0,PROVIEN)
+51 ; No DEA on file
if VADEADFL=""
SET (VADEANUM,VADEADSP)=1
+52 ; PSO*7*743 - Use matching DEA if present, default DEA if no match
IF VADEADFL'=""
SET (VADEANUM,VADEADSP)=VADEADFL
+53 ; PSO*7*743 End
End DoDot:5
+54 IF $PIECE(VADEANUM,"^")=2
Begin DoDot:5
+55 SET RESULT($ORDER(RESULT(""),-1)+1)="VistA Provider "_$$GET1^DIQ(200,PROVIEN,.01)_" is NOT authorized to write to the schedule ("_$PIECE(VADRSCH,"^",3)_") of the VistA Drug selected."
End DoDot:5
End DoDot:4
End DoDot:3
End DoDot:2
+56 ; All checks are OK
+57 ; Add DEA Suffix mismatch message
+58 IF $GET(ERXSUFF)
Begin DoDot:2
+59 IF '$ORDER(RESULT(0))
DO SUFFWARN(.RESULT,ERXPRDEA,$SELECT($LENGTH($GET(VADEADSP)):VADEADSP,1:VADEANUM),0)
SET RESULT="0^W"
QUIT
+60 IF ACTION="EP"!(ACTION="VP")
IF 'VACSDRUG
DO SUFFWARN(.RESULT,ERXPRDEA,$SELECT($LENGTH($GET(VADEADSP)):VADEADSP,1:VADEANUM),0)
SET RESULT="0^W"
QUIT
+61 IF ACTION="EP"
DO SUFFWARN(.RESULT,ERXPRDEA,$SELECT($LENGTH($GET(VADEADSP)):VADEADSP,1:VADEANUM),0)
SET RESULT="0^W"
QUIT
+62 IF ACTION="VP"!(ACTION="AC")
DO SUFFWARN(.RESULT,ERXPRDEA,$SELECT($LENGTH($GET(VADEADSP)):VADEADSP,1:VADEANUM),0)
SET RESULT="0^B"
QUIT
End DoDot:2
QUIT
+63 IF '$ORDER(RESULT(0))
SET RESULT=1
QUIT
+64 ; VistA Drug is not Selected or it is not a CS Drug
+65 IF ACTION="EP"!(ACTION="VP")!(ACTION="AC")
IF 'VACSDRUG
Begin DoDot:2
+66 SET RESULT="0^W"
End DoDot:2
QUIT
+67 ; Editing Provider, VistA Drug is CS or Detox, Warning (soft stop)
+68 IF ACTION="EP"
Begin DoDot:2
+69 SET RESULT="0^W"
End DoDot:2
QUIT
+70 ; Validating Provider/Accept eRx, VistA Drug is CS or Detox, Block (hard stop)
+71 IF ACTION="VP"!(ACTION="AC")
Begin DoDot:2
+72 SET RESULT="0^B"
End DoDot:2
QUIT
End DoDot:1
QUIT
+73 ;
+74 ; Edit/Validate Drug & Accept eRx Checks
+75 IF (ACTION="ED")!(ACTION="VD")!(ACTION="AC")
Begin DoDot:1
+76 SET VADRSCH=$$VADRSCH(DRUGIEN)
IF VADRSCH'=""
SET VACSDRUG=1
+77 IF DSERXFLG
IF 'VACSDRUG
IF ACTION'="AC"
Begin DoDot:2
+78 SET RESULT="0^W"
+79 IF ERXDRSCH=""
Begin DoDot:3
+80 SET RESULT($ORDER(RESULT(""),-1)+1)="eRx was digitally signed by the prescriber and VistA Drug selected is Non-CS. Please, review and make sure you selected the correct drug."
End DoDot:3
+81 IF '$TEST
Begin DoDot:3
+82 SET RESULT($ORDER(RESULT(""),-1)+1)="eRx Drug is indicated by the prescriber as CS ("_$PIECE(ERXDRSCH,"^",2)_") and VistA Drug selected is Non-CS. Please, review and make sure you selected the correct drug."
End DoDot:3
End DoDot:2
+83 IF 'DSERXFLG
IF VACSDRUG
Begin DoDot:2
+84 SET RESULT="0^B"
+85 IF $PIECE(VADRSCH,"^",2)="L"
Begin DoDot:3
+86 SET RESULT($ORDER(RESULT(""),-1)+1)="eRx is not digitally signed and VistA drug is not matched to an NDF item marked with a CS Federal Schedule but is locally marked as a controlled substance ("_$PIECE(VADRSCH,"^",3)
_")."
End DoDot:3
+87 IF '$TEST
Begin DoDot:3
+88 SET RESULT($ORDER(RESULT(""),-1)+1)="eRx is not digitally signed and VistA Drug is marked as CS ("_$PIECE(VADRSCH,"^",3)_")."
End DoDot:3
End DoDot:2
+89 IF VACSDRUG
IF ERXPRDEA=""
Begin DoDot:2
+90 SET RESULT="0^B"
+91 SET RESULT($ORDER(RESULT(""),-1)+1)="eRx Provider does not have a valid DEA#."
End DoDot:2
+92 ; VistA Provider Selected (Additional Checks)
+93 IF PROVIEN
Begin DoDot:2
+94 ; CS VistA Drug
+95 IF VACSDRUG
Begin DoDot:3
+96 ; PSO*7*743 Begin
NEW DEAFOUND
SET DEAFOUND=0
+97 ; Does the DEA# exist on the provider's profile?
IF ERXPRDEA'=""
SET DEAFOUND=$$DEAFOUND^PSOERXU8(ERXPRDEA,PROVIEN)
+98 ; PSO*7*743 - If found, valid for drug?
IF DEAFOUND
SET VADEANUM=$$UP^XLFSTR($$SDEA^XUSER(0,PROVIEN,$PIECE(VADRSCH,"^"),RXWRDATE,$PIECE(ERXPRDEA,"-")))
SET (VADEADSP,VADEADFL)=$PIECE($$VADEA^PSOERXU8(PROVIEN,ERXIEN),"^")
+99 ; PSO*7*743 Begin - If eRx DEA is not found on provider's profile, find default DEA to display
IF 'DEAFOUND
Begin DoDot:4
+100 ; PSO*7*743
SET VADEADFL=$PIECE($$UP^XLFSTR($$VADEA^PSOERXU8(PROVIEN,ERXIEN)),"^")
+101 if VADEADFL=""
SET VADEADFL=$$DEA^XUSER(0,PROVIEN)
+102 ; No DEA on file
if VADEADFL=""
SET (VADEANUM,VADEADSP)=1
+103 ; PSO*7*743 - Use matching DEA if present, default DEA if no match
IF VADEADFL'=""
SET (VADEANUM,VADEADSP)=VADEADFL
End DoDot:4
+104 IF $PIECE(VADEANUM,"^")=1
Begin DoDot:4
+105 SET RESULT="0^B"
+106 SET RESULT($ORDER(RESULT(""),-1)+1)="VistA Provider "_$$GET1^DIQ(200,PROVIEN,.01)_" does not have a valid DEA# on file."
+107 DO SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$GET(ERXSUFF))
End DoDot:4
QUIT
+108 IF $PIECE(VADEANUM,"^")=2
Begin DoDot:4
+109 SET RESULT="0^"_$SELECT(ACTION="ED"&($PIECE($GET(RESULT),"^",2)'="B"):"W",1:"B")
+110 SET RESULT($ORDER(RESULT(""),-1)+1)="VistA Provider "_$$GET1^DIQ(200,PROVIEN,.01)_" is NOT authorized to write to the schedule ("_$PIECE(VADRSCH,"^",3)_") of the VistA Drug selected."
+111 DO SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$GET(ERXSUFF))
End DoDot:4
QUIT
+112 IF $PIECE(VADEANUM,"^")=4
Begin DoDot:4
+113 SET RESULT="0^"_$SELECT(ACTION="ED"&($PIECE($GET(RESULT),"^",2)'="B"):"W",1:"B")
+114 ; PSO*7*743
SET RESULT($ORDER(RESULT(""),-1)+1)="eRx Written Date/Issue Date is after the VistA Provider DEA expiration date ("_$$FMTE^XLFDT($PIECE(VADEANUM,"^",2))_")."
+115 DO SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$GET(ERXSUFF))
End DoDot:4
QUIT
+116 IF ERXPRDEA'=""
IF $LENGTH($PIECE(VADEANUM,"^",1))>8
IF ($PIECE($PIECE(VADEANUM,"^"),"-")'=$PIECE(ERXPRDEA,"-"))
Begin DoDot:4
+117 SET RESULT="0^B"
+118 SET RESULT($ORDER(RESULT(""),-1)+1)="Provider DEA mismatch (eRx: "_ERXPRDEA_" | VistA: "_VADEANUM_")."
+119 DO SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$GET(ERXSUFF))
End DoDot:4
QUIT
+120 DO SUFCHK^PSOERXU8(.RESULT,ERXPRDEA,VADEADFL,$GET(ERXSUFF))
+121 ; PSO*7*743 End
End DoDot:3
+122 ; Detox VistA Drug
+123 IF $$DETOX^PSSOPKI(DRUGIEN)
IF $$DETOX^XUSER(PROVIEN,RXWRDATE)'?1"X"1A7N
Begin DoDot:3
+124 SET RESULT="0^"_$SELECT(ACTION="ED"&($PIECE($GET(RESULT),"^",2)'="B"):"W",1:"B")
+125 SET RESULT($ORDER(RESULT(""),-1)+1)="VistA Provider "_$$GET1^DIQ(200,PROVIEN,.01)_" does not have a valid DETOX#."
End DoDot:3
End DoDot:2
End DoDot:1
+126 ;
+127 QUIT
+128 ;
ERXDRSCH(ERXIEN) ; Returns the CS Schedule for the eRx Drug (Internal^External Format)
+1 ; Input: (r) ERXIEN - Pointer to the ERX HOLDING QUEUE file (52.49)
+2 ;Output: ERXDRSCH - eRx DEA Schedule ^ Formatted eRx DEA Schedule (e.g., "2^[C-II]", "4^[C-IV], "", etc...)
+3 ;
+4 NEW ERXDRSCH
+5 IF '$GET(ERXIEN)
QUIT ""
+6 SET ERXDRSCH=$$GET1^DIQ(52.49,+ERXIEN,4.9)
IF ERXDRSCH=""
QUIT ""
+7 QUIT (ERXDRSCH_"^[C-"_$SELECT(ERXDRSCH="C48675":"II",ERXDRSCH="C48676":"III",ERXDRSCH="C48677":"IV",ERXDRSCH="C48679":"V",1:"")_"]")
+8 ;
VADRSCH(DRUGIEN) ; Returns the CS Schedule for the VistA Dispense Drug (Internal^External Format)
+1 ; Input: (r) DRUGIEN - Pointer to the DRUG file (#50)
+2 ;Output: VADRSCH - P1: Schedule (2, 2n, 3, ..5) | P2: "F"ederal or "L"ocally Marked CS | P3: Formatted eRx DEA Schedule (e.g., "3n^F^[C-II]", "5^L^[C-V]", "", etc...)
+3 ;
+4 NEW VADRSCH,VAPRDIEN
+5 IF '$GET(DRUGIEN)
QUIT ""
+6 SET VAPRDIEN=+$$GET1^DIQ(50,+DRUGIEN,22,"I")
+7 SET VADRSCH=$SELECT(VAPRDIEN:$$GET1^DIQ(50.68,VAPRDIEN,19,"I"),1:+$$GET1^DIQ(50,DRUGIEN,3))
+8 IF VADRSCH<1!(VADRSCH>5)
QUIT ""
+9 QUIT (VADRSCH_"^"_$SELECT(VAPRDIEN:"F",1:"L")_"^[C-"_$SELECT(VADRSCH=2:"II",VADRSCH="2n":"IIn",VADRSCH=3:"III",VADRSCH="3n":"IIIn",+VADRSCH=4:"IV",+VADRSCH=5:"V",1:"")_"]")
+10 ;
PAUSE ; Pauses screen until user hits Return
+1 KILL DIR
SET DIR("A")="Press Return to continue"
SET DIR(0)="E"
DO ^DIR
+2 QUIT
+3 ;
ERXIEN(PORXIEN) ; Given the Pending Order (#52.41) or Prescription (#52) IEN, returns the eRx (#52.49) IEN or "" (null)
+1 ; Input: (r) PORXIEN - Pointer to either the PENDING ORDERS file (#52.41) (e.g., "139839P") or PRESCRIPTION file (#52) (e.g., 12930984)
+2 ;Output: ERXIEN - Pointer to the ERX HOLDING QUEUE file (#52.49) or "" (Not an eRx prescription)
+3 ;
+4 NEW OR100IEN
+5 IF '$GET(PORXIEN)
QUIT ""
+6 IF PORXIEN'["P"
SET OR100IEN=$$GET1^DIQ(52,+PORXIEN,39.3,"I")
+7 IF PORXIEN["P"
SET OR100IEN=+$$GET1^DIQ(52.41,+PORXIEN,.01,"I")
+8 IF '$GET(OR100IEN)
QUIT ""
+9 QUIT $SELECT($$CHKERX^PSOERXU1(OR100IEN):$$CHKERX^PSOERXU1(OR100IEN),1:"")
+10 ;
AUDLOG(ERXIEN,FIELD,EDITBY,NEWVAL) ; Sets eRx Edit Audit Log
+1 ; Input: (r) ERXIEN - Pointer to ERX HOLDING QUEUE File (#52.49). eRx record being edited.
+2 ; (r) FIELD - Freetext eRx Field Name (e.g.,"DRUG", "PROVIDER", "PATIENT", Etc...). Field being edited.
+3 ; (r) EDITBY - Pointer to NEW PERSON File (#200). User who made the edit.
+4 ; (r) NEWVAL - Array containing the new value for the field being edited (Passed in by Reference)
+5 ;
+6 NEW AUDLOG,SAVERES
+7 SET ERXIEN=+$GET(ERXIEN)
SET EDITBY=+$GET(EDITBY)
+8 ; Invalid eRx IEN
IF '$DATA(^PS(52.49,ERXIEN,0))
QUIT
+9 ; Invalid Field Name
IF $GET(FIELD)=""
QUIT
+10 ; Invalid Edit By value
IF '$DATA(^VA(200,EDITBY,0))
QUIT
+11 ; No New Value
IF '$DATA(NEWVAL)
QUIT
+12 ;
+13 ; Old value and new value are the same (no edit)
+14 IF $$EQUAL(ERXIEN,FIELD,.NEWVAL)
QUIT
+15 ;
+16 ; Saving Data Element
+17 ;Audit Log Date/Time
SET AUDLOG(52.4920,"+1,"_ERXIEN_",",.01)=$$NOW^XLFDT()
+18 ;Element Name
SET AUDLOG(52.4920,"+1,"_ERXIEN_",",.02)=FIELD
+19 ;Data Format
SET AUDLOG(52.4920,"+1,"_ERXIEN_",",.03)=EDITBY
+20 ;New Value
SET AUDLOG(52.4920,"+1,"_ERXIEN_",",.04)="NEWVAL"
+21 DO UPDATE^DIE("","AUDLOG","SAVERES","")
+22 QUIT
+23 ;
EQUAL(ERXIEN,FIELD,NEWVAL) ; Compare if the OLD and NEW values are the same
+1 ;Input: (r) ERXIEN - Pointer to ERX HOLDING QUEUE File (#52.49). eRx record being edited.
+2 ; (r) FIELD - Freetext eRx Field Name (e.g.,"DRUG", "PROVIDER", "PATIENT", Etc...). Field being edited.
+3 ; (r) NEWVAL - Array containing the new/current value for the field (Passed by Reference)
+4 ;Output: 1 - Values are equal | 0 - Values are different
+5 ;
+6 NEW EQUAL,OLDVAL,I
SET EQUAL=1
+7 ; Retrieving the old/previous value
+8 DO OLDVAL(ERXIEN,FIELD,,.OLDVAL)
+9 FOR I=1:1
if '$DATA(OLDVAL(I))
QUIT
IF $GET(OLDVAL(I))'=$GET(NEWVAL(I))
SET EQUAL=0
+10 IF EQUAL
FOR I=1:1
if '$DATA(NEWVAL(I))
QUIT
IF $GET(NEWVAL(I))'=$GET(OLDVAL(I))
SET EQUAL=0
+11 QUIT EQUAL
+12 ;
OLDVAL(ERXIEN,FIELD,STRTFROM,OLDVAL) ; Retrieves the Previous/Old Value for the eRx Field
+1 ; Input: (r) ERXIEN - Pointer to ERX HOLDING QUEUE File (#52.49). eRx record being edited.
+2 ; (r) FIELD - Freetext eRx Field Name (e.g.,"DRUG", "PROVIDER", "PATIENT", Etc...). Field being edited.
+3 ; (o) STRTFROM - Start From Audit Log IEN. Default: Lastest value for the field.
+4 ;Output: OLDVAL - Array containing the old/previous value for the field (Returned by Reference)
+5 ;
+6 NEW AUDLOG,X
KILL OLDVAL
+7 SET AUDLOG=$SELECT(+$GET(STRTFROM):STRTFROM,1:999999999)
+8 FOR
SET AUDLOG=$ORDER(^PS(52.49,ERXIEN,"AUD",AUDLOG),-1)
if 'AUDLOG
QUIT
Begin DoDot:1
+9 IF $$GET1^DIQ(52.4920,AUDLOG_","_ERXIEN,.02)=FIELD
Begin DoDot:2
+10 FOR I=1:1
if '$DATA(^PS(52.49,ERXIEN,"AUD",AUDLOG,"VAL",I))
QUIT
Begin DoDot:3
+11 SET OLDVAL(I)=^PS(52.49,ERXIEN,"AUD",AUDLOG,"VAL",I,0)
End DoDot:3
End DoDot:2
End DoDot:1
IF $ORDER(OLDVAL(0))
QUIT
+12 QUIT
+13 ;
PROXYDUZ() ; Returns the Proxy DUZ for Audit Log entries from Auto-Matching
+1 ; Output: PROXYDUZ - Pointer to NEW PERSON file (#200)
+2 NEW DIC,X,Y
+3 SET DIC="^VA(200,"
SET DIC(0)="X"
SET X="PSOAPPLICATIONPROXY,PSO"
DO ^DIC
+4 QUIT $SELECT(+$GET(Y):+$GET(Y),1:.5)
+5 ;
DONOTFIL(ERXIEN) ; Do Not Fill record
+1 ; Input: (r) ERXIEN - Pointer to ERX HOLDING QUEUE File (#52.49). eRx record being edited.
+2 ;Output: 1: 'Do Not Fill' eRx Record (Display Message on the Scrren) ! 0: Not a 'Do Not Fill' eRx Record
+3 ;
+4 IF $$GET1^DIQ(52.49,+$GET(ERXIEN),10.5,"I")=2
Begin DoDot:1
+5 WRITE !!,"This is a DO NOT FILL record. The only actions available are REMOVE or REJECT.",$CHAR(7)
+6 DO PAUSE^VALM1
End DoDot:1
QUIT 1
+7 QUIT 0
+8 ;
SUFFWARN(RESULT,ERXPRDEA,VADEADSP,HEADER) ; Append suffix warning to end of RESULT array
+1 ; Input: (r) ERXPRDEA - eRx DEA number
+2 ; (r) VADEADSP - VA DEA #
+3 ; (o) HEADER - Print Message Heading
+4 ; Output: RESULT - DEA Number suffix mismatch warning text
+5 NEW RESCNT
SET RESCNT=$ORDER(RESULT(""),-1)
+6 IF $GET(HEADER)!RESCNT
Begin DoDot:1
+7 SET RESULT($ORDER(RESULT(""),-1)+1)="******************************* WARNING(S) *******************************"
End DoDot:1
+8 SET RESULT($ORDER(RESULT(""),-1)+1)="Provider DEA suffix mismatch (eRx: "_ERXPRDEA_" | VistA: "_VADEADSP_")."
+9 QUIT
+10 ;
DEFROUTE(OIIEN) ; Returns the Default Route for Orderable Item
+1 ; Input: OIIEN - Orderable Item IEN - Pointer to PHARMACY ORDERABLE ITEM file (#50.7)
+2 ;Output: DEFROUTE - Default Route (e.g., "ORAL", "TOPICAL", etc..) or "" (No default route found)
+3 IF '$GET(OIIEN)!'$DATA(^PS(50.7,+$GET(OIIEN)))
QUIT ""
+4 NEW DEFROUTE,DFIEN,RTIEN
SET DEFROUTE=""
+5 ; OI uses Possible Med Route(s)
IF $$GET1^DIQ(50.7,OIIEN,10,"I")="N"
Begin DoDot:1
+6 ; No Possible Routes Found
SET RTIEN=$ORDER(^PS(50.7,OIIEN,3,0))
IF 'RTIEN
QUIT
+7 ; More than one Possible Med Route Found
IF $ORDER(^PS(50.7,OIIEN,3,RTIEN))
QUIT
+8 SET DEFROUTE=$$GET1^DIQ(50.711,RTIEN_","_OIIEN,.01)
End DoDot:1
+9 ; OI uses Dosage Form Med Route(s)
IF $$GET1^DIQ(50.7,OIIEN,10,"I")="Y"
Begin DoDot:1
+10 ; No Dosage Form pointer Found
SET DFIEN=$$GET1^DIQ(50.7,OIIEN,.02,"I")
IF 'DFIEN
QUIT
+11 ; No Med Route for Dosage Form Found
SET RTIEN=$ORDER(^PS(50.606,DFIEN,"MR",0))
IF 'RTIEN
QUIT
+12 ; More than one Med Route Found
IF $ORDER(^PS(50.606,DFIEN,"MR",RTIEN))
QUIT
+13 SET DEFROUTE=$$GET1^DIQ(50.6061,RTIEN_","_DFIEN,.01)
End DoDot:1
+14 ;
+15 ; No Route Found above and Orderable Item has a Default Route
+16 IF DEFROUTE=""
IF $$GET1^DIQ(50.7,OIIEN,.06)'=""
QUIT $$GET1^DIQ(50.7,OIIEN,.06)
+17 ; Orderable Item has a Default Route that does not match the one found
+18 IF DEFROUTE'=""
IF $$GET1^DIQ(50.7,OIIEN,.06)'=""
IF DEFROUTE'=$$GET1^DIQ(50.7,OIIEN,.06)
QUIT ""
+19 ;
+20 QUIT DEFROUTE
+21 ;
ERXSIG(ERXIEN) ; Returns the eRx SIG
+1 QUIT $$ERXSIG^PSOERXU8(ERXIEN)
+2 ;
VISTASIG(ERXIEN) ; Returns the VistA SIG, if present
+1 QUIT $$VISTASIG^PSOERXU8(ERXIEN)
+2 ;
RENEWALS(ERXIEN) ; Returns whether Renewals are Prohibited or no
+1 QUIT $$RENEWALS^PSOERXU8(ERXIEN)