- AUPNPAT4 ; IHS/CMI/LAB - ENCRYPTED PATIENT IDENTIFIER ;
- ;;99.1;IHS DICTIONARIES (PATIENT);;MAR 09, 1999
- ;
- Q
- ;
- ; This routine is passed a patient ien and returns an encrypted patient
- ; identifier 12 bytes long. The entry point DEC reverses the process
- ; and returns the decoded output in a 27 byte long string.
- ;
- ENC ;(DFN) ;EP - RETURN ENCRYPTED PATIENT IDENTIFIER
- NEW AUPNV,AUPNX,AUPNY,I,X,X1,Y
- S AUPNV=""
- G:'$G(DFN) ENCX ; exit if no patient ien passed
- G:'$D(^DPT(DFN,0)) ENCX ; exit if patient doesn't exist
- ;----------
- ; take 1st 3 chars of name, replace punctuation with numbers, pad out
- ; to 3 chars
- S AUPNX=$E($P($P(^DPT(DFN,0),U),","),1,3)
- S AUPNX=$TR(AUPNX," '-.,","01234")
- F I=1:1:(3-$L(AUPNX)) S AUPNX=AUPNX_"5"
- S AUPNV=AUPNX
- ;----------
- ; take 1st initial, 0 if null
- S AUPNX=$E($P($P(^DPT(DFN,0),U),",",2)) S:AUPNX="" AUPNX=0
- ;----------
- ; concatenate in reverse order
- S AUPNV=$E(AUPNV,3)_$E(AUPNV,2)_$E(AUPNV)_AUPNX
- ;----------
- ; concatenate fileman date of birth (converted to $H/hex format)
- S AUPNX=$$DOB^AUPNPAT(DFN) S:$L(AUPNX)'=7 AUPNX=3991231
- S AUPNX=$$FMTH^XLFDT(AUPNX,1)
- S X=AUPNX,X1=16 D CNV^XTBASE S Y=$E(Y,1,4)
- F I=1:1:(4-$L(Y)) S Y=Y_"-"
- S AUPNV=AUPNV_Y
- ;----------
- ; concatenate last 4 digits of SSN
- S AUPNX=$E($$SSN^AUPNPAT(DFN),6,9) S:$L(AUPNX)'=4 AUPNX="9999"
- F I=1:1:4 D
- . S X=$E(AUPNX,I)
- . I X<5 S X=X+5,$E(AUPNX,I)=X I 1
- . E S X=X-5,$E(AUPNX,I)=X
- . Q
- S AUPNV=AUPNV_AUPNX
- ;----------
- ; shuffle
- S AUPNV=$E(AUPNV,4,6)_$E(AUPNV,10,12)_$E(AUPNV,1,3)_$E(AUPNV,7,9)
- ;----------
- ; encrypt
- D ENCRYPT
- ;----------
- ENCX ;
- Q AUPNV
- ;
- ;
- ENCRYPT ;
- S AUPNV=$TR(AUPNV,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","UVWXJKLMYZABQRSTCDGHIEFNOP")
- S AUPNV=$TR(AUPNV,"1234567890","8967320415")
- Q
- ;
- ;
- ;
- DEC ;(PID) ;EP - RETURN DECRYPTED PATIENT IDENTIFIER
- NEW AUPNV,AUPNX,AUPNY,I,X,X1,Y
- S AUPNV=""
- G:$G(PID)="" DECX ; exit if no string
- G:$L(PID)'=12 DECX ; exit if string not 12 chars
- S AUPNV="["
- ;----------
- ; decrypt
- D DECRYPT
- ;----------
- ; unshuffle
- S PID=$E(PID,7,9)_$E(PID,1,3)_$E(PID,10,12)_$E(PID,4,6)
- ;----------
- ; take 1st 3 chars of name, replace numbers with punctuation
- S AUPNX=""
- F I=3,2,1 S AUPNX=AUPNX_$E(PID,I)
- S AUPNX=$TR(AUPNX,"01234"," '-.,")
- S AUPNY=""
- F I=1:1:3 S:$E(AUPNX,I)'="5" AUPNY=AUPNY_$E(AUPNX,I)
- S AUPNX=AUPNY_","_$S($E(PID,4)'="0":$E(PID,4),1:"")
- S AUPNV=AUPNV_AUPNX
- ;----------
- ; fileman date of birth (converted to external format)
- S AUPNX=""
- S X=$E(PID,5,8)
- F I=1:1:4 S:$E(X,I)'="-" AUPNX=AUPNX_$E(X,I)
- S X=AUPNX,X1=16 D DEC^XTBASE S AUPNX=Y
- S AUPNX=$$HTE^XLFDT(AUPNX,1)
- S AUPNV=AUPNV_"__"_AUPNX
- ;----------
- ; last 4 digits of SSN
- S AUPNX=$E(PID,9,12)
- F I=1:1:4 D
- . S X=$E(AUPNX,I)
- . I X<5 S X=X+5,$E(AUPNX,I)=X I 1
- . E S X=X-5,$E(AUPNX,I)=X
- . Q
- S:AUPNX="9999" AUPNX=" "
- S AUPNV=AUPNV_"__"_AUPNX
- ;----------
- S AUPNV=AUPNV_"]"
- DECX ;
- Q AUPNV
- ;
- DECRYPT ;
- S PID=$TR(PID,"UVWXJKLMYZABQRSTCDGHIEFNOP","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- S PID=$TR(PID,"8967320415","1234567890")
- Q
- AUPNPAT4 ; IHS/CMI/LAB - ENCRYPTED PATIENT IDENTIFIER ;
- +1 ;;99.1;IHS DICTIONARIES (PATIENT);;MAR 09, 1999
- +2 ;
- +3 QUIT
- +4 ;
- +5 ; This routine is passed a patient ien and returns an encrypted patient
- +6 ; identifier 12 bytes long. The entry point DEC reverses the process
- +7 ; and returns the decoded output in a 27 byte long string.
- +8 ;
- ENC ;(DFN) ;EP - RETURN ENCRYPTED PATIENT IDENTIFIER
- +1 NEW AUPNV,AUPNX,AUPNY,I,X,X1,Y
- +2 SET AUPNV=""
- +3 ; exit if no patient ien passed
- IF '$GET(DFN)
- GOTO ENCX
- +4 ; exit if patient doesn't exist
- IF '$DATA(^DPT(DFN,0))
- GOTO ENCX
- +5 ;----------
- +6 ; take 1st 3 chars of name, replace punctuation with numbers, pad out
- +7 ; to 3 chars
- +8 SET AUPNX=$EXTRACT($PIECE($PIECE(^DPT(DFN,0),U),","),1,3)
- +9 SET AUPNX=$TRANSLATE(AUPNX," '-.,","01234")
- +10 FOR I=1:1:(3-$LENGTH(AUPNX))
- SET AUPNX=AUPNX_"5"
- +11 SET AUPNV=AUPNX
- +12 ;----------
- +13 ; take 1st initial, 0 if null
- +14 SET AUPNX=$EXTRACT($PIECE($PIECE(^DPT(DFN,0),U),",",2))
- IF AUPNX=""
- SET AUPNX=0
- +15 ;----------
- +16 ; concatenate in reverse order
- +17 SET AUPNV=$EXTRACT(AUPNV,3)_$EXTRACT(AUPNV,2)_$EXTRACT(AUPNV)_AUPNX
- +18 ;----------
- +19 ; concatenate fileman date of birth (converted to $H/hex format)
- +20 SET AUPNX=$$DOB^AUPNPAT(DFN)
- IF $LENGTH(AUPNX)'=7
- SET AUPNX=3991231
- +21 SET AUPNX=$$FMTH^XLFDT(AUPNX,1)
- +22 SET X=AUPNX
- SET X1=16
- DO CNV^XTBASE
- SET Y=$EXTRACT(Y,1,4)
- +23 FOR I=1:1:(4-$LENGTH(Y))
- SET Y=Y_"-"
- +24 SET AUPNV=AUPNV_Y
- +25 ;----------
- +26 ; concatenate last 4 digits of SSN
- +27 SET AUPNX=$EXTRACT($$SSN^AUPNPAT(DFN),6,9)
- IF $LENGTH(AUPNX)'=4
- SET AUPNX="9999"
- +28 FOR I=1:1:4
- Begin DoDot:1
- +29 SET X=$EXTRACT(AUPNX,I)
- +30 IF X<5
- SET X=X+5
- SET $EXTRACT(AUPNX,I)=X
- IF 1
- +31 IF '$TEST
- SET X=X-5
- SET $EXTRACT(AUPNX,I)=X
- +32 QUIT
- End DoDot:1
- +33 SET AUPNV=AUPNV_AUPNX
- +34 ;----------
- +35 ; shuffle
- +36 SET AUPNV=$EXTRACT(AUPNV,4,6)_$EXTRACT(AUPNV,10,12)_$EXTRACT(AUPNV,1,3)_$EXTRACT(AUPNV,7,9)
- +37 ;----------
- +38 ; encrypt
- +39 DO ENCRYPT
- +40 ;----------
- ENCX ;
- +1 QUIT AUPNV
- +2 ;
- +3 ;
- ENCRYPT ;
- +1 SET AUPNV=$TRANSLATE(AUPNV,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","UVWXJKLMYZABQRSTCDGHIEFNOP")
- +2 SET AUPNV=$TRANSLATE(AUPNV,"1234567890","8967320415")
- +3 QUIT
- +4 ;
- +5 ;
- +6 ;
- DEC ;(PID) ;EP - RETURN DECRYPTED PATIENT IDENTIFIER
- +1 NEW AUPNV,AUPNX,AUPNY,I,X,X1,Y
- +2 SET AUPNV=""
- +3 ; exit if no string
- IF $GET(PID)=""
- GOTO DECX
- +4 ; exit if string not 12 chars
- IF $LENGTH(PID)'=12
- GOTO DECX
- +5 SET AUPNV="["
- +6 ;----------
- +7 ; decrypt
- +8 DO DECRYPT
- +9 ;----------
- +10 ; unshuffle
- +11 SET PID=$EXTRACT(PID,7,9)_$EXTRACT(PID,1,3)_$EXTRACT(PID,10,12)_$EXTRACT(PID,4,6)
- +12 ;----------
- +13 ; take 1st 3 chars of name, replace numbers with punctuation
- +14 SET AUPNX=""
- +15 FOR I=3,2,1
- SET AUPNX=AUPNX_$EXTRACT(PID,I)
- +16 SET AUPNX=$TRANSLATE(AUPNX,"01234"," '-.,")
- +17 SET AUPNY=""
- +18 FOR I=1:1:3
- IF $EXTRACT(AUPNX,I)'="5"
- SET AUPNY=AUPNY_$EXTRACT(AUPNX,I)
- +19 SET AUPNX=AUPNY_","_$SELECT($EXTRACT(PID,4)'="0":$EXTRACT(PID,4),1:"")
- +20 SET AUPNV=AUPNV_AUPNX
- +21 ;----------
- +22 ; fileman date of birth (converted to external format)
- +23 SET AUPNX=""
- +24 SET X=$EXTRACT(PID,5,8)
- +25 FOR I=1:1:4
- IF $EXTRACT(X,I)'="-"
- SET AUPNX=AUPNX_$EXTRACT(X,I)
- +26 SET X=AUPNX
- SET X1=16
- DO DEC^XTBASE
- SET AUPNX=Y
- +27 SET AUPNX=$$HTE^XLFDT(AUPNX,1)
- +28 SET AUPNV=AUPNV_"__"_AUPNX
- +29 ;----------
- +30 ; last 4 digits of SSN
- +31 SET AUPNX=$EXTRACT(PID,9,12)
- +32 FOR I=1:1:4
- Begin DoDot:1
- +33 SET X=$EXTRACT(AUPNX,I)
- +34 IF X<5
- SET X=X+5
- SET $EXTRACT(AUPNX,I)=X
- IF 1
- +35 IF '$TEST
- SET X=X-5
- SET $EXTRACT(AUPNX,I)=X
- +36 QUIT
- End DoDot:1
- +37 IF AUPNX="9999"
- SET AUPNX=" "
- +38 SET AUPNV=AUPNV_"__"_AUPNX
- +39 ;----------
- +40 SET AUPNV=AUPNV_"]"
- DECX ;
- +1 QUIT AUPNV
- +2 ;
- DECRYPT ;
- +1 SET PID=$TRANSLATE(PID,"UVWXJKLMYZABQRSTCDGHIEFNOP","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- +2 SET PID=$TRANSLATE(PID,"8967320415","1234567890")
- +3 QUIT