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

PSOERXI1.m

Go to the documentation of this file.
  1. PSOERXI1 ;ALB/BWF - eRx Utilities/RPC's ; 12/10/22 11:24am
  1. ;;7.0;OUTPATIENT PHARMACY;**581,617,692,706,700,743,746,783**;DEC 1997;Build 1
  1. ;
  1. ;
  1. ;Reference to MAKEADD^TIUSRVP2 in ICR #4795
  1. Q
  1. ; File incoming XML into appropriate file
  1. ; XML - xml text
  1. ; PRCHK - provider check information
  1. ; PACHK - patient check information
  1. ; DACHK - drug auto check
  1. ; STATION - station #
  1. ; DIV - institution name^NPI
  1. ; ERXHID - eRx processing hub id^CANCEL/CHANGE REQUEST DENIED BY HUB (1=YES)^relates to hub ID
  1. ; ERXVALS - code values for NIST codes (potency unit code^form code^strength code^prohibit renewals - change response (y/n))
  1. ; XML2 - structured sig from the medication prescribed segment
  1. ; VADAT - DUZ^RXIEN
  1. ; XML3 - third stream of XML
  1. INCERX(RES,XML,PRCHK,PACHK,DACHK,STATION,DIV,ERXHID,ERXVALS,XML2,VADAT,XML3) ;
  1. ;p783 This error handling prevents delays at the eRx Hub because it always returns a result
  1. N $ESTACK,$ETRAP S $ETRAP="D ERROR^PSOERXI1"
  1. N CURREC,FDA,EIEN,ERRTXT,ERRSEQ,PACNT,PASCNT,PAICN,PAIEN,VAINST,NPI,VAOI,VPATINST,PRVAUTOV
  1. S NPI=$P($G(DIV),U,2)
  1. S CURREC=$$PARSE^PSOERXI2(.XML,.ERXVALS,NPI,.XML2,.XML3)
  1. I $P(CURREC,U)<1 D Q
  1. . I $L($P(CURREC,U,2)) S RES=CURREC Q
  1. . S RES="0^XML received. Error creating or finding associated record in the ERX Holding queue." Q
  1. S EIEN=CURREC
  1. S CURREC=CURREC_","
  1. ;If this is an outbound message, file the users DUZ and quit back the response. no drug, patient, or provider auto checks will occur
  1. I $G(VADAT)]"" D Q
  1. . I $P($G(VADAT),U)>1 D
  1. . . S FDA(52.49,CURREC,51.1)=DUZ D FILE^DIE(,"FDA") K FDA
  1. . I $P(VADAT,U,2) D
  1. . . S FDA(52.49,CURREC,.13)=$P(VADAT,U,2) D FILE^DIE(,"FDA") K FDA
  1. . S RES="1^Erx Received."
  1. ;Process auto-validation results. Only log positive results for now
  1. K FDA
  1. I $P($G(VADAT),U) S RES="1^Message Filed." Q
  1. ;
  1. ;Drug Auto-Check (Moved from Hub to VistA - P-692)
  1. I $G(DACHK("success"))="false" D
  1. . N MSGTYPE,MEDSEG,MTCHDRUG,PRDCODE,PRDCOQL,DRGNAME
  1. . S MSGTYPE=$O(^TMP($J,"PSOERXO1","Message",0,"Body",0,"")) I MSGTYPE="" Q
  1. . S MEDSEG="MedicationPrescribed"
  1. . I '$D(^TMP($J,"PSOERXO1","Message",0,"Body",0,MSGTYPE,0,MEDSEG)) D
  1. . . S MEDSEG="MedicationResponse"
  1. . S PRDCODE=$G(^TMP($J,"PSOERXO1","Message",0,"Body",0,MSGTYPE,0,MEDSEG,0,"DrugCoded",0,"ProductCode",0,"Code",0)) I PRDCODE="" Q
  1. . S PRDCOQL=$E($G(^TMP($J,"PSOERXO1","Message",0,"Body",0,MSGTYPE,0,MEDSEG,0,"DrugCoded",0,"ProductCode",0,"Qualifier",0)),1)
  1. . I PRDCOQL'="N",PRDCOQL'="U" Q
  1. . S DRGNAME=$G(^TMP($J,"PSOERXO1","Message",0,"Body",0,MSGTYPE,0,MEDSEG,0,"DrugDescription",0))
  1. . D DRGMTCH^PSOERXA0(.MTCHDRUG,PRDCOQL_"^"_PRDCODE,DRGNAME)
  1. . I +$G(MTCHDRUG) D
  1. . . K DACHK S DACHK("success")="true",DACHK("IEN")=+MTCHDRUG
  1. ;
  1. I $G(DACHK("success"))="true" D
  1. . I $G(DACHK("IEN")) D
  1. . .;Saving the eRx Audit Log For Auto-Matched Drug
  1. . . S NEWVAL(1)=$$GET1^DIQ(50,DACHK("IEN"),.01)_" (NDC#: "_$$GETNDC^PSSNDCUT(DACHK("IEN"))_")"
  1. . . D AUDLOG^PSOERXUT(+CURREC,"DRUG",$$PROXYDUZ^PSOERXUT(),.NEWVAL)
  1. . .;Setting Matched Drug and Auto Match info
  1. . . S FDA(52.49,CURREC,1.4)=1
  1. . . S FDA(52.49,CURREC,3.2)=DACHK("IEN")
  1. . . S FDA(52.49,CURREC,44)=1
  1. . . S VAOI=$$GET1^DIQ(50,DACHK("IEN"),2.1,"I")
  1. . . S VPATINST=$$GET1^DIQ(50.7,VAOI,7,"E")
  1. . . I $L(VPATINST) D
  1. . . . S (NEWVAL(1),FDA(52.49,CURREC,27))=VPATINST
  1. . . . D AUDLOG^PSOERXUT(+CURREC,"PATIENT INSTRUCTIONS",$$PROXYDUZ^PSOERXUT(),.NEWVAL)
  1. ;
  1. I $G(DACHK("success"))="false" D
  1. . S ERRTXT=$G(DACHK("error"))
  1. . S ERRSEQ=$$ERRSEQ^PSOERXU1(EIEN) Q:'ERRSEQ
  1. . D FILERR^PSOERXU1(CURREC,ERRSEQ,"D","E",ERRTXT)
  1. ;
  1. ;Provider Auto-Check (Moved from Hub to VistA - P-692)
  1. I $G(PRCHK("success"))="false" D
  1. . N TMP,MSGTYPE,MTCHPROV,TMP,NPI,DEA,CS
  1. . S MSGTYPE=$O(^TMP($J,"PSOERXO1","Message",0,"Body",0,"")) I MSGTYPE="" Q
  1. . S DEA=$G(^TMP($J,"PSOERXO1","Message",0,"Body",0,MSGTYPE,0,"Prescriber",0,"NonVeterinarian",0,"Identification",0,"DEANumber",0))
  1. . S NPI=$G(^TMP($J,"PSOERXO1","Message",0,"Body",0,MSGTYPE,0,"Prescriber",0,"NonVeterinarian",0,"Identification",0,"NPI",0))
  1. . S CS=($G(^TMP($J,"PSOERXO1","Message",0,"Header",0,"DigitalSignature",0,"SignatureValue",0))'="")
  1. . D PRVMTCH^PSOERXA0(.MTCHPROV,NPI,DEA,CS)
  1. . I +$G(MTCHPROV) D
  1. . . K PRCHK S PRCHK("success")="true",PRCHK("IEN")=+MTCHPROV
  1. ;
  1. ;Auto-Matching Provider
  1. I $G(PRCHK("success"))="true",PRCHK("IEN") D
  1. . S FDA(52.49,CURREC,1.2)=1
  1. . S FDA(52.49,CURREC,2.3)=PRCHK("IEN")
  1. . ;Auto-Validating Provider if auto-match was successful
  1. . ;Condition: Non-CS eRx only & Last name, first letter of first name and zip code 5 digits must match
  1. . S PRVAUTOV=0
  1. . I '$$GET1^DIQ(52.49,+CURREC,95.1,"I") D
  1. . . N EPRVIEN,EPRVNAM,EPRVZC,VPRVIEN,VPRVNAM,VPRVZC
  1. . . S EPRVIEN=$$GET1^DIQ(52.49,+CURREC,2.1,"I")
  1. . . S EPRVNAM=$$UP^XLFSTR($TR($$GET1^DIQ(52.48,EPRVIEN,.01)," "))
  1. . . S EPRVZC=$P($$GET1^DIQ(52.48,EPRVIEN,4.5),"-")
  1. . . S VPRVIEN=PRCHK("IEN") I '$$CHKPRV2^PSOERX1A(VPRVIEN) Q
  1. . . S VPRVNAM=$$UP^XLFSTR($TR($$GET1^DIQ(200,VPRVIEN,.01)," "))
  1. . . S VPRVZC=$P($$GET1^DIQ(200,VPRVIEN,.116),"-")
  1. . . I $E(EPRVNAM,1,$F(EPRVNAM,","))'=$E(VPRVNAM,1,$F(VPRVNAM,",")) Q
  1. . . I $E(EPRVZC,1,5)'=$E(VPRVZC,1,5) Q
  1. . . S FDA(52.49,CURREC,1.3)=1
  1. . . S FDA(52.49,CURREC,1.8)=$$PROXYDUZ^PSOERXUT()
  1. . . S FDA(52.49,CURREC,1.9)=$$NOW^XLFDT()
  1. . . S FDA(52.49,CURREC,2.7)=1
  1. . . S PRVAUTOV=1
  1. . ;Saving the eRx Audit Log for the Auto-Matched Provider
  1. . S NEWVAL(1)=$$GET1^DIQ(200,PRCHK("IEN"),.01)_" (DEA#: "_$P($$VADEA^PSOERXU8(PRCHK("IEN"),+CURREC),"^",2)_")"_$S(PRVAUTOV:" - AUTO-VALIDATED",1:"")
  1. . D AUDLOG^PSOERXUT(+CURREC,"PROVIDER",$$PROXYDUZ^PSOERXUT(),.NEWVAL)
  1. ;
  1. I $G(PRCHK("success"))="false" D
  1. . S ERRTXT=$G(PRCHK("error"))
  1. . S ERRSEQ=$$ERRSEQ^PSOERXU1(EIEN) Q:'ERRSEQ
  1. . D FILERR^PSOERXU1(CURREC,ERRSEQ,"PR","E",ERRTXT)
  1. ;
  1. I $G(PACHK("MVIerror"))']"" D
  1. . S PAICN=+$P($G(PACHK("ICN")),"V")
  1. . I PAICN D
  1. . . S (PAIEN,PACNT)=0 F S PAIEN=$O(^DPT("AICN",PAICN,PAIEN)) Q:'PAIEN D
  1. . . . S PACNT=PACNT+1
  1. . . . ;revisit in future build - if we find more than one match in the local system, do we log some sort of an error?
  1. . I $G(PACNT)=1 D Q
  1. . . S FDA(52.49,CURREC,1.6)=1
  1. . . S FDA(52.49,CURREC,.05)=$O(^DPT("AICN",PAICN,0))
  1. . I $L(PACHK("ssn")) D
  1. . . S (PASCNT,PAIEN)=0 F S PAIEN=$O(^DPT("SSN",$TR(PACHK("ssn"),"-",""),PAIEN)) Q:'PAIEN D
  1. . . . S PASCNT=PASCNT+1
  1. . I $G(PASCNT)=1 D Q
  1. . . S FDA(52.49,CURREC,1.6)=1
  1. . . S FDA(52.49,CURREC,.05)=$O(^DPT("SSN",$TR(PACHK("ssn"),"-",""),0))
  1. ;
  1. ;Saving the eRx Audit Log For Auto-Matched Patient
  1. I $G(FDA(52.49,CURREC,.05)) D
  1. . N DFN,VADM S DFN=+FDA(52.49,CURREC,.05) D DEM^VADPT
  1. . S NEWVAL(1)=$$GET1^DIQ(2,DFN,.01)_" (L4SSN: "_$P($P(VADM(2),"^",2),"-",3)_" | DOB: "_$P(VADM(3),"^",2)_")"
  1. . D AUDLOG^PSOERXUT(+CURREC,"PATIENT",$$PROXYDUZ^PSOERXUT(),.NEWVAL)
  1. ;
  1. I $D(FDA) D FILE^DIE(,"FDA") K FDA
  1. ;
  1. I $G(PACHK("success"))="false" D
  1. .; file e&e error
  1. . S ERRTXT=$G(PACHK("EandEerror")) I ERRTXT]"" D
  1. . . S ERRSEQ=$$ERRSEQ^PSOERXU1(EIEN) Q:'ERRSEQ
  1. . . D FILERR^PSOERXU1(CURREC,ERRSEQ,"PA","E",ERRTXT)
  1. .; file mvi error
  1. . S ERRTXT=$G(PACHK("MVIerror")) I ERRTXT]"" D
  1. . . S ERRSEQ=$$ERRSEQ^PSOERXU1(EIEN) Q:'ERRSEQ
  1. . . D FILERR^PSOERXU1(CURREC,ERRSEQ,"PA","E",ERRTXT)
  1. ;
  1. S RES="1^Erx Received."
  1. ;
  1. ;Create an Addendum for eRx Change Response Progress Note
  1. I $G(EIEN)'="",$$GET1^DIQ(52.49,EIEN,.08,"I")="CX" D CREATEADD(ERXHID,EIEN)
  1. Q
  1. ;
  1. CREATEADD(ERXHID,EIEN) ;Create CPRS Progress Notes Addendum for this eRx Change Response
  1. ;Input: ERXHID - eRx processing hub id^CANCEL/CHANGE REQUEST DENIED BY HUB (1=YES)^relates to hub ID
  1. ; EIEN - The eRx Change Response IEN, Pointer to ERX HOLDING QUEUE file (#52.49)
  1. ;Output: Create an Addendum and attach it to the parent eRx Change Request
  1. ;
  1. I ($G(ERXHID)="")!($G(EIEN)="") Q
  1. N CNT,CRERXIEN,ORGERXIEN,ERXDRUG,CRMEDS,CNT,CXTARGET,ERXDRUG,PSOTIUIEN,TIUDADD,ERXTIUX
  1. ;
  1. S CRERXIEN=$O(^PS(52.49,"B",$P(ERXHID,"^",3),0))
  1. S ORGERXIEN=$P($G(^PS(52.49,CRERXIEN,0)),"^",14)
  1. S ORGERXIEN=$O(^PS(52.49,"B",ORGERXIEN,0))
  1. ;
  1. ;get the parent reference IEN TIU Document
  1. S PSOTIUIEN=$$GET1^DIQ(52.49,CRERXIEN,320.1)
  1. I '$G(PSOTIUIEN) D Q
  1. . D BLDCRMEDS(ERXHID,.DACHK,"ERX RX CHANGE REQUEST NOTE")
  1. ;
  1. S CXTARGET=$NA(^TMP("TIUP",$J)) K @CXTARGET
  1. D BUILDLST^PSOERSE4(CXTARGET,EIEN)
  1. Q:'$D(@CXTARGET)
  1. K ERXTIUX M ERXTIUX("TEXT")=@CXTARGET
  1. D MAKEADD^TIUSRVP2(.TIUDADD,PSOTIUIEN,.ERXTIUX) ;PSOTIUIEN is the parent IEN from The TIU Document Definition name in File #8925.1
  1. D UPDATEPN^PSOERX1H(.TIUDADD,$G(ORGERXIEN)) ;TIUDADD is the Addendum IEN
  1. Q
  1. ;
  1. BLDCRMEDS(ERXHID,DACHK,TIUTITLE) ;Build eRx Change Response Medication array
  1. ;get the original eRx
  1. Q:$G(ERXHID)=""
  1. N CRERXIEN,ORGERXIEN,ERXDRUG,CRMEDS
  1. ;
  1. S CRERXIEN=$O(^PS(52.49,"B",$P(ERXHID,"^",3),0))
  1. S ORGERXIEN=$P($G(^PS(52.49,CRERXIEN,0)),"^",14)
  1. S ORGERXIEN=$O(^PS(52.49,"B",ORGERXIEN,0))
  1. S CNT=0
  1. I $D(DACHK("IEN")) D
  1. . S ERXDRUG=$$GET1^DIQ(50,DACHK("IEN"),.01)
  1. . S CNT=CNT+1,CRMEDS(CNT)="^"_ERXDRUG
  1. ;
  1. D CREATEPN^PSOERX1H(ORGERXIEN,EIEN,,.CRMEDS,TIUTITLE) ;create eRx Change Response PN
  1. ;
  1. Q
  1. ; VAL - value to resolve
  1. ; TYPE - This is the code type, which will tell which 'C' index type to get the code from
  1. PRESOLV(VAL,TYPE) ;
  1. N MATCH
  1. S MATCH=""
  1. Q:'$L(TYPE)!('$L(VAL)) "" ; avoid null subscript
  1. S MATCH=$O(^PS(52.45,"C",TYPE,VAL,0))
  1. ; return the match found, null if no match
  1. Q MATCH
  1. CONVDTTM(VAL) ;
  1. N EDATE,ETIME,X,ETZ,Y
  1. I '$L(VAL) Q ""
  1. S EDATE=$P(VAL,"T"),ETIME=$P(VAL,"T",2)
  1. ; split off time zone
  1. S ETZ=$P(ETIME,".",2)
  1. S ETIME=$P(ETIME,".")
  1. S X=EDATE D ^%DT I 'Y Q ""
  1. S VAL=Y_$S($L(ETIME):"."_$TR(ETIME,":",""),1:"")
  1. Q VAL
  1. ERROR ;p783 Error Handling
  1. D ^%ZTER
  1. S RES="1^eRx received but there was an error. See error trap at "_$P($TR($$SITE^VASITE(),"^","-"),"-",1,2)
  1. Q