| 1 | IVMUFNC ;ALB/MLI/PHH/SCK - IVM GENERIC FUNCTIONS ; 10/15/2004 1:10pm | 
|---|
| 2 | ;;2.0;INCOME VERIFICATION MATCH;**3,11,17,34,95,94**;21-OCT-94 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ; This routine contains generic calls for use throughout IVM | 
|---|
| 6 | ; | 
|---|
| 7 | INIT(EID,HL,INT) ; initialize variables for 1.6 HL7/IVM | 
|---|
| 8 | S EID=$G(EID),INT=$G(INT) | 
|---|
| 9 | S HLDAP="IVM" D INIT^HLFNC2(EID,.HL,INT) | 
|---|
| 10 | S (HLEVN,IVMCT)=0 ; initialize segment and message counters | 
|---|
| 11 | ;;D NOW^%DTC S HLSDT=% | 
|---|
| 12 | Q | 
|---|
| 13 | ; | 
|---|
| 14 | ; | 
|---|
| 15 | CLEAN ; clean-up variables for HL7/IVM (as defined by call to INIT) | 
|---|
| 16 | D KILL^HLTRANS | 
|---|
| 17 | K HLEVN,HLMTN,HLSDT,IVMCT | 
|---|
| 18 | Q | 
|---|
| 19 | ; | 
|---|
| 20 | ; | 
|---|
| 21 | BATCH ; put BHS and BTS segments into TMP global | 
|---|
| 22 | ; | 
|---|
| 23 | ;  Input - HLMTN as HL7 message type being sent in this batch (REQUIRED) | 
|---|
| 24 | ;          HLEVN as number of HL7 messages in batch (REQUIRED) | 
|---|
| 25 | ;          IVMCT as subscript in TMP global where BTS segment goes (REQ) | 
|---|
| 26 | ;          HLSEC (optional) as security (see BHS^HLFNC1) | 
|---|
| 27 | ;          HLMSA (optional) as message ack variables (see BHS^HLFNC1) | 
|---|
| 28 | ; | 
|---|
| 29 | ;      ****Also assumes all HL7 variables returned from**** | 
|---|
| 30 | ;          INIT^HLTRANS are defined | 
|---|
| 31 | ; | 
|---|
| 32 | Q  ; LINE ADDED FOR HL7 1.6 | 
|---|
| 33 | S HLSEC=$G(HLSEC),HLMSA=$G(HLMSA) | 
|---|
| 34 | S ^TMP("HLS",$J,HLSDT,0)=$$BHS^HLFNC1(HLMTN,HLSEC,HLMSA) | 
|---|
| 35 | S ^TMP("HLS",$J,HLSDT,IVMCT)="BTS"_HLFS_HLEVN ; trailer | 
|---|
| 36 | Q | 
|---|
| 37 | ; | 
|---|
| 38 | ; | 
|---|
| 39 | IVM(DFN,IVMDT) ; extrinsic function - should this pt be transmitted to IVM? | 
|---|
| 40 | ; | 
|---|
| 41 | ;  Input - DFN as internal entry number of PATIENT file | 
|---|
| 42 | ;          IVMDT as date of test (default DT) | 
|---|
| 43 | ; | 
|---|
| 44 | ; Output - 1 if pt should be sent to IVM, 0 otherwise | 
|---|
| 45 | ; | 
|---|
| 46 | N X,Y | 
|---|
| 47 | S DFN=$G(DFN) I '$D(^DPT(+DFN,0)) G IVMQ | 
|---|
| 48 | S IVMDT=$S($G(IVMDT):IVMDT,1:DT) | 
|---|
| 49 | S X=$$LST^DGMTU(DFN,IVMDT) | 
|---|
| 50 | I $E($P(X,"^",2),1,3)'=$E(IVMDT,1,3) K IVMDT G IVMQ ; not in same year | 
|---|
| 51 | S X=$G(^DGMT(408.31,+X,0)) I 'X G IVMQ ; can't find MT entry for date | 
|---|
| 52 | I $P(X,"^",3)=6 S:'$$INS(DFN,IVMDT) Y=1 G IVMQ ; C/no insurance...send | 
|---|
| 53 | I $P(X,"^",3)'=4 G IVMQ ; not cat A | 
|---|
| 54 | I ($P(X,"^",4)-$P(X,"^",15)>$P(X,"^",12))!$P(X,"^",10) G IVMQ ; income-deduct expenses>threshold (hardship) or adjudicated | 
|---|
| 55 | S Y=1 | 
|---|
| 56 | IVMQ Q +$G(Y) | 
|---|
| 57 | ; | 
|---|
| 58 | ; | 
|---|
| 59 | INS(DFN,IVMDT) ; extrinsic function to see if pt has active insurance | 
|---|
| 60 | ; | 
|---|
| 61 | ;  Input - DFN as internal entry number of PATIENT file | 
|---|
| 62 | ;          IVMDT [optional] as date to compute ins coverage for | 
|---|
| 63 | ; | 
|---|
| 64 | ; Output - 1 if yes, 0 if no | 
|---|
| 65 | ; | 
|---|
| 66 | Q $S($$INSUR^IBBAPI(DFN,$G(IVMDT))=1:1,1:0) | 
|---|
| 67 | ; | 
|---|
| 68 | ; | 
|---|
| 69 | MAIL(IVMGRP) ; Transmit to members of Mail Group. Before D MAIL^IVMUFNC() | 
|---|
| 70 | ; set XMSUB = to subject   and  set IVMTEXT array to message. | 
|---|
| 71 | ; | 
|---|
| 72 | ;Input: | 
|---|
| 73 | ;  IVMGRP - optional parameter, = to name of a mailgroup to send the | 
|---|
| 74 | ;           message to.  If not sent, the IVM Site Parameter file is | 
|---|
| 75 | ;           used to determine the mailgroup. | 
|---|
| 76 | ; | 
|---|
| 77 | N DIFROM,XMDUZ,XMTEXT,XMSTRIP,XMROU,XMY,XMZ,XMDF | 
|---|
| 78 | S XMDF="" | 
|---|
| 79 | S XMDUZ="IVM PACKAGE" | 
|---|
| 80 | S XMTEXT="IVMTEXT(" | 
|---|
| 81 | I '$L($G(IVMGRP)) D | 
|---|
| 82 | .S IVMGRP=$P($G(^XMB(3.8,+$P($G(^IVM(301.9,1,0)),"^",2),0)),"^") | 
|---|
| 83 | S XMY("G."_IVMGRP_"@"_^XMB("NETNAME"))="" | 
|---|
| 84 | D ^XMD | 
|---|
| 85 | K IVMTEXT,XMDUZ,XMSUB,XMTEXT,XMY | 
|---|
| 86 | Q | 
|---|
| 87 | ; | 
|---|
| 88 | ; | 
|---|
| 89 | LTD(DFN,IVMQUERY) ; Find Last Treatment Date | 
|---|
| 90 | ;  Input:       DFN -- pointer to the patient in file #2 | 
|---|
| 91 | ;          IVMQUERY("LTD") -- # of the QUERY that is currently open or | 
|---|
| 92 | ;                      undefined, zero, or null if no QUERY opened for | 
|---|
| 93 | ;                      last treatment date | 
|---|
| 94 | ; Output:  LTD -- Last Treatment Date (really last date seen at | 
|---|
| 95 | ;                                      the facility) | 
|---|
| 96 | ; | 
|---|
| 97 | N LTD,SDSTOP,X,Z,IVMQ | 
|---|
| 98 | ; | 
|---|
| 99 | ; - need a patient | 
|---|
| 100 | S IVMQ=$G(IVMQUERY("LTD")) | 
|---|
| 101 | I '$G(DFN) S LTD=0 G LTDQ | 
|---|
| 102 | ; | 
|---|
| 103 | ; - if current inpatient, set LTD = today and quit | 
|---|
| 104 | I $G(^DPT(DFN,.105)) S LTD=DT G LTDQ | 
|---|
| 105 | ; | 
|---|
| 106 | ; - get the last discharge date | 
|---|
| 107 | S LTD=+$O(^DGPM("ATID3",DFN,"")) S:LTD LTD=9999999.9999999-LTD\1 S:LTD>DT LTD=DT | 
|---|
| 108 | ; | 
|---|
| 109 | ; - get the last registration date and compare to LTD | 
|---|
| 110 | S X=+$O(^DPT(DFN,"DIS",0)) I X S X=9999999-X\1 S:X>LTD LTD=X | 
|---|
| 111 | ; | 
|---|
| 112 | ; - get the last appointment or stop after LTD (if any) | 
|---|
| 113 | K ^TMP("DIERR",$J) | 
|---|
| 114 | I $G(IVMQ) D ACTIVE^SDQ(.IVMQ,"FALSE","SET") ;clear QUERY results | 
|---|
| 115 | I '$G(IVMQ) D | 
|---|
| 116 | .D OPEN^SDQ(.IVMQ) Q:'$G(IVMQ) | 
|---|
| 117 | .D INDEX^SDQ(.IVMQ,"PATIENT/DATE","SET") | 
|---|
| 118 | .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") | 
|---|
| 119 | .S IVMQUERY("LTD")=IVMQ | 
|---|
| 120 | ; | 
|---|
| 121 | D PAT^SDQ(.IVMQ,DFN,"SET") | 
|---|
| 122 | D DATE^SDQ(.IVMQ,LTD+.000001,9999999,"SET") | 
|---|
| 123 | D ACTIVE^SDQ(.IVMQ,"TRUE","SET") | 
|---|
| 124 | D SCAN^SDQ(.IVMQ,"BACKWARD") | 
|---|
| 125 | K ^TMP("DIERR",$J) | 
|---|
| 126 | ; | 
|---|
| 127 | LTDQ ; | 
|---|
| 128 | Q $S(LTD:$$HLDATE^HLFNC(LTD),1:HLQ) | 
|---|
| 129 | ; | 
|---|
| 130 | APPT(SDOE0) ;Determine if appt associated with encounter is in a valid state | 
|---|
| 131 | ; Quit when Outpatient Encounter STATUS is CHECKED OUT | 
|---|
| 132 | Q:$P(SDOE0,U,12)=2 1 | 
|---|
| 133 | ; Quit when Outpatient Encounter STATUS is ACTION REQUIRED and the | 
|---|
| 134 | ; Appointment Status is SCHEDULED/KEPT | 
|---|
| 135 | N DGARRAY,SDCNT,SDSTAT,SDDTTM S DGARRAY("FLDS")=3,DGARRAY(4)=+$P(SDOE0,U,2) | 
|---|
| 136 | S DGARRAY(1)=$P(SDOE0,U),DGARRAY("SORT")="P",DGARRAY("MAX")=1 | 
|---|
| 137 | S SDCNT=$$SDAPI^SDAMA301(.DGARRAY),SDSTAT="" | 
|---|
| 138 | I SDCNT>0 D | 
|---|
| 139 | .S SDDTTM=$O(^TMP($J,"SDAMA301",DGARRAY(4),0)) | 
|---|
| 140 | .I SDDTTM S SDSTAT=$P($P($G(^TMP($J,"SDAMA301",DGARRAY(4),SDDTTM)),U,3),";") | 
|---|
| 141 | K ^TMP($J,"SDAMA301") | 
|---|
| 142 | Q:(($P(SDOE0,U,12)=14)&(SDSTAT="R")) 1 | 
|---|
| 143 | Q 0 | 
|---|
| 144 | ; | 
|---|
| 145 | OUTTR(IVMINT,IVMPAR,IVMST) ; - Transform IVMINT to a displayable value | 
|---|
| 146 | ;  Input:   IVMINT  --  internal value of demographic element | 
|---|
| 147 | ;                       received from IVM | 
|---|
| 148 | ;           IVMPAR  --  Zeroth node of the entry in file #301.92 | 
|---|
| 149 | ;                       for the demographic element IVMINT | 
|---|
| 150 | ;            IVMST  --  [optional] pointer to the STATE (#5) file | 
|---|
| 151 | ;                       Required to transform the county code | 
|---|
| 152 | ;  Output:  IVMOUT  --  Displayable value for IVMINT | 
|---|
| 153 | ; | 
|---|
| 154 | N IVMOUT,Z S IVMOUT=IVMINT | 
|---|
| 155 | I $G(IVMINT)=""!($G(IVMPAR)="") S IVMOUT="" G OUTTRQ | 
|---|
| 156 | ; | 
|---|
| 157 | ; - use special transform for county | 
|---|
| 158 | I $G(IVMST),$P(IVMPAR,"^",2)="PID12" S IVMOUT=$P($G(^DIC(5,IVMST,1,IVMINT,0)),"^") | 
|---|
| 159 | ; | 
|---|
| 160 | ; - transform the internal value if necessary | 
|---|
| 161 | I $P(IVMPAR,"^",6) S IVMOUT=$$EXPAND($P(IVMPAR,"^",4),$P(IVMPAR,"^",5),IVMINT) | 
|---|
| 162 | ; | 
|---|
| 163 | OUTTRQ Q IVMOUT | 
|---|
| 164 | ; | 
|---|
| 165 | ; | 
|---|
| 166 | EXPAND(FILE,FIELD,VALUE) ; - returns internal data in an output format | 
|---|
| 167 | N Y,C S Y=VALUE | 
|---|
| 168 | I 'FILE!('FIELD)!(VALUE="") G EXPQ | 
|---|
| 169 | S Y=VALUE,C=$P(^DD(FILE,FIELD,0),"^",2) D Y^DIQ | 
|---|
| 170 | EXPQ Q Y | 
|---|
| 171 | ; | 
|---|
| 172 | ; | 
|---|
| 173 | GETPAT(DFN,IVMPAT) ; | 
|---|
| 174 | ; Description: Used to obtain identifying information for a patient | 
|---|
| 175 | ; in the PATIENT file and place it in the IVMPAT() array. | 
|---|
| 176 | ; | 
|---|
| 177 | ;  Input: | 
|---|
| 178 | ;   DFN - ien of patient in PATIENT file | 
|---|
| 179 | ; | 
|---|
| 180 | ; Output: | 
|---|
| 181 | ;  Function Value - 1 on success, 0 on failure | 
|---|
| 182 | ;   IVMPAT - (pass by reference) On success, this array will contain | 
|---|
| 183 | ;    the patient identifing information. Array subscripts are: | 
|---|
| 184 | ;      "DFN"  - ien PATIENT file | 
|---|
| 185 | ;      "NAME" - patient name | 
|---|
| 186 | ;      "SSN"  - patient Social Security Number | 
|---|
| 187 | ;      "DOB"  - patient date of birth (FM format) | 
|---|
| 188 | ;      "SEX"  - patient sex | 
|---|
| 189 | ; | 
|---|
| 190 | N IVMNODE | 
|---|
| 191 | Q:'$G(DFN) 0 | 
|---|
| 192 | K IVMPAT S IVMPAT="" | 
|---|
| 193 | ; | 
|---|
| 194 | ; obtain patient record | 
|---|
| 195 | S IVMNODE=$G(^DPT(DFN,0)) | 
|---|
| 196 | Q:IVMNODE="" 0 | 
|---|
| 197 | ; | 
|---|
| 198 | S IVMPAT("DFN")=DFN | 
|---|
| 199 | S IVMPAT("NAME")=$P(IVMNODE,"^") | 
|---|
| 200 | S IVMPAT("SEX")=$P(IVMNODE,"^",2) | 
|---|
| 201 | S IVMPAT("DOB")=$P(IVMNODE,"^",3) | 
|---|
| 202 | S IVMPAT("SSN")=$P(IVMNODE,"^",9) | 
|---|
| 203 | Q 1 | 
|---|
| 204 | ; | 
|---|
| 205 | LOOKUP(SSN,DOB,SEX,ERROR) ; | 
|---|
| 206 | ;Description: This function will do a search for the patient based on | 
|---|
| 207 | ;the identifying information provided. The function will be successful | 
|---|
| 208 | ;only if a single patient is found matching the identifiers provided. | 
|---|
| 209 | ; | 
|---|
| 210 | ;Inputs: | 
|---|
| 211 | ;  SSN - patient Social Security Number | 
|---|
| 212 | ;  DOB - patient date of birth (FM format) | 
|---|
| 213 | ;  SEX - patient sex | 
|---|
| 214 | ;Outputs: | 
|---|
| 215 | ;  Function Value - patient DFN if successful, 0 otherwise | 
|---|
| 216 | ;  ERROR - if unsuccessful, an error message is returned (optional, pass by reference) | 
|---|
| 217 | ; | 
|---|
| 218 | N DFN,NODE | 
|---|
| 219 | ; | 
|---|
| 220 | S DFN=$O(^DPT("SSN",SSN,0)) | 
|---|
| 221 | I 'DFN S ERROR="SSN NOT FOUND" Q 0 | 
|---|
| 222 | I $O(^DPT("SSN",SSN,DFN)) S ERROR="MULTIPLE PATIENTS MATCHING SSN" Q 0 | 
|---|
| 223 | S NODE=$G(^DPT(DFN,0)) | 
|---|
| 224 | I $P(NODE,"^",2)'=SEX S ERROR="SEX DOES NOT MATCH" Q 0 | 
|---|
| 225 | I $E($P(NODE,"^",3),1,3)'=$E(DOB,1,3) S ERROR="DOB DOES NOT MATCH" Q 0 | 
|---|
| 226 | 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 | 
|---|
| 227 | Q DFN | 
|---|