[613] | 1 | AUPNPAT4 ; IHS/CMI/LAB - ENCRYPTED PATIENT IDENTIFIER ;
|
---|
| 2 | ;;1.0;PCE PATIENT CARE ENCOUNTER;**167**;Aug 12, 1996;Build 22
|
---|
| 3 | ;
|
---|
| 4 | Q
|
---|
| 5 | ;
|
---|
| 6 | ; This routine is passed a patient ien and returns an encrypted patient
|
---|
| 7 | ; identifier 12 bytes long. The entry point DEC reverses the process
|
---|
| 8 | ; and returns the decoded output in a 27 byte long string.
|
---|
| 9 | ;
|
---|
| 10 | ENC ;(DFN) ;EP - RETURN ENCRYPTED PATIENT IDENTIFIER
|
---|
| 11 | NEW AUPNV,AUPNX,AUPNY,I,X,X1,Y
|
---|
| 12 | S AUPNV=""
|
---|
| 13 | G:'$G(DFN) ENCX ; exit if no patient ien passed
|
---|
| 14 | G:'$D(^DPT(DFN,0)) ENCX ; exit if patient doesn't exist
|
---|
| 15 | ;----------
|
---|
| 16 | ; take 1st 3 chars of name, replace punctuation with numbers, pad out
|
---|
| 17 | ; to 3 chars
|
---|
| 18 | S AUPNX=$E($P($P(^DPT(DFN,0),U),","),1,3)
|
---|
| 19 | S AUPNX=$TR(AUPNX," '-.,","01234")
|
---|
| 20 | F I=1:1:(3-$L(AUPNX)) S AUPNX=AUPNX_"5"
|
---|
| 21 | S AUPNV=AUPNX
|
---|
| 22 | ;----------
|
---|
| 23 | ; take 1st initial, 0 if null
|
---|
| 24 | S AUPNX=$E($P($P(^DPT(DFN,0),U),",",2)) S:AUPNX="" AUPNX=0
|
---|
| 25 | ;----------
|
---|
| 26 | ; concatenate in reverse order
|
---|
| 27 | S AUPNV=$E(AUPNV,3)_$E(AUPNV,2)_$E(AUPNV)_AUPNX
|
---|
| 28 | ;----------
|
---|
| 29 | ; concatenate fileman date of birth (converted to $H/hex format)
|
---|
| 30 | S AUPNX=$$DOB^AUPNPAT(DFN) S:$L(AUPNX)'=7 AUPNX=3991231
|
---|
| 31 | S AUPNX=$$FMTH^XLFDT(AUPNX,1)
|
---|
| 32 | S X=AUPNX,X1=16 D CNV^XTBASE S Y=$E(Y,1,4)
|
---|
| 33 | F I=1:1:(4-$L(Y)) S Y=Y_"-"
|
---|
| 34 | S AUPNV=AUPNV_Y
|
---|
| 35 | ;----------
|
---|
| 36 | ; concatenate last 4 digits of SSN
|
---|
| 37 | S AUPNX=$E($$SSN^AUPNPAT(DFN),6,9) S:$L(AUPNX)'=4 AUPNX="9999"
|
---|
| 38 | F I=1:1:4 D
|
---|
| 39 | . S X=$E(AUPNX,I)
|
---|
| 40 | . I X<5 S X=X+5,$E(AUPNX,I)=X I 1
|
---|
| 41 | . E S X=X-5,$E(AUPNX,I)=X
|
---|
| 42 | . Q
|
---|
| 43 | S AUPNV=AUPNV_AUPNX
|
---|
| 44 | ;----------
|
---|
| 45 | ; shuffle
|
---|
| 46 | S AUPNV=$E(AUPNV,4,6)_$E(AUPNV,10,12)_$E(AUPNV,1,3)_$E(AUPNV,7,9)
|
---|
| 47 | ;----------
|
---|
| 48 | ; encrypt
|
---|
| 49 | D ENCRYPT
|
---|
| 50 | ;----------
|
---|
| 51 | ENCX ;
|
---|
| 52 | Q AUPNV
|
---|
| 53 | ;
|
---|
| 54 | ;
|
---|
| 55 | ENCRYPT ;
|
---|
| 56 | S AUPNV=$TR(AUPNV,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","UVWXJKLMYZABQRSTCDGHIEFNOP")
|
---|
| 57 | S AUPNV=$TR(AUPNV,"1234567890","8967320415")
|
---|
| 58 | Q
|
---|
| 59 | ;
|
---|
| 60 | ;
|
---|
| 61 | ;
|
---|
| 62 | DEC ;(PID) ;EP - RETURN DECRYPTED PATIENT IDENTIFIER
|
---|
| 63 | NEW AUPNV,AUPNX,AUPNY,I,X,X1,Y
|
---|
| 64 | S AUPNV=""
|
---|
| 65 | G:$G(PID)="" DECX ; exit if no string
|
---|
| 66 | G:$L(PID)'=12 DECX ; exit if string not 12 chars
|
---|
| 67 | S AUPNV="["
|
---|
| 68 | ;----------
|
---|
| 69 | ; decrypt
|
---|
| 70 | D DECRYPT
|
---|
| 71 | ;----------
|
---|
| 72 | ; unshuffle
|
---|
| 73 | S PID=$E(PID,7,9)_$E(PID,1,3)_$E(PID,10,12)_$E(PID,4,6)
|
---|
| 74 | ;----------
|
---|
| 75 | ; take 1st 3 chars of name, replace numbers with punctuation
|
---|
| 76 | S AUPNX=""
|
---|
| 77 | F I=3,2,1 S AUPNX=AUPNX_$E(PID,I)
|
---|
| 78 | S AUPNX=$TR(AUPNX,"01234"," '-.,")
|
---|
| 79 | S AUPNY=""
|
---|
| 80 | F I=1:1:3 S:$E(AUPNX,I)'="5" AUPNY=AUPNY_$E(AUPNX,I)
|
---|
| 81 | S AUPNX=AUPNY_","_$S($E(PID,4)'="0":$E(PID,4),1:"")
|
---|
| 82 | S AUPNV=AUPNV_AUPNX
|
---|
| 83 | ;----------
|
---|
| 84 | ; fileman date of birth (converted to external format)
|
---|
| 85 | S AUPNX=""
|
---|
| 86 | S X=$E(PID,5,8)
|
---|
| 87 | F I=1:1:4 S:$E(X,I)'="-" AUPNX=AUPNX_$E(X,I)
|
---|
| 88 | S X=AUPNX,X1=16 D DEC^XTBASE S AUPNX=Y
|
---|
| 89 | S AUPNX=$$HTE^XLFDT(AUPNX,1)
|
---|
| 90 | S AUPNV=AUPNV_"__"_AUPNX
|
---|
| 91 | ;----------
|
---|
| 92 | ; last 4 digits of SSN
|
---|
| 93 | S AUPNX=$E(PID,9,12)
|
---|
| 94 | F I=1:1:4 D
|
---|
| 95 | . S X=$E(AUPNX,I)
|
---|
| 96 | . I X<5 S X=X+5,$E(AUPNX,I)=X I 1
|
---|
| 97 | . E S X=X-5,$E(AUPNX,I)=X
|
---|
| 98 | . Q
|
---|
| 99 | S:AUPNX="9999" AUPNX=" "
|
---|
| 100 | S AUPNV=AUPNV_"__"_AUPNX
|
---|
| 101 | ;----------
|
---|
| 102 | S AUPNV=AUPNV_"]"
|
---|
| 103 | DECX ;
|
---|
| 104 | Q AUPNV
|
---|
| 105 | ;
|
---|
| 106 | DECRYPT ;
|
---|
| 107 | S PID=$TR(PID,"UVWXJKLMYZABQRSTCDGHIEFNOP","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
---|
| 108 | S PID=$TR(PID,"8967320415","1234567890")
|
---|
| 109 | Q
|
---|