| 1 | ORRCTSK ;SLC/MKB -- Patient Task file #102.3 utilities ; 25 Jul 2003  9:31 AM
 | 
|---|
| 2 |  ;;1.0;CARE MANAGEMENT;;Jul 15, 2003
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; ID = "TSK:"_task# everywhere below
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | PATS(ORY,ORUSR) ; -- Return list of patients for whom ORUSR has tasks due
 | 
|---|
| 7 |  ; in @ORY@(PAT) = #tasks ^ 1 if any are high priority
 | 
|---|
| 8 |  ;    @ORY@(PAT,ID) = * if high priority, else null
 | 
|---|
| 9 |  ; [from ORRCDPT]
 | 
|---|
| 10 |  N ORPROV,DUE,PAT,CNT,ABN,IFN,X0
 | 
|---|
| 11 |  S ORY=$NA(^TMP($J,"ORRCTSK")) K @ORY
 | 
|---|
| 12 |  S ORUSR=+$G(ORUSR),DUE=$S($G(DT):DT,1:$P($$NOW^XLFDT,"."))
 | 
|---|
| 13 |  S PAT=0 F  S PAT=+$O(^ORRT(102.3,"DUE",PAT)) Q:PAT<1  D
 | 
|---|
| 14 |  . I $D(^TMP($J,"ORRCLST")),'$D(^TMP($J,"ORRCY",PAT)) Q  ;pt not on list
 | 
|---|
| 15 |  . S ORPROV=$$PROV(ORUSR,PAT),(CNT,ABN,IFN)=0
 | 
|---|
| 16 |  . F  S IFN=+$O(^ORRT(102.3,"DUE",PAT,IFN)) Q:IFN<1  D
 | 
|---|
| 17 |  .. S X0=$G(^ORRT(102.3,IFN,0)) I $P(X0,U,5),$P($P(X0,U,5),".")>DUE Q
 | 
|---|
| 18 |  .. I $P(X0,U,2)'=+ORUSR,'ORPROV Q  ;not linked provider
 | 
|---|
| 19 |  .. S @ORY@(PAT,"TSK:"_IFN)=$S($P(X0,U,4)="H":"*",1:"")
 | 
|---|
| 20 |  .. S CNT=CNT+1 S:$P(X0,U,4)="H" ABN=1
 | 
|---|
| 21 |  . I CNT S @ORY@(PAT)=CNT_U_ABN
 | 
|---|
| 22 |  Q
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 | IDS(ORY,PAT) ; -- Return due tasks for PAT
 | 
|---|
| 25 |  ; in @ORY@(PAT) = #tasks ^ 1 if any are high priority
 | 
|---|
| 26 |  ;    @ORY@(PAT,ID) = * if high priority, else null
 | 
|---|
| 27 |  ; [from ORRCDPT1]
 | 
|---|
| 28 |  N DUE,CNT,ABN,IFN,X0
 | 
|---|
| 29 |  S ORY=$NA(^TMP($J,"ORRCTSK")) K @ORY
 | 
|---|
| 30 |  S DUE=$S($G(DT):DT,1:$P($$NOW^XLFDT,".")),CNT=0,ABN=""
 | 
|---|
| 31 |  S IFN=0 F  S IFN=+$O(^ORRT(102.3,"DUE",PAT,IFN)) Q:IFN<1  D
 | 
|---|
| 32 |  . S X0=$G(^ORRT(102.3,IFN,0)) I $P(X0,U,5),$P($P(X0,U,5),".")>DUE Q
 | 
|---|
| 33 |  . S @ORY@(PAT,"TSK:"_IFN)=$S($P(X0,U,4)="H":"*",1:"")
 | 
|---|
| 34 |  . S CNT=CNT+1 S:$P(X0,U,4)="H" ABN=1
 | 
|---|
| 35 |  S:CNT @ORY@(PAT)=CNT_U_ABN
 | 
|---|
| 36 |  Q
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 | PROV(USR,PAT) ; -- Return 1 or 0, if USR is a provider for PAT
 | 
|---|
| 39 |  N Y,LIST S Y=0 S USR=+$G(USR),PAT=+$G(PAT)
 | 
|---|
| 40 |  I +$G(^DPT(PAT,.104))=USR S Y=1 G PVQ ;Prim Prov
 | 
|---|
| 41 |  I +$G(^DPT(PAT,.1041))=USR S Y=1 G PVQ ;Attending Prov
 | 
|---|
| 42 |  S PAT=PAT_";DPT(",LIST=0
 | 
|---|
| 43 |  F  S LIST=+$O(^OR(100.21,"AB",PAT,LIST)) Q:LIST<1  I $G(^OR(100.21,LIST,1,USR,0)) S Y=1 Q
 | 
|---|
| 44 | PVQ Q Y
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 | LIST(ORY,ORPAT,ORUSR,ORDUE) ; -- Return incomplete[ORDUE] tasks [by ORUSR] for ORPAT
 | 
|---|
| 47 |  ; in ORY(#) = ID^subject^date created^who created^patient^priority^due^date completed^who completed^date canceled^who canceled^items
 | 
|---|
| 48 |  ; RPC = ORRC TASKS BY PATIENT
 | 
|---|
| 49 |  N ORN,ORPROV,IFN,X0,X1,I,ITMS,X K ORY
 | 
|---|
| 50 |  S ORN=0,ORPAT=+$G(ORPAT),ORPROV=$S($G(ORUSR):$$PROV(ORUSR,ORPAT),1:"")
 | 
|---|
| 51 |  I $G(ORDUE) S ORDUE=$$HL7TFM^XLFDT(ORDUE)
 | 
|---|
| 52 |  S IFN=0 F  S IFN=+$O(^ORRT(102.3,"DUE",ORPAT,IFN)) Q:IFN<1  D
 | 
|---|
| 53 |  . S X0=$G(^ORRT(102.3,IFN,0)),X1=$G(^(1)),ITMS=""
 | 
|---|
| 54 |  . I $G(ORDUE),$P(X0,U,5),$P($P(X0,U,5),".")>ORDUE Q  ;future-not due yet
 | 
|---|
| 55 |  . I $G(ORUSR),$P(X0,U,2)'=+ORUSR,'ORPROV Q  ;not linked prov
 | 
|---|
| 56 |  . F I=1,5,6,8 S X=$P(X0,U,I) I $L(X) S $P(X0,U,I)=$$FMTHL7^XLFDT(X)
 | 
|---|
| 57 |  . S I=0 F  S I=$O(^ORRT(102.3,IFN,2,I)) Q:I<1  S X=$G(^(I,0)),ITMS=ITMS_$S($L(ITMS):"~",1:"")_X
 | 
|---|
| 58 |  . S $P(X0,U,10)=ITMS,ORN=ORN+1,ORY(ORN)="TSK:"_IFN_U_X1_U_X0
 | 
|---|
| 59 |  Q
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 | DUE(ORY,ORPAT) ; -- Return tasks that are due for ORPAT
 | 
|---|
| 62 |  ; in ORY(#) = ID^subject^date created^who created^patient^priority^due^date completed^who completed^date canceled^who canceled^items
 | 
|---|
| 63 |  ; RPC = ORRC TASKS DUE BY PATIENT <not used>
 | 
|---|
| 64 |  N ORDT S ORDT=$$FMTHL7^XLFDT($G(DT))
 | 
|---|
| 65 |  D LIST(.ORY,ORPAT,,ORDT)
 | 
|---|
| 66 |  Q
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 | DETAIL(ORY,TASK) ; -- Return details of TASKs
 | 
|---|
| 69 |  ; where TASK(#) = ID
 | 
|---|
| 70 |  ; in ORY(#) = ID^subject^date created^who created^patient^priority^due^date completed^who completed^date canceled^who canceled^items
 | 
|---|
| 71 |  ; RPC = ORRC TASKS BY ID
 | 
|---|
| 72 |  N ORN,ORI,ID,IFN,X0,X1,ITMS,I,X S ORN=0 K ORY
 | 
|---|
| 73 |  S ORI="" F  S ORI=$O(TASK(ORI)) Q:ORI=""  S ID=$G(TASK(ORI)) D
 | 
|---|
| 74 |  . S IFN=+$P(ID,":",2),X0=$G(^ORRT(102.3,IFN,0)),X1=$G(^(1))
 | 
|---|
| 75 |  . F I=1,5,6,8 S X=$P(X0,U,I) I $L(X) S $P(X0,U,I)=$$FMTHL7^XLFDT(X)
 | 
|---|
| 76 |  . S ITMS="",I=0 F  S I=$O(^ORRT(102.3,IFN,2,I)) Q:I<1  S X=$G(^(I,0)),ITMS=ITMS_$S($L(ITMS):"~",1:"")_X
 | 
|---|
| 77 |  . S $P(X0,U,10)=ITMS,ORN=ORN+1,ORY(ORN)=ID_U_X1_U_X0
 | 
|---|
| 78 |  Q
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 | NEW(ORY,DATA) ; -- Create new task
 | 
|---|
| 81 |  ;   where DATA = [^]subject^date created^user^patient^priority^due^date completed^who completed^date canceled^who canceled^items
 | 
|---|
| 82 |  ; returns ORY  = ID if successful, else 0^error message
 | 
|---|
| 83 |  ; RPC = ORRC TASK ADD
 | 
|---|
| 84 |  N DO,DIC,X,Y,I,ITMS S ORY=""
 | 
|---|
| 85 |  I '$L($G(DATA)) S ORY="0^Missing data string" Q
 | 
|---|
| 86 |  S DATA=U_DATA,ORY=$$VALID(.DATA) Q:'ORY  ;invalid data
 | 
|---|
| 87 |  S DIC="^ORRT(102.3,",DIC(0)="",X=$P(DATA,U,3) S:X<1 X=$$NOW^XLFDT
 | 
|---|
| 88 |  D FILE^DICN I Y<1 S ORY="0^Unable to create new task" Q
 | 
|---|
| 89 |  S $P(^ORRT(102.3,+Y,0),U,2,9)=$P(DATA,U,4,11),^(1)=$P(DATA,U,2)
 | 
|---|
| 90 |  S ^ORRT(102.3,"C",+$P(DATA,U,5),+Y)=""
 | 
|---|
| 91 |  I '$P(DATA,U,8),'$P(DATA,U,10) S ^ORRT(102.3,"DUE",+$P(DATA,U,5),+Y)=""
 | 
|---|
| 92 |  S ITMS=$P(DATA,U,12) I $L(ITMS) D
 | 
|---|
| 93 |  . F I=1:1:$L(ITMS,"~") S X=$P(ITMS,"~",I) I $L(X) S ^ORRT(102.3,+Y,2,I,0)=X,^ORRT(102.3,+Y,2,"B",X,I)=""
 | 
|---|
| 94 |  . S ^ORRT(102.3,+Y,2,0)="^102.31AV^"_I_U_I
 | 
|---|
| 95 |  S ORY="TSK:"_+Y
 | 
|---|
| 96 |  Q
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 | VALID(DATA) ; -- Returns 1 or 0^error if DATA string is valid
 | 
|---|
| 99 |  N X,Y,I,L S Y=1
 | 
|---|
| 100 |  S X=$P(DATA,U) I $L(X),'$D(^ORRT(102.3,+$P(X,":",2),0)) S Y="0^Invalid task number" G VQ
 | 
|---|
| 101 |  S X=$P(DATA,U,5) I X'=+X!(X<1)!'$D(^DPT(+X,0)) S Y="0^Missing or invalid patient ID" G VQ
 | 
|---|
| 102 |  F I=4,9 S X=$P(X,U,I) I $L(X),X'=+X!(X<1)!'$D(^VA(200,+X,0)) S Y="0^Missing or invalid user ID" G VQ
 | 
|---|
| 103 |  F I=3,7,8,10 S X=$P(DATA,U,I) I $L(X) D  Q:'Y
 | 
|---|
| 104 |  . I $L(X)=12,$E(X,9,12)="0000" S X=$E(X,1,8) ;date only
 | 
|---|
| 105 |  . S X=$$HL7TFM^XLFDT(X) I $L(X) S $P(DATA,U,I)=X Q  ;reformat
 | 
|---|
| 106 |  . S Y="0^Invalid date "_$S(I=3:"created",I=7:"due",1:"completed")
 | 
|---|
| 107 |  S X=$P(DATA,U,6) I $L(X),X'="L",X'="M",X'="H" S Y="0^Invalid priority" G VQ
 | 
|---|
| 108 |  S X=$P(DATA,U,2) I '$L(X)!(X["^")!($L(X)>100) S Y="0^Invalid subject text" G VQ
 | 
|---|
| 109 |  S X=$P(DATA,U,12) I $L(X) F I=1:1:$P(X,"~") S L=$P(X,"~",I) I $L(L),L'?3U1":".E S Y="0^Invalid linked item ID" Q
 | 
|---|
| 110 | VQ Q Y
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 | EDIT(ORY,TASK) ; -- Change existing tasks
 | 
|---|
| 113 |  ;   where TASK(#) = ID^subject^date created^user^patient^priority^due^date completed^who completed^date canceled^who canceled^items
 | 
|---|
| 114 |  ; returns ORY(#)  = ID^1 or ID^0^error, if successful or not
 | 
|---|
| 115 |  ; RPC = ORRC TASK EDIT
 | 
|---|
| 116 |  N ORI,DATA,ID,DA,I,X,Y,SUBJ,ITMS,X0 K ORY
 | 
|---|
| 117 |  S ORI="" F  S ORI=$O(TASK(ORI)) Q:ORI=""  S DATA=$G(TASK(ORI)) D
 | 
|---|
| 118 |  . S ID=$P(DATA,U),DA=+$P(ID,":",2)
 | 
|---|
| 119 |  . I DA<1 S ORY(ORI)=ID_"^0^Invalid task number" Q
 | 
|---|
| 120 |  . S X=$$VALID(.DATA) I X<1 S ORY(ORI)=ID_U_X Q
 | 
|---|
| 121 |  . L +^ORRT(102.3,DA):5 I '$T S ORY(ORI)=ID_"^0^Another user is editing this task" Q
 | 
|---|
| 122 |  . S SUBJ=$P(DATA,U,2),ITMS=$P(DATA,U,12),DATA=$P(DATA,U,3,11)
 | 
|---|
| 123 |  . S X0=$G(^ORRT(102.3,DA,0)),^(0)=DATA,^(1)=SUBJ K ^(2) I $L(ITMS) D
 | 
|---|
| 124 |  .. F I=1:1:$L(ITMS,"~") S X=$P(ITMS,"~",I) I $L(X) S ^ORRT(102.3,DA,2,I,0)=X,^ORRT(102.3,DA,2,"B",X,I)=""
 | 
|---|
| 125 |  .. S ^ORRT(102.3,DA,2,0)="^102.31AV^"_I_U_I
 | 
|---|
| 126 |  . I $P(X0,U)'=$P(DATA,U) K ^ORRT(102.3,"B",$P(X0,U),DA) S ^ORRT(102.3,"B",$P(DATA,U),DA)=""
 | 
|---|
| 127 |  . I $P(X0,U,3)'=$P(DATA,U,3) K ^ORRT(102.3,"C",$P(X0,U,3),DA) S ^ORRT(102.3,"C",$P(DATA,U,3),DA)=""
 | 
|---|
| 128 |  . K ^ORRT(102.3,"DUE",$P(X0,U,3),DA)
 | 
|---|
| 129 |  . I '$P(DATA,U,6),'$P(DATA,U,8) S ^ORRT(102.3,"DUE",$P(DATA,U,3),DA)=""
 | 
|---|
| 130 |  . S ORY(ORI)=ID_"^1" L -^ORRT(102.3,DA)
 | 
|---|
| 131 |  Q
 | 
|---|
| 132 |  ;
 | 
|---|
| 133 | COMP(ORY,ORUSR,TASK) ; -- Complete tasks by ORUSR
 | 
|---|
| 134 |  ;   where TASK(#) = ID
 | 
|---|
| 135 |  ; returns ORY(#)  = ID^1 or ID^0^error, if successful or not
 | 
|---|
| 136 |  ; RPC = ORRC TASK COMPLETE
 | 
|---|
| 137 |  N X,Y,ID,DA,DR,DIE,ORI
 | 
|---|
| 138 |  I $G(ORUSR)<1 S ORY(0)="0^Invalid user identifier" Q
 | 
|---|
| 139 |  S DIE="^ORRT(102.3,",DR="6///NOW;7///"_+ORUSR
 | 
|---|
| 140 |  S ORI="" F  S ORI=$O(TASK(ORI)) Q:ORI=""  S ID=TASK(ORI) D
 | 
|---|
| 141 |  . S DA=+$P(ID,":",2) I DA<1 S ORY(ORI)=ID_"^0^Invalid task number" Q
 | 
|---|
| 142 |  . L +^ORRT(102.3,DA):5 I '$T S ORY(ORI)=ID_"^0^Another user is editing this task" Q
 | 
|---|
| 143 |  . D ^DIE S ORY(ORI)=ID_"^1" L -^ORRT(102.3,DA)
 | 
|---|
| 144 |  Q
 | 
|---|
| 145 |  ;
 | 
|---|
| 146 | CANC(ORY,ORUSR,TASK) ; -- Cancel tasks by ORUSR
 | 
|---|
| 147 |  ;   where TASK(#) = ID
 | 
|---|
| 148 |  ; returns ORY(#)  = ID^1 or ID^0^error, if successful or not
 | 
|---|
| 149 |  ; RPC = ORRC TASK CANCEL
 | 
|---|
| 150 |  N X,Y,ID,DA,DR,DIE,ORI
 | 
|---|
| 151 |  I $G(ORUSR)<1 S ORY(0)="0^Invalid user identifier" Q
 | 
|---|
| 152 |  S DIE="^ORRT(102.3,",DR="8///NOW;9///"_+ORUSR
 | 
|---|
| 153 |  S ORI="" F  S ORI=$O(TASK(ORI)) Q:ORI=""  S ID=TASK(ORI) D
 | 
|---|
| 154 |  . S DA=+$P(ID,":",2) I DA<1 S ORY(ORI)=ID_"^0^Invalid task number" Q
 | 
|---|
| 155 |  . L +^ORRT(102.3,DA):5 I '$T S ORY(ORI)=ID_"^0^Another user is editing this task" Q
 | 
|---|
| 156 |  . D ^DIE S ORY(ORI)=ID_"^1" L -^ORRT(102.3,DA)
 | 
|---|
| 157 |  Q
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 | SUBJ(ORY,ORPAT) ; -- Return list of task subjects used for ORPAT
 | 
|---|
| 160 |  ; as ORY(#) = task subject
 | 
|---|
| 161 |  N ORI,ORN K ORY S ORN=0
 | 
|---|
| 162 |  S ORI=0  F  S ORI=$O(^ORRT(102.3,"C",ORPAT,ORI)) Q:ORI<1  D
 | 
|---|
| 163 |  . S X=$G(^ORRT(102.3,ORI,1)) Q:'$L(X)
 | 
|---|
| 164 |  . S ORN=ORN+1,ORY(ORN)=X
 | 
|---|
| 165 |  Q
 | 
|---|