| 1 | ORRCSIG ;SLC/MKB - Signature utilities for CM ; 25 Jul 2003  9:31 AM | 
|---|
| 2 | ;;1.0;CARE MANAGEMENT;;Jul 15, 2003 | 
|---|
| 3 | ; | 
|---|
| 4 | ; ID = "DOC:"_Document# or "ORU:"_Order# everywhere below | 
|---|
| 5 | ; | 
|---|
| 6 | LIST(ORY,ORUSR,ORPAT,ORDET) ; -- Return unsigned orders and documents by ORUSR for ORPAT | 
|---|
| 7 | ; in @ORY@(#) = Item=ID^Text^Date in HL7 format, and also if ORDET | 
|---|
| 8 | ;             = Text=line of report text | 
|---|
| 9 | ; RPC = ORRC UNSIGNED BY PATIENT | 
|---|
| 10 | N ORN,ORI,ORORD,ORDOC | 
|---|
| 11 | S ORUSR=+$G(ORUSR),ORPAT=+$G(ORPAT) | 
|---|
| 12 | D LISTUNS^ORRCOR(.ORORD,ORUSR,ORPAT,$G(ORDET)) | 
|---|
| 13 | D LISTUNS^ORRCTIU(.ORDOC,ORUSR,ORPAT,$G(ORDET)) | 
|---|
| 14 | S ORY=$NA(^TMP($J,"ORRCSIG")),ORN=0 K @ORY | 
|---|
| 15 | S ORI=0 F  S ORI=$O(@ORORD@(ORI)) Q:ORI<1  S ORN=ORN+1,@ORY@(ORN)=@ORORD@(ORI) | 
|---|
| 16 | S ORI=0 F  S ORI=$O(@ORDOC@(ORI)) Q:ORI<1  S ORN=ORN+1,@ORY@(ORN)=@ORDOC@(ORI) | 
|---|
| 17 | K @ORORD,@ORDOC | 
|---|
| 18 | Q | 
|---|
| 19 | ; | 
|---|
| 20 | DETAIL(ORY,ITEM) ; -- Return details of unsigned ITEMs | 
|---|
| 21 | ; where ITEM(#) = ID | 
|---|
| 22 | ;   in @ORY@(#) = Item=ID^Text^Date in HL7 format | 
|---|
| 23 | ;               = Text=line of report text | 
|---|
| 24 | ; RPC = ORRC UNSIGNED BY ID | 
|---|
| 25 | N ORN,ORI,ORID,ORO,ORD,ORORD,ORDOC | 
|---|
| 26 | S ORI="" F  S ORI=$O(ITEM(ORI)) Q:ORI=""  S ORID=ITEM(ORI) D | 
|---|
| 27 | . I ORID["OR" S ORO(ORI)=ORID | 
|---|
| 28 | . I ORID["DOC" S ORD(ORI)=ORID | 
|---|
| 29 | D DETAIL^ORRCOR(.ORORD,.ORO),TEXT^ORRCTIU(.ORDOC,.ORD) | 
|---|
| 30 | S ORY=$NA(^TMP($J,"ORRCSIG")),ORN=0 K @ORY | 
|---|
| 31 | S ORI=0 F  S ORI=$O(@ORORD@(ORI)) Q:ORI<1  S ORN=ORN+1,@ORY@(ORN)=@ORORD@(ORI) | 
|---|
| 32 | S ORI=0 F  S ORI=$O(@ORDOC@(ORI)) Q:ORI<1  S ORN=ORN+1,@ORY@(ORN)=@ORDOC@(ORI) | 
|---|
| 33 | K @ORORD,@ORDOC | 
|---|
| 34 | Q | 
|---|
| 35 | ; | 
|---|
| 36 | SIGN(ORY,ORNP,LOC,ESCODE,ITEM) ; -- Apply signature to ITEMs | 
|---|
| 37 | ; where ITEM(#) = ID for notes, or for orders | 
|---|
| 38 | ;               = ID^DFN^Release Flag^Signature Status^Nature of Order | 
|---|
| 39 | ;   in @ORY@(#) = ID^Success Indicator^Error Message (if 'Success) | 
|---|
| 40 | ; RPC = ORRC SIGN ITEMS | 
|---|
| 41 | N ORN,DFN,ORID,ORO,ORD,ORORD,ORDOC | 
|---|
| 42 | S ORI="" F  S ORI=$O(ITEM(ORI)) Q:ORI=""  D | 
|---|
| 43 | . S ORID=$P(ITEM(ORI),U) | 
|---|
| 44 | . I ORID["OR" S ORO(ORI)=$P(ORID,":",2)_U_$P(ITEM(ORI),U,2,5) | 
|---|
| 45 | . I ORID["DOC" D | 
|---|
| 46 | . . N ERROR | 
|---|
| 47 | . . D SIGN^TIUSRVP(.ERROR,$P(ORID,":",2),ESCODE) | 
|---|
| 48 | . . S ORDOC(ORI)=ORID_U_'+ERROR_$P(ERROR,U,2) | 
|---|
| 49 | I $D(ORO) D SIGNORDR(.ORORD,ORNP,LOC,.ORO) | 
|---|
| 50 | S ORY=$NA(^TMP($J,"ORRCSIG")),ORN=0 K @ORY | 
|---|
| 51 | S ORI=0 F  S ORI=$O(ORORD(ORI)) Q:ORI<1  S ORN=ORN+1,@ORY@(ORN)=ORORD(ORI) | 
|---|
| 52 | S ORI=0 F  S ORI=$O(ORDOC(ORI)) Q:ORI<1  S ORN=ORN+1,@ORY@(ORN)=ORDOC(ORI) | 
|---|
| 53 | Q | 
|---|
| 54 | SIGNORDR(ORORD,ORNP,LOC,ORO)    ; Sign orders | 
|---|
| 55 | N OROBYPT,DFN,OREI,ORNDX,ORERRS | 
|---|
| 56 | D SORTORDR(.ORBYPT,.ORO),INDEX(.ORNDX,.ORO,.ORORD) | 
|---|
| 57 | S DFN=0 F  S DFN=$O(ORBYPT(DFN)) Q:+DFN'>0  D | 
|---|
| 58 | . N ORLST M ORLST=ORBYPT(DFN) | 
|---|
| 59 | . ;D SIGN^ORWD(.ORERRS,DFN,ORNP,LOC,.ORLST) | 
|---|
| 60 | S OREI=0 F  S OREI=$O(ORERRS(OREI)) Q:+OREI'>0  D | 
|---|
| 61 | . N ORID,ORI S ORID=$P(ORERRS(OREI),U),ORI=$G(ORNDX(ORID)) | 
|---|
| 62 | . I +ORI S ORORD(ORI)=ORID_U_0_U_$P(ORERRS(OREI),U,2) | 
|---|
| 63 | Q | 
|---|
| 64 | TSTSORT ; Test SORTORDR and INDEX calls | 
|---|
| 65 | N ORO,ORI,ORBYPT,ORNDX,ORORD | 
|---|
| 66 | S ORO(1)="123^987^1^U^E" | 
|---|
| 67 | S ORO(3)="176^789^1^U^E" | 
|---|
| 68 | S ORO(5)="221^987^1^U^E" | 
|---|
| 69 | S ORO(6)="233^321^1^U^E" | 
|---|
| 70 | S ORO(9)="311^789^1^U^E" | 
|---|
| 71 | S ORO(15)="339^321^1^U^E" | 
|---|
| 72 | ;W ! S ORI=0 F  S ORI=$O(ORO(ORI)) Q:+ORI'>0  D | 
|---|
| 73 | ;. W !,"ORO(",ORI,")=",ORO(ORI) | 
|---|
| 74 | ;D SORTORDR(.ORBYPT,.ORO),INDEX(.ORNDX,.ORO,.ORORD) | 
|---|
| 75 | ;W ! ZW ORBYPT W ! ZW ORNDX W ! ZW ORORD | 
|---|
| 76 | Q | 
|---|
| 77 | SORTORDR(ORBYPT,ORO)    ; Sort orders by patient | 
|---|
| 78 | N ORI S ORI=0 | 
|---|
| 79 | F  S ORI=$O(ORO(ORI)) Q:+ORI'>0  D | 
|---|
| 80 | . N ORDER,DFN,ID S ORDER=ORO(ORI),DFN=$P(ORDER,U,2),ID=$P(ORDER,U) | 
|---|
| 81 | . S ORBYPT(DFN,ORI)=ID_U_$P(ORDER,U,3,5) | 
|---|
| 82 | Q | 
|---|
| 83 | INDEX(ORNDX,ORO,ORORD)  ; Index orders | 
|---|
| 84 | N ORI S ORI=0 | 
|---|
| 85 | F  S ORI=$O(ORO(ORI)) Q:+ORI'>0  D | 
|---|
| 86 | . N ORID S ORID=$P(ORO(ORI),U) | 
|---|
| 87 | . S ORNDX(ORID)=ORI,ORORD(ORI)=ORID_U_1 | 
|---|
| 88 | Q | 
|---|