| 1 | ORMTIM02 ; JM/SLC-ISC - PERFORM MISC TIME BASED ACTIVITIES ;05/02/06
 | 
|---|
| 2 |  ;;3.0;ORDER ENTRY/RESULTS REPORTING;**253**;Dec 17, 1997
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  Q
 | 
|---|
| 5 | MISC ; Perform misc time based activities
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  D UNSIGNED ; Generate alerts for unsigned orders that have slipped through the cracks
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  Q
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 | UNSIGNED ; Generate alerts for unsigned orders that were not alerted by CPRS
 | 
|---|
| 12 |  ; This happens when CPRS crashes - through network connection drops or other causes
 | 
|---|
| 13 |  N ORZPAT,ORZDATE,ORZIEN,ORZSUB,ORZSDATE,%DT,X,Y,ORZTIME,ORZNOW,ORZPURGE
 | 
|---|
| 14 |  N ORN,ORBDFN,ORNUM,ORBADUZ,ORBPMSG,ORBPDATA,ORZREC8,ORZSIGDT,ORZSTS,ORZWHEN,ORMARKID
 | 
|---|
| 15 |  N MINTIME,XTMPDAYS,XTMPHOUR,MINDAYS
 | 
|---|
| 16 |  S ORN=12,ORMARKID="ORMTIME_UNSGNORD"
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  S MINTIME=60 ; Order must be unsigned for 60 Minutes before generating an alert
 | 
|---|
| 19 |  S MINDAYS=90 ; Order must have been generated within the last 90 days
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  S XTMPDAYS=10 ; Keep ^XTMP record for 10 days - reset timeframe with each run
 | 
|---|
| 22 |  S XTMPHOUR=48 ; Each order that's verified as having generated an alert has a flag set in
 | 
|---|
| 23 |  ;               ^XTMP that's kept for 48 hours.  When flag is gone, must recheck alert status
 | 
|---|
| 24 |  ;
 | 
|---|
| 25 |  S X="T-"_MINDAYS
 | 
|---|
| 26 |  D ^%DT S ORZSDATE=9999999-Y
 | 
|---|
| 27 |  S %DT="ST",X="NOW" D ^%DT
 | 
|---|
| 28 |  S ORZNOW=Y
 | 
|---|
| 29 |  S ORZTIME=$$FMADD^XLFDT(ORZNOW,0,0,-MINTIME,0) ; Order must have existed for ORZTIME minutes
 | 
|---|
| 30 |  S ORZPURGE=$$FMADD^XLFDT(ORZNOW,XTMPDAYS,0,0,0) ; Purge all marked flags if not run in XTMPDAYS days
 | 
|---|
| 31 |  S ^XTMP(ORMARKID,0)=ORZPURGE_U_ORZNOW_U_"Unsigned Orders Reviewed by ORMTIME"
 | 
|---|
| 32 |  S ORZPURGE=$$FMADD^XLFDT(ORZNOW,0,XTMPHOUR,0,0) ; Purge each marked flag XTMPHOUR hours after creation
 | 
|---|
| 33 |  K MINTIME,MINDAYS,XTMPDAYS,XTMPHOUR,X,Y,%DT ; Kill non-namespaced vars
 | 
|---|
| 34 |  S ORZPAT="" F  S ORZPAT=$O(^OR(100,"AS",ORZPAT)) Q:'ORZPAT  D
 | 
|---|
| 35 |  . Q:$P(^DPT(+ORZPAT,0),U,21)  ; Quit if test patient
 | 
|---|
| 36 |  . S ORZDATE=0 F  S ORZDATE=$O(^OR(100,"AS",ORZPAT,ORZDATE)) Q:'ORZDATE  I ORZDATE<ORZSDATE D
 | 
|---|
| 37 |  . . S ORZIEN=0 F  S ORZIEN=$O(^OR(100,"AS",ORZPAT,ORZDATE,ORZIEN)) Q:'ORZIEN  D
 | 
|---|
| 38 |  . . . S ORZSUB=0 F  S ORZSUB=$O(^OR(100,"AS",ORZPAT,ORZDATE,ORZIEN,ORZSUB)) Q:'ORZSUB  D
 | 
|---|
| 39 |  . . . . I $D(^OR(100,ORZIEN,8,ORZSUB,0)) D
 | 
|---|
| 40 |  . . . . . S ORZREC8=^OR(100,ORZIEN,8,ORZSUB,0)
 | 
|---|
| 41 |  . . . . . S ORZSIGDT=$P(ORZREC8,U,6) I $L(ORZSIGDT)>0 Q  ; Can't have a sign date/time
 | 
|---|
| 42 |  . . . . . S ORZSTS=$P(ORZREC8,U,4) I ORZSTS'=2 Q  ; must be in an unsigned state
 | 
|---|
| 43 |  . . . . . S ORZWHEN=$P(ORZREC8,U) I ORZWHEN>ORZTIME Q  ; must have been unsigned for MINTIME
 | 
|---|
| 44 |  . . . . . S ORBDFN=+ORZPAT
 | 
|---|
| 45 |  . . . . . S ORNUM=ORZIEN_";"_ORZSUB
 | 
|---|
| 46 |  . . . . . I $$NEEDALRT($P(ORZREC8,U,3),ORBDFN,ORNUM) D  ; must not have already generated an alert
 | 
|---|
| 47 |  . . . . . . S (ORBADUZ,ORBPMSG,ORBPDATA)=""
 | 
|---|
| 48 |  . . . . . . D DOALERT^ORB3
 | 
|---|
| 49 |  . . . . . . D MARK(ORNUM) ; Alert sent, don't send another one
 | 
|---|
| 50 |  D CLEAN
 | 
|---|
| 51 |  Q
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 | NEEDALRT(PROVIDER,DFN,ORNUM) ; Returns true if order needs an alert
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  I $$MARKED(ORNUM) Q 0 ; If already checked, return
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 |  N RESULT,SUROGATE
 | 
|---|
| 58 |  S RESULT=1
 | 
|---|
| 59 |  I $$HASALERT(PROVIDER,DFN) S RESULT=0 I 1
 | 
|---|
| 60 |  E  D
 | 
|---|
| 61 |  . S SUROGATE=$P($$GETSURO^XQALSURO(PROVIDER),U,1)
 | 
|---|
| 62 |  . I +SUROGATE,$$HASALERT(SUROGATE,DFN) S RESULT=0
 | 
|---|
| 63 |  I 'RESULT D MARK(ORNUM)
 | 
|---|
| 64 |  Q RESULT
 | 
|---|
| 65 |  ;
 | 
|---|
| 66 | HASALERT(USER,PATIENT) ; Returns true if alert exists for user and patient
 | 
|---|
| 67 |  N RESULT,ALERTID,DATE
 | 
|---|
| 68 |  S RESULT=0,ALERTID="OR,"_PATIENT_",12"
 | 
|---|
| 69 |  I $D(^XTV(8992,"AXQAN",ALERTID,USER)) D  ;DBIA# 2689
 | 
|---|
| 70 |  . S DATE=$O(^XTV(8992,"AXQAN",ALERTID,USER,0))
 | 
|---|
| 71 |  . I $G(DATE)>0 S RESULT=1
 | 
|---|
| 72 |  Q RESULT
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | MARKED(ORNUM) ; Returns true if the order has been marked as not needing an alert
 | 
|---|
| 75 |  I $D(^XTMP(ORMARKID,"A",ORNUM))>0 Q 1
 | 
|---|
| 76 |  Q 0
 | 
|---|
| 77 |  ; 
 | 
|---|
| 78 | MARK(ORNUM) ; Marks an order as already having been alerted
 | 
|---|
| 79 |  S ^XTMP(ORMARKID,"A",ORNUM)=""
 | 
|---|
| 80 |  S ^XTMP(ORMARKID,"B",ORZPURGE,ORNUM)=""
 | 
|---|
| 81 |  Q
 | 
|---|
| 82 | CLEAN ; Clean up old entries in ^XTMP
 | 
|---|
| 83 |  N IDX,ORNUM
 | 
|---|
| 84 |  S IDX=0
 | 
|---|
| 85 |  F  S IDX=$O(^XTMP(ORMARKID,"B",IDX)) Q:((+IDX=0)!(IDX>ORZNOW))  D
 | 
|---|
| 86 |  . S ORNUM=0
 | 
|---|
| 87 |  . F  S ORNUM=$O(^XTMP(ORMARKID,"B",IDX,ORNUM)) Q:+ORNUM=0  D
 | 
|---|
| 88 |  . . K ^XTMP(ORMARKID,"A",ORNUM)
 | 
|---|
| 89 |  . . K ^XTMP(ORMARKID,"B",IDX,ORNUM)
 | 
|---|
| 90 |  Q
 | 
|---|