IVMUFNC ;ALB/MLI/PHH/SCK,TDM - IVM GENERIC FUNCTIONS ; 6/30/08 4:11pm
;;2.0;INCOME VERIFICATION MATCH;**3,11,17,34,95,94,115**;21-OCT-94;Build 28
;;Per VHA Directive 10-93-142, this routine should not be modified.
;
; This routine contains generic calls for use throughout IVM
;
INIT(EID,HL,INT) ; initialize variables for 1.6 HL7/IVM
S EID=$G(EID),INT=$G(INT)
S HLDAP="IVM" D INIT^HLFNC2(EID,.HL,INT)
S (HLEVN,IVMCT)=0 ; initialize segment and message counters
;;D NOW^%DTC S HLSDT=%
Q
;
;
CLEAN ; clean-up variables for HL7/IVM (as defined by call to INIT)
D KILL^HLTRANS
K HLEVN,HLMTN,HLSDT,IVMCT
Q
;
;
BATCH ; put BHS and BTS segments into TMP global
;
; Input - HLMTN as HL7 message type being sent in this batch (REQUIRED)
; HLEVN as number of HL7 messages in batch (REQUIRED)
; IVMCT as subscript in TMP global where BTS segment goes (REQ)
; HLSEC (optional) as security (see BHS^HLFNC1)
; HLMSA (optional) as message ack variables (see BHS^HLFNC1)
;
; ****Also assumes all HL7 variables returned from****
; INIT^HLTRANS are defined
;
Q ; LINE ADDED FOR HL7 1.6
S HLSEC=$G(HLSEC),HLMSA=$G(HLMSA)
S ^TMP("HLS",$J,HLSDT,0)=$$BHS^HLFNC1(HLMTN,HLSEC,HLMSA)
S ^TMP("HLS",$J,HLSDT,IVMCT)="BTS"_HLFS_HLEVN ; trailer
Q
;
;
IVM(DFN,IVMDT) ; extrinsic function - should this pt be transmitted to IVM?
;
; Input - DFN as internal entry number of PATIENT file
; IVMDT as date of test (default DT)
;
; Output - 1 if pt should be sent to IVM, 0 otherwise
;
N X,Y
S DFN=$G(DFN) I '$D(^DPT(+DFN,0)) G IVMQ
S IVMDT=$S($G(IVMDT):IVMDT,1:DT)
S X=$$LST^DGMTU(DFN,IVMDT)
I $E($P(X,"^",2),1,3)'=$E(IVMDT,1,3) K IVMDT G IVMQ ; not in same year
S X=$G(^DGMT(408.31,+X,0)) I 'X G IVMQ ; can't find MT entry for date
I $P(X,"^",3)=6 S:'$$INS(DFN,IVMDT) Y=1 G IVMQ ; C/no insurance...send
I $P(X,"^",3)'=4 G IVMQ ; not cat A
I ($P(X,"^",4)-$P(X,"^",15)>$P(X,"^",12))!$P(X,"^",10) G IVMQ ; income-deduct expenses>threshold (hardship) or adjudicated
S Y=1
IVMQ Q +$G(Y)
;
;
INS(DFN,IVMDT) ; extrinsic function to see if pt has active insurance
;
; Input - DFN as internal entry number of PATIENT file
; IVMDT [optional] as date to compute ins coverage for
;
; Output - 1 if yes, 0 if no
;
Q $S($$INSUR^IBBAPI(DFN,$G(IVMDT))=1:1,1:0)
;
;
MAIL(IVMGRP) ; Transmit to members of Mail Group. Before D MAIL^IVMUFNC()
; set XMSUB = to subject and set IVMTEXT array to message.
;
;Input:
; IVMGRP - optional parameter, = to name of a mailgroup to send the
; message to. If not sent, the IVM Site Parameter file is
; used to determine the mailgroup.
;
N DIFROM,XMDUZ,XMTEXT,XMSTRIP,XMROU,XMY,XMZ,XMDF
S XMDF=""
S XMDUZ="IVM PACKAGE"
S XMTEXT="IVMTEXT("
I '$L($G(IVMGRP)) D
.S IVMGRP=$P($G(^XMB(3.8,+$P($G(^IVM(301.9,1,0)),"^",2),0)),"^")
S XMY("G."_IVMGRP_"@"_^XMB("NETNAME"))=""
D ^XMD
K IVMTEXT,XMDUZ,XMSUB,XMTEXT,XMY
Q
;
;
LTD(DFN,IVMQUERY) ; Find Last Treatment Date
; Input: DFN -- pointer to the patient in file #2
; IVMQUERY("LTD") -- # of the QUERY that is currently open or
; undefined, zero, or null if no QUERY opened for
; last treatment date
; Output: LTD -- Last Treatment Date (really last date seen at
; the facility)
;
N LTD,SDSTOP,X,Z,IVMQ
;
; - need a patient
S IVMQ=$G(IVMQUERY("LTD"))
I '$G(DFN) S LTD=0 G LTDQ
;
; - if current inpatient, set LTD = today and quit
I $G(^DPT(DFN,.105)) S LTD=DT G LTDQ
;
; - get the last discharge date
S LTD=+$O(^DGPM("ATID3",DFN,"")) S:LTD LTD=9999999.9999999-LTD\1 S:LTD>DT LTD=DT
;
; - get the last registration date and compare to LTD
S X=+$O(^DPT(DFN,"DIS",0)) I X S X=9999999-X\1 S:X>LTD LTD=X
;
; - get the last appointment or stop after LTD (if any)
K ^TMP("DIERR",$J)
I $G(IVMQ) D ACTIVE^SDQ(.IVMQ,"FALSE","SET") ;clear QUERY results
I '$G(IVMQ) D
.D OPEN^SDQ(.IVMQ) Q:'$G(IVMQ)
.D INDEX^SDQ(.IVMQ,"PATIENT/DATE","SET")
.D SCANCB^SDQ(.IVMQ,"I $S($P(SDOE0,U,8)=2:1,$P(SDOE0,U,8)=1:$$APPT^IVMUFNC(SDOE0),1:0) S LTD=SDOE0\1,SDSTOP=1","SET")
.S IVMQUERY("LTD")=IVMQ
;
D PAT^SDQ(.IVMQ,DFN,"SET")
D DATE^SDQ(.IVMQ,LTD+.000001,9999999,"SET")
D ACTIVE^SDQ(.IVMQ,"TRUE","SET")
D SCAN^SDQ(.IVMQ,"BACKWARD")
K ^TMP("DIERR",$J)
;
LTDQ ;
Q $S(LTD:$$HLDATE^HLFNC(LTD),1:HLQ)
;
APPT(SDOE0) ;Determine if appt associated with encounter is in a valid state
; Quit when Outpatient Encounter STATUS is CHECKED OUT
Q:$P(SDOE0,U,12)=2 1
; Quit when Outpatient Encounter STATUS is ACTION REQUIRED and the
; Appointment Status is SCHEDULED/KEPT
N DGARRAY,SDCNT,SDSTAT,SDDTTM S DGARRAY("FLDS")=3,DGARRAY(4)=+$P(SDOE0,U,2)
S DGARRAY(1)=$P(SDOE0,U),DGARRAY("SORT")="P",DGARRAY("MAX")=1
S SDCNT=$$SDAPI^SDAMA301(.DGARRAY),SDSTAT=""
I SDCNT>0 D
.S SDDTTM=$O(^TMP($J,"SDAMA301",DGARRAY(4),0))
.I SDDTTM S SDSTAT=$P($P($G(^TMP($J,"SDAMA301",DGARRAY(4),SDDTTM)),U,3),";")
K ^TMP($J,"SDAMA301")
Q:(($P(SDOE0,U,12)=14)&(SDSTAT="R")) 1
Q 0
;
OUTTR(IVMINT,IVMPAR,IVMST) ; - Transform IVMINT to a displayable value
; Input: IVMINT -- internal value of demographic element
; received from IVM
; IVMPAR -- Zeroth node of the entry in file #301.92
; for the demographic element IVMINT
; IVMST -- [optional] pointer to the STATE (#5) file
; Required to transform the county code
; Output: IVMOUT -- Displayable value for IVMINT
;
N IVMOUT,Z S IVMOUT=IVMINT
I $G(IVMINT)=""!($G(IVMPAR)="") S IVMOUT="" G OUTTRQ
;
; - use special transform for county
I $G(IVMST),$P(IVMPAR,"^",2)="PID12" S IVMOUT=$P($G(^DIC(5,IVMST,1,IVMINT,0)),"^")
;
; - transform the internal value if necessary
I $P(IVMPAR,"^",6) S IVMOUT=$$EXPAND($P(IVMPAR,"^",4),$P(IVMPAR,"^",5),IVMINT)
;
OUTTRQ Q IVMOUT
;
;
EXPAND(FILE,FIELD,VALUE) ; - returns internal data in an output format
N Y,C S Y=VALUE
I 'FILE!('FIELD)!(VALUE="") G EXPQ
S Y=VALUE,C=$P(^DD(FILE,FIELD,0),"^",2) D Y^DIQ
EXPQ Q Y
;
;
GETPAT(DFN,IVMPAT) ;
; Description: Used to obtain identifying information for a patient
; in the PATIENT file and place it in the IVMPAT() array.
;
; Input:
; DFN - ien of patient in PATIENT file
;
; Output:
; Function Value - 1 on success, 0 on failure
; IVMPAT - (pass by reference) On success, this array will contain
; the patient identifing information. Array subscripts are:
; "DFN" - ien PATIENT file
; "NAME" - patient name
; "SSN" - patient Social Security Number
; "DOB" - patient date of birth (FM format)
; "SEX" - patient sex
; "ICN" - patient ICN
;
N IVMNODE
Q:'$G(DFN) 0
K IVMPAT S IVMPAT=""
;
; obtain patient record
S IVMNODE=$G(^DPT(DFN,0))
Q:IVMNODE="" 0
;
S IVMPAT("DFN")=DFN
S IVMPAT("NAME")=$P(IVMNODE,"^")
S IVMPAT("SEX")=$P(IVMNODE,"^",2)
S IVMPAT("DOB")=$P(IVMNODE,"^",3)
S IVMPAT("SSN")=$P(IVMNODE,"^",9)
S IVMPAT("ICN")=$$GETICN^MPIF001(DFN)
Q 1
;
LOOKUP(SSN,DOB,SEX,ERROR) ;
;Description: This function will do a search for the patient based on
;the identifying information provided. The function will be successful
;only if a single patient is found matching the identifiers provided.
;
;Inputs:
; SSN - patient Social Security Number
; DOB - patient date of birth (FM format)
; SEX - patient sex
;Outputs:
; Function Value - patient DFN if successful, 0 otherwise
; ERROR - if unsuccessful, an error message is returned (optional, pass by reference)
;
N DFN,NODE
;
I $G(SSN)="" S ERROR="INVALID SSN" Q 0
S DFN=$O(^DPT("SSN",SSN,0))
I 'DFN S ERROR="SSN NOT FOUND" Q 0
I $O(^DPT("SSN",SSN,DFN)) S ERROR="MULTIPLE PATIENTS MATCHING SSN" Q 0
S NODE=$G(^DPT(DFN,0))
I $P(NODE,"^",2)'=SEX S ERROR="SEX DOES NOT MATCH" Q 0
I $E($P(NODE,"^",3),1,3)'=$E(DOB,1,3) S ERROR="DOB DOES NOT MATCH" Q 0
I $E($P(NODE,"^",3),4,5),$E($P(NODE,"^",3),4,5)'=$E(DOB,4,5) S ERROR="DOB DOES NOT MATCH" Q 0
Q DFN
;
MATCH(DFN,ICN,DOB,SEX,CFLG,ERROR) ;
;Description: This function will try to match the patient based on
;the identifying information provided. The function will be
;successful only if the patient is found matching the identifiers
;provided.
;
;Inputs:
; DFN - patient DFN
; ICN - patient ICN
; DOB - patient date of birth (FM format)
; SEX - patient sex
; CFLG - Compare Flag (Default="IDS", I=ICN, D=DOB, S=Sex)
;Outputs:
; Function Value: 1 - patient matched successfully, 0 - otherwise
; ERROR - if unsuccessful, an error message is returned (optional, pass by reference)
N NODE
I $G(DFN)="" S ERROR="INVALID DFN" Q 0
I $G(CFLG)="" S CFLG="IDS"
S NODE=$G(^DPT(DFN,0)) I NODE="" S ERROR="DFN NOT FOUND" Q 0
I CFLG["I",$$GETICN^MPIF001(DFN)'=$G(ICN) S ERROR="ICN DOES NOT MATCH" Q 0
I CFLG["S",$P(NODE,"^",2)'=$G(SEX) S ERROR="SEX DOES NOT MATCH" Q 0
I CFLG["D",$E($P(NODE,"^",3),1,3)'=$E($G(DOB),1,3) S ERROR="DOB DOES NOT MATCH" Q 0
I CFLG["D",$E($P(NODE,"^",3),4,5),$E($P(NODE,"^",3),4,5)'=$E($G(DOB),4,5) S ERROR="DOB DOES NOT MATCH" Q 0
Q 1
PARSPID3(PID3,PID3ARY) ;
;Description: This function will parse seq 3 of PID segment
;Input : PID3 - Array for seq. 3 of PID segment
;Output: PID3ARY("NI") - Value - ICN
; PID3ARY("PI") - Value - DFN
I $D(PID3(3)) D
.I $O(PID3(3,"")) D Q
..S COMP=0 F S COMP=$O(PID3(3,COMP)) Q:COMP="" D
...I $P(PID3(3,COMP),$E(HLECH),5)="PI" S PID3ARY("PI")=$P(PID3(3,COMP),$E(HLECH))
...I $P(PID3(3,COMP),$E(HLECH),5)="NI" S PID3ARY("NI")=$P(PID3(3,COMP),$E(HLECH))
.I $P(PID3(3),$E(HLECH),5)="PI" S PID3ARY("PI")=$P(PID3(3),$E(HLECH))
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIVMUFNC 9933 printed Oct 16, 2024@18:03:31 Page 2
IVMUFNC ;ALB/MLI/PHH/SCK,TDM - IVM GENERIC FUNCTIONS ; 6/30/08 4:11pm
+1 ;;2.0;INCOME VERIFICATION MATCH;**3,11,17,34,95,94,115**;21-OCT-94;Build 28
+2 ;;Per VHA Directive 10-93-142, this routine should not be modified.
+3 ;
+4 ; This routine contains generic calls for use throughout IVM
+5 ;
INIT(EID,HL,INT) ; initialize variables for 1.6 HL7/IVM
+1 SET EID=$GET(EID)
SET INT=$GET(INT)
+2 SET HLDAP="IVM"
DO INIT^HLFNC2(EID,.HL,INT)
+3 ; initialize segment and message counters
SET (HLEVN,IVMCT)=0
+4 ;;D NOW^%DTC S HLSDT=%
+5 QUIT
+6 ;
+7 ;
CLEAN ; clean-up variables for HL7/IVM (as defined by call to INIT)
+1 DO KILL^HLTRANS
+2 KILL HLEVN,HLMTN,HLSDT,IVMCT
+3 QUIT
+4 ;
+5 ;
BATCH ; put BHS and BTS segments into TMP global
+1 ;
+2 ; Input - HLMTN as HL7 message type being sent in this batch (REQUIRED)
+3 ; HLEVN as number of HL7 messages in batch (REQUIRED)
+4 ; IVMCT as subscript in TMP global where BTS segment goes (REQ)
+5 ; HLSEC (optional) as security (see BHS^HLFNC1)
+6 ; HLMSA (optional) as message ack variables (see BHS^HLFNC1)
+7 ;
+8 ; ****Also assumes all HL7 variables returned from****
+9 ; INIT^HLTRANS are defined
+10 ;
+11 ; LINE ADDED FOR HL7 1.6
QUIT
+12 SET HLSEC=$GET(HLSEC)
SET HLMSA=$GET(HLMSA)
+13 SET ^TMP("HLS",$JOB,HLSDT,0)=$$BHS^HLFNC1(HLMTN,HLSEC,HLMSA)
+14 ; trailer
SET ^TMP("HLS",$JOB,HLSDT,IVMCT)="BTS"_HLFS_HLEVN
+15 QUIT
+16 ;
+17 ;
IVM(DFN,IVMDT) ; extrinsic function - should this pt be transmitted to IVM?
+1 ;
+2 ; Input - DFN as internal entry number of PATIENT file
+3 ; IVMDT as date of test (default DT)
+4 ;
+5 ; Output - 1 if pt should be sent to IVM, 0 otherwise
+6 ;
+7 NEW X,Y
+8 SET DFN=$GET(DFN)
IF '$DATA(^DPT(+DFN,0))
GOTO IVMQ
+9 SET IVMDT=$SELECT($GET(IVMDT):IVMDT,1:DT)
+10 SET X=$$LST^DGMTU(DFN,IVMDT)
+11 ; not in same year
IF $EXTRACT($PIECE(X,"^",2),1,3)'=$EXTRACT(IVMDT,1,3)
KILL IVMDT
GOTO IVMQ
+12 ; can't find MT entry for date
SET X=$GET(^DGMT(408.31,+X,0))
IF 'X
GOTO IVMQ
+13 ; C/no insurance...send
IF $PIECE(X,"^",3)=6
if '$$INS(DFN,IVMDT)
SET Y=1
GOTO IVMQ
+14 ; not cat A
IF $PIECE(X,"^",3)'=4
GOTO IVMQ
+15 ; income-deduct expenses>threshold (hardship) or adjudicated
IF ($PIECE(X,"^",4)-$PIECE(X,"^",15)>$PIECE(X,"^",12))!$PIECE(X,"^",10)
GOTO IVMQ
+16 SET Y=1
IVMQ QUIT +$GET(Y)
+1 ;
+2 ;
INS(DFN,IVMDT) ; extrinsic function to see if pt has active insurance
+1 ;
+2 ; Input - DFN as internal entry number of PATIENT file
+3 ; IVMDT [optional] as date to compute ins coverage for
+4 ;
+5 ; Output - 1 if yes, 0 if no
+6 ;
+7 QUIT $SELECT($$INSUR^IBBAPI(DFN,$GET(IVMDT))=1:1,1:0)
+8 ;
+9 ;
MAIL(IVMGRP) ; Transmit to members of Mail Group. Before D MAIL^IVMUFNC()
+1 ; set XMSUB = to subject and set IVMTEXT array to message.
+2 ;
+3 ;Input:
+4 ; IVMGRP - optional parameter, = to name of a mailgroup to send the
+5 ; message to. If not sent, the IVM Site Parameter file is
+6 ; used to determine the mailgroup.
+7 ;
+8 NEW DIFROM,XMDUZ,XMTEXT,XMSTRIP,XMROU,XMY,XMZ,XMDF
+9 SET XMDF=""
+10 SET XMDUZ="IVM PACKAGE"
+11 SET XMTEXT="IVMTEXT("
+12 IF '$LENGTH($GET(IVMGRP))
Begin DoDot:1
+13 SET IVMGRP=$PIECE($GET(^XMB(3.8,+$PIECE($GET(^IVM(301.9,1,0)),"^",2),0)),"^")
End DoDot:1
+14 SET XMY("G."_IVMGRP_"@"_^XMB("NETNAME"))=""
+15 DO ^XMD
+16 KILL IVMTEXT,XMDUZ,XMSUB,XMTEXT,XMY
+17 QUIT
+18 ;
+19 ;
LTD(DFN,IVMQUERY) ; Find Last Treatment Date
+1 ; Input: DFN -- pointer to the patient in file #2
+2 ; IVMQUERY("LTD") -- # of the QUERY that is currently open or
+3 ; undefined, zero, or null if no QUERY opened for
+4 ; last treatment date
+5 ; Output: LTD -- Last Treatment Date (really last date seen at
+6 ; the facility)
+7 ;
+8 NEW LTD,SDSTOP,X,Z,IVMQ
+9 ;
+10 ; - need a patient
+11 SET IVMQ=$GET(IVMQUERY("LTD"))
+12 IF '$GET(DFN)
SET LTD=0
GOTO LTDQ
+13 ;
+14 ; - if current inpatient, set LTD = today and quit
+15 IF $GET(^DPT(DFN,.105))
SET LTD=DT
GOTO LTDQ
+16 ;
+17 ; - get the last discharge date
+18 SET LTD=+$ORDER(^DGPM("ATID3",DFN,""))
if LTD
SET LTD=9999999.9999999-LTD\1
if LTD>DT
SET LTD=DT
+19 ;
+20 ; - get the last registration date and compare to LTD
+21 SET X=+$ORDER(^DPT(DFN,"DIS",0))
IF X
SET X=9999999-X\1
if X>LTD
SET LTD=X
+22 ;
+23 ; - get the last appointment or stop after LTD (if any)
+24 KILL ^TMP("DIERR",$JOB)
+25 ;clear QUERY results
IF $GET(IVMQ)
DO ACTIVE^SDQ(.IVMQ,"FALSE","SET")
+26 IF '$GET(IVMQ)
Begin DoDot:1
+27 DO OPEN^SDQ(.IVMQ)
if '$GET(IVMQ)
QUIT
+28 DO INDEX^SDQ(.IVMQ,"PATIENT/DATE","SET")
+29 DO SCANCB^SDQ(.IVMQ,"I $S($P(SDOE0,U,8)=2:1,$P(SDOE0,U,8)=1:$$APPT^IVMUFNC(SDOE0),1:0) S LTD=SDOE0\1,SDSTOP=1","SET")
+30 SET IVMQUERY("LTD")=IVMQ
End DoDot:1
+31 ;
+32 DO PAT^SDQ(.IVMQ,DFN,"SET")
+33 DO DATE^SDQ(.IVMQ,LTD+.000001,9999999,"SET")
+34 DO ACTIVE^SDQ(.IVMQ,"TRUE","SET")
+35 DO SCAN^SDQ(.IVMQ,"BACKWARD")
+36 KILL ^TMP("DIERR",$JOB)
+37 ;
LTDQ ;
+1 QUIT $SELECT(LTD:$$HLDATE^HLFNC(LTD),1:HLQ)
+2 ;
APPT(SDOE0) ;Determine if appt associated with encounter is in a valid state
+1 ; Quit when Outpatient Encounter STATUS is CHECKED OUT
+2 if $PIECE(SDOE0,U,12)=2
QUIT 1
+3 ; Quit when Outpatient Encounter STATUS is ACTION REQUIRED and the
+4 ; Appointment Status is SCHEDULED/KEPT
+5 NEW DGARRAY,SDCNT,SDSTAT,SDDTTM
SET DGARRAY("FLDS")=3
SET DGARRAY(4)=+$PIECE(SDOE0,U,2)
+6 SET DGARRAY(1)=$PIECE(SDOE0,U)
SET DGARRAY("SORT")="P"
SET DGARRAY("MAX")=1
+7 SET SDCNT=$$SDAPI^SDAMA301(.DGARRAY)
SET SDSTAT=""
+8 IF SDCNT>0
Begin DoDot:1
+9 SET SDDTTM=$ORDER(^TMP($JOB,"SDAMA301",DGARRAY(4),0))
+10 IF SDDTTM
SET SDSTAT=$PIECE($PIECE($GET(^TMP($JOB,"SDAMA301",DGARRAY(4),SDDTTM)),U,3),";")
End DoDot:1
+11 KILL ^TMP($JOB,"SDAMA301")
+12 if (($PIECE(SDOE0,U,12)=14)&(SDSTAT="R"))
QUIT 1
+13 QUIT 0
+14 ;
OUTTR(IVMINT,IVMPAR,IVMST) ; - Transform IVMINT to a displayable value
+1 ; Input: IVMINT -- internal value of demographic element
+2 ; received from IVM
+3 ; IVMPAR -- Zeroth node of the entry in file #301.92
+4 ; for the demographic element IVMINT
+5 ; IVMST -- [optional] pointer to the STATE (#5) file
+6 ; Required to transform the county code
+7 ; Output: IVMOUT -- Displayable value for IVMINT
+8 ;
+9 NEW IVMOUT,Z
SET IVMOUT=IVMINT
+10 IF $GET(IVMINT)=""!($GET(IVMPAR)="")
SET IVMOUT=""
GOTO OUTTRQ
+11 ;
+12 ; - use special transform for county
+13 IF $GET(IVMST)
IF $PIECE(IVMPAR,"^",2)="PID12"
SET IVMOUT=$PIECE($GET(^DIC(5,IVMST,1,IVMINT,0)),"^")
+14 ;
+15 ; - transform the internal value if necessary
+16 IF $PIECE(IVMPAR,"^",6)
SET IVMOUT=$$EXPAND($PIECE(IVMPAR,"^",4),$PIECE(IVMPAR,"^",5),IVMINT)
+17 ;
OUTTRQ QUIT IVMOUT
+1 ;
+2 ;
EXPAND(FILE,FIELD,VALUE) ; - returns internal data in an output format
+1 NEW Y,C
SET Y=VALUE
+2 IF 'FILE!('FIELD)!(VALUE="")
GOTO EXPQ
+3 SET Y=VALUE
SET C=$PIECE(^DD(FILE,FIELD,0),"^",2)
DO Y^DIQ
EXPQ QUIT Y
+1 ;
+2 ;
GETPAT(DFN,IVMPAT) ;
+1 ; Description: Used to obtain identifying information for a patient
+2 ; in the PATIENT file and place it in the IVMPAT() array.
+3 ;
+4 ; Input:
+5 ; DFN - ien of patient in PATIENT file
+6 ;
+7 ; Output:
+8 ; Function Value - 1 on success, 0 on failure
+9 ; IVMPAT - (pass by reference) On success, this array will contain
+10 ; the patient identifing information. Array subscripts are:
+11 ; "DFN" - ien PATIENT file
+12 ; "NAME" - patient name
+13 ; "SSN" - patient Social Security Number
+14 ; "DOB" - patient date of birth (FM format)
+15 ; "SEX" - patient sex
+16 ; "ICN" - patient ICN
+17 ;
+18 NEW IVMNODE
+19 if '$GET(DFN)
QUIT 0
+20 KILL IVMPAT
SET IVMPAT=""
+21 ;
+22 ; obtain patient record
+23 SET IVMNODE=$GET(^DPT(DFN,0))
+24 if IVMNODE=""
QUIT 0
+25 ;
+26 SET IVMPAT("DFN")=DFN
+27 SET IVMPAT("NAME")=$PIECE(IVMNODE,"^")
+28 SET IVMPAT("SEX")=$PIECE(IVMNODE,"^",2)
+29 SET IVMPAT("DOB")=$PIECE(IVMNODE,"^",3)
+30 SET IVMPAT("SSN")=$PIECE(IVMNODE,"^",9)
+31 SET IVMPAT("ICN")=$$GETICN^MPIF001(DFN)
+32 QUIT 1
+33 ;
LOOKUP(SSN,DOB,SEX,ERROR) ;
+1 ;Description: This function will do a search for the patient based on
+2 ;the identifying information provided. The function will be successful
+3 ;only if a single patient is found matching the identifiers provided.
+4 ;
+5 ;Inputs:
+6 ; SSN - patient Social Security Number
+7 ; DOB - patient date of birth (FM format)
+8 ; SEX - patient sex
+9 ;Outputs:
+10 ; Function Value - patient DFN if successful, 0 otherwise
+11 ; ERROR - if unsuccessful, an error message is returned (optional, pass by reference)
+12 ;
+13 NEW DFN,NODE
+14 ;
+15 IF $GET(SSN)=""
SET ERROR="INVALID SSN"
QUIT 0
+16 SET DFN=$ORDER(^DPT("SSN",SSN,0))
+17 IF 'DFN
SET ERROR="SSN NOT FOUND"
QUIT 0
+18 IF $ORDER(^DPT("SSN",SSN,DFN))
SET ERROR="MULTIPLE PATIENTS MATCHING SSN"
QUIT 0
+19 SET NODE=$GET(^DPT(DFN,0))
+20 IF $PIECE(NODE,"^",2)'=SEX
SET ERROR="SEX DOES NOT MATCH"
QUIT 0
+21 IF $EXTRACT($PIECE(NODE,"^",3),1,3)'=$EXTRACT(DOB,1,3)
SET ERROR="DOB DOES NOT MATCH"
QUIT 0
+22 IF $EXTRACT($PIECE(NODE,"^",3),4,5)
IF $EXTRACT($PIECE(NODE,"^",3),4,5)'=$EXTRACT(DOB,4,5)
SET ERROR="DOB DOES NOT MATCH"
QUIT 0
+23 QUIT DFN
+24 ;
MATCH(DFN,ICN,DOB,SEX,CFLG,ERROR) ;
+1 ;Description: This function will try to match the patient based on
+2 ;the identifying information provided. The function will be
+3 ;successful only if the patient is found matching the identifiers
+4 ;provided.
+5 ;
+6 ;Inputs:
+7 ; DFN - patient DFN
+8 ; ICN - patient ICN
+9 ; DOB - patient date of birth (FM format)
+10 ; SEX - patient sex
+11 ; CFLG - Compare Flag (Default="IDS", I=ICN, D=DOB, S=Sex)
+12 ;Outputs:
+13 ; Function Value: 1 - patient matched successfully, 0 - otherwise
+14 ; ERROR - if unsuccessful, an error message is returned (optional, pass by reference)
+15 NEW NODE
+16 IF $GET(DFN)=""
SET ERROR="INVALID DFN"
QUIT 0
+17 IF $GET(CFLG)=""
SET CFLG="IDS"
+18 SET NODE=$GET(^DPT(DFN,0))
IF NODE=""
SET ERROR="DFN NOT FOUND"
QUIT 0
+19 IF CFLG["I"
IF $$GETICN^MPIF001(DFN)'=$GET(ICN)
SET ERROR="ICN DOES NOT MATCH"
QUIT 0
+20 IF CFLG["S"
IF $PIECE(NODE,"^",2)'=$GET(SEX)
SET ERROR="SEX DOES NOT MATCH"
QUIT 0
+21 IF CFLG["D"
IF $EXTRACT($PIECE(NODE,"^",3),1,3)'=$EXTRACT($GET(DOB),1,3)
SET ERROR="DOB DOES NOT MATCH"
QUIT 0
+22 IF CFLG["D"
IF $EXTRACT($PIECE(NODE,"^",3),4,5)
IF $EXTRACT($PIECE(NODE,"^",3),4,5)'=$EXTRACT($GET(DOB),4,5)
SET ERROR="DOB DOES NOT MATCH"
QUIT 0
+23 QUIT 1
PARSPID3(PID3,PID3ARY) ;
+1 ;Description: This function will parse seq 3 of PID segment
+2 ;Input : PID3 - Array for seq. 3 of PID segment
+3 ;Output: PID3ARY("NI") - Value - ICN
+4 ; PID3ARY("PI") - Value - DFN
+5 IF $DATA(PID3(3))
Begin DoDot:1
+6 IF $ORDER(PID3(3,""))
Begin DoDot:2
+7 SET COMP=0
FOR
SET COMP=$ORDER(PID3(3,COMP))
if COMP=""
QUIT
Begin DoDot:3
+8 IF $PIECE(PID3(3,COMP),$EXTRACT(HLECH),5)="PI"
SET PID3ARY("PI")=$PIECE(PID3(3,COMP),$EXTRACT(HLECH))
+9 IF $PIECE(PID3(3,COMP),$EXTRACT(HLECH),5)="NI"
SET PID3ARY("NI")=$PIECE(PID3(3,COMP),$EXTRACT(HLECH))
End DoDot:3
End DoDot:2
QUIT
+10 IF $PIECE(PID3(3),$EXTRACT(HLECH),5)="PI"
SET PID3ARY("PI")=$PIECE(PID3(3),$EXTRACT(HLECH))
End DoDot:1
+11 QUIT