VEPERI3 ;DAOU/WCJ - Incoming HL7 messages ;10/10/06 15:11 ;;1.0;VOEB;;Jun 12, 2005 ;;;VISTA OFFICE/EHR; ;;Per VHA Directive 10-93-142, this routine should not be modified. ; ;**Program Description** ; Find patient ; Add if not found and addflag set Q ; ; Find the patient's DFN ; If patient can not be found, add it or save it off depending on the flag being ; passed in ; FINDPAT(HLP,FE,DFN,NPADDFLG,HLMTIEN) ; N NAME,DOB,HRN,ID,SEX,MSHDTTM,%DT,X,RESULT,MBI,SSN ; S FE=0 ; ; There are some required fields to lookup a patient S MSHDTTM=$$GETDATA("MSH",1000,6) I MSHDTTM="" D Q . S FE=$$FATALERR^VEPERI6(1,"DATA","REQUIRED PATIENT IDENTIFIER - MSH DATE/TIME MISSING",HLMTIEN,.HLP) Q ; S NAME=$$GETDATA("PID",1000,5) I NAME="" D Q . S FE=$$FATALERR^VEPERI6(1,"DATA","REQUIRED PATIENT IDENTIFIER - NAME MISSING",HLMTIEN,.HLP) Q ; S DOB=$$GETDATA("PID",1000,7) I DOB="" D Q . S FE=$$FATALERR^VEPERI6(1,"DATA","REQUIRED PATIENT IDENTIFIER - DOB MISSING",HLMTIEN,.HLP) Q I DOB["/" D Q:FE . S %DT="",X=DOB D ^%DT . I Y>0 S DOB=Y Q . S FE=$$FATALERR^VEPERI6(1,"DATA","REQUIRED PATIENT IDENTIFIER - DOB INVALID",HLMTIEN,.HLP) Q ; ; This won't be there since we are no longer doing a 2 way interface ; S HRN=$$GETDATA("PID",1000,2) ;not required S HRN="" ; S ID=$$GETDATA("PID",1000,3) I ID="" D Q . S FE=$$FATALERR^VEPERI6(1,"DATA","REQUIRED PATIENT IDENTIFIER - ID MISSING",HLMTIEN,.HLP) Q ; S SEX=$$GETDATA("PID",1000,8) I SEX="" D Q . S FE=$$FATALERR^VEPERI6(1,"DATA","REQUIRED PATIENT IDENTIFIER - SEX MISSING",HLMTIEN,.HLP) Q ; S RESULT=$$LKUP^VEPERIC(HLMTIEN,MSHDTTM,"",DOB,ID,HRN,NAME,SEX) ; ; -1 is BAD. Error is logged in VEPERIC I RESULT=-1 S FE=1 Q ; ; We have a match I +RESULT S DFN=RESULT Q ; ; Me thinks we have a new patient S MBI=$$GETDATA("PID",1000,24) ; multiple birth indicator S SSN=$$GETDATA("PID",1000,19) ; social security number I RESULT=0 D Q:FE .I NPADDFLG D ADDPAT(NAME,DOB,SEX,.DFN,FE,HLMTIEN,.HLP) Q .I 'NPADDFLG D SAVEPAT(NAME,DOB,SEX,ID,HLMTIEN,MSHDTTM,.DUZ,FE,.HLP) Q ; ; The data will be in one of two places. ; On if it was mapped or manipulated after coming in or another if it was not. ; SETID is always 1000 on non repeating segments such as PID GETDATA(SEG,SETID,SEQ) ; N DATA S DATA=$G(HLP(SEG,SETID,SEQ,0)) I DATA]"" Q DATA Q $G(HLP(SEG,SETID,SEQ)) ; ; Save the information on this record for another day ; Dates need be in MMDDYYYY@HHMMSS or MM/DD/YYYY@HHMMSS ; SAVEPAT(NAME,DOB,SEX,ID,HLMTIEN,MSGDTTM,DUZ,FE,HLP) ; N DIE,DIC,X,DR S X="`"_HLMTIEN S DIC=19904.21,DIC(0)="L" S DIC("DR")=".02///^S X=NAME;.03///^S X=DOB;.04///^S X=SEX;.06///^S X=ID;.07///NOW;.08///^S X=DUZ;.09///^S X=MSGDTTM" D ^DIC ; I '+Y D Q . S FE=$$FATALERR^VEPERI6(1,"SYSTEM","CAN'T ADD TO NEW PATIENT HOLD FILE 19904.21",HLMTIEN,.HLP) Q ; Q ; ; Add a patient to file 2 & 9000001 ; This just adds a stub to get the patient started. ADDPAT(NAME,DOB,SEX,DFN,FE,HLMTIEN,HLP) ; N DIC,HRN,IENS,DATA,DLAYGO,RET,X,FDA ; ; These variables are most likely set by DIC,DIE and IHS lookup routines. N Y,VAERR,FDAIEN,DIW,DGUSER,DFN,DDER,DA,C,DICR,SSN N AUPNSEX,AUPNPAT,AUPNLK,AUPNDOD,AUPNDOB,AUPNDAYS,AGE,%I,%1,%L ; S FE=0 I $G(NAME)=""!($G(DOB)="")!($G(SEX)="") D Q . S FE=$$FATALERR^VEPERI6(1,"DATA","NAME, DOB OR SEX MISSING FROM PATIENT ADD",HLMTIEN,.HLP) Q ; ; Add stub patient ; Force the entry because we already determined it was a new patient S X=""""_NAME_"""" S DIC=2,DIC(0)="L",DLAYGO=2 S DIC("DR")=".301///N;391///VISTA OFFICE EHR;1901///N;.03///"_DOB_";.02///"_SEX D ^DIC I Y<0 D Q . S FE=$$FATALERR^VEPERI6(1,"PATADD","PROBLEM ADDING PATIENT",HLMTIEN,.HLP) Q ; S DFN=+Y ; ; Create patient in IHS global S HRN=$$GENHRN^MPIFAG1() S IENS="?+1,"_+Y_"," S DATA="FDA" S FDA(9000001.41,IENS,.01)=DUZ(2) S FDA(9000001.41,IENS,.02)=HRN D UPDATE^DIE("",DATA,"FDAIEN","RET") I $D(RET) D Q . S FE=$$FATALERR^VEPERI6(1,"PATADD","PROBLEM ADDING PATIENT HRN",HLMTIEN,.HLP) Q Q