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
|
---|