ORAM ;POR/RSF - ANTICOAGULATION MANAGEMENT RPCS (1 of 4) ;11/26/14  12:08
 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**307,330,391**;Dec 17, 1997;Build 11
 ;;Per VHA Directive 2004-038, this routine should not be modified
 Q
 ;
PATIENT(RESULT,ORAMDFN) ;Returns current Patient info as:
 ;DFN^NAME^GENDER^ADMISSION^CURRENT DT/TIME (internal)^SSN^CURRENT DT/TIME (external)^CLINIC LOCATION^DTIME
 ;RPC=ORAM PATIENT
 N CURADM,PTNAME,GENDER,ORAMNOW,ORAMRD,ORAMSSN,ORAMPLOC,ORAMVDT,ORAMLOCS
 I '$G(ORAMDFN) D
 . N DIC,X,Y
 . S DIC="^DPT(",DIC(0)="Z",X=" "
 . D ^DIC
 . S ORAMDFN=+$G(Y)
 I ORAMDFN<1 S ORAMDFN=0 G PATIENTQ
 S CURADM=$G(^DPT(ORAMDFN,.105))   ;CHECKS IF PATIENT IS ADMITTED
 S PTNAME=$P(^DPT(ORAMDFN,0),U)
 I $L(PTNAME)>19 D
 . N ORFMT
 . F ORFMT="LAST,FIRST MI","LAST,FI MI" S PTNAME=$$NAME^ORAMX(PTNAME,ORFMT) Q:$L(PTNAME)'>19
 S GENDER=$P(^DPT(ORAMDFN,0),U,2)
 S ORAMSSN=$P(^DPT(ORAMDFN,0),U,9)
 S ORAMNOW=$$NOW^XLFDT S ORAMRD=$$FMTE^XLFDT($E(ORAMNOW,1,12),2)
 S ORAMPLOC=$P($G(^ORAM(103,ORAMDFN,6)),U,2)
 ; if pt enrolled in a clinic, use that location and look for an appt in look-up range
 I +ORAMPLOC>0 D  I 1
 . S ORAMPLOC=ORAMPLOC_";SC("
 . S ORAMVDT=$$GETAPPT(ORAMDFN,+ORAMPLOC)
 E  D  ; otherwise check whether pt has appt at any anticoag clinic in look-up range
 . N ORAMLOCS,ORI S ORI=0
 . D GETCLINS^ORAMSET(.ORAMLOCS) Q:+$G(ORAMLOCS(0))'>0
 . F  S ORI=$O(ORAMLOCS(ORI)) D  Q:+ORI'>0!+ORAMVDT
 . . S ORAMPLOC=$P($G(ORAMLOCS(ORI)),U,2)
 . . S ORAMVDT=$$GETAPPT(ORAMDFN,+ORAMPLOC)
 S:+$G(ORAMVDT)'>0 ORAMVDT=ORAMNOW
 S:$L($P(ORAMRD,"/",1))=1 $P(ORAMRD,"/",1)="0"_$P(ORAMRD,"/",1)
 S:$L($P(ORAMRD,"/",2))=1 $P(ORAMRD,"/",2)="0"_$P(ORAMRD,"/",2)
 S RESULT=$G(ORAMDFN)_U_$G(PTNAME)_U_$G(GENDER)_U_$G(CURADM)_U_ORAMNOW_U_$G(ORAMSSN)_U_$G(ORAMRD)_U_ORAMPLOC_U_$G(DTIME)_U_ORAMVDT
PATIENTQ Q
 ;
APPTMTCH(RESULT,ORAMDFN,ORAMCL) ; Find appt match on clinic change
 S RESULT=$$GETAPPT(ORAMDFN,+ORAMCL)
 Q
 ;
GETAPPT(ORAMDFN,ORAMCL) ; Find most recent appointment to Clinic from t-1 to t+1 days
 N ORAMC,ORAMEDT,ORAMLDT,ORAMOK,ORAMY,ORAMDIFF,ORAMTCL,ORAMVCL,ORAMLAD,ORAMLBD,ORAMFLTR,ORAMAPPT
 S ORAMOK=0
 S ORAMY=$$NOW^XLFDT
 I +ORAMCL'>0 G GETAPPX
 S ORAMLBD=$$GET^XPAR(ORAMCL_";SC(^ALL","ORAM APPT MATCH LOOK-BACK",1,"I")
 S ORAMDIFF=$S(ORAMLBD]"":-ORAMLBD,1:-1)
 S ORAMEDT=$$FMADD^XLFDT(DT,ORAMDIFF)
 S ORAMLAD=$$GET^XPAR(ORAMCL_";SC(^ALL","ORAM APPT MATCH LOOK-AHEAD",1,"I")
 S ORAMDIFF=$S(ORAMLAD]"":ORAMLAD,1:1)
 S ORAMLDT=$$FMADD^XLFDT(DT,ORAMDIFF)_".2359"
 S ORAMVCL=$$GET^XPAR(ORAMCL_";SC(","ORAM VISIT LOCATION",1,"I")
 S ORAMTCL=$$GET^XPAR(ORAMCL_";SC(","ORAM PHONE CLINIC",1,"I")
 F ORAMC=ORAMVCL,ORAMTCL D
 . N ORAMOK
 . S ORAMFLTR(1)=ORAMEDT_";"_ORAMLDT
 . S ORAMFLTR(2)=ORAMC
 . S ORAMFLTR(3)="R;I;NT"
 . S ORAMFLTR(4)=ORAMDFN
 . S ORAMFLTR("MAX")=-3
 . S ORAMFLTR("FLDS")="1;2;4"
 . S ORAMOK=$$SDAPI^SDAMA301(.ORAMFLTR)
 . I +ORAMOK>0 M ORAMAPPT=^TMP($J,"SDAMA301")
 I +$D(ORAMAPPT)>9 S ORAMY=$$NEAREST($NA(ORAMAPPT(ORAMDFN)))
 K ^TMP($J,"SDAMA301")
GETAPPX Q ORAMY
 ;
NEAREST(APPTS) ; Find the nearest appointment to NOW
 N ORC,ORI,ORY,ORNOW,ORDIFFS S (ORC,ORY)=0,ORNOW=$$NOW^XLFDT
 F  S ORC=$O(@APPTS@(ORC)) Q:+ORC'>0  D
 . N ORDT S ORDT=0
 . F  S ORDT=$O(@APPTS@(ORC,ORDT)) Q:+ORDT'>0  S ORDIFFS($$ABS^XLFMTH($$FMDIFF^XLFDT(ORNOW,ORDT,2)))=ORDT
 S ORI=$O(ORDIFFS(0))
 S:+ORI>0 ORY=ORDIFFS(ORI)
 Q ORY
 ;
PROVIDER(RESULT) ;GETS DUZ/NAME OF PROVIDER WHO IS SIGNED IN
 ;;RPC=ORAM PROVIDER
 N PN,INIT
 S DUZ=$G(DUZ)
 S PN=$P(^VA(200,DUZ,0),U)
 S INIT=$P(^VA(200,DUZ,0),U,2)
 S RESULT=$G(DUZ)_U_PN_U_$G(INIT)
 Q
 ;
INRCHK(ORAMQO) ; Resolve Lab Test id from Quick Order
 N TST,N,ORAM60,ORAMT2,ORAMTT,ORAMPP,ORAMTST,ORAMTSTN,ORAMNEW,ORAML,ORAMT60,ORAMORD,ORY
 S ORAMORD=$$QOORD(ORAMQO),ORY=""
 I +$G(ORAMQO) D
 . N ORAMC
 . S ORAM60=+$P(^ORD(101.43,ORAMORD,0),U,2) Q:'+$G(ORAM60)
 . S ORAMT60=$P($P($G(^LAB(60,ORAM60,0)),U,5),";",2) I +$G(ORAMT60) S ORY=ORAMT60 Q
 . I '$G(ORAMT60),$D(^LAB(60,ORAM60,2,0)) S ORAMC=0 F  S ORAMC=$O(^LAB(60,ORAM60,2,ORAMC)) Q:'+$G(ORAMC)!(+$G(ORY))  D
 .. S ORAMNEW=^LAB(60,ORAM60,2,ORAMC,0) I +ORAMNEW>0,$$ISINR(ORAMNEW) S ORY=$P($P($G(^LAB(60,ORAMNEW,0)),U,5),";",2) Q
 Q ORY
 ;
ISINR(ORTEST) ; Is the lab test an INR?
 N ORY,ORNM S ORY=0
 S ORNM=$P($G(^LAB(60,ORTEST,0)),U)
 S ORY=$S(ORNM["INR":1,(ORNM["INT")&(ORNM["NORM")&(ORNM["RAT"):1,1:0)
 Q ORY
 ;
LABCHK(RESULT) ;
 ;;RPC=ORAM ORDERABLES
 N ORAMINR,ORAMCBC,C,Y S (C,Y)=0,RESULT="0|0"
 S ORAMINR=0 F  S ORAMINR=$O(^ORD(101.43,"B","INR",ORAMINR)) Q:'+$G(ORAMINR)!(+$G(C))  I +$G(ORAMINR) S $P(RESULT,"|")=ORAMINR,C=1
 I $G(ORAMINR)="" S ORAMINR=0 F  S ORAMINR=$O(^ORD(101.43,"B","INR ",ORAMINR)) Q:'+$G(ORAMINR)!(+$G(C))  I +$G(ORAMINR) S $P(RESULT,"|")=ORAMINR,C=1
 I $G(ORAMINR)="" S ORAMINR=0 F  S ORAMINR=$O(^ORD(101.43,"B","INR/PT",ORAMINR)) Q:'+$G(ORAMINR)!(+$G(C))  I +$G(ORAMINR) S $P(RESULT,"|")=ORAMINR,C=1
 I $G(ORAMINR)="" S ORAMINR=0 F  S ORAMINR=$O(^ORD(101.43,"B","PT",ORAMINR)) Q:'+$G(ORAMINR)!(+$G(C))  I +$G(ORAMINR) S $P(RESULT,"|")=ORAMINR,C=1
 S ORAMCBC=0 F  S ORAMCBC=$O(^ORD(101.43,"B","CBC",ORAMCBC)) Q:'+$G(ORAMCBC)!(+$G(Y))  I +$G(ORAMCBC) S $P(RESULT,"|",2)=ORAMCBC,Y=1
 I $G(ORAMCBC)="" S ORAMCBC=$O(^ORD(101.43,"B","CBC ",ORAMCBC)) Q:'+$G(ORAMCBC)!(+$G(Y))  I +$G(ORAMCBC) S $P(RESULT,"|",2)=ORAMCBC,Y=1
 Q
 ;
SIGCHECK(RESULT,ESCODE) ;
 ;;CHECKS SIG CODE
 ;;RPC=ORAM SIGCHECK
 N SUCCESS,X
 S SUCCESS=0
 Q:ESCODE=""
 S X=ESCODE D HASH^XUSHSHP
 I $P($G(^VA(200,DUZ,20)),U,4)=X S SUCCESS=1 ;SIG CODE CORRECT
 S RESULT=$G(SUCCESS)
SIGQ Q
 ;
HCT(RESULT,ORAMDFN) ;GET HCT
 ;;GETS MOST RECENT HCT
 ;;RPC=ORAM HCT
 N HCT,LDATE,HCTDATE,LOOPCNT,HCTDIFF,LRDFN,ORAMS,ORAMHCT,ORAMDNM,OHCT,OHCTD,ORAMFM,ORAMHCTN
 I '$G(ORAMDFN) S RESULT="" Q  ;IF DFN IS NOT PASSED, EXIT
 S LRDFN=$$LAB($G(ORAMDFN)) I +LRDFN'>0 S RESULT="Patient has no VistA Lab Data." Q
 S ORAMHCT=$$GET^XPAR("ALL","ORAM HCT/HGB REFERENCE",1,"B")
 I +$G(ORAMHCT)'>0 S RESULT="HCT Param not set." Q
 S ORAMHCTN=$P(ORAMHCT,U,2),ORAMHCT=$P(ORAMHCT,U)
 ; Get Lab Data Name based on IEN in ^LAB(60,
 S ORAMDNM=$P($P(^LAB(60,+ORAMHCT,0),U,5),";",2) I ORAMDNM']"" S RESULT="Data Name not defined for "_ORAMHCTN_" in Lab Test File." Q
 S LDATE=0 F  SET LDATE=$O(^LR(LRDFN,"CH",LDATE)) S LOOPCNT=0 Q:LDATE=""!(+$G(HCT))  D  Q:LOOPCNT
 . S RESULT=$G(^LR(LRDFN,"CH",LDATE,ORAMDNM))
 . Q:RESULT=""
 . Q:$P(RESULT,U,1)=""  ;QUIT IF NO HCT DATA
 . S HCT=$P(RESULT,U,1)  ;HCT
 . S HCTDATE=9999999-LDATE
 . S LOOPCNT=1
 . Q:+HCT
 I LDATE="" S RESULT="NONE"
 I $D(^ORAM(103,ORAMDFN,6)),($L($P(^ORAM(103,ORAMDFN,6),U,4),"|")=3) D
 . S OHCT=$P($P(^ORAM(103,ORAMDFN,6),U,4),"|"),OHCTD=$P($P(^ORAM(103,ORAMDFN,6),U,4),"|",2)
 . I +$G(OHCT) D DT^DILF(,OHCTD,.ORAMFM)
 I +$G(HCTDATE),$G(ORAMFM)>HCTDATE S HCT=OHCT_" (Outside Lab)",HCTDATE=ORAMFM,ORAMHCTN="HCT"
 I '+$G(HCTDATE) S:+$G(OHCT) HCT=OHCT_" (Outside Lab)",ORAMHCTN="HCT" S:$G(ORAMFM)'="" HCTDATE=ORAMFM
 I +$G(HCTDATE) S HCTDATE=$$FMTE^XLFDT($E(HCTDATE,1,7),2)
 S RESULT=$G(HCT)_U_$G(HCTDATE)_U_ORAMHCTN
 Q
 ;
INR(RESULT,ORAMDFN) ; Gets most recent INR
 ;;RPC=ORAM INR
 N LDATE,INR,INRFD,LRDFN,HDATE,TDIFF,SIXMON,COUNT,SCORE,ORAMITST,INRHD,INRRD
 N ORAMQO
 S RESULT=""
 I '$G(ORAMDFN) Q  ;IF DFN IS NOT PASSED, EXIT
 S LRDFN=$$LAB($G(ORAMDFN))  I +LRDFN'>0 S RESULT="Patient has no Lab Data." Q
 S ORAMQO=$$GET^XPAR("ALL","ORAM INR QUICK ORDER",1,"I") S ORAMITST=$$INRCHK(ORAMQO)
 I +ORAMITST'>0 Q
 S (LDATE,COUNT)=0,SIXMON=$$FMADD^XLFDT(DT,-180)
 F  S LDATE=$O(^LR(LRDFN,"CH",LDATE)) Q:+LDATE'>0!(LDATE>(9999999-SIXMON))  D
 . N SCORE,INR,INRFD,INRHD,INRRD,XDT
 . S SCORE=$G(^LR(LRDFN,"CH",LDATE,ORAMITST))
 . Q:SCORE=""  ;QUIT IF NO INR TEST
 . S INR=$P(SCORE,U)  ;INR
 . Q:INR=""  ;QUIT IF NO INR DATA
 . S INRFD=9999999-LDATE
 . S XDT=$P(INRFD,".") S INRHD=$$FMTH^XLFDT(XDT,1),INRRD=$$FMTE^XLFDT(XDT,"2P")
 . S RESULT(COUNT)=$G(INR)_"^^"_$G(INRRD)_U_$G(INRHD)
 . Q:INRFD<SIXMON  ;Q WHEN SEARCHED LAST 6 MONTHS
 . S COUNT=COUNT+1
 Q
 ;
CONCOMP(RESULT,ORAMCNUM,ORAMNNUM,ORAMDUZ) ;
 ;;BRINGS IN CONSULT NUMBER(ORAMCNUM)
 ;;BRINGS IN NOTE NUMBER(ORAMNNUM), COMPLETES CONSULT
 ;;RPC=ORAM CONCOMP
 N ORAMCST
 S RESULT=0
 S ORAMCST=$S($$STATUS^TIULC(ORAMNNUM)="completed":"COMPLETE",1:"INCOMPLETE")
 D GET^GMRCTIU(ORAMCNUM,ORAMNNUM,ORAMCST,ORAMDUZ)
 S RESULT=1
 Q
 ;
LAB(DFN) ;GET LAB NUMBER
 N LRDFN
 IF 'DFN S LRDFN="" G LABQ ;IF DFN IS NOT PASSED, EXIT
 S LRDFN=$G(^DPT(DFN,"LR"))
LABQ Q LRDFN
 ;
ORDER(ORESULT,DFN,ORNP,ORLOC,ORQO,ORCDT) ; Place Quick Order for INR or CBC
 ; RPC ORAM ORDER
 ;  in: DFN   - pt id file 2
 ;      ORNP  - ordering provider id file 200
 ;      ORLOC - location id file 42
 ;      ORQO  - quick order id file 101.41
 ;      ORCDT - collection date/time
 N ORANS,ORDIALOG,ORDG,ORDLG
 I +$G(DFN)'>0 S ORESULT="0^invalid Patient id" Q
 I +$G(ORNP)'>0 S ORESULT="0^invalid Provider id" Q
 I +$G(ORLOC)'>0 S ORESULT="0^invalid Location id" Q
 I +$G(ORQO)'>0 S ORESULT="0^invalid Quick Order id" Q
 I $G(ORCDT)']"" S ORESULT="0^invalid Collection Date/Time" Q
 D GETQDLG^ORCD(ORQO)
 I '$D(ORDIALOG) S ORESULT="0^invalid Quick Order id" Q
 S ORDLG=$$GET1^DIQ(101.41,+ORDIALOG_",",.01)
 I ORDLG']"" S ORESULT="0^invalid Quick Order id" Q
 S ORDG=$$GET1^DIQ(101.41,ORQO_",",5,"I")
 I +ORDG'>0 S ORESULT="0^invalid Quick Order id - no Display Group" Q
 S ORDIALOG(6,1)=$$IDATE(ORCDT)
 D SAVE^ORWDX(.ORESULT,DFN,ORNP,ORLOC,ORDLG,ORDG,ORQO,"",.ORDIALOG) ; Place the order
 ; if the order is placed, call UNOTIF^ORCSIGN to avoid duplicate alerts,
 ; then call NOTIF^ORCSIGN to generate an unsigned order notification
 I +ORESULT D
 . N ORVP,ORIFN,Y
 . S ORVP=DFN_";DPT(",ORIFN=$P($P($G(ORESULT(1)),"~",2),";")
 . D UNOTIF^ORCSIGN
 . D NOTIF^ORCSIGN
 Q
IDATE(ORX) ; Convert External Date/time to FM Internal format
 N ORY S ORY=""
 D DT^DILF("T",ORX,.ORY) S:+ORY'>0 ORY=""
 Q ORY
QOORD(ORQO) ; Given Quick Order, find the IEN of the Orderable Item
 N ORI,ORDIALOG,ORY S ORY=0
 D GETQDLG^ORCD(+$G(ORQO))
 I '$D(ORDIALOG) G QOORDX
 S ORI=0
 F  S ORI=$O(ORDIALOG(ORI)) Q:ORI'>0!+ORY>0  D
 . I $G(ORDIALOG(ORI))["ORDERABLE" S ORY=$G(ORDIALOG(ORI,1))
QOORDX Q ORY
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HORAM   10237     printed  Sep 23, 2025@20:03:15                                                                                                                                                                                                       Page 2
ORAM      ;POR/RSF - ANTICOAGULATION MANAGEMENT RPCS (1 of 4) ;11/26/14  12:08
 +1       ;;3.0;ORDER ENTRY/RESULTS REPORTING;**307,330,391**;Dec 17, 1997;Build 11
 +2       ;;Per VHA Directive 2004-038, this routine should not be modified
 +3        QUIT 
 +4       ;
PATIENT(RESULT,ORAMDFN) ;Returns current Patient info as:
 +1       ;DFN^NAME^GENDER^ADMISSION^CURRENT DT/TIME (internal)^SSN^CURRENT DT/TIME (external)^CLINIC LOCATION^DTIME
 +2       ;RPC=ORAM PATIENT
 +3        NEW CURADM,PTNAME,GENDER,ORAMNOW,ORAMRD,ORAMSSN,ORAMPLOC,ORAMVDT,ORAMLOCS
 +4        IF '$GET(ORAMDFN)
               Begin DoDot:1
 +5                NEW DIC,X,Y
 +6                SET DIC="^DPT("
                   SET DIC(0)="Z"
                   SET X=" "
 +7                DO ^DIC
 +8                SET ORAMDFN=+$GET(Y)
               End DoDot:1
 +9        IF ORAMDFN<1
               SET ORAMDFN=0
               GOTO PATIENTQ
 +10      ;CHECKS IF PATIENT IS ADMITTED
           SET CURADM=$GET(^DPT(ORAMDFN,.105))
 +11       SET PTNAME=$PIECE(^DPT(ORAMDFN,0),U)
 +12       IF $LENGTH(PTNAME)>19
               Begin DoDot:1
 +13               NEW ORFMT
 +14               FOR ORFMT="LAST,FIRST MI","LAST,FI MI"
                       SET PTNAME=$$NAME^ORAMX(PTNAME,ORFMT)
                       if $LENGTH(PTNAME)'>19
                           QUIT 
               End DoDot:1
 +15       SET GENDER=$PIECE(^DPT(ORAMDFN,0),U,2)
 +16       SET ORAMSSN=$PIECE(^DPT(ORAMDFN,0),U,9)
 +17       SET ORAMNOW=$$NOW^XLFDT
           SET ORAMRD=$$FMTE^XLFDT($EXTRACT(ORAMNOW,1,12),2)
 +18       SET ORAMPLOC=$PIECE($GET(^ORAM(103,ORAMDFN,6)),U,2)
 +19      ; if pt enrolled in a clinic, use that location and look for an appt in look-up range
 +20       IF +ORAMPLOC>0
               Begin DoDot:1
 +21               SET ORAMPLOC=ORAMPLOC_";SC("
 +22               SET ORAMVDT=$$GETAPPT(ORAMDFN,+ORAMPLOC)
               End DoDot:1
               IF 1
 +23      ; otherwise check whether pt has appt at any anticoag clinic in look-up range
          IF '$TEST
               Begin DoDot:1
 +24               NEW ORAMLOCS,ORI
                   SET ORI=0
 +25               DO GETCLINS^ORAMSET(.ORAMLOCS)
                   if +$GET(ORAMLOCS(0))'>0
                       QUIT 
 +26               FOR 
                       SET ORI=$ORDER(ORAMLOCS(ORI))
                       Begin DoDot:2
 +27                       SET ORAMPLOC=$PIECE($GET(ORAMLOCS(ORI)),U,2)
 +28                       SET ORAMVDT=$$GETAPPT(ORAMDFN,+ORAMPLOC)
                       End DoDot:2
                       if +ORI'>0!+ORAMVDT
                           QUIT 
               End DoDot:1
 +29       if +$GET(ORAMVDT)'>0
               SET ORAMVDT=ORAMNOW
 +30       if $LENGTH($PIECE(ORAMRD,"/",1))=1
               SET $PIECE(ORAMRD,"/",1)="0"_$PIECE(ORAMRD,"/",1)
 +31       if $LENGTH($PIECE(ORAMRD,"/",2))=1
               SET $PIECE(ORAMRD,"/",2)="0"_$PIECE(ORAMRD,"/",2)
 +32       SET RESULT=$GET(ORAMDFN)_U_$GET(PTNAME)_U_$GET(GENDER)_U_$GET(CURADM)_U_ORAMNOW_U_$GET(ORAMSSN)_U_$GET(ORAMRD)_U_ORAMPLOC_U_$GET(DTIME)_U_ORAMVDT
PATIENTQ   QUIT 
 +1       ;
APPTMTCH(RESULT,ORAMDFN,ORAMCL) ; Find appt match on clinic change
 +1        SET RESULT=$$GETAPPT(ORAMDFN,+ORAMCL)
 +2        QUIT 
 +3       ;
GETAPPT(ORAMDFN,ORAMCL) ; Find most recent appointment to Clinic from t-1 to t+1 days
 +1        NEW ORAMC,ORAMEDT,ORAMLDT,ORAMOK,ORAMY,ORAMDIFF,ORAMTCL,ORAMVCL,ORAMLAD,ORAMLBD,ORAMFLTR,ORAMAPPT
 +2        SET ORAMOK=0
 +3        SET ORAMY=$$NOW^XLFDT
 +4        IF +ORAMCL'>0
               GOTO GETAPPX
 +5        SET ORAMLBD=$$GET^XPAR(ORAMCL_";SC(^ALL","ORAM APPT MATCH LOOK-BACK",1,"I")
 +6        SET ORAMDIFF=$SELECT(ORAMLBD]"":-ORAMLBD,1:-1)
 +7        SET ORAMEDT=$$FMADD^XLFDT(DT,ORAMDIFF)
 +8        SET ORAMLAD=$$GET^XPAR(ORAMCL_";SC(^ALL","ORAM APPT MATCH LOOK-AHEAD",1,"I")
 +9        SET ORAMDIFF=$SELECT(ORAMLAD]"":ORAMLAD,1:1)
 +10       SET ORAMLDT=$$FMADD^XLFDT(DT,ORAMDIFF)_".2359"
 +11       SET ORAMVCL=$$GET^XPAR(ORAMCL_";SC(","ORAM VISIT LOCATION",1,"I")
 +12       SET ORAMTCL=$$GET^XPAR(ORAMCL_";SC(","ORAM PHONE CLINIC",1,"I")
 +13       FOR ORAMC=ORAMVCL,ORAMTCL
               Begin DoDot:1
 +14               NEW ORAMOK
 +15               SET ORAMFLTR(1)=ORAMEDT_";"_ORAMLDT
 +16               SET ORAMFLTR(2)=ORAMC
 +17               SET ORAMFLTR(3)="R;I;NT"
 +18               SET ORAMFLTR(4)=ORAMDFN
 +19               SET ORAMFLTR("MAX")=-3
 +20               SET ORAMFLTR("FLDS")="1;2;4"
 +21               SET ORAMOK=$$SDAPI^SDAMA301(.ORAMFLTR)
 +22               IF +ORAMOK>0
                       MERGE ORAMAPPT=^TMP($JOB,"SDAMA301")
               End DoDot:1
 +23       IF +$DATA(ORAMAPPT)>9
               SET ORAMY=$$NEAREST($NAME(ORAMAPPT(ORAMDFN)))
 +24       KILL ^TMP($JOB,"SDAMA301")
GETAPPX    QUIT ORAMY
 +1       ;
NEAREST(APPTS) ; Find the nearest appointment to NOW
 +1        NEW ORC,ORI,ORY,ORNOW,ORDIFFS
           SET (ORC,ORY)=0
           SET ORNOW=$$NOW^XLFDT
 +2        FOR 
               SET ORC=$ORDER(@APPTS@(ORC))
               if +ORC'>0
                   QUIT 
               Begin DoDot:1
 +3                NEW ORDT
                   SET ORDT=0
 +4                FOR 
                       SET ORDT=$ORDER(@APPTS@(ORC,ORDT))
                       if +ORDT'>0
                           QUIT 
                       SET ORDIFFS($$ABS^XLFMTH($$FMDIFF^XLFDT(ORNOW,ORDT,2)))=ORDT
               End DoDot:1
 +5        SET ORI=$ORDER(ORDIFFS(0))
 +6        if +ORI>0
               SET ORY=ORDIFFS(ORI)
 +7        QUIT ORY
 +8       ;
PROVIDER(RESULT) ;GETS DUZ/NAME OF PROVIDER WHO IS SIGNED IN
 +1       ;;RPC=ORAM PROVIDER
 +2        NEW PN,INIT
 +3        SET DUZ=$GET(DUZ)
 +4        SET PN=$PIECE(^VA(200,DUZ,0),U)
 +5        SET INIT=$PIECE(^VA(200,DUZ,0),U,2)
 +6        SET RESULT=$GET(DUZ)_U_PN_U_$GET(INIT)
 +7        QUIT 
 +8       ;
INRCHK(ORAMQO) ; Resolve Lab Test id from Quick Order
 +1        NEW TST,N,ORAM60,ORAMT2,ORAMTT,ORAMPP,ORAMTST,ORAMTSTN,ORAMNEW,ORAML,ORAMT60,ORAMORD,ORY
 +2        SET ORAMORD=$$QOORD(ORAMQO)
           SET ORY=""
 +3        IF +$GET(ORAMQO)
               Begin DoDot:1
 +4                NEW ORAMC
 +5                SET ORAM60=+$PIECE(^ORD(101.43,ORAMORD,0),U,2)
                   if '+$GET(ORAM60)
                       QUIT 
 +6                SET ORAMT60=$PIECE($PIECE($GET(^LAB(60,ORAM60,0)),U,5),";",2)
                   IF +$GET(ORAMT60)
                       SET ORY=ORAMT60
                       QUIT 
 +7                IF '$GET(ORAMT60)
                       IF $DATA(^LAB(60,ORAM60,2,0))
                           SET ORAMC=0
                           FOR 
                               SET ORAMC=$ORDER(^LAB(60,ORAM60,2,ORAMC))
                               if '+$GET(ORAMC)!(+$GET(ORY))
                                   QUIT 
                               Begin DoDot:2
 +8                                SET ORAMNEW=^LAB(60,ORAM60,2,ORAMC,0)
                                   IF +ORAMNEW>0
                                       IF $$ISINR(ORAMNEW)
                                           SET ORY=$PIECE($PIECE($GET(^LAB(60,ORAMNEW,0)),U,5),";",2)
                                           QUIT 
                               End DoDot:2
               End DoDot:1
 +9        QUIT ORY
 +10      ;
ISINR(ORTEST) ; Is the lab test an INR?
 +1        NEW ORY,ORNM
           SET ORY=0
 +2        SET ORNM=$PIECE($GET(^LAB(60,ORTEST,0)),U)
 +3        SET ORY=$SELECT(ORNM["INR":1,(ORNM["INT")&(ORNM["NORM")&(ORNM["RAT"):1,1:0)
 +4        QUIT ORY
 +5       ;
LABCHK(RESULT) ;
 +1       ;;RPC=ORAM ORDERABLES
 +2        NEW ORAMINR,ORAMCBC,C,Y
           SET (C,Y)=0
           SET RESULT="0|0"
 +3        SET ORAMINR=0
           FOR 
               SET ORAMINR=$ORDER(^ORD(101.43,"B","INR",ORAMINR))
               if '+$GET(ORAMINR)!(+$GET(C))
                   QUIT 
               IF +$GET(ORAMINR)
                   SET $PIECE(RESULT,"|")=ORAMINR
                   SET C=1
 +4        IF $GET(ORAMINR)=""
               SET ORAMINR=0
               FOR 
                   SET ORAMINR=$ORDER(^ORD(101.43,"B","INR ",ORAMINR))
                   if '+$GET(ORAMINR)!(+$GET(C))
                       QUIT 
                   IF +$GET(ORAMINR)
                       SET $PIECE(RESULT,"|")=ORAMINR
                       SET C=1
 +5        IF $GET(ORAMINR)=""
               SET ORAMINR=0
               FOR 
                   SET ORAMINR=$ORDER(^ORD(101.43,"B","INR/PT",ORAMINR))
                   if '+$GET(ORAMINR)!(+$GET(C))
                       QUIT 
                   IF +$GET(ORAMINR)
                       SET $PIECE(RESULT,"|")=ORAMINR
                       SET C=1
 +6        IF $GET(ORAMINR)=""
               SET ORAMINR=0
               FOR 
                   SET ORAMINR=$ORDER(^ORD(101.43,"B","PT",ORAMINR))
                   if '+$GET(ORAMINR)!(+$GET(C))
                       QUIT 
                   IF +$GET(ORAMINR)
                       SET $PIECE(RESULT,"|")=ORAMINR
                       SET C=1
 +7        SET ORAMCBC=0
           FOR 
               SET ORAMCBC=$ORDER(^ORD(101.43,"B","CBC",ORAMCBC))
               if '+$GET(ORAMCBC)!(+$GET(Y))
                   QUIT 
               IF +$GET(ORAMCBC)
                   SET $PIECE(RESULT,"|",2)=ORAMCBC
                   SET Y=1
 +8        IF $GET(ORAMCBC)=""
               SET ORAMCBC=$ORDER(^ORD(101.43,"B","CBC ",ORAMCBC))
               if '+$GET(ORAMCBC)!(+$GET(Y))
                   QUIT 
               IF +$GET(ORAMCBC)
                   SET $PIECE(RESULT,"|",2)=ORAMCBC
                   SET Y=1
 +9        QUIT 
 +10      ;
SIGCHECK(RESULT,ESCODE) ;
 +1       ;;CHECKS SIG CODE
 +2       ;;RPC=ORAM SIGCHECK
 +3        NEW SUCCESS,X
 +4        SET SUCCESS=0
 +5        if ESCODE=""
               QUIT 
 +6        SET X=ESCODE
           DO HASH^XUSHSHP
 +7       ;SIG CODE CORRECT
           IF $PIECE($GET(^VA(200,DUZ,20)),U,4)=X
               SET SUCCESS=1
 +8        SET RESULT=$GET(SUCCESS)
SIGQ       QUIT 
 +1       ;
HCT(RESULT,ORAMDFN) ;GET HCT
 +1       ;;GETS MOST RECENT HCT
 +2       ;;RPC=ORAM HCT
 +3        NEW HCT,LDATE,HCTDATE,LOOPCNT,HCTDIFF,LRDFN,ORAMS,ORAMHCT,ORAMDNM,OHCT,OHCTD,ORAMFM,ORAMHCTN
 +4       ;IF DFN IS NOT PASSED, EXIT
           IF '$GET(ORAMDFN)
               SET RESULT=""
               QUIT 
 +5        SET LRDFN=$$LAB($GET(ORAMDFN))
           IF +LRDFN'>0
               SET RESULT="Patient has no VistA Lab Data."
               QUIT 
 +6        SET ORAMHCT=$$GET^XPAR("ALL","ORAM HCT/HGB REFERENCE",1,"B")
 +7        IF +$GET(ORAMHCT)'>0
               SET RESULT="HCT Param not set."
               QUIT 
 +8        SET ORAMHCTN=$PIECE(ORAMHCT,U,2)
           SET ORAMHCT=$PIECE(ORAMHCT,U)
 +9       ; Get Lab Data Name based on IEN in ^LAB(60,
 +10       SET ORAMDNM=$PIECE($PIECE(^LAB(60,+ORAMHCT,0),U,5),";",2)
           IF ORAMDNM']""
               SET RESULT="Data Name not defined for "_ORAMHCTN_" in Lab Test File."
               QUIT 
 +11       SET LDATE=0
           FOR 
               SET LDATE=$ORDER(^LR(LRDFN,"CH",LDATE))
               SET LOOPCNT=0
               if LDATE=""!(+$GET(HCT))
                   QUIT 
               Begin DoDot:1
 +12               SET RESULT=$GET(^LR(LRDFN,"CH",LDATE,ORAMDNM))
 +13               if RESULT=""
                       QUIT 
 +14      ;QUIT IF NO HCT DATA
                   if $PIECE(RESULT,U,1)=""
                       QUIT 
 +15      ;HCT
                   SET HCT=$PIECE(RESULT,U,1)
 +16               SET HCTDATE=9999999-LDATE
 +17               SET LOOPCNT=1
 +18               if +HCT
                       QUIT 
               End DoDot:1
               if LOOPCNT
                   QUIT 
 +19       IF LDATE=""
               SET RESULT="NONE"
 +20       IF $DATA(^ORAM(103,ORAMDFN,6))
               IF ($LENGTH($PIECE(^ORAM(103,ORAMDFN,6),U,4),"|")=3)
                   Begin DoDot:1
 +21                   SET OHCT=$PIECE($PIECE(^ORAM(103,ORAMDFN,6),U,4),"|")
                       SET OHCTD=$PIECE($PIECE(^ORAM(103,ORAMDFN,6),U,4),"|",2)
 +22                   IF +$GET(OHCT)
                           DO DT^DILF(,OHCTD,.ORAMFM)
                   End DoDot:1
 +23       IF +$GET(HCTDATE)
               IF $GET(ORAMFM)>HCTDATE
                   SET HCT=OHCT_" (Outside Lab)"
                   SET HCTDATE=ORAMFM
                   SET ORAMHCTN="HCT"
 +24       IF '+$GET(HCTDATE)
               if +$GET(OHCT)
                   SET HCT=OHCT_" (Outside Lab)"
                   SET ORAMHCTN="HCT"
               if $GET(ORAMFM)'=""
                   SET HCTDATE=ORAMFM
 +25       IF +$GET(HCTDATE)
               SET HCTDATE=$$FMTE^XLFDT($EXTRACT(HCTDATE,1,7),2)
 +26       SET RESULT=$GET(HCT)_U_$GET(HCTDATE)_U_ORAMHCTN
 +27       QUIT 
 +28      ;
INR(RESULT,ORAMDFN) ; Gets most recent INR
 +1       ;;RPC=ORAM INR
 +2        NEW LDATE,INR,INRFD,LRDFN,HDATE,TDIFF,SIXMON,COUNT,SCORE,ORAMITST,INRHD,INRRD
 +3        NEW ORAMQO
 +4        SET RESULT=""
 +5       ;IF DFN IS NOT PASSED, EXIT
           IF '$GET(ORAMDFN)
               QUIT 
 +6        SET LRDFN=$$LAB($GET(ORAMDFN))
           IF +LRDFN'>0
               SET RESULT="Patient has no Lab Data."
               QUIT 
 +7        SET ORAMQO=$$GET^XPAR("ALL","ORAM INR QUICK ORDER",1,"I")
           SET ORAMITST=$$INRCHK(ORAMQO)
 +8        IF +ORAMITST'>0
               QUIT 
 +9        SET (LDATE,COUNT)=0
           SET SIXMON=$$FMADD^XLFDT(DT,-180)
 +10       FOR 
               SET LDATE=$ORDER(^LR(LRDFN,"CH",LDATE))
               if +LDATE'>0!(LDATE>(9999999-SIXMON))
                   QUIT 
               Begin DoDot:1
 +11               NEW SCORE,INR,INRFD,INRHD,INRRD,XDT
 +12               SET SCORE=$GET(^LR(LRDFN,"CH",LDATE,ORAMITST))
 +13      ;QUIT IF NO INR TEST
                   if SCORE=""
                       QUIT 
 +14      ;INR
                   SET INR=$PIECE(SCORE,U)
 +15      ;QUIT IF NO INR DATA
                   if INR=""
                       QUIT 
 +16               SET INRFD=9999999-LDATE
 +17               SET XDT=$PIECE(INRFD,".")
                   SET INRHD=$$FMTH^XLFDT(XDT,1)
                   SET INRRD=$$FMTE^XLFDT(XDT,"2P")
 +18               SET RESULT(COUNT)=$GET(INR)_"^^"_$GET(INRRD)_U_$GET(INRHD)
 +19      ;Q WHEN SEARCHED LAST 6 MONTHS
                   if INRFD<SIXMON
                       QUIT 
 +20               SET COUNT=COUNT+1
               End DoDot:1
 +21       QUIT 
 +22      ;
CONCOMP(RESULT,ORAMCNUM,ORAMNNUM,ORAMDUZ) ;
 +1       ;;BRINGS IN CONSULT NUMBER(ORAMCNUM)
 +2       ;;BRINGS IN NOTE NUMBER(ORAMNNUM), COMPLETES CONSULT
 +3       ;;RPC=ORAM CONCOMP
 +4        NEW ORAMCST
 +5        SET RESULT=0
 +6        SET ORAMCST=$SELECT($$STATUS^TIULC(ORAMNNUM)="completed":"COMPLETE",1:"INCOMPLETE")
 +7        DO GET^GMRCTIU(ORAMCNUM,ORAMNNUM,ORAMCST,ORAMDUZ)
 +8        SET RESULT=1
 +9        QUIT 
 +10      ;
LAB(DFN)  ;GET LAB NUMBER
 +1        NEW LRDFN
 +2       ;IF DFN IS NOT PASSED, EXIT
           IF 'DFN
               SET LRDFN=""
               GOTO LABQ
 +3        SET LRDFN=$GET(^DPT(DFN,"LR"))
LABQ       QUIT LRDFN
 +1       ;
ORDER(ORESULT,DFN,ORNP,ORLOC,ORQO,ORCDT) ; Place Quick Order for INR or CBC
 +1       ; RPC ORAM ORDER
 +2       ;  in: DFN   - pt id file 2
 +3       ;      ORNP  - ordering provider id file 200
 +4       ;      ORLOC - location id file 42
 +5       ;      ORQO  - quick order id file 101.41
 +6       ;      ORCDT - collection date/time
 +7        NEW ORANS,ORDIALOG,ORDG,ORDLG
 +8        IF +$GET(DFN)'>0
               SET ORESULT="0^invalid Patient id"
               QUIT 
 +9        IF +$GET(ORNP)'>0
               SET ORESULT="0^invalid Provider id"
               QUIT 
 +10       IF +$GET(ORLOC)'>0
               SET ORESULT="0^invalid Location id"
               QUIT 
 +11       IF +$GET(ORQO)'>0
               SET ORESULT="0^invalid Quick Order id"
               QUIT 
 +12       IF $GET(ORCDT)']""
               SET ORESULT="0^invalid Collection Date/Time"
               QUIT 
 +13       DO GETQDLG^ORCD(ORQO)
 +14       IF '$DATA(ORDIALOG)
               SET ORESULT="0^invalid Quick Order id"
               QUIT 
 +15       SET ORDLG=$$GET1^DIQ(101.41,+ORDIALOG_",",.01)
 +16       IF ORDLG']""
               SET ORESULT="0^invalid Quick Order id"
               QUIT 
 +17       SET ORDG=$$GET1^DIQ(101.41,ORQO_",",5,"I")
 +18       IF +ORDG'>0
               SET ORESULT="0^invalid Quick Order id - no Display Group"
               QUIT 
 +19       SET ORDIALOG(6,1)=$$IDATE(ORCDT)
 +20      ; Place the order
           DO SAVE^ORWDX(.ORESULT,DFN,ORNP,ORLOC,ORDLG,ORDG,ORQO,"",.ORDIALOG)
 +21      ; if the order is placed, call UNOTIF^ORCSIGN to avoid duplicate alerts,
 +22      ; then call NOTIF^ORCSIGN to generate an unsigned order notification
 +23       IF +ORESULT
               Begin DoDot:1
 +24               NEW ORVP,ORIFN,Y
 +25               SET ORVP=DFN_";DPT("
                   SET ORIFN=$PIECE($PIECE($GET(ORESULT(1)),"~",2),";")
 +26               DO UNOTIF^ORCSIGN
 +27               DO NOTIF^ORCSIGN
               End DoDot:1
 +28       QUIT 
IDATE(ORX) ; Convert External Date/time to FM Internal format
 +1        NEW ORY
           SET ORY=""
 +2        DO DT^DILF("T",ORX,.ORY)
           if +ORY'>0
               SET ORY=""
 +3        QUIT ORY
QOORD(ORQO) ; Given Quick Order, find the IEN of the Orderable Item
 +1        NEW ORI,ORDIALOG,ORY
           SET ORY=0
 +2        DO GETQDLG^ORCD(+$GET(ORQO))
 +3        IF '$DATA(ORDIALOG)
               GOTO QOORDX
 +4        SET ORI=0
 +5        FOR 
               SET ORI=$ORDER(ORDIALOG(ORI))
               if ORI'>0!+ORY>0
                   QUIT 
               Begin DoDot:1
 +6                IF $GET(ORDIALOG(ORI))["ORDERABLE"
                       SET ORY=$GET(ORDIALOG(ORI,1))
               End DoDot:1
QOORDX     QUIT ORY