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

APSPFUNC.m

Go to the documentation of this file.
  1. APSPFUNC ;IHS/CIA/PLS - MISC FUNCTIONS ;10-May-2016 13:29;DU
  1. ;;7.0;IHS PHARMACY MODIFICATIONS;**1002,1004,1005,1006,1007,1008,1009,1010,1011,1013,1015,1017,1020,1021**;Sep 23, 2004;Build 14
  1. ;
  1. HRC(DFN,D) ;EP; -- IHS health record number
  1. ; Input: IEN to File 200
  1. ; D - 1 for dashes (default = 0)
  1. N HRCN
  1. S HRCN=$P($G(^AUPNPAT(+$G(DFN),41,+$G(DUZ(2)),0)),"^",2)
  1. S:$G(D,0) HRCN=$$HRCD(HRCN)
  1. Q HRCN
  1. ;
  1. HRCD(X) ; Add dashes to given HRN value in X
  1. S X="00000"_X,X=$E(X,$L(X)-5,$L(X))
  1. S X=$E(X,1,2)_"-"_$E(X,3,4)_"-"_$E(X,5,6)
  1. Q X
  1. ;
  1. ; Return most recent vital of specified type
  1. ; Return value is IEN^VALUE^DATE
  1. VITAL(DFN,TYP) ; EP
  1. N IDT,IEN,DAT,VIS,EIE,GOOD,RET
  1. S GOOD=0,RET=""
  1. S:TYP'=+TYP TYP=$O(^AUTTMSR("B",TYP,0))
  1. Q:'TYP ""
  1. S IDT=0
  1. F S IDT=$O(^AUPNVMSR("AA",DFN,TYP,IDT)) Q:IDT=""!(+GOOD) D
  1. .S IEN=$C(1)
  1. .F S IEN=+$O(^AUPNVMSR("AA",DFN,TYP,IDT,IEN),-1) Q:'+IEN!(+GOOD) D
  1. ..S EIE=$$GET1^DIQ(9000010.01,IEN,2,"I")
  1. ..Q:EIE=1
  1. ..S X=$G(^AUPNVMSR(IEN,0)),DAT=+$G(^(12))
  1. ..S:'DAT DAT=+$G(^AUPNVSIT(+$P(X,U,3),0))
  1. ..S GOOD=1,RET=IEN_U_$P(X,U,4)_U_DAT
  1. Q RET
  1. ; Return height in cm
  1. VITCHT(VAL) ; EP
  1. Q $J($G(VAL)*2.54,0,2)
  1. ; Return weight in kg
  1. VITCWT(VAL) ; EP
  1. Q $J($G(VAL)/2.2046226,0,2)
  1. ; Return vital date in format MM/DD/YYYY
  1. VITDT(VAL) ; EP
  1. Q $$FMTE^XLFDT(VAL,"5DZ0")
  1. ; Return vital information in same format at EN6^GMRVUTL
  1. ; Return format: Date^Value in Imperial Unit^Value inMetric Unit
  1. VITALF(DFN,TYP) ; EP
  1. N VAL,RES
  1. S VAL=$$VITAL(DFN,TYP)
  1. S RES=$$VITDT($P(VAL,U,3))_"^^^^^^^"_$P(VAL,U,2)_U_$$VITCWT($P(VAL,U,2))
  1. Q RES
  1. ; Return NDC value
  1. ; Input: RX - Presciption IEN
  1. ; RF - Refill IEN
  1. ; Output: NDC value
  1. NDCVAL(RX,RF) ; EP - Return NDC Value
  1. ; NDC value for prescription is returned if Refill IEN is not supplied
  1. N IENS,FILE,FLD
  1. S RF=$G(RF,0)
  1. Q:'$G(RX) ""
  1. S IENS=$S(RF:RF_","_RX_",",1:RX_",")
  1. S FILE=$S(RF:52.1,1:52)
  1. S FLD=$S(RF:11,1:27)
  1. Q $$GET1^DIQ(FILE,IENS,FLD)
  1. ; Input: RX - Presciption IEN
  1. ; RF = Refill IEN
  1. ; NDC = NDC value to store
  1. SETNDC(RX,RF,NDC) ; EP - Store NDC Value
  1. N FDA,MSG
  1. S RF=$G(RF,0)
  1. S FL=$S(RF:52.1,1:52)
  1. S IENS=$S(RF:RF_","_RX_",",1:RX_",")
  1. S FLD=$S(RF:11,1:27)
  1. S FDA(FL,IENS,FLD)=NDC
  1. D FILE^DIE("EK","FDA","MSG")
  1. Q $S($D(MSG):$G(MSG("DIERR",1))_" Error",1:0)
  1. ;Input: RX - Prescription IEN
  1. ; RF - Refil IEN
  1. ; OVERDUR - NCPDP 5.1 DUR segment pointer
  1. ;Output: Null if value stored; otherwise an error occurred
  1. UPDRX(RX,RF,OVERDUR) ;PEP - Update DUR 5.1 information
  1. N FDA,MSG
  1. Q:'$G(RX)!'$G(OVERDUR) "-1^Required variables not present"
  1. Q:'$D(^PSRX(RX,0)) "-2^Prescription not present"
  1. S RF=$G(RF,0)
  1. I RF Q:'$G(^PSRX(RX,1,RF,0)) "-3^Refill not present"
  1. S FL=$S(RF:52.1,1:52)
  1. S IENS=$S(RF:RF_","_RX_",",1:RX_",")
  1. S FDA(FL,IENS,9999999.13)=OVERDUR
  1. D FILE^DIE("EK","FDA","MSG")
  1. Q $S($D(MSG):$G(MSG("DIERR",1))_" Error",1:0)
  1. ; Call POS Hook
  1. CALLPOS(RIEN,RFIEN,ACT,REASON) ; EP - IHS/CIA/PLS - 03/31/04
  1. N X,ARY
  1. Q:'$G(RIEN)!'$L($G(ACT))
  1. Q:$$GET1^DIQ(52,RIEN,9999999.23,"I") ;IHS/MSC/PLS - 11/02/07- Autofinished Rx
  1. S RFIEN=$G(RFIEN)
  1. S X=$$EN^APSQBRES(RIEN,$G(RFIEN),ACT,$G(REASON))
  1. I $$GET^XPAR("ALL","APSP LOG ABSP MESSAGES") D
  1. .S ARY(1)=$G(RIEN)_U_$G(RFIEN)_U_$G(ACT)_U_$G(X)_U_$G(REASON)
  1. .D LOG^APSPPOSH(.ARY)
  1. Q
  1. ; Display Future Fill Date Warning if needed.
  1. FFDTWARN(FILLDT) ; EP
  1. I $G(FILLDT)>DT D
  1. .W !,"WARNING: The prescription has a Fill Date in the future!",!
  1. Q
  1. ; Fire EHR Patient Context Change
  1. SETPTCX(PSODFN) ;EP
  1. N X
  1. Q:$G(XQY0)="OR BCMA ORDER COM" ; IHS/MSC/PLS - 03/25/2016
  1. S X="CIAVCXPT" X ^%ZOSF("TEST") I $T D SETCTX^CIAVCXPT(+PSODFN) Q
  1. S X="BEHOPTCX" X ^%ZOSF("TEST") I $T D SETCTX^BEHOPTCX(+PSODFN)
  1. Q
  1. ; Fire BOP message to ADS device
  1. BOPSTAT ; EP
  1. N X
  1. S X="BOPCAP" X ^%ZOSF("TEST") I $T D STAT^BOPCAP
  1. Q
  1. ; Return fraction value
  1. FRACVAL(WNUM,FRAC) ; EP
  1. N RES,OUT
  1. S RES=""
  1. Q:'FRAC&(WNUM>10) ""
  1. I FRAC=".5"!(FRAC=".50") S RES="1/2"
  1. E I FRAC=".25" S RES="1/4"
  1. E I FRAC=".33"!(FRAC=".34") S RES="1/3"
  1. E I FRAC=".66"!(FRAC=".67") S RES="2/3"
  1. E I FRAC=".75" S RES="3/4"
  1. I WNUM!RES D
  1. .S OUT=" ("
  1. .I WNUM S OUT=OUT_WNUM
  1. .S OUT=OUT_$S(RES&WNUM:" AND "_RES,RES:RES,1:"")
  1. .S:$L(OUT) OUT=OUT_")"
  1. Q $G(OUT)
  1. ; Return fraction text
  1. FRACTXT(FRAC) ; EP
  1. N RES
  1. S FRAC=$G(FRAC)
  1. I FRAC=".5"!(FRAC=".50") S RES="ONE-HALF"
  1. E I FRAC=".25" S RES="ONE-FOURTH"
  1. E I FRAC=".33"!(FRAC=".34") S RES="ONE-THIRD"
  1. E I FRAC=".66"!(FRAC=".67") S RES="TWO-THIRDS"
  1. E I FRAC=".75" S RES="THREE-FOURTHS"
  1. Q $G(RES)
  1. ; Return POS status
  1. POS(RIEN) ; EP
  1. N ANS,DIR
  1. S ANS=""
  1. I '$$TEST^APSQBRES("ABSPOSRX") D
  1. .N APSQPOS,APSQPOST,APSQIT
  1. .S APSQIT=0
  1. .S ANS="CLAIM WAS NOT RESUBMITTED TO POS"
  1. .S APSQPOS=$$IEN59^ABSPOSRX(RIEN,$G(RFIEN,0)) ; Get IEN in POS File
  1. .I $G(APSQPOS) S APSQPOST=$O(^ABSPTL("B",APSQPOS,"A"),-1) ; Last entry in ^ABSPTBL global
  1. .I $G(APSQPOST) D:+$$GET1^DIQ(9002313.57,+APSQPOST_",",.15) ; >0 indicates entry in Accounts Receivable
  1. ..S DIR("A",1)="There is an entry for this prescription in the Accounts Receivable Package"
  1. ..S DIR("A")="Do you really want to reverse this entry and resend it to the insurer and put another entry in the Accounts Receivable Package"
  1. ..S DIR("B")="YES"
  1. ..S DIR(0)="Y"
  1. ..D ^DIR
  1. ..S:Y=0 APSQIT=1
  1. .I 'APSQIT D
  1. ..S ANS="CLAIM WAS RESUBMITTED TO POS"
  1. ..N APSQPST,RFIEN,ARY,RET
  1. ..S RFIEN=$O(^PSRX(RIEN,1,$C(1)),-1)
  1. ..D CALLPOS^APSPFUNC(RIEN,$S(RFIEN:RFIEN,1:""),"D","Reversal caused by edit.")
  1. ..S ARY("RX REF")=$S(RFIEN:RFIEN,1:0)
  1. ..S ARY("REASON")="E"
  1. ..S ARY("COM")=ANS
  1. ..D UPTLOG^APSPFNC2(.RET,RIEN,0,.ARY)
  1. Q ANS
  1. ;
  1. ; Returns patient corresponding to 12 digit facility/hrn code
  1. HRCNF(HRCN12) ; EP
  1. N DFN,ASUFAC,HRN,Y
  1. S DFN=-1
  1. ;S ASUFAC=+$E(HRCN12,1,6),HRN=+$E(HRCN12,7,12)
  1. S ASUFAC=$E(HRCN12,1,6),HRN=+$E(HRCN12,7,12) ;P1021
  1. Q:'ASUFAC!'HRN DFN
  1. S ASUFAC=$$FIND1^DIC(9999999.06,,,ASUFAC,"C")
  1. Q:'ASUFAC DFN
  1. S Y=0 F S Y=$O(^AUPNPAT("D",HRN,Y)) Q:'Y Q:$D(^(Y,ASUFAC))
  1. S:Y DFN=Y
  1. Q DFN
  1. ; Return list of prescriptions on hold for patient and date range
  1. ; Input: DATA - $NA of array reference
  1. ; DFN - Patient IEN
  1. ; BDT - Beginning date - Issue Date
  1. ; EDT - End date
  1. RXHLDLST(DATA,DFN,BDT,EDT) ;PEP -
  1. K @DATA
  1. Q:'$G(DFN) ; Patient must be defined
  1. S BDT=$G(BDT,0)
  1. S EDT=$G(EDT,DT)+.99
  1. N HRSN,RXISD
  1. S HRSN=0 F S HRSN=$O(^PSRX("AH",HRSN)) Q:'HRSN D
  1. .S RX=0 F S RX=$O(^PSRX("AH",HRSN,RX)) Q:'RX D
  1. ..Q:$$GET1^DIQ(52,RX,2,"I")'=DFN
  1. ..Q:$$GET1^DIQ(52,RX,100,"I")'=3 ; Hold status
  1. ..S RXISD=$$GET1^DIQ(52,RX,1,"I") ; Get Issue Date
  1. ..Q:RXISD<BDT!(RXISD>EDT)
  1. ..S @DATA@(RX)=""
  1. Q
  1. ; Pad string with character to specified length
  1. PAD(S,P,L) ; EP
  1. S $P(P,P,L)=""
  1. Q $E(S_P,1,L)
  1. ;
  1. ; Return formatted phone number
  1. FMTPHN(X) ;EP
  1. N RES
  1. I $E(X,1,10)?10N Q "("_$E(X,1,3)_")"_$E(X,4,6)_"-"_$E(X,7,10)_$S($L($E(X,11,20)):" "_$E(X,11,20),1:"")
  1. I $E(X,1,7)?7N Q $E(X,1,3)_"-"_$E(X,4,7)_" "_$E(8,20)
  1. I X?10N1" ".6UN Q "("_$E(X,1,3)_")"_$E(X,4,6)_"-"_$E(X,7,10)_$S($L($E(X,11,20)):" "_$E(X,11,20),1:"")
  1. I X?3N1"-"3N1"-"4N.1" ".A Q "("_$E(X,1,3)_")"_$E(X,5,12)_" "_$E(X,13,20)
  1. I X?3N1"-"4N Q X
  1. I X?3N1"-"4N.1" ".6UN Q X
  1. Q X
  1. ; Returns value of POE field for given prescription with DEA Class rules applied
  1. ISPOE(RX) ;PEP -
  1. N POE,DRG
  1. S POE=+$P($G(^PSRX(RX,"POE")),U)
  1. Q:'POE 0
  1. S DRG=+$P($G(^PSRX(RX,0)),U,6)
  1. Q:'DRG 0
  1. Q '$$ISSCH^APSPFNC2(DRG,"2345")
  1. ; Removes RXs with future fill date from PPL string
  1. ; Input: PPL - List of comma delimited RXs
  1. ; SFLG - Passing 1 will remove the future RXs from PPL
  1. CHKFDT(PPL,SFLG) ; EP
  1. N LP,RX,PPLARY,FFLG
  1. Q:'$G(PPL)
  1. S SFLG=$G(SFLG,0)
  1. D BPPLARY(PPL)
  1. S RX=0 F S RX=$O(PPLARY(RX)) Q:'RX D
  1. .S PPLARY(RX)=$$FILLDT(RX)>$$DT^XLFDT()
  1. .S:PPLARY(RX) FFLG=1
  1. D:$G(FFLG) FDTWARN(.PPLARY)
  1. D:SFLG BPPLSTR(.PPLARY)
  1. Q
  1. ; Extracts PPL string into an array
  1. BPPLARY(PPL) ;EP
  1. N LP,RX
  1. F LP=1:1 Q:$P(PPL,",",LP)="" D
  1. .S RX=$P(PPL,",",LP)
  1. .S PPLARY(RX)=""
  1. Q
  1. ; Builds PPL string from array excluding flagged items
  1. BPPLSTR(PPLARY) ;EP
  1. N RX
  1. S PPL=""
  1. S RX=0 F S RX=$O(PPLARY(RX)) Q:'RX D
  1. .S:'PPLARY(RX) PPL=PPL_RX_","
  1. Q
  1. ; Returns Fill Date of Prescription
  1. FILLDT(RX) ;EP
  1. N LFN,REF,RF0,FDAT
  1. S LFN=+$O(^PSRX(RX,1,$C(1)),-1)
  1. S FDAT=$S(LFN:+$P($G(^PSRX(RX,1,LFN,0)),U),1:+$P($G(^PSRX(RX,2)),U,2))
  1. Q FDAT
  1. ; Displays warning that labels will not be printed for RXs with future fill dates
  1. FDTWARN(PPLARY) ;EP
  1. N RX
  1. W !,"The following prescription labels will not be generated because"
  1. W !,"of a Future Fill date:"
  1. S RX=0 F S RX=$O(PPLARY(RX)) Q:'RX D
  1. .I PPLARY(RX) D
  1. ..W !,"RX: "_$P($G(^PSRX(RX,0)),U)," Fill Date: "_$$FMTE^XLFDT($$FILLDT(RX),"5Z")
  1. W !,"Please edit the fill date(s) or place the prescription(s) on suspense."
  1. Q
  1. ; Return status of prescription
  1. RXSTAT(RX) ;EP
  1. Q $G(^PSRX(RX,"STA"))
  1. ; Return user's DEA, or Facility DEA-VA-USPHS or null
  1. DEAVAUS(PRV) ;EP -
  1. ; 1. If provider DEA# exists in File 200 use that.
  1. ; 2. If no provider DEA# exists but has VA#
  1. ; then return Facility DEA-VA-USPHS
  1. ; else return null
  1. ; Facility DEA#-VA#-USPHS (ie AU1234567-BB1234-USPHS)
  1. Q:$G(PRV)="" ""
  1. N DEAID,VAID,RET,FACID
  1. S RET=""
  1. S DEAID=$$GET1^DIQ(200,PRV,53.2) ;Provider DEA#
  1. S VAID=$$GET1^DIQ(200,PRV,53.3) ;Provider VA#
  1. S FACID=$$GET1^DIQ(4,DUZ(2),52) ;Facility DEA#
  1. I $L(DEAID) D
  1. .S RET=DEAID
  1. E I $L(VAID) D
  1. .S RET=FACID_"-"_VAID_"-"_"USPHS"
  1. Q RET
  1. ; Returns remaining refill count
  1. ; Input: RX : Prescription IEN - Required
  1. ; FDT: Fill date - optional - If passed will restrict count to
  1. ; refill count to exclude refills past the value in FDT.
  1. RMNRFL(RX,FDT) ;EP-
  1. N RFS,IEN
  1. S RX=$G(RX,0)
  1. Q:'$D(^PSRX(RX,0)) 0
  1. S RFS=$P(^PSRX(RX,0),U,9),IEN=0 F S IEN=$O(^PSRX(RX,1,IEN)) Q:'IEN D
  1. .I $G(FDT) Q:$P(^PSRX(RX,1,IEN,0),U)>FDT
  1. .S RFS=RFS-1
  1. Q RFS
  1. ; Prompt for electronic signature
  1. ESIG() ;EP-
  1. N X,X1
  1. D SIG^XUSESIG
  1. Q X1'=""
  1. ; Return Masked SSN
  1. FMTSSN(SSN) ;EP-
  1. N X
  1. S SSN=$TR(SSN,"-","")
  1. S X=$E(SSN,6,$L(SSN))
  1. Q "XXX-XX-"_$S($L(X):X,1:"XXXX")
  1. ; Prompt user for processing on pending flagged order
  1. PMTFORD(POIEN) ;EP-
  1. N DRG,ORDITM,P0,FLG,ISSDT,PRV,HLP
  1. S P0=$G(^PS(52.41,POIEN,0))
  1. S FLG=$$ISORDFLG(+P0)
  1. Q:'FLG 1
  1. S DRG=$$GET1^DIQ(52.41,POIEN,11)
  1. S ORDITM=$$GET1^DIQ(52.41,POIEN,8)
  1. S ISSDT=$$FMTE^XLFDT($P($P(P0,U,6),"."),"5Z")
  1. S PRV=$$GET1^DIQ(52.41,POIEN,5)
  1. W !!,"Dispense or Orderable Item: "_$S($L(DRG):DRG,1:ORDITM)
  1. W !,"Issue Date: "_ISSDT
  1. W !,"Ordering Provider: "_PRV
  1. W !!,"This order has been flagged!",!
  1. W !,"Date/Time flagged: "_$$FMTE^XLFDT($P(FLG,U,3),"5Z")_" Flagged by: "_$$GET1^DIQ(200,$P(FLG,U,4),.01)
  1. W !,"Reason for flag: "_$P(FLG,U,5)
  1. W !!
  1. Q ''$$DIR^APSPUTIL("Y","Continue Processing",,.HLP)
  1. ; Return flagged status of order
  1. ISORDFLG(ORDID) ;EP-
  1. N RES,LP,ACT0
  1. S RES=0
  1. S LP=0 F S LP=$O(^OR(100,+ORDID,8,LP)) Q:'LP D
  1. .S ACT0=$G(^OR(100,+ORDID,8,LP,3))
  1. .I ACT0 D
  1. ..S RES=ACT0
  1. Q RES
  1. ; Return order check of type ALLERGY-DRUG INTERACTION
  1. ISADCHK(ORDID,CHKIEN) ;EP-
  1. Q:'$G(CHKIEN) 0
  1. Q $$GET1^DIQ(100.8,$P($G(^OR(100,+ORDID,9,CHKIEN,0)),U),.01)="ALLERGY-DRUG INTERACTION"
  1. ; Check array for existing string
  1. SRCHARY(ARY,STR) ;EP-
  1. N LINE,FLAG,STRX S LINE=0,FLAG=0,OUT=0
  1. S STRX=""
  1. Q:'$L($G(STR)) OUT
  1. I $D(STR)>1 D
  1. .F S LINE=$O(STR(LINE)) Q:'LINE D
  1. ..S STRX=STRX_STR(LINE)
  1. E S STRX=STR
  1. S LINE=0
  1. S STRX=$$UP^XLFSTR(STRX)
  1. S STRX=$TR(STRX," ","")
  1. Q:'$L(STRX) 0
  1. F S LINE=+$O(ARY(LINE)) Q:'LINE D Q:'FLAG Q:OUT
  1. . N X1
  1. . S X1=$$UP^XLFSTR(ARY(LINE)),X1=$TR(X1," ","")
  1. . S FLAG=+$O(ARY(LINE))
  1. . I 'FLAG S:X1[STRX OUT=1 Q
  1. . S X1=X1_$$UP^XLFSTR(ARY(FLAG)),X1=$TR(X1," ","")
  1. . I X1[STRX S OUT=1 Q
  1. Q OUT
  1. ; Display REM message to user
  1. REMMSG(DRG) ;EP-
  1. N VAIEN,DNAME
  1. S DNAME=$$GET1^DIQ(50,DRG,.01)
  1. S VAIEN=$$GET1^DIQ(50,DRG,22,"I")
  1. I $L($$GET1^DIQ(50.68,VAIEN,100)) D
  1. .W !,DNAME_" requires an FDA medication guide."
  1. .W !,"Please take appropriate action and print a patient medication guide if necessary."
  1. .;Q:''$$DIR^APSPUTIL("Y","Continue Processing",,.HLP)
  1. .D DIRZ^APSPUTIL()
  1. Q
  1. ; Prompt for comment on Inpatient orders.
  1. INPTCOM(COM) ;EP-
  1. W !
  1. N DIR,DTOUT,DUOUT,DIRUT,COM,Y
  1. S RES=""
  1. S DIR("A")="Comments"_$S($D(PKIR):"/Reason for DCing",1:""),DIR(0)="F^5:75"
  1. S DIR("?")="Comments must be entered. Comments must be 5 to 75 characters and must not contain embedded uparrow"
  1. S:$D(COM) DIR("B")=$G(COM)
  1. D ^DIR
  1. S COM=$S('$D(DIRUT):Y,1:"")
  1. Q COM
  1. ; Ask for Fill Priority
  1. APRTY ;EP-
  1. N DA,DIR
  1. S DIR("A")="Fill Priority"
  1. S DIR("B")=$$GET1^DIQ(9009033,PSOSITE,406)
  1. S DIR(0)="52,9999999.38" D ^DIR
  1. S APSPPRIO=$S($L($G(Y(0))):Y,1:"")
  1. Q
  1. ; Return status of Beyond Use field in 59.5
  1. BYU(SITE) ;EP-
  1. Q +$S('$G(SITE):0,1:$G(^PS(59.5,SITE,9999999)))