| 1 | XOBESIG ;Oakland/mko-ELECTRONIC SIGNATURE CODES ;9:29 AM  14 Jul 2006
 | 
|---|
| 2 |  ;;1.0;Electronic Signature;;Jul 14, 2006
 | 
|---|
| 3 |  ;;Foundations Electronic Signature Release v1.0 [Build: 1.0.0.024]
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | ISDEF(RESULT) ; -- Returns whether the user has an Electronic Signature Code defined.
 | 
|---|
| 6 |  ; Returns:
 | 
|---|
| 7 |  ;   0 : if the user has no esig defined
 | 
|---|
| 8 |  ;   1 : if the user does have an esig defined
 | 
|---|
| 9 |  ;  -2 : if DUZ doesn't refer to a valid user
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ; Remote Procedure: XOBE ESIG IS DEFINED
 | 
|---|
| 12 |  ;
 | 
|---|
| 13 |  NEW XOBESIG,XOBEMSG,DIERR
 | 
|---|
| 14 |  KILL RESULT
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ; -- Get current esig
 | 
|---|
| 17 |  SET XOBESIG=$$GET1^DIQ(200,+$GET(DUZ)_",",20.4,"I","","XOBEMSG")
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 |  ; -- Check result
 | 
|---|
| 20 |  IF $GET(DIERR),$DATA(XOBEMSG("DIERR","E",601)) SET RESULT=-2
 | 
|---|
| 21 |  ELSE  IF XOBESIG]"" SET RESULT=1
 | 
|---|
| 22 |  ELSE  SET RESULT=0
 | 
|---|
| 23 |  QUIT
 | 
|---|
| 24 |  ;
 | 
|---|
| 25 | GETCODE(RESULT) ; -- Get user's Electronic Signature Code
 | 
|---|
| 26 |  ; Return:
 | 
|---|
| 27 |  ;   Electronic signature code
 | 
|---|
| 28 |  ;   -2 : if DUZ doesn't refer to a valid user
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  ; Remote Procedure: XOBE ESIG GET CODE
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 |  NEW XOBESIG,XOBEMSG,DIERR
 | 
|---|
| 33 |  KILL RESULT
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 |  ; -- Get current esig
 | 
|---|
| 36 |  SET XOBESIG=$$GET1^DIQ(200,+$GET(DUZ)_",",20.4,"I","","XOBEMSG")
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  ; -- Return result
 | 
|---|
| 39 |  IF $GET(DIERR),$DATA(XOBEMSG("DIERR","E",601)) SET RESULT=-2
 | 
|---|
| 40 |  ELSE  IF XOBESIG="" SET RESULT=""
 | 
|---|
| 41 |  ELSE  SET RESULT=$$ENCRYP^XUSRB1(XOBESIG)
 | 
|---|
| 42 |  QUIT
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 | SETCODE(RESULT,XOBESIG) ; -- Save user's Electronic Signature Code
 | 
|---|
| 45 |  ; Return:
 | 
|---|
| 46 |  ;   1 : if new ESig was correctly filed
 | 
|---|
| 47 |  ;   0 : if new ESig code is not valid
 | 
|---|
| 48 |  ;  -1 : if new ESig is the same as the old one
 | 
|---|
| 49 |  ;  -2 : if DUZ doesn't refer to a valid user
 | 
|---|
| 50 |  ;
 | 
|---|
| 51 |  ; Remote Procedure: XOBE ESIG SET CODE
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  NEW X,XOBEIENS,XOBEOLD,XOBEFDA,XOBEMSG,DIERR
 | 
|---|
| 54 |  KILL RESULT
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 |  ; -- Get the old esig code
 | 
|---|
| 57 |  SET XOBEIENS=+$GET(DUZ)_","
 | 
|---|
| 58 |  SET XOBEOLD=$$GET1^DIQ(200,XOBEIENS,20.4,"I","","XOBEMSG")
 | 
|---|
| 59 |  IF $GET(DIERR) DO  QUIT
 | 
|---|
| 60 |  . IF $DATA(XOBEMSG("DIERR","E",601)) SET RESULT=-2
 | 
|---|
| 61 |  . ELSE  SET RESULT=0
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 |  ; -- Validate format of new esig
 | 
|---|
| 64 |  IF $GET(XOBESIG)="" SET RESULT=0 QUIT
 | 
|---|
| 65 |  SET X=$$DECRYP^XUSRB1(XOBESIG)
 | 
|---|
| 66 |  IF X'?.UNP!($LENGTH(X)>20)!($LENGTH(X)<6) SET RESULT=0 QUIT
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 |  ; -- Make sure old and new are different
 | 
|---|
| 69 |  DO HASH^XUSHSHP
 | 
|---|
| 70 |  IF X=XOBEOLD SET RESULT=-1 QUIT
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 |  ; -- Save the new code
 | 
|---|
| 73 |  SET XOBEFDA(200,XOBEIENS,20.4)=X
 | 
|---|
| 74 |  DO FILE^DIE("","XOBEFDA","XOBEMSG")
 | 
|---|
| 75 |  IF $GET(DIERR) SET RESULT=0 QUIT
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  SET RESULT=1
 | 
|---|
| 78 |  QUIT
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 | GETDATA(RESULT) ; -- Return electronic signature block-related data
 | 
|---|
| 81 |  ; Return:
 | 
|---|
| 82 |  ;   Electronic signature block-related data
 | 
|---|
| 83 |  ;   -2 : if DUZ doesn't refer to a valid user
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 |  ; Remote Procedure: XOBE ESIG GET DATA
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 |  NEW XOBEIENS,XOBEFLDS,XOBETARG,XOBEMSG,DIERR
 | 
|---|
| 88 |  KILL RESULT
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 |  ; -- Setup input variables to GETS^DIQ call
 | 
|---|
| 91 |  SET XOBEIENS=+$GET(DUZ)_","
 | 
|---|
| 92 |  SET XOBEFLDS="1;20.2;20.3;.132;.137;.138"
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  ; -- Get data
 | 
|---|
| 95 |  DO GETS^DIQ(200,XOBEIENS,XOBEFLDS,"I","XOBETARG","XOBEMSG")
 | 
|---|
| 96 |  IF $GET(DIERR) DO  QUIT
 | 
|---|
| 97 |  . IF $DATA(XOBEMSG("DIERR","E",601)) SET RESULT=-2
 | 
|---|
| 98 |  . ELSE  SET RESULT=""
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 |  ; -- Put data into RESULT array
 | 
|---|
| 101 |  SET RESULT(1)=$$VALUE($GET(XOBETARG(200,XOBEIENS,1,"I"))) ;initial
 | 
|---|
| 102 |  SET RESULT(2)=$$VALUE($GET(XOBETARG(200,XOBEIENS,20.2,"I"))) ;sig blk printed name
 | 
|---|
| 103 |  SET RESULT(3)=$$VALUE($GET(XOBETARG(200,XOBEIENS,20.3,"I"))) ;sig blk title
 | 
|---|
| 104 |  SET RESULT(4)=$$VALUE($GET(XOBETARG(200,XOBEIENS,.132,"I"))) ;office phone
 | 
|---|
| 105 |  SET RESULT(5)=$$VALUE($GET(XOBETARG(200,XOBEIENS,.137,"I"))) ;voice pager
 | 
|---|
| 106 |  SET RESULT(6)=$$VALUE($GET(XOBETARG(200,XOBEIENS,.138,"I"))) ;digital pager
 | 
|---|
| 107 |  QUIT
 | 
|---|
| 108 |  ;
 | 
|---|
| 109 | VALUE(X) ; -- Return X or if X is "", return @
 | 
|---|
| 110 |  QUIT $SELECT($GET(X)="":"@",1:X)
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 | SETDATA(RESULT,XOBEVALS) ; -- Save electronic signature block-related data
 | 
|---|
| 113 |  ; Return:
 | 
|---|
| 114 |  ;            1 : if successfully filed
 | 
|---|
| 115 |  ;           -2 : if DUZ doesn't refer to a valid user
 | 
|---|
| 116 |  ;   error text : if Filer call failed
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 |  ; Remote Procedure: XOBE ESIG SET DATA
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  NEW XOBEFDA,DIERR,XOBEMSG,XOBEIENS
 | 
|---|
| 121 |  KILL RESULT
 | 
|---|
| 122 |  SET XOBEIENS=+$GET(DUZ)_","
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 |  ; -- Setup up FDA for FILE^DIE call
 | 
|---|
| 125 |  SET XOBEFDA(200,XOBEIENS,1)=$GET(XOBEVALS("initial"))
 | 
|---|
| 126 |  SET XOBEFDA(200,XOBEIENS,20.2)=$GET(XOBEVALS("signature block printed name"))
 | 
|---|
| 127 |  SET XOBEFDA(200,XOBEIENS,20.3)=$GET(XOBEVALS("signature block title"))
 | 
|---|
| 128 |  SET XOBEFDA(200,XOBEIENS,.132)=$GET(XOBEVALS("office phone"))
 | 
|---|
| 129 |  SET XOBEFDA(200,XOBEIENS,.137)=$GET(XOBEVALS("voice pager"))
 | 
|---|
| 130 |  SET XOBEFDA(200,XOBEIENS,.138)=$GET(XOBEVALS("digital pager"))
 | 
|---|
| 131 |  ;
 | 
|---|
| 132 |  ; -- File the data
 | 
|---|
| 133 |  DO FILE^DIE("ET","XOBEFDA","XOBEMSG")
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 |  ; -- Handle errors
 | 
|---|
| 136 |  IF $GET(DIERR) DO  QUIT
 | 
|---|
| 137 |  . ; -- Entry not found error
 | 
|---|
| 138 |  . IF $DATA(XOBEMSG("DIERR","E",601)) SET RESULT(1)=-2 QUIT
 | 
|---|
| 139 |  . ;
 | 
|---|
| 140 |  . ; -- Put error message into RESULT array
 | 
|---|
| 141 |  . NEW ERR,LN
 | 
|---|
| 142 |  . SET ERR=0 FOR  SET ERR=$ORDER(XOBEMSG("DIERR",ERR)) QUIT:'ERR  DO
 | 
|---|
| 143 |  .. DO ADDTEXT("Error #"_XOBEMSG("DIERR",ERR),.RESULT)
 | 
|---|
| 144 |  .. DO ADDTEXT("--------------",.RESULT)
 | 
|---|
| 145 |  .. SET LN=0 FOR  SET LN=$ORDER(XOBEMSG("DIERR",ERR,"TEXT",LN)) QUIT:'LN  DO
 | 
|---|
| 146 |  ... DO ADDTEXT(XOBEMSG("DIERR",ERR,"TEXT",LN),.RESULT)
 | 
|---|
| 147 |  .. ;
 | 
|---|
| 148 |  .. ; -- If the error returned is 701 (invalid input),
 | 
|---|
| 149 |  .. ; -- put the ? help for the field into the RESULT array
 | 
|---|
| 150 |  .. IF XOBEMSG("DIERR",ERR)=701 DO ADDHELP(.XOBEMSG,ERR,.RESULT)
 | 
|---|
| 151 |  ;
 | 
|---|
| 152 |  ; -- Values were successfully saved
 | 
|---|
| 153 |  SET RESULT(1)=1
 | 
|---|
| 154 |  QUIT
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 | ADDHELP(XOBEMSG,ERR,RESULT) ;
 | 
|---|
| 157 |  NEW FILE,IENS,FIELD,LINE,MSG,DIERR,DIHELP
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 |  ; -- Get file/field information from the XOBEMSG array
 | 
|---|
| 160 |  SET FILE=$GET(XOBEMSG("DIERR",ERR,"PARAM","FILE"))
 | 
|---|
| 161 |  SET IENS=$GET(XOBEMSG("DIERR",ERR,"PARAM","IENS"))
 | 
|---|
| 162 |  SET FIELD=$GET(XOBEMSG("DIERR",ERR,"PARAM","FIELD"))
 | 
|---|
| 163 |  ;
 | 
|---|
| 164 |  ; -- Get the ? help for the field
 | 
|---|
| 165 |  DO HELP^DIE(FILE,IENS,FIELD,"?","MSG")
 | 
|---|
| 166 |  ;
 | 
|---|
| 167 |  ; -- Add the ? help to the RESULT array
 | 
|---|
| 168 |  SET LINE=0 FOR  SET LINE=$ORDER(MSG("DIHELP",LINE)) Q:'LINE  DO
 | 
|---|
| 169 |  . DO ADDTEXT(MSG("DIHELP",LINE),.RESULT)
 | 
|---|
| 170 |  DO ADDTEXT("",.RESULT)
 | 
|---|
| 171 |  QUIT
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 | ADDTEXT(TEXT,RESULT) ;Add TEXT to RESULT array
 | 
|---|
| 174 |  NEW NODE
 | 
|---|
| 175 |  SET NODE=$ORDER(RESULT(" "),-1)+1
 | 
|---|
| 176 |  SET RESULT(NODE)=$GET(TEXT)
 | 
|---|
| 177 |  QUIT
 | 
|---|
| 178 |  ;
 | 
|---|
| 179 | VALIDATE(RESULT,XOBESIG) ; -- Return whether passed ESig is valid
 | 
|---|
| 180 |  ; Return:
 | 
|---|
| 181 |  ;   1 if ESig is valid
 | 
|---|
| 182 |  ;   0 if ESig is invalid
 | 
|---|
| 183 |  ;  -1 if ESig is null
 | 
|---|
| 184 |  ;  -2 if DUZ doesn't refer to a valid user
 | 
|---|
| 185 |  ; This entry point is not currently used.
 | 
|---|
| 186 |  ;
 | 
|---|
| 187 |  NEW X,XOBECURR,XOBEIENS,XOBEMSG,DIERR
 | 
|---|
| 188 |  KILL RESULT
 | 
|---|
| 189 |  ;
 | 
|---|
| 190 |  ; -- Get esig from New Person file
 | 
|---|
| 191 |  SET XOBEIENS=+$GET(DUZ)_","
 | 
|---|
| 192 |  SET XOBECURR=$$GET1^DIQ(200,XOBEIENS,20.4,"I","","XOBEMSG")
 | 
|---|
| 193 |  ;
 | 
|---|
| 194 |  ; -- Check that DUZ refers to a valid user
 | 
|---|
| 195 |  IF $GET(DIERR),$DATA(XOBEMSG("DIERR","E",601)) SET RESULT=-2 QUIT
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 |  ; -- Check for null esig
 | 
|---|
| 198 |  IF XOBECURR="" SET RESULT=-1 QUIT
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 |  ; -- Check whether old matches value passed in
 | 
|---|
| 201 |  SET X=$$DECRYP^XUSRB1(XOBESIG)
 | 
|---|
| 202 |  DO HASH^XUSHSHP
 | 
|---|
| 203 |  SET RESULT=X=XOBECURR
 | 
|---|
| 204 |  QUIT
 | 
|---|