| 1 | ORWOR1 ; slc/dcm - PKI RPC functions | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**132,141,163**;Dec 17, 1997 | 
|---|
| 3 | SIG(RET,ID,X1,X2,X3,X4,ORX5,X6) ;Store the signature. | 
|---|
| 4 | ;ID = orifn;action | 
|---|
| 5 | ;X1 = Hash | 
|---|
| 6 | ;X2 = Length of the array | 
|---|
| 7 | ;X3 = Datafile (100) | 
|---|
| 8 | ;X4 = Provider DUZ | 
|---|
| 9 | ;ORX5 = Array for the sig | 
|---|
| 10 | ;X6 = CRLURL | 
|---|
| 11 | N Y1,ORIFN,ACT | 
|---|
| 12 | S Y1=$$STORESIG^XUSSPKI(X1,X2,.ORX5,X4,X3) | 
|---|
| 13 | I +Y1>0,$L($G(X6)) S Y1=$$CRLURL^XUSSPKI(X6) | 
|---|
| 14 | I +Y1>0 D | 
|---|
| 15 | . S ORIFN=+ID,ACT=$P(ID,";",2) | 
|---|
| 16 | . S $P(^OR(100,ORIFN,8,+ACT,2),"^",3)=X1 | 
|---|
| 17 | S RET=Y1 | 
|---|
| 18 | Q | 
|---|
| 19 | CRLURL(RET,X1) ;Store the URL's | 
|---|
| 20 | S RET=$$CRLURL^XUSSPKI(X1) | 
|---|
| 21 | Q | 
|---|
| 22 | VERIFY(RET,ORDER,DFN)       ;Verify PKI Data | 
|---|
| 23 | ;DBIA #3750 | 
|---|
| 24 | ;ORDER = ORIFN;ACTION - NOTE: if no ACTION then 1 (new order) is assumed | 
|---|
| 25 | ;Returned values: "1" if digital signature verifies | 
|---|
| 26 | ;                 "-1^error message" if DS fails during initial parameter checking | 
|---|
| 27 | ;                 "898020xx^message" if DS fails during verification | 
|---|
| 28 | N ORIFN,ORACTION,HASH,DATE | 
|---|
| 29 | K ^TMP("ORPKIDATA",$J) | 
|---|
| 30 | I '$G(ORDER) S RET="-1^No order number passed" Q | 
|---|
| 31 | I '$G(DFN) S RET="-1^No DFN passed" Q | 
|---|
| 32 | S ORIFN=$P(ORDER,";"),ORACTION=$P(ORDER,";",2) | 
|---|
| 33 | I 'ORACTION S ORACTION=1 | 
|---|
| 34 | I '$D(^OR(100,ORIFN,0)) S RET="-1^Invalid order number" Q | 
|---|
| 35 | I DFN'=+$P(^OR(100,ORIFN,0),"^",2) S RET="-1^DFN does not match patient on order" Q | 
|---|
| 36 | I '$D(^OR(100,ORIFN,8,ORACTION)) S RET="-1^Invalid order action passed" Q | 
|---|
| 37 | S HASH=$P($G(^OR(100,ORIFN,8,ORACTION,2)),"^",3) | 
|---|
| 38 | I '$L(HASH) S RET="-1^Order has no PKI Hash" Q | 
|---|
| 39 | I '$O(^OR(100,ORIFN,8,ORACTION,.2,0)) S RET="-1^Order has no PKI Data" Q | 
|---|
| 40 | S DATE=$P($G(^OR(100,ORIFN,8,ORACTION,.2,1,0)),"^") | 
|---|
| 41 | I '$L(DATE) S RET="-1^No date associated with PKI Data" Q | 
|---|
| 42 | S DATE=$$HL7TFM^XLFDT(DATE),I=0 | 
|---|
| 43 | F  S I=$O(^OR(100,ORIFN,8,ORACTION,.2,I)) Q:'I  S ^TMP("ORPKIDATA",$J,I)=^(I,0) | 
|---|
| 44 | S RET=$$VERIFY^XUSSPKI(HASH,$NA(^TMP("ORPKIDATA",$J)),DATE) | 
|---|
| 45 | I RET="OK" S RET=1 Q | 
|---|
| 46 | I $E(RET,1,7)="-898020" S RET=$E(RET,2,99) | 
|---|
| 47 | Q | 
|---|
| 48 | CHKDIG(REQ,ORDER)       ;Check if Digital Signature is required | 
|---|
| 49 | N IFN,ACTION | 
|---|
| 50 | S REQ=0,IFN=+ORDER,ACTION=$P(ORDER,";",2) | 
|---|
| 51 | I +$P($G(^OR(100,+IFN,8,+ACTION,2)),U,5) S REQ=1 | 
|---|
| 52 | Q | 
|---|
| 53 | GETDTEXT(TEXT,ORDER)    ;Get External Text | 
|---|
| 54 | N IFN,ACTION | 
|---|
| 55 | S IFN=+ORDER,ACTION=$P(ORDER,";",2),I=0 | 
|---|
| 56 | F  S I=$O(^OR(100,+IFN,8,+ACTION,.2,I)) Q:'I  S TEXT(I)=^(I,0) | 
|---|
| 57 | Q | 
|---|
| 58 | GETDSIG(SIG,ORDER)      ;Get Digital Signature | 
|---|
| 59 | N IFN,ACTION | 
|---|
| 60 | S SIG=0,IFN=+ORDER,ACTION=$P(ORDER,";",2) | 
|---|
| 61 | I +$P($G(^OR(100,+IFN,8,+ACTION,2)),U,3) S SIG=$P(^(2),"^",3) | 
|---|
| 62 | Q | 
|---|
| 63 | GETDEA(Y,ORUSER)        ;Get user DEA | 
|---|
| 64 | S Y=$$DEA^XUSER(,$G(ORUSER)) | 
|---|
| 65 | Q | 
|---|
| 66 | GETDSCH(Y,ORDER)       ;Check if Drug Schedule | 
|---|
| 67 | N IFN,ACTION | 
|---|
| 68 | S IFN=+ORDER,ACTION=$P(ORDER,";",2) | 
|---|
| 69 | S Y=$P($G(^OR(100,+IFN,8,+ACTION,2)),U,4) | 
|---|
| 70 | Q | 
|---|
| 71 | SETDTEXT(Y,ORDER,ORDEA,ORSIGNER)        ;Set Digital Text data into file 100 & return the array | 
|---|
| 72 | ;ORDER = ORIFN;ACTION | 
|---|
| 73 | ;ORDEA = Schedule of Drug (2-5) | 
|---|
| 74 | ;ORSIGNER = DUZ of signer | 
|---|
| 75 | N ORSET,IFN,ACT,I | 
|---|
| 76 | S Y="-1^Digital Text failed to build",IFN=+ORDER,ACT=$P(ORDER,";",2) | 
|---|
| 77 | I '$G(ORDEA) Q | 
|---|
| 78 | I '$G(ORSIGNER) S ORSIGNER=DUZ | 
|---|
| 79 | D DIGTEXT^ORCSAVE1(IFN,ORDEA,ORSIGNER) | 
|---|
| 80 | S Y=0 | 
|---|
| 81 | I '$G(ORSET) Q | 
|---|
| 82 | K ^OR(100,IFN,8,ACT,.2) | 
|---|
| 83 | F I=1:1:ORSET S (Y(I),^OR(100,IFN,8,ACT,.2,I,0))=ORSET(I) | 
|---|
| 84 | S ^OR(100,IFN,8,ACT,.2,0)="^^"_ORSET_"^"_ORSET_"^"_DT_"^",Y=ORSET | 
|---|
| 85 | Q | 
|---|
| 86 | GETDATA(Y,ORDER,DFN)    ;Get PKI Data | 
|---|
| 87 | ;DBIA #3750 | 
|---|
| 88 | ;On error: Y = -1^Error message | 
|---|
| 89 | ;Else: Y = 1^ Order # ^ Nature of order ^ Order Status ^ Date Signed | 
|---|
| 90 | ;Y(1) = Patient name ^ Street1 ^ Street2 ^ Street3 ^ City ^ State ^ Zip | 
|---|
| 91 | ;Y(2) = Drug name_strength_dosage form (Dispense drug) ^ Drug IEN (file 50) ^ Drug quantity prescribed ^ Schedule of medication ^ DEA Schedule | 
|---|
| 92 | ;Y(3) = Directions for use (SIG) | 
|---|
| 93 | ;Y(4) = Practitioner's name ^ DUZ ^ Practitioner's (DEA) registration number | 
|---|
| 94 | ;Y(5) = SiteName ^ SiteStreet1  ^ SiteStreet2 ^ SiteCity  ^ SiteState ^ SiteZip | 
|---|
| 95 | ;Y(6) = Orderable Item ^ Orderable Item IEN (file 101.43) | 
|---|
| 96 | N X0,X1,X2,X3,X4,X5,X6,ORNAT,ORSTAT | 
|---|
| 97 | I '$D(^OR(100,+$G(ORDER),0)) S Y="-1^INVALID ORDER #" Q | 
|---|
| 98 | I $G(DFN)'=+$P(^OR(100,ORDER,0),"^",2) S Y="-1^INVALID PATIENT ID" Q | 
|---|
| 99 | I '$D(^OR(100,ORDER,8,1,.2,0)) S Y="-1^MISSING DIGITAL SIGNATURE TEXT" Q | 
|---|
| 100 | S X0=$G(^OR(100,ORDER,8,1,0)) | 
|---|
| 101 | I $P($G(^OR(100,ORDER,8,1,0)),"^",4)'=7 S Y="-1^ORDER HAS NOT BEEN DIGITALLY SIGNED" Q | 
|---|
| 102 | S X1=$G(^OR(100,ORDER,8,1,.2,1,0)) | 
|---|
| 103 | I DFN'=$P(X1,"^",4) S Y="-1^PKI PATIENT ID DOES NOT MATCH DFN" Q | 
|---|
| 104 | S ORNAT=$P(X0,"^",12),ORSTAT=$P($G(^OR(100,ORDER,3)),"^",3) | 
|---|
| 105 | I ORNAT S ORNAT=$P($G(^ORD(100.02,ORNAT,0)),"^") | 
|---|
| 106 | I ORSTAT S ORSTAT=ORSTAT_";"_$P(^ORD(100.01,ORSTAT,0),"^") | 
|---|
| 107 | S Y="1^"_ORDER_"^"_ORNAT_"^"_ORSTAT_"^"_$P(X0,"^",6) | 
|---|
| 108 | S X2=$G(^OR(100,ORDER,8,1,.2,2,0)),X3=$G(^OR(100,ORDER,8,1,.2,3,0)),X4=$G(^OR(100,ORDER,8,1,.2,4,0)),X5=$G(^OR(100,ORDER,8,1,.2,5,0)),X6=$G(^OR(100,ORDER,8,1,.2,6,0)) | 
|---|
| 109 | S X3=$$VALUE^ORX8(ORDER,"DRUG",,"E")_"^"_$$VALUE^ORX8(ORDER,"DRUG",,"I")_"^"_$P(X3,"^",3,99) | 
|---|
| 110 | S Y(1)=$P(X1,"^",2)_"^"_X2 | 
|---|
| 111 | S Y(2)=X3,Y(3)=X4,Y(4)=X5,Y(5)=X6 | 
|---|
| 112 | S Y(6)=$$VALUE^ORX8(ORDER,"ORDERABLE",,"E")_"^"_$$VALUE^ORX8(ORDER,"ORDERABLE",,"I") | 
|---|
| 113 | Q | 
|---|