Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: PSOPKIV1

PSOPKIV1.m

Go to the documentation of this file.
  1. PSOPKIV1 ;BHAM ISC/MHA - validate PKI cert. ; 05/09/2002 8:15 am
  1. ;;7.0;OUTPATIENT PHARMACY;**131,146,223,148,249,391,426,462,572,630,545**;DEC 1997;Build 270
  1. ;Ref. to ^ORDEA is supported by DBIA 5709
  1. ;Ref. to ^ORB supported by DBIA 1362
  1. ;Ref. to ^XUSSPKI supported by DBIA 3539
  1. ;*545 - Replaced 'Certificate expired' with 'Rx processed: PIV Card Cert Expired - NO ACTION REQ'
  1. ;*545 - Replaced 'Certificate revoked' with 'Rx NOT processed: PIV Card Certificate Revoked'
  1. CER ;
  1. ;N PKIRT
  1. N PKIRT,MSG ;572
  1. D VERIFY(.PKIRT,ORD)
  1. S PKI=+PKIRT I PKI=1!(PKI=89802020) D Q
  1. . ;S PKI1=1,VALMSG="Digitally Signed Order",PKIE="Processing "_VALMSG
  1. . S PKI1=1,MSG="Digitally Signed Order",PKIE="Processing "_MSG ;572
  1. . I PKI=89802020 S PKIE=PKIE_": "_$P($T(@($E(PKI,7,8))),";;",2)
  1. I PKI<2 S VALMSG=$P(PKIRT,"^",2) Q
  1. S PKI1=$S(PKI>89802014&(PKI<89802020)!((PKI>89802020)&(PKI<89802031)):2,1:1)
  1. S PKIE="Digital Signature Failed: "_$P($T(@($E(PKI,7,8))),";;",2)
  1. I PKI1=2 D
  1. .S VALMSG="Signature Failed: "_$P($T(@($E(PKI,7,8))),";;",2)
  1. .S PKIE=PKIE_" - Order Auto Discontinued"
  1. S:$L(PKIE)>80 PKIE=$E(PKIE,1,80)
  1. Q
  1. L1 ;
  1. S PKID=1,IEN=IEN+1,^TMP($S($G(ST)=1:"PSOAO",1:"PSOPO"),$J,IEN,0)=PKIE
  1. Q
  1. ERR(ER) ;
  1. Q:'ER
  1. N ERM S ERM=$P($T(@($E(ER,7,8))),";;",2) I ERM]"" Q "Signature Failed: "_ERM
  1. Q ""
  1. REA ;
  1. D KV^PSOVER1
  1. W ! S DIR("A")="Enter Override Reason ",DIR(0)="F^5:70",DIR("?")="Free text reason must be entered, should be between 5 to 70 characters and must not contain embedded up-arrow, e.g. Spoke with the Provider."
  1. S:$G(PKIR)]"" DIR("B")=PKIR D ^DIR S:'$D(DIRUT) PKIR=Y
  1. I $D(DIRUT) K PKIR I $D(OR0) S:$P(OR0,"^",3)="RNW" PSONEW("QFLG")=1 S:$P(OR0,"^",3)="NW" PSORX("DFLG")=1
  1. D KV^PSOVER1 K Y Q
  1. ACT(DA) ;
  1. Q:'DA
  1. N I,J D AR
  1. S ^PSRX(DA,"A",0)="^52.3DA^"_J_"^"_J,^PSRX(DA,"A",J,0)=%_"^K^"_DUZ_"^0^INVALID PKI CERT. "_PKI
  1. S ^PSRX(DA,"A",J,2,1,0)=PKIR,^PSRX(DA,"A",J,2,0)="^52.34A^1^1"
  1. K PKIR Q
  1. ;
  1. AR ;
  1. S (I,J)=0 F S I=$O(^PSRX(DA,"A",I)) Q:'I S J=I
  1. S J=J+1 D NOW^%DTC Q
  1. DCP ;
  1. Q:'$D(^PS(52.41,ORD,0)) N PKIOR,PKIORM
  1. K ^PS(52.41,"AOR",$P(^PS(52.41,ORD,0),"^",2),+$P($G(^PS(52.41,ORD,"INI")),"^"),ORD),^PS(52.41,"AD",$P(^PS(52.41,ORD,0),"^",12),+$P($G(^PS(52.41,ORD,"INI")),"^"),ORD)
  1. S $P(^PS(52.41,ORD,0),"^",3)="DC"
  1. S PKIE=$P(PKIE," - ")_" - "_PKI,$P(^PS(52.41,ORD,4),"^")=PKIE
  1. S PKIOR=$E(PKI,7,8)
  1. S PKIORM=$S(PKIOR=16:"16:Order has been modified. Resubmit or contact Pharmacy.",PKIOR=17:"17:PIV Certificate revoked. Resubmit or contact Pharmacy.",1:PKIE)
  1. D EN^PSOHLSN($P(^PS(52.41,ORD,0),"^"),"OC",PKIORM,"A")
  1. D ^PSOPKIV2
  1. Q
  1. ;
  1. DCV ;
  1. W ! D KV^PSOVER1 K PKIR S DIR(0)="Y",DIR("B")="N",DIR("A",1)="Digitally signed Schedule II Rx cannot be deleted, it can only be D/Ced."
  1. S DIR("A")="Are you sure you want to D/C this Rx: " D ^DIR,KV^PSOVER1
  1. I 'Y S VALMSG="No Action Taken!",VALMBCK="R" Q
  1. S:'$D(INCOM) INCOM="DCed by Pharmacy for PKI" S DIR("B")=INCOM
  1. ;
  1. W ! S DIR("A")="Reason for D/Cing",DIR(0)="F^5:75",DIR("?")="Reason must be entered and should be 5 to 75 characters and must not contain embedded uparrow"
  1. D ^DIR I $D(DIRUT) D KV^PSOVER1 S VALMSG="No Action Taken!",VALMBCK="R" Q
  1. S PKIR=Y D KV^PSOVER1
  1. DCV0 Q:'$D(^PS(52.4,DA,0))
  1. S $P(^PSRX(DA,"STA"),"^")=12,$P(^PSRX(DA,3),"^",5)=DT
  1. D REVERSE^PSOBPSU1(DA,,"DC",7),CAN^PSOTPCAN(DA) N I,J D AR
  1. S ^PSRX(DA,"A",J,0)=%_"^C^"_DUZ_"^0^Discontinued during verification"
  1. S J=J+1 D ADR
  1. N PKIX S PKIX=DA D EN^PSOHLSN1(DA,"OD","",PKIR,PSONOOR)
  1. S DA=PKIX S DIK="^PS(52.4," D ^DIK K DIK
  1. Q
  1. ;
  1. DCV1 N PKIR,PSONOOR,DA S DA=PSONV,PKIR=$P($G(PKIE),"-")_" - "_PKI,PSONOOR="A" D DCV0
  1. Q
  1. ADR ;
  1. S ^PSRX(DA,"A",0)="^52.3DA^"_J_"^"_J
  1. S ^PSRX(DA,"A",J,0)=%_"^K^"_DUZ_"^0^Digitally signed"
  1. S ^PSRX(DA,"A",J,2,1,0)=$S($G(PKIR)]"":PKIR,1:"Digitally signed order Discontinued"),^PSRX(DA,"A",J,2,0)="^52.34A^1^1"
  1. Q
  1. RV ;
  1. N TY,T,T1,T2,MIG,SG
  1. S (T,T2)=0
  1. F S T=$O(^PS(52.41,ORD,"OBX",T)) Q:'T D
  1. .S T1=0,$P(TY(T2)," ",23)=" "
  1. .F S T1=$O(^PS(52.41,ORD,"OBX",T,2,T1)) Q:'T1 D
  1. ..S MIG=^PS(52.41,ORD,"OBX",T,2,T1,0)
  1. ..F SG=1:1:$L(MIG," ") S:$L(TY(T2)_" "_$P(MIG," ",SG))>80 T2=T2+1,$P(TY(T2)," ",23)=" " S TY(T2)=$G(TY(T2))_" "_$P(MIG," ",SG)
  1. .S T2=T2+4
  1. Q
  1. ;
  1. VERIFY(RET,PSIEN) ;Verify PKI Data
  1. ;PSIEN = IEN of file 52.41 ;ORIFN;ACTION - NOTE: if no ACTION then 1 (new order) is assumed
  1. ;Returned values: "1" if digital signature verifies
  1. ; "-1^error message" if DS fails during initial parameter checking
  1. ; "898020xx^message" if DS fails during verification
  1. ;
  1. N PSO0,DFN,PSIG,I,INFO,INF1,DEA,INST,HASH,DATE
  1. I $G(PSIEN)="" S RET="-1^Invalid order number" Q
  1. K ^TMP("PSOPKIDATA",$J)
  1. S PSO0=$G(^PS(52.41,PSIEN,0))
  1. S ^TMP("PSOPKIDATA",$J,"ISSUANCE DATE",1)=$$FMTE^XLFDT($P($P(PSO0,"^",6),"."))
  1. ;patient inf
  1. S DFN=$P(PSO0,"^",2) D DEM^VADPT,ADD^VADPT
  1. S ^TMP("PSOPKIDATA",$J,"PATIENT NAME",2)=VADM(1)
  1. S ^TMP("PSOPKIDATA",$J,"PATIENT ADDRESS",3)=VAPA(1)_"^"_VAPA(2)_"^"_VAPA(3)_"^"_VAPA(4)_"^"_$P(VAPA(5),"^")_"^"_$P(VAPA(5),"^",2)_"^"_VAPA(6)_"^"_VAPA(7)
  1. S ^TMP("PSOPKIDATA",$J,"QUANTITY",5)=$P(PSO0,"^",10)
  1. K ^TMP($J,"ORDEA")
  1. D ARCHIVE^ORDEA(+PSO0)
  1. ;POS DOSE
  1. N J,INF0,INF1,PSIG
  1. S J=0 F S J=$O(^PS(52.41,PSIEN,1,J)) Q:'J D
  1. .S INF0=$G(^PS(52.41,PSIEN,9,J,0)),INF1=$G(^PS(52.41,PSIEN,1,J,1))
  1. .S PSIG=INF0_"|"_$P(INF1,"^")_"|"_$S($E($P(INF1,"^",2))="L":"M"_$E($P(INF1,"^",2),2,99),1:$P(INF1,"^",2))_"|"_$P(INF1,"^",6)_"|"_$P(INF1,"^",8)
  1. .S ^TMP("PSOPKIDATA",$J,"DIRECTIONS",6,J)=PSIG
  1. I +$P(PSO0,"^",9),+$P(PSO0,"^",25) S ^TMP("PSOPKIDATA",$J,"DRUG NAME",4)=$$GET1^DIQ(50,$P(PSO0,"^",9),.01)
  1. S DEA=$P($G(^TMP($J,"ORDEA",+PSO0,2)),"^")
  1. S ^TMP("PSOPKIDATA",$J,"PROVIDER NAME",8)=$$GET1^DIQ(200,$P(PSO0,"^",5),.01)
  1. I $D(^TMP($J,"ORDEA",+PSO0,3)) S ^TMP("PSOPKIDATA",$J,"PROVIDER ADDRESS",9)=$P(^(3),"^",2,6)
  1. E D INSTAD
  1. K ^TMP($J,"ORDEA")
  1. D KVA^VADPT
  1. S ^TMP("PSOPKIDATA",$J,"DEA NUMBER",10)=DEA
  1. S ^TMP("PSOPKIDATA",$J,"ORDER NUMBER",11)=$P(PSO0,"^")
  1. S HASH=$$HASHRTN^ORDEA($P(PSO0,"^"))
  1. I '$L(HASH) S RET="-1^Order has no PKI Hash" G VQT
  1. S DATE=$$FMTE^XLFDT($P($P(PSO0,"^",6),"."))
  1. I '$L(DATE) S RET="-1^No date associated with order" G VQT
  1. I +$P($P(^OR(100,+PSO0,8,$O(^OR(100,+PSO0,8,999),-1),0),"^",6),".") S ^TMP("PSOPKIDATA",$J,"ISSUANCE DATE",1)=$$FMTE^XLFDT($P($P(^OR(100,+PSO0,8,$O(^OR(100,+PSO0,8,999),-1),0),"^",6),".")) ;PSO*7*462
  1. S RET=$$VERIFY^XUSSPKI(HASH,$NA(^TMP("PSOPKIDATA",$J)))
  1. I RET="OK"!(RET["No error found for this certificate or chain") S RET=1 G VQT
  1. N ECD S ECD=898020
  1. I RET[ECD S RET=$P(RET,"^",2) G VQT
  1. I RET["not time-valid" S RET=ECD_"20" G VQT
  1. I RET["has been revoked" S RET=ECD_"17" G VQT
  1. I RET["does not have a valid signature" S RET=ECD_"22" G VQT
  1. I RET["not properly time-nested" S RET=ECD_"23" G VQT
  1. I RET["not valid in its proposed usage" S RET=ECD_"24" G VQT
  1. I RET["based on an untrusted root" S RET=ECD_"25" G VQT
  1. I RET["certificates in the certificate chain is unknown" S RET=ECD_"26" G VQT
  1. I RET["authority that the original certificate had certified" S RET=ECD_"27" G VQT
  1. I RET["certificate chain is not complete" S RET=ECD_"28" G VQT
  1. I RET["this chain did not have a valid signature" S RET=ECD_"29" G VQT
  1. I RET["not valid for this usage" S RET=ECD_"30" G VQT
  1. VQT ;
  1. K ^TMP("PSOPKIDATA",$J)
  1. Q
  1. ;
  1. INSTAD ;
  1. S INST=$P($G(^PS(52.41,PSIEN,"INI")),"^")
  1. D GETS^DIQ(4,INST,".01;1.01;1.02;1.03;1.04;.02","E","VADR")
  1. S VADD(1)=$G(VADR(4,INST_",",.01,"E")),VADD(2)=$G(VADR(4,INST_",",1.01,"E")),VADD(3)=$G(VADR(4,INST_",",1.02,"E"))
  1. S VADD(4)=$G(VADR(4,INST_",",1.03,"E")),VADD(5)=$G(VADR(4,INST_",",.02,"E")),VADD(6)=$G(VADR(4,INST_",",1.04,"E"))
  1. S ^TMP("PSOPKIDATA",$J,"PROVIDER ADDRESS",9)=VADD(1)_"^"_VADD(2)_"^"_VADD(3)_"^"_VADD(4)_"^"_VADD(5)_"^"_VADD(6)
  1. Q
  1. ;
  1. HSHCHK(ARET,PNP) ;Compares digitally signed archived data in file #101.52 against data in OP pending file #52.41
  1. ;PSO*7*391/JAM
  1. ;Input - PNP - Pending file IEN
  1. ;
  1. ;Output - returns 1 if the archived data matches the pending file
  1. ; 0 if initial parameter checking fails
  1. ; -1 if comparison fails; and return array with failed items
  1. ;
  1. N DFN,PND0,DRGNM,DEA,DETOX,DFN,J,I,INST,NAM,SIGFL,DOSE,DOSEP,DOSEX,DFRM,TMP,VADD,VADR,INF0,INF1,ASIG,PSIG,ORP,ND
  1. I $G(PNP)="" S ARET=0 Q ARET
  1. S PND0=$G(^PS(52.41,PNP,0)) I PND0="" S ARET=0 Q ARET
  1. S ORP=$P(PND0,"^") I ORP="" S ARET=0 Q ARET
  1. ;get archived data from CPRS
  1. K ^TMP($J,"ORDEA")
  1. D ARCHIVE^ORDEA(ORP)
  1. I '$D(^TMP($J,"ORDEA")) S ARET=0 Q ARET
  1. F I=1:1:5 S TMP(I)=$G(^TMP($J,"ORDEA",ORP,I))
  1. I $P($P(PND0,"^",6),".")'=$P(TMP(1),"^",2) S ARET=-1,ARET("ISSUANCE DATE")=$P(TMP(1),"^",2)_"^"_$P($P(PND0,"^",6),".")
  1. S DRGNM=$$GET1^DIQ(50,$P(PND0,"^",9),.01)
  1. I DRGNM'=$P(TMP(1),"^",3) S ARET=-1,ARET("DRUG NAME")=$P(TMP(1),"^",3)_"^"_DRGNM
  1. I $P(PND0,"^",10)'=$P(TMP(1),"^",6) S ARET=-1,ARET("QTY PRESCRIBED")=$P(TMP(1),"^",6)_"^"_$P(PND0,"^",10)
  1. ;provider info
  1. S INST=$P($G(^PS(52.41,PNP,"INI")),"^")
  1. ;*545
  1. S DEA=$$RXDEA^PSOUTIL(,ORP)
  1. I DEA'=$P(TMP(2),"^") S ARET=-1,ARET("DEA #")=$P(TMP(2),"^")_"^"_DEA
  1. S NAM=$$GET1^DIQ(200,$P(PND0,"^",5),.01) I NAM'=$P(TMP(2),"^",3) S ARET=-1,ARET("PROVIDER NAME")=$P(TMP(2),"^",3)_"^"_NAM
  1. ;patient inf
  1. S DFN=$P(PND0,"^",2) D DEM^VADPT,ADD^VADPT
  1. I VADM(1)'=$P(TMP(4),"^") S ARET=-1,ARET("PATIENT NAME")=$P(TMP(4),"^")_"^"_VADM(1)
  1. I VAPA(1)'=$P(TMP(5),"^") S ARET=-1,ARET("PATIENT ADDRESS #1")=$P(TMP(5),"^")_"^"_VAPA(1)
  1. I VAPA(2)'=$P(TMP(5),"^",2) S ARET=-1,ARET("PATIENT ADDRESS #2")=$P(TMP(5),"^",2)_"^"_VAPA(2)
  1. I VAPA(3)'=$P(TMP(5),"^",3) S ARET=-1,ARET("PATIENT ADDRESS #3")=$P(TMP(5),"^",3)_"^"_VAPA(3)
  1. I VAPA(4)'=$P(TMP(5),"^",4) S ARET=-1,ARET("PATIENT CITY")=$P(TMP(5),"^",4)_"^"_VAPA(4)
  1. I $P(VAPA(5),"^",2)'=$P(TMP(5),"^",5) S ARET=-1,ARET("PATIENT STATE")=$P(TMP(5),"^",5)_"^"_$P(VAPA(5),"^",2)
  1. I VAPA(6)'=$P(TMP(5),"^",6) S ARET=-1,ARET("PATIENT ZIP+4")=$P(TMP(5),"^",6)_"^"_VAPA(6)
  1. ;sig
  1. M ASIG=^TMP($J,"ORDEA",ORP,6)
  1. S I=0 F S I=$O(^PS(52.41,PNP,1,I)) Q:'I D
  1. .S INF0=$G(^PS(52.41,PNP,9,I,0)),INF1=$G(^PS(52.41,PNP,1,I,1))
  1. .S PSIG(I)=INF0_"|"_$P(INF1,"^")_"|"_$P(INF1,"^",2)_"|"_$P(INF1,"^",6)_"|"_$P(INF1,"^",8)
  1. S I=0 F S I=$O(ASIG(I)) Q:'I I ASIG(I)'=$G(PSIG(I)) S ND="SIG #"_I,ARET=-1 S ARET(ND)=ASIG(I)_"^"_$G(PSIG(I))
  1. D KVA^VADPT
  1. K ^TMP($J,"ORDEA")
  1. Q $S($G(ARET):ARET,1:1)
  1. ;
  1. ALERT ;
  1. ; ORN=76 - Notification ID (ifn from OE/RR Notifications file #100.9)
  1. ; ORBDFN=Patient DFN from Patient file #2
  1. ; ORNUM=Order ifn from Order file #100
  1. ; ORBADUZ=Provider DUZ - Array of notification recipients requested by the calling package.
  1. ; ORBPMSG=Message text
  1. ; ORBPDATA=This is an identifier of the package entry which the notification is based on.
  1. ; For radiology: Rad/Nuc Med exam/case ifn's(format: exam_ifn;case_ifn)
  1. ; For consults: the IEN of the consult in file 123
  1. N PSOX S PSOX=1
  1. S PSOX(+$P(OR0,"^",5))=""
  1. D EN^ORB3(76,PSODFN,$P(OR0,"^"),.PSOX,"Rx processed: PIV Card Cert Expired - NO ACTION REQ","") ;PSO*7*630
  1. Q
  1. ;
  1. 00 ;;Order Text is blank;;
  1. 01 ;;DEA # missing;;
  1. 02 ;;Drug Schedule missing;;
  1. 03 ;;DEA # not valid;;
  1. 04 ;;Valid Certificate not found;;
  1. 05 ;;Couldn't load CSP;;
  1. 06 ;;Smart card Reader not found;;
  1. 07 ;;Certificate with DEA # not found;;
  1. 08 ;;Certificate not valid for schedule;;
  1. 10 ;;Crypto Error (contact IRM);;
  1. 15 ;;Corrupted (Decode failure);;
  1. 16 ;;Corrupted (Hash mismatch);;
  1. 17 ;;Rx NOT processed: PIV Card Certificate Revoked;;
  1. 18 ;;Verification failure;;
  1. 19 ;;Before Cert effective date;;
  1. 20 ;;Rx processed: PIV Card Cert Expired - NO ACTION REQ;;
  1. 21 ;;No Cert with a valid date found;;
  1. 22 ;;Signature Check failed (Invalid Signature);;
  1. 23 ;;CERT_IS_NOT_TIME_NESTED;;
  1. 24 ;;CERT_IS_NOT_VALID_FOR_USAGE;;
  1. 25 ;;CERT_IS_UNTRUSTED_ROOT;;
  1. 26 ;;CERT_REVOCATION_STATUS_UNKNOWN;;
  1. 27 ;;CERT_IS_CYCLIC;;
  1. 28 ;;CERT_IS_PARTIAL_CHAIN;;
  1. 29 ;;CERT_CTL_IS_NOT_SIGNATURE_VALID;;
  1. 30 ;;CERT_CTL_IS_NOT_VALID_FOR_USAGE;;