| [613] | 1 | IBCNEUT5 ;DAOU/ALA - IIV MISC. UTILITIES ;20-JUN-2002 | 
|---|
|  | 2 | ;;2.0;INTEGRATED BILLING;**184,284,271**;21-MAR-94 | 
|---|
|  | 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
|  | 4 | ; | 
|---|
|  | 5 | ;**Program Description** | 
|---|
|  | 6 | ;  This program contains some general utilities or functions | 
|---|
|  | 7 | ; | 
|---|
|  | 8 | Q | 
|---|
|  | 9 | ; | 
|---|
|  | 10 | MSG(MGRP,XMSUB,XMTEXT,FROMFLAG,XMY) ;  Send a MailMan Message | 
|---|
|  | 11 | ; | 
|---|
|  | 12 | ;  Input Parameters | 
|---|
|  | 13 | ;   MGRP = Mailgroup Name (optional) | 
|---|
|  | 14 | ;   XMSUB = Subject Line (required) | 
|---|
|  | 15 | ;   XMTEXT = Message Text Array Name in open format:  "MSG(" (required) | 
|---|
|  | 16 | ;   FROMFLAG = Flag indicating from whom the message is sent (optional) | 
|---|
|  | 17 | ;         false/undefined:  from the specific, non-human IIV user | 
|---|
|  | 18 | ;                    true:  from the actual user (DUZ) | 
|---|
|  | 19 | ;   XMY = recipients array; pass by reference (optional) | 
|---|
|  | 20 | ;         The possible recipients are the sender, the Mail Group in the | 
|---|
|  | 21 | ;         first parameter, and anybody else already defined in the XMY | 
|---|
|  | 22 | ;         array when this parameter is used. | 
|---|
|  | 23 | ; | 
|---|
|  | 24 | ; New MailMan variables and also some FileMan variables.  The FileMan | 
|---|
|  | 25 | ; variables are used and not cleaned up when sending to external | 
|---|
|  | 26 | ; internet addresses. | 
|---|
|  | 27 | NEW DIFROM,XMDUZ,XMDUN,XMZ,XMMG,XMSTRIP,XMROU,XMYBLOB | 
|---|
|  | 28 | NEW D0,D1,D2,DG,DIC,DICR,DISYS,DIW | 
|---|
|  | 29 | NEW TMPSUB,TMPTEXT,TMPY,XX | 
|---|
|  | 30 | ; | 
|---|
|  | 31 | I $G(FROMFLAG),$G(DUZ) S XMDUZ=DUZ | 
|---|
|  | 32 | E  S XMDUZ="IIV INTERFACE (IB)" | 
|---|
|  | 33 | ;I $G(DUZ) S XMY(DUZ)=""      ; original location of line - moved below | 
|---|
|  | 34 | I $G(MGRP)'="" S XMY("G."_MGRP)="" | 
|---|
|  | 35 | ; If no recipients are defined, send to postmaster | 
|---|
|  | 36 | I '$D(XMY) S XMY(.5)="" | 
|---|
|  | 37 | I $G(DUZ) S XMY(DUZ)="" | 
|---|
|  | 38 | ; Store off subject, array reference and array of recipients | 
|---|
|  | 39 | S TMPSUB=XMSUB,TMPTEXT=XMTEXT | 
|---|
|  | 40 | M TMPY=XMY | 
|---|
|  | 41 | D ^XMD | 
|---|
|  | 42 | ; | 
|---|
|  | 43 | ; Error logic | 
|---|
|  | 44 | ; If there's an error message and the message was not originally sent | 
|---|
|  | 45 | ; to the postmaster, then send a message to the postmaster with this | 
|---|
|  | 46 | ; error message. | 
|---|
|  | 47 | ; | 
|---|
|  | 48 | I $D(XMMG),'$D(TMPY(.5)) D | 
|---|
|  | 49 | . S XMY(.5)="" | 
|---|
|  | 50 | . S XMTEXT=TMPTEXT,XMSUB="MailMan Error" | 
|---|
|  | 51 | . ; Add XMMG error message as the first line of the message | 
|---|
|  | 52 | . S XX=999999 | 
|---|
|  | 53 | . F  S XX=$O(@(XMTEXT_"XX)"),-1) Q:'XX  S @(XMTEXT_"XX+3)")=@(XMTEXT_"XX)") | 
|---|
|  | 54 | . S @(XMTEXT_"1)")="   MailMan Error:  "_XMMG | 
|---|
|  | 55 | . S @(XMTEXT_"2)")="Original Subject:  "_TMPSUB | 
|---|
|  | 56 | . S @(XMTEXT_"3)")="------Original Message------" | 
|---|
|  | 57 | . D ^XMD | 
|---|
|  | 58 | . Q | 
|---|
|  | 59 | Q | 
|---|
|  | 60 | ; | 
|---|
|  | 61 | ; | 
|---|
|  | 62 | BFEXIST(DFN,INSNAME) ; Function returns 1 if an Entered Ins Buffer File | 
|---|
|  | 63 | ; entry exists with the same DFN and INSNAME, otherwise it returns a 0 | 
|---|
|  | 64 | ; | 
|---|
|  | 65 | ; DFN - Patient DFN | 
|---|
|  | 66 | ; INSNAME - Insurance Company Name File 36 - Field .01 | 
|---|
|  | 67 | ; | 
|---|
|  | 68 | NEW EXIST,IEN | 
|---|
|  | 69 | S EXIST=0 | 
|---|
|  | 70 | S INSNAME=$$TRIM^XLFSTR(INSNAME)  ; trimmed | 
|---|
|  | 71 | I ('DFN)!(INSNAME="") G BFEXIT | 
|---|
|  | 72 | ; | 
|---|
|  | 73 | S IEN=0 | 
|---|
|  | 74 | F  S IEN=$O(^IBA(355.33,"C",DFN,IEN)) Q:'IEN!EXIST  D | 
|---|
|  | 75 | .  ; Quit if status is NOT 'Entered' | 
|---|
|  | 76 | .  I $P($G(^IBA(355.33,IEN,0)),U,4)'="E" Q | 
|---|
|  | 77 | .  ; Quit if Ins Buffer Ins Co Name (trimmed) is NOT EQUAL to | 
|---|
|  | 78 | .  ;  the Ins Co Name parameter (trimmed) | 
|---|
|  | 79 | .  I $$TRIM^XLFSTR($P($G(^IBA(355.33,IEN,20)),U))'=INSNAME Q | 
|---|
|  | 80 | .  ; Match found | 
|---|
|  | 81 | .  S EXIST=1 | 
|---|
|  | 82 | .  Q | 
|---|
|  | 83 | BFEXIT ; | 
|---|
|  | 84 | Q EXIST | 
|---|
|  | 85 | ; | 
|---|
|  | 86 | ; | 
|---|
|  | 87 | MGRP() ; Get the Mail Group for the IIV Interface - IB Site Parameters (51.04) | 
|---|
|  | 88 | Q $$GET1^DIQ(350.9,"1,",51.04,"E") | 
|---|
|  | 89 | ; | 
|---|
|  | 90 | ; | 
|---|
|  | 91 | PYRAPP(APP,PAYERIEN) ; Get the Payer Application multiple IEN | 
|---|
|  | 92 | ; based on the payer application name and payer ien. | 
|---|
|  | 93 | ; | 
|---|
|  | 94 | NEW MIEN,APPIEN,DISYS | 
|---|
|  | 95 | S MIEN="" | 
|---|
|  | 96 | S APPIEN=$$FIND1^DIC(365.13,,"X",APP,"B") | 
|---|
|  | 97 | I 'APPIEN G PYRAPPX | 
|---|
|  | 98 | I '$G(PAYERIEN) G PYRAPPX | 
|---|
|  | 99 | S MIEN=$O(^IBE(365.12,PAYERIEN,1,"B",APPIEN,"")) | 
|---|
|  | 100 | PYRAPPX ; | 
|---|
|  | 101 | Q MIEN | 
|---|
|  | 102 | ; | 
|---|
|  | 103 | ; | 
|---|
|  | 104 | ACTAPP(IEN) ; Active payer applications | 
|---|
|  | 105 | ; This function will return 1 if any of the payer applications for | 
|---|
|  | 106 | ; this payer (being passed in by the payer IEN) are NOT deactivated. | 
|---|
|  | 107 | ; This should not be confused with the other payer application fields | 
|---|
|  | 108 | ; such as national active or local active.  The deactivated field is | 
|---|
|  | 109 | ; the .11 field in the payer application multiple. | 
|---|
|  | 110 | ; | 
|---|
|  | 111 | ; This function is invoked by the FileMan data dictionary as a screen | 
|---|
|  | 112 | ; for the Payer field (#3.1) in the Insurance company file (#36). | 
|---|
|  | 113 | ; | 
|---|
|  | 114 | NEW APPIEN,ACTAPP,APPDATA | 
|---|
|  | 115 | S APPIEN=0,ACTAPP="",IEN=+$G(IEN) | 
|---|
|  | 116 | F  S APPIEN=$O(^IBE(365.12,IEN,1,APPIEN)) Q:'APPIEN  D  Q:ACTAPP | 
|---|
|  | 117 | . S APPDATA=$G(^IBE(365.12,IEN,1,APPIEN,0)) | 
|---|
|  | 118 | . I $P(APPDATA,U,11) Q | 
|---|
|  | 119 | . I $P(APPDATA,U,12) Q | 
|---|
|  | 120 | . S ACTAPP=1 | 
|---|
|  | 121 | . Q | 
|---|
|  | 122 | Q ACTAPP | 
|---|
|  | 123 | ; | 
|---|
|  | 124 | ADDTQ(DFN,PAYER,SRVDT,FDAYS,ANYPAYER) ; Function  - Returns flag (0/1) | 
|---|
|  | 125 | ; 1 - TQ File entry can be added as the service date for the patient | 
|---|
|  | 126 | ;     and payer >= MAX TQ service date + Freshness Days | 
|---|
|  | 127 | ;     If ANYPAYER is set, check for recent entries for this patient and | 
|---|
|  | 128 | ;     any payer | 
|---|
|  | 129 | ; 0 - otherwise | 
|---|
|  | 130 | ; | 
|---|
|  | 131 | ; Input: | 
|---|
|  | 132 | ;  DFN   - Patient DFN (File #2) | 
|---|
|  | 133 | ;  PAYER - Payer IEN (File #365.12) | 
|---|
|  | 134 | ;  SRVDT - Service dt for potential TQ entry | 
|---|
|  | 135 | ;  FDAYS - Freshness Days param (by extract type) | 
|---|
|  | 136 | ;  ANYPAYER - NUMERIC>0 if checking for any payer | 
|---|
|  | 137 | ; | 
|---|
|  | 138 | N ADDTQ,MAXDT | 
|---|
|  | 139 | ; | 
|---|
|  | 140 | S ADDTQ=1 | 
|---|
|  | 141 | I ($G(DFN)="")!($G(SRVDT)="")!($G(FDAYS)="") S ADDTQ=0 G ADDTQX | 
|---|
|  | 142 | I '$G(ANYPAYER),$G(PAYER)="" S ADDTQ=0 G ADDTQX | 
|---|
|  | 143 | ; MAX TQ Service Date | 
|---|
|  | 144 | S MAXDT=$$TQMAXSV(DFN,$G(PAYER),$G(ANYPAYER)) | 
|---|
|  | 145 | I MAXDT="" G ADDTQX | 
|---|
|  | 146 | ; If Service Date < Max Service Date + Freshness Days, do not add | 
|---|
|  | 147 | I SRVDT<$$FMADD^XLFDT(MAXDT,FDAYS) S ADDTQ=0 | 
|---|
|  | 148 | ; | 
|---|
|  | 149 | ADDTQX ; ADDTQ exit pt | 
|---|
|  | 150 | Q ADDTQ | 
|---|
|  | 151 | ; | 
|---|
|  | 152 | TQUPDSV(DFN,PAYER,SRVDT) ; Update service dates & freshness dates for TQ | 
|---|
|  | 153 | ; entries awaiting transmission | 
|---|
|  | 154 | ; | 
|---|
|  | 155 | N SVDT,STS,ERACT,CSRVDT,CSPAN,SPAN,DA,HL7IEN,RIEN | 
|---|
|  | 156 | ; | 
|---|
|  | 157 | I ($G(DFN)="")!($G(PAYER)="")!($G(SRVDT)="") G TQUPDSVX | 
|---|
|  | 158 | ; | 
|---|
|  | 159 | ; Loop thru all inquiries to be transmitted to update the service date | 
|---|
|  | 160 | ; Statuses:  Ready to Transmit(1), Hold(4) and Retry(6) | 
|---|
|  | 161 | S SVDT="" | 
|---|
|  | 162 | F  S SVDT=$O(^IBCN(365.1,"AD",DFN,PAYER,SVDT)) Q:'SVDT  D | 
|---|
|  | 163 | . S DA=0 | 
|---|
|  | 164 | . F  S DA=$O(^IBCN(365.1,"AD",DFN,PAYER,SVDT,DA)) Q:'DA  D | 
|---|
|  | 165 | .. ; TQ Status | 
|---|
|  | 166 | .. S STS=$P($G(^IBCN(365.1,DA,0)),U,4) | 
|---|
|  | 167 | .. ; Check to see if record is still scheduled to be transmitted. | 
|---|
|  | 168 | .. ; If so, update the service date if the new service date and current | 
|---|
|  | 169 | .. ; service date are both in the past or future and the new service | 
|---|
|  | 170 | .. ; date is closer to Today.  Also, if the current service date is in | 
|---|
|  | 171 | .. ; the future and the new service date is in the past, update with the | 
|---|
|  | 172 | .. ; new service date. | 
|---|
|  | 173 | .. ; If not Ready to Transmit(1), Hold(4) and Retry(6), quit | 
|---|
|  | 174 | .. I STS'=1,STS'=4,STS'=6 Q | 
|---|
|  | 175 | .. ; If Hold and last Response returned Error Action - Please resubmit | 
|---|
|  | 176 | .. ; Original Transaction (P) - do not update | 
|---|
|  | 177 | .. I STS=4 S ERACT="" D  I ERACT="P" Q | 
|---|
|  | 178 | .. . ; Last msg sent | 
|---|
|  | 179 | .. . S HL7IEN=$O(^IBCN(365.1,DA,2," "),-1) Q:'HL7IEN | 
|---|
|  | 180 | .. . ; Assoc IIV Response IEN | 
|---|
|  | 181 | .. . S RIEN=$P($G(^IBCN(365.1,DA,2,HL7IEN,0)),U,3) Q:'RIEN | 
|---|
|  | 182 | .. . ; Error Action IEN (365.018) | 
|---|
|  | 183 | .. . S ERACT=$P($G(^IBCN(365,RIEN,1)),U,15) Q:'ERACT | 
|---|
|  | 184 | .. . S ERACT=$P($G(^IBE(365.018,ERACT,0)),U,1) | 
|---|
|  | 185 | .. ; | 
|---|
|  | 186 | .. ; Current service date for TQ entry | 
|---|
|  | 187 | .. S CSRVDT=$P($G(^IBCN(365.1,DA,0)),U,12) | 
|---|
|  | 188 | .. ; If current service date is today (DT), do not update | 
|---|
|  | 189 | .. I CSRVDT=DT Q | 
|---|
|  | 190 | .. ; If new service date is in the future and current service date is in | 
|---|
|  | 191 | .. ; the past, do not update | 
|---|
|  | 192 | .. I SRVDT>DT,CSRVDT<DT Q | 
|---|
|  | 193 | .. ; If new service date is today, update | 
|---|
|  | 194 | .. I SRVDT=DT D SAVETQ^IBCNEUT2(DA,SRVDT),SAVFRSH(DA,+$$FMDIFF^XLFDT(SRVDT,CSRVDT,1)) Q | 
|---|
|  | 195 | .. ; If both current and new service dates are in the past or future, | 
|---|
|  | 196 | .. ; only update, when new service date is closer to today (DT). | 
|---|
|  | 197 | .. I ((CSRVDT<DT)&(SRVDT<DT))!((CSRVDT>DT)&(SRVDT>DT)) D  Q | 
|---|
|  | 198 | .. . S CSPAN=$$FMDIFF^XLFDT(CSRVDT,DT,1),SPAN=$$FMDIFF^XLFDT(SRVDT,DT,1) | 
|---|
|  | 199 | .. . I CSPAN<0 S CSPAN=-CSPAN | 
|---|
|  | 200 | .. . I SPAN<0 S SPAN=-SPAN | 
|---|
|  | 201 | .. . I SPAN<CSPAN D SAVETQ^IBCNEUT2(DA,SRVDT),SAVFRSH(DA,+$$FMDIFF^XLFDT(SRVDT,CSRVDT,1)) | 
|---|
|  | 202 | .. ; If new service date is in the past and current service date is in | 
|---|
|  | 203 | .. ; the future, update | 
|---|
|  | 204 | .. I SRVDT<CSRVDT D SAVETQ^IBCNEUT2(DA,SRVDT),SAVFRSH(DA,+$$FMDIFF^XLFDT(SRVDT,CSRVDT,1)) Q | 
|---|
|  | 205 | .. Q | 
|---|
|  | 206 | TQUPDSVX ; TQUPDSV exit pt | 
|---|
|  | 207 | Q | 
|---|
|  | 208 | ; | 
|---|
|  | 209 | TQMAXSV(DFN,PAYER,ANYPAYER) ; Returns MAX(TQ Service Date) for Patient & Payer | 
|---|
|  | 210 | ; Input: | 
|---|
|  | 211 | ;  DFN     - Patient DFN (2) | 
|---|
|  | 212 | ;  PAYER   - Payer IEN (365.12) (If no PAYER passed in, check them all) | 
|---|
|  | 213 | ;  ANYPAYER - NUMERIC>0 if checking for any payer | 
|---|
|  | 214 | ; Output: | 
|---|
|  | 215 | ;  TQMAXSV - MAX (most recent) service date from TQ entry for Patient & | 
|---|
|  | 216 | ;            Payer | 
|---|
|  | 217 | ; | 
|---|
|  | 218 | N TQMAXSV | 
|---|
|  | 219 | S TQMAXSV="" | 
|---|
|  | 220 | I $G(DFN)="" G TQMAXSVX | 
|---|
|  | 221 | I '$G(ANYPAYER) S TQMAXSV=$O(^IBCN(365.1,"AD",DFN,PAYER,""),-1) G TQMAXSVX | 
|---|
|  | 222 | ; | 
|---|
|  | 223 | N PIEN,LASTBYP | 
|---|
|  | 224 | S PIEN="" F  S PIEN=$O(^IBCN(365.1,"AD",DFN,PIEN)) Q:PIEN=""  D | 
|---|
|  | 225 | .S LASTBYP=$O(^IBCN(365.1,"AD",DFN,PIEN,""),-1) | 
|---|
|  | 226 | .Q:'LASTBYP   ; Just in case | 
|---|
|  | 227 | .I LASTBYP>TQMAXSV S TQMAXSV=LASTBYP | 
|---|
|  | 228 | ; | 
|---|
|  | 229 | TQMAXSVX ; TQMAXSV exit pt | 
|---|
|  | 230 | Q TQMAXSV | 
|---|
|  | 231 | ; | 
|---|
|  | 232 | ; | 
|---|
|  | 233 | SNDSSN(PIEN,APP) ; Determine Transmit SSN flag based on Payer and Payer | 
|---|
|  | 234 | ; Application values | 
|---|
|  | 235 | ; Input: | 
|---|
|  | 236 | ;  PIEN - Payer IEN (365.12) | 
|---|
|  | 237 | ;  APP  - Payer application description (like "IIV") | 
|---|
|  | 238 | N IBFLG | 
|---|
|  | 239 | ; | 
|---|
|  | 240 | S IBFLG=0 | 
|---|
|  | 241 | ; | 
|---|
|  | 242 | I $G(PIEN)=""!($G(APP)="") G SNDSSNX | 
|---|
|  | 243 | S IBFLG=+$P($G(^IBE(365.12,PIEN,1,+$$PYRAPP(APP,PIEN),0)),U,10) | 
|---|
|  | 244 | ; | 
|---|
|  | 245 | SNDSSNX Q IBFLG | 
|---|
|  | 246 | ; | 
|---|
|  | 247 | SAVFRSH(TQIEN,DTDIFF) ; Update TQ freshness date based on service date diff | 
|---|
|  | 248 | ; | 
|---|
|  | 249 | N DIE,DA,FDT,DR,D,D0,DI,DIC,DQ,X | 
|---|
|  | 250 | I $G(TQIEN)="" Q | 
|---|
|  | 251 | S FDT=$P($G(^IBCN(365.1,TQIEN,0)),U,17) | 
|---|
|  | 252 | ; Note - will only update if FDT > 0. | 
|---|
|  | 253 | S FDT=$$FMADD^XLFDT(FDT,+DTDIFF) | 
|---|
|  | 254 | S DIE="^IBCN(365.1,",DA=TQIEN,DR=".17////"_FDT | 
|---|
|  | 255 | D ^DIE | 
|---|
|  | 256 | Q | 
|---|
|  | 257 | ; | 
|---|