IBCNEHL5A ;AITC/CKB - HL7 Process Incoming RPI Msgs (Cont.) ; 10-JAN-2025
;;2.0;INTEGRATED BILLING;**806**;21-MAR-94;Build 19
;;Per VA Directive 6402, this routine should not be modified.
;
Q ; No direct calls allowed
;
LOAD(RIEN) ; Load Medicare policy as a new policy on patient record
; RIEN - IEN OF THE EIV REPONSE IN FILE #365
;
; Only allowed to load Medicare (WNR) policies if the patient has no
; history of any MEDICARE (WNR) on file in #2.312 and if the patient has
; no other policies on file that meet a specific criteria and if the MEDICARE
; policy is active according to the Medicare payer's 271 eIV response
;
; Returns 1 if at least 1 policy was loaded; otherwise, returns a zero
;
; ** DEVELOPER: This tag purposely locks the patient's insurance subfile as we don't want
; anything loading insurance to the patient's record while we are evaluating.
; This checks if the patient's record meets the requirements to allow Medicare
; Part A and B to be loaded automatically to the patient's record.
;
N ACTIVE,CONTINUE,DFN,ELIG,GRPNUM,IBNEW,IENS,INSRIEN,MWNRIEN,MWNRTYP,MWNRA,MWNRB
N PIEN,POLCT,POLEFF,POLICY,POLTERM,RDATA0,SOI,TQN
;
K ACTIVE,LOAD,POLICY
S (LOAD,MWNRTYP,POLCT)=0,(MWNRA,MWNRB)=""
S RDATA0=$G(^IBCN(365,RIEN,0))
S PIEN=$P(RDATA0,U,3)
S TQN=$P(RDATA0,U,5)
I TQN'="" S SOI=$$GET1^DIQ(365.1,TQN_",",3.02,"I")
; If SOI is null, hardcoded it to '5' for eIV - SOI should never be null, this is a safety valve
I SOI="" S SOI=5
S MWNRIEN=$P($G(^IBE(350.9,1,51)),U,25)
I PIEN=MWNRIEN S MWNRTYP=$$ISMCR^IBCNEHLU(RIEN)
I 'MWNRTYP G XLOAD ; Did not load policy as a new policy to patient record
;
S DFN=$P(RDATA0,U,2),CONTINUE=1
L +^DPT(DFN,.312):90 I '$T S CONTINUE=0 G XLOAD ;LOCK ins subfile
;
S INSRIEN=0 F S INSRIEN=$O(^DPT(DFN,.312,INSRIEN)) Q:'INSRIEN!('CONTINUE) D
. S IENS=INSRIEN_","_DFN
. ; If external name of (#2.312,.01)="MEDICARE (WNR)" S CONTINUE=0 Q
. I $$GET1^DIQ(2.312,IENS,.01)="MEDICARE (WNR)" S CONTINUE=0 Q
. S POLEFF=$$GET1^DIQ(2.312,IENS,8,"I")
. S POLTERM=$$GET1^DIQ(2.312,IENS,3,"I")
. I POLEFF>DT S CONTINUE=0 Q
. I POLEFF="",((POLTERM="")!(POLTERM>DT)) S CONTINUE=0 Q
. ; Regardless if expiration is null, today, future or bad date
. I (POLTERM="")!(POLTERM>(DT-1))!($$VALIDDT^IBCNINSU(POLTERM)=-1) S CONTINUE=0 Q
. ; Bad POLEFF and POLTERM is bad,null, today or future
. I ($$VALIDDT^IBCNINSU(POLEFF)=-1),(POLTERM'<DT) S CONTINUE=0 Q
;
I 'CONTINUE G XLOAD ; Existing policies on file doesn't allow us to add this policy to patient record
;
;Get list of insurance identified in the EB loops of the 271 payer response
D EBSUMMARY^IBCNEUT2(DFN,RIEN,SOI,.POLICY)
;
I '$O(POLICY(0)) G XLOAD ;if none was returned on payer response (safety valve)
I $G(POLICY("OHI"))=1 G XLOAD ;Indicates Other potential insurance indicated on payer response
;If the Medicare Policy in the Response is missing the Effective Date, don't load ANY Medicare policies
I $G(POLICY("MISSING_EFFDT"))=1 G XLOAD
;
;Loop through list of insurance (.POLICY) and keep only ACTIVE policies (according to the payer's response)
; Only add 'Active' policies to the ACTIVE array - ACTIVE(GRPNUM)=DFN_U_GRPNUM_U_EFFDT_U_SOI_U_ELIG
S POLCT="" F S POLCT=$O(POLICY(POLCT)) Q:POLCT="" D
. S GRPNUM="" F S GRPNUM=$O(POLICY(POLCT,GRPNUM)) Q:GRPNUM="" D
. . I $TR(GRPNUM,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")'["MEDICARE" Q
. . S ELIG=$P(POLICY(POLCT,GRPNUM),U,5) ; ELIG='Inactive' or 'Active Coverage'
. . I $TR(ELIG,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")["INACTIVE" Q
. . S ACTIVE(GRPNUM)=POLICY(POLCT,GRPNUM)
;
;Loop through the ACTIVE policies, determine what policy(s) can be added to the patient record
; GRPNUM ='Medicare Part A' or 'Medicare Part B'
S GRPNUM="" F S GRPNUM=$O(ACTIVE(GRPNUM)) Q:GRPNUM="" D
. N IBCDFN,IBCOVP,IBCPOL,IBCDFN,IBEVTACT,IBEVTP0,IBEVTP1,IBEVTP2,IBEVTP3,IBEVTP7,IBNEW
. ; Note: SAVEMWR calls BEFORE^IBCNSEVT
. S LOAD=$$SAVEMWR(RIEN)
. ;
. ;Check to see if patient is 'COVERED BY HEALTH INSURANCE?' regardless of what LOAD is set to.
. ; It is possible that a policy could have been partially loaded (LOAD=0) and should be evaluated.
. S IBCOVP=$$GET1^DIQ(2,DFN_",",.3192,"I") ;COVERED BY INSURANCE?
. S IBCPOL=$$GET1^DIQ(2.312,IBCDFN_","_DFN,.18,"I") ;GROUP PLAN
. D COVERED^IBCNSM31(DFN,IBCOVP) ;this code updates field (#2,.3192)
. ;
. ;IBCNSEVT calls the protocol IBCN NEW INSURANCE EVENTS which in turn calls the following
. ; protocols: IBCN INSURANCE BULLETIN, IVM INSURANCE EVENT and VPR IBCN EVENTS
. ; Note: the protocol IBCN INSURANCE BULLETIN deletes field NO VERIFICATION DATE (#354,60)
. I $G(IBCDFN)>0 D AFTER^IBCNSEVT,^IBCNSEVT
. Q
;
XLOAD ;
D MWRUNLOCK ; unlock ins subfile
Q LOAD
;
;--------------------------------------------------
;
SAVEMWR(RIEN) ;autoload of Medicare policy(s)
; The logic in this tag is from AUTOFIL^IBCNEHL5, with minor modifications for Medicare autoload
;
;INPUT:
; RIEN - IEN of file #365 IIV RESPONSE
;
; DFN - IEN in file #2
; IEN312 - IEN in file #2.312
; EFFDT - Effective Date of Policy (in FileMan format)
; SOI - Source of Information
;
N ADDFLG,DATA,DFN,DOBCMT,EFFDT,ERFLG,ERROR,IBAUUSR,IBEIVUSR,IBFLDS,IBIFN,IBINS,IBGRP,IBMSG,IENS,IEN312
N MGRP,PTLOAD,SOI,TQN
;
S PTLOAD=1
I (RIEN="") S PTLOAD=0 G SAVEMWRX
S MGRP=$$MGRP^IBCNEUT5()
;
N RDATA0,RDATA1,RDATA4,RDATA5,RDATA12,RDATA13
S DFN=$P(ACTIVE(GRPNUM),U)
S EFFDT=$P(ACTIVE(GRPNUM),U,3)
S SOI=$P(ACTIVE(GRPNUM),U,4)
S ADDFLG=365
; Required fields needed to save the policy
I ($G(DFN)="")!($G(GRPNUM)="")!($G(EFFDT)="")!($G(SOI)="") S PTLOAD=0 G SAVEMWRX
; Get data from the eIV Response
S RDATA0=$G(^IBCN(365,RIEN,0)),RDATA1=$G(^IBCN(365,RIEN,1))
S RDATA4=$G(^IBCN(365,RIEN,4)),RDATA5=$G(^IBCN(365,RIEN,5))
S RDATA12=$G(^IBCN(365,RIEN,12)),RDATA13=$G(^IBCN(365,RIEN,13))
S TQN=$P(RDATA0,U,5)
; Get other required data
S (IBINS,IBGRP,IBAUUSR,IBEIVUSR)=""
S IBINS=$O(^DIC(36,"B","MEDICARE (WNR)",""))
;find the Medicare Group Plan - Part A or Part B. There could be more than 1 Part A or Part B
I IBINS'="" D GETGRP
S IBAUUSR=$O(^VA(200,"B","AUTOUPDATE,IBEIV",""))
S IBEIVUSR=$O(^VA(200,"B","INTERFACE,IB EIV",""))
I (IBINS="")!(IBGRP="")!(IBAUUSR="")!(IBEIVUSR="") S PTLOAD=0 G SAVEMWRX
;
; --Medicare Required fields--
; Add a new patient policy
K DA,DD,DIC,DO,X,Y
S DIC("DR")=".01///"_IBINS_";.18///"_IBGRP_";1.01///NOW;1.02///"_IBEIVUSR_";1.05///NOW"
S DA(1)=DFN,DIC="^DPT("_DFN_",.312,",DIC(0)="L",X=IBINS
D FILE^DICN S (IEN312,IBCDFN)=+Y,IBNEW=1
D BEFORE^IBCNSEVT ;this sets variables that will be used in COVERED
S IENS=IEN312_","_DFN_","
;
K DATA
S DATA(2.312,IENS,.2)=1 ;'1' for PRIMARY
S DATA(2.312,IENS,4.03)=18 ;'18' for SELF
S DATA(2.312,IENS,1.09)=SOI ;SOURCE OF INFORMATION (from 270 Inquiry)
S DATA(2.312,IENS,7.02)=$P(RDATA13,U,2) ;SUBSCRIBER ID
S DATA(2.312,IENS,8)=EFFDT ;EFFECTIVE DATE
; --Medicare - Optional fields on 271 Payer Response--
S DATA(2.312,IENS,6)="v" ;WHOSE INSURANCE - 'v' for VETERAN
S DATA(2.312,IENS,7.01)=$P(RDATA13,U) ;NAME OF INSURED
;
; Get DOB from 271 Payer Response, if null pull from the PATIENT file
N PRDOB S PRDOB=$P(RDATA1,U,2)
S DATA(2.312,IENS,3.01)=$S(PRDOB'="":PRDOB,1:$$GET1^DIQ(2,DFN_",",.03))
;
; if DOB from 271 Payer Response DOESN'T match the DOB on the PATIENT file, then store
; the DOB from the 271 and add a patient policy comment indicating there is a difference
I PRDOB'="" I PRDOB'=$$GET1^DIQ(2,DFN_",",.03,"I") D
. S DATA(2.312,IENS,3.01)=PRDOB
. S DOBCMT="The DOB on the Patient record is "_$$GET1^DIQ(2,DFN_",",.03)_". The DOB on the eIV Payer Response, which was saved to the insurance record, is "_$$FMTE^XLFDT(PRDOB,5)_"."
. D ADDCOM(DFN,IEN312,DOBCMT)
;
; Get SEX from 271 Payer Response, if null pull from the PATIENT file
S DATA(2.312,IENS,3.12)=$S($P(RDATA1,U,4)'="":$P(RDATA1,U,4),1:$$GET1^DIQ(2,DFN_",",.02))
;
; Get Address from 271 Payer Response - the Response MUST contain Address Line 1,
; City, State, Zip. Otherwise pull from PATIENT file
I ($P(RDATA5,U)="")!($P(RDATA5,U,3)="")!($P(RDATA5,U,4)="")!($P(RDATA5,U,5)="") S ADDFLG=2
I ADDFLG=365 D
. S DATA(2.312,IENS,3.06)=$P(RDATA5,U) ;Street line 1
. S DATA(2.312,IENS,3.08)=$P(RDATA5,U,3) ;City
. S DATA(2.312,IENS,3.09)=$P(RDATA5,U,4) ;State
. S DATA(2.312,IENS,3.1)=$P(RDATA5,U,5) ;Zip
I ADDFLG=2 D
. S DATA(2.312,IENS,3.06)=$$GET1^DIQ(2,DFN_",",.111) ;Street line 1
. S DATA(2.312,IENS,3.08)=$$GET1^DIQ(2,DFN_",",.114) ;City
. S DATA(2.312,IENS,3.09)=$$GET1^DIQ(2,DFN_",",.115) ;State
. S DATA(2.312,IENS,3.1)=$$GET1^DIQ(2,DFN_",",.116) ;Zip
; --Medicare - other fields from 271 Payer Response--
N XX
S XX=$P(RDATA4,U,2)
I XX'="" S DATA(2.312,IENS,3.07)=XX ;Street 2
S XX=$P(RDATA4,U,6)
I XX'="" S DATA(2.312,IENS,3.13)=XX ;Country
S XX=$P(RDATA4,U,9)
I XX'="" S DATA(2.312,IENS,3.14)=XX ;Country subdivision
S XX=$P(RDATA12,U)
I XX'="" S DATA(2.312,IENS,12.01)=XX ;Military Info Status Code
S XX=$P(RDATA12,U,7)
I XX'="" S DATA(2.312,IENS,12.07)=XX ;Date Time Period
;
I $D(DATA) D FILE^DIE("","DATA","ERROR")
I $D(ERROR) D WARN^IBCNEHL3 K ERROR D FIL^IBCNEHL1 S PTLOAD=0 G SAVEMWRX
K DATA
S DATA(2.312,IENS,1.03)=$$NOW^XLFDT ;DATE LAST VERIFIED
S DATA(2.312,IENS,1.04)=IBAUUSR ;VERIFIED BY - AUTOUPDATE,IBEIV
S DATA(2.312,IENS,1.06)=IBAUUSR ;LAST EDITED BY - AUTOUPDATE,IBEIV
D FILE^DIE("","DATA","ERROR")
I $D(ERROR) D WARN^IBCNEHL3 Q
;
; Set the insurance record IEN in the IIV Response file to track
; which policy was updated based on the response
D UPDIREC^IBCNEHL3(RIEN,IEN312)
;
; Set the EIV AUTO-LOAD field (#.16) in the response file #365 to '1' for "YES" to indicate auto load occurred
K DATA
S DATA(365,RIEN_",",.16)=1
D FILE^DIE("","DATA")
;
; File data at 2.312, 9, 10 & 11 subfiles; if error is produced update buffer entry & then quit processing
S ERFLG=$$GRPFILE^IBCNEHL1(DFN,IEN312,RIEN,1)
I $G(ERFLG) Q
;
; File new EB data
S ERFLG=$$EBFILE^IBCNEHL1(DFN,IEN312,RIEN,1)
I $G(ERFLG) Q ;bail out if something went wrong during filing of EB data
;
; File Auto Updated policy in INTERFACILITY INSURANCE UPDATE File (#365.19)
; IBCNBAR added a field the param list when calling LOC^IBCNIUF. For consistency we added a 'null'.
D LOC^IBCNIUF(DFN,$$GET1^DIQ(2.312,IEN312_","_DFN_",",.01,"I"),IEN312,$$GET1^DIQ(365,RIEN_",",.13,"I"),"",$$GET1^DIQ(365.1,TQN_",",3.02,"E"),"")
;
; Get the buffer entry from the IIV RESPONSE File (#365)
S BUFF=+$P($G(^IBCN(365,RIEN,0)),U,4)
;
; If there is a Buffer entry associated with the Response and it is already processed,
; DO NOT touch/update files #355.33 or #355.36
I BUFF,$$GET1^DIQ(355.33,BUFF,.04,"I")'="E" S PTLOAD=0 G SAVEMWRX
;
; Update the buffer status to ACCEPTED, then call DELDATA^IBCNBED so only the stub remains
I BUFF D
. D STATUS^IBCNBEE(BUFF,"A",0,0,1) ;update status to accepted
. ;save auto update user to buffer
. S IBIFN=BUFF_"," K IBARR
. S IBARR(355.33,IBIFN,.06)=$G(IBEIVUSR)
. D FILE^DIE("","IBARR")
. D DELDATA^IBCNBED(BUFF) ;delete buffer's insurance/patient data
;
; File data to #355.36 file.
N BUFF,ERROR,FDA,WE
S WE=$$GET1^DIQ(365.1,TQN_",",.1,"I")
S BUFF=$$GET1^DIQ(365,RIEN_",",.04,"I")
S FDA(355.36,"+1,",.01)=$$NOW^XLFDT ;Date Processed
S FDA(355.36,"+1,",.02)=$S("^6^"[(U_WE_U):3,"^1^"[(U_WE_U):1,1:"") ;"WE" can only be a 1 or a 6 at this point
S FDA(355.36,"+1,",.03)=$$GET1^DIQ(365.1,TQN_",",3.02,"I") ;Source of Information
S FDA(355.36,"+1,",.05)=TQN ;EIV Inquiry
S FDA(355.36,"+1,",.06)=RIEN ;EIV Response
S FDA(355.36,"+1,",.07)=BUFF ;Buffer
S FDA(355.36,"+1,",.08)=WE ;Source of Request (Which Extract)
S FDA(355.36,"+1,",.09)=$$GET1^DIQ(365,RIEN_",",.16,"I") ;EIV Auto-load
D UPDATE^DIE("","FDA",,"ERROR")
I $D(ERROR) D
. D MSG003^IBCNEMS1(.IBMSG,.ERROR,TQN,RIEN,BUFF)
. D MSG^IBCNEUT5($$MGRP^IBCNEUT5(),"eIV Problem: Error writing to the CREATION TO PROCESSING TRACKING File (#355.36)","IBMSG(")
;
SAVEMWRX ;
Q PTLOAD
;
MWRUNLOCK ;unlock ins subfile
L -^DPT(DFN,.312)
Q
;
GETGRP ;find the Medicare Group Plan - Part A or Part B
N FOUND,GIEN
S FOUND=0
S GIEN="" F S GIEN=$O(^IBA(355.3,"B",IBINS,GIEN)) Q:(GIEN="")!(FOUND=1) D
. I $G(^IBA(355.3,GIEN,0))="" Q
. I $P(^IBA(355.3,GIEN,0),U,3)=$S(GRPNUM="Medicare Part A":"PART A",1:"PART B") S FOUND=1,IBGRP=GIEN
Q
;
ADDCOM(IBDFN,IBPOLDA,IBPOLCOM) ;
; Add new patient policy comment (2.312, 1.18) Multiple #2.342
N CIEN,FDA
;
;To keep the Patient Policy Comment trigger from looping and creating two entries
; we need to set DUZ to the INTERFACE,IB EIV user (IBEIVUSR)
I +$G(IBEIVUSR)'=0 N DUZ S DUZ=$G(IBEIVUSR)
;
; -- populate FDA array
S CIEN="+1"_","_IBPOLDA_","_IBDFN_","
S FDA(2.342,CIEN,.01)=$$NOW^XLFDT()
S FDA(2.342,CIEN,.02)=DUZ
S FDA(2.342,CIEN,.03)=IBPOLCOM
; -- add comments
D UPDATE^DIE(,"FDA")
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBCNEHL5A 13393 printed Jan 29, 2026@15:13:32 Page 2
IBCNEHL5A ;AITC/CKB - HL7 Process Incoming RPI Msgs (Cont.) ; 10-JAN-2025
+1 ;;2.0;INTEGRATED BILLING;**806**;21-MAR-94;Build 19
+2 ;;Per VA Directive 6402, this routine should not be modified.
+3 ;
+4 ; No direct calls allowed
QUIT
+5 ;
LOAD(RIEN) ; Load Medicare policy as a new policy on patient record
+1 ; RIEN - IEN OF THE EIV REPONSE IN FILE #365
+2 ;
+3 ; Only allowed to load Medicare (WNR) policies if the patient has no
+4 ; history of any MEDICARE (WNR) on file in #2.312 and if the patient has
+5 ; no other policies on file that meet a specific criteria and if the MEDICARE
+6 ; policy is active according to the Medicare payer's 271 eIV response
+7 ;
+8 ; Returns 1 if at least 1 policy was loaded; otherwise, returns a zero
+9 ;
+10 ; ** DEVELOPER: This tag purposely locks the patient's insurance subfile as we don't want
+11 ; anything loading insurance to the patient's record while we are evaluating.
+12 ; This checks if the patient's record meets the requirements to allow Medicare
+13 ; Part A and B to be loaded automatically to the patient's record.
+14 ;
+15 NEW ACTIVE,CONTINUE,DFN,ELIG,GRPNUM,IBNEW,IENS,INSRIEN,MWNRIEN,MWNRTYP,MWNRA,MWNRB
+16 NEW PIEN,POLCT,POLEFF,POLICY,POLTERM,RDATA0,SOI,TQN
+17 ;
+18 KILL ACTIVE,LOAD,POLICY
+19 SET (LOAD,MWNRTYP,POLCT)=0
SET (MWNRA,MWNRB)=""
+20 SET RDATA0=$GET(^IBCN(365,RIEN,0))
+21 SET PIEN=$PIECE(RDATA0,U,3)
+22 SET TQN=$PIECE(RDATA0,U,5)
+23 IF TQN'=""
SET SOI=$$GET1^DIQ(365.1,TQN_",",3.02,"I")
+24 ; If SOI is null, hardcoded it to '5' for eIV - SOI should never be null, this is a safety valve
+25 IF SOI=""
SET SOI=5
+26 SET MWNRIEN=$PIECE($GET(^IBE(350.9,1,51)),U,25)
+27 IF PIEN=MWNRIEN
SET MWNRTYP=$$ISMCR^IBCNEHLU(RIEN)
+28 ; Did not load policy as a new policy to patient record
IF 'MWNRTYP
GOTO XLOAD
+29 ;
+30 SET DFN=$PIECE(RDATA0,U,2)
SET CONTINUE=1
+31 ;LOCK ins subfile
LOCK +^DPT(DFN,.312):90
IF '$TEST
SET CONTINUE=0
GOTO XLOAD
+32 ;
+33 SET INSRIEN=0
FOR
SET INSRIEN=$ORDER(^DPT(DFN,.312,INSRIEN))
if 'INSRIEN!('CONTINUE)
QUIT
Begin DoDot:1
+34 SET IENS=INSRIEN_","_DFN
+35 ; If external name of (#2.312,.01)="MEDICARE (WNR)" S CONTINUE=0 Q
+36 IF $$GET1^DIQ(2.312,IENS,.01)="MEDICARE (WNR)"
SET CONTINUE=0
QUIT
+37 SET POLEFF=$$GET1^DIQ(2.312,IENS,8,"I")
+38 SET POLTERM=$$GET1^DIQ(2.312,IENS,3,"I")
+39 IF POLEFF>DT
SET CONTINUE=0
QUIT
+40 IF POLEFF=""
IF ((POLTERM="")!(POLTERM>DT))
SET CONTINUE=0
QUIT
+41 ; Regardless if expiration is null, today, future or bad date
+42 IF (POLTERM="")!(POLTERM>(DT-1))!($$VALIDDT^IBCNINSU(POLTERM)=-1)
SET CONTINUE=0
QUIT
+43 ; Bad POLEFF and POLTERM is bad,null, today or future
+44 IF ($$VALIDDT^IBCNINSU(POLEFF)=-1)
IF (POLTERM'<DT)
SET CONTINUE=0
QUIT
End DoDot:1
+45 ;
+46 ; Existing policies on file doesn't allow us to add this policy to patient record
IF 'CONTINUE
GOTO XLOAD
+47 ;
+48 ;Get list of insurance identified in the EB loops of the 271 payer response
+49 DO EBSUMMARY^IBCNEUT2(DFN,RIEN,SOI,.POLICY)
+50 ;
+51 ;if none was returned on payer response (safety valve)
IF '$ORDER(POLICY(0))
GOTO XLOAD
+52 ;Indicates Other potential insurance indicated on payer response
IF $GET(POLICY("OHI"))=1
GOTO XLOAD
+53 ;If the Medicare Policy in the Response is missing the Effective Date, don't load ANY Medicare policies
+54 IF $GET(POLICY("MISSING_EFFDT"))=1
GOTO XLOAD
+55 ;
+56 ;Loop through list of insurance (.POLICY) and keep only ACTIVE policies (according to the payer's response)
+57 ; Only add 'Active' policies to the ACTIVE array - ACTIVE(GRPNUM)=DFN_U_GRPNUM_U_EFFDT_U_SOI_U_ELIG
+58 SET POLCT=""
FOR
SET POLCT=$ORDER(POLICY(POLCT))
if POLCT=""
QUIT
Begin DoDot:1
+59 SET GRPNUM=""
FOR
SET GRPNUM=$ORDER(POLICY(POLCT,GRPNUM))
if GRPNUM=""
QUIT
Begin DoDot:2
+60 IF $TRANSLATE(GRPNUM,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")'["MEDICARE"
QUIT
+61 ; ELIG='Inactive' or 'Active Coverage'
SET ELIG=$PIECE(POLICY(POLCT,GRPNUM),U,5)
+62 IF $TRANSLATE(ELIG,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")["INACTIVE"
QUIT
+63 SET ACTIVE(GRPNUM)=POLICY(POLCT,GRPNUM)
End DoDot:2
End DoDot:1
+64 ;
+65 ;Loop through the ACTIVE policies, determine what policy(s) can be added to the patient record
+66 ; GRPNUM ='Medicare Part A' or 'Medicare Part B'
+67 SET GRPNUM=""
FOR
SET GRPNUM=$ORDER(ACTIVE(GRPNUM))
if GRPNUM=""
QUIT
Begin DoDot:1
+68 NEW IBCDFN,IBCOVP,IBCPOL,IBCDFN,IBEVTACT,IBEVTP0,IBEVTP1,IBEVTP2,IBEVTP3,IBEVTP7,IBNEW
+69 ; Note: SAVEMWR calls BEFORE^IBCNSEVT
+70 SET LOAD=$$SAVEMWR(RIEN)
+71 ;
+72 ;Check to see if patient is 'COVERED BY HEALTH INSURANCE?' regardless of what LOAD is set to.
+73 ; It is possible that a policy could have been partially loaded (LOAD=0) and should be evaluated.
+74 ;COVERED BY INSURANCE?
SET IBCOVP=$$GET1^DIQ(2,DFN_",",.3192,"I")
+75 ;GROUP PLAN
SET IBCPOL=$$GET1^DIQ(2.312,IBCDFN_","_DFN,.18,"I")
+76 ;this code updates field (#2,.3192)
DO COVERED^IBCNSM31(DFN,IBCOVP)
+77 ;
+78 ;IBCNSEVT calls the protocol IBCN NEW INSURANCE EVENTS which in turn calls the following
+79 ; protocols: IBCN INSURANCE BULLETIN, IVM INSURANCE EVENT and VPR IBCN EVENTS
+80 ; Note: the protocol IBCN INSURANCE BULLETIN deletes field NO VERIFICATION DATE (#354,60)
+81 IF $GET(IBCDFN)>0
DO AFTER^IBCNSEVT
DO ^IBCNSEVT
+82 QUIT
End DoDot:1
+83 ;
XLOAD ;
+1 ; unlock ins subfile
DO MWRUNLOCK
+2 QUIT LOAD
+3 ;
+4 ;--------------------------------------------------
+5 ;
SAVEMWR(RIEN) ;autoload of Medicare policy(s)
+1 ; The logic in this tag is from AUTOFIL^IBCNEHL5, with minor modifications for Medicare autoload
+2 ;
+3 ;INPUT:
+4 ; RIEN - IEN of file #365 IIV RESPONSE
+5 ;
+6 ; DFN - IEN in file #2
+7 ; IEN312 - IEN in file #2.312
+8 ; EFFDT - Effective Date of Policy (in FileMan format)
+9 ; SOI - Source of Information
+10 ;
+11 NEW ADDFLG,DATA,DFN,DOBCMT,EFFDT,ERFLG,ERROR,IBAUUSR,IBEIVUSR,IBFLDS,IBIFN,IBINS,IBGRP,IBMSG,IENS,IEN312
+12 NEW MGRP,PTLOAD,SOI,TQN
+13 ;
+14 SET PTLOAD=1
+15 IF (RIEN="")
SET PTLOAD=0
GOTO SAVEMWRX
+16 SET MGRP=$$MGRP^IBCNEUT5()
+17 ;
+18 NEW RDATA0,RDATA1,RDATA4,RDATA5,RDATA12,RDATA13
+19 SET DFN=$PIECE(ACTIVE(GRPNUM),U)
+20 SET EFFDT=$PIECE(ACTIVE(GRPNUM),U,3)
+21 SET SOI=$PIECE(ACTIVE(GRPNUM),U,4)
+22 SET ADDFLG=365
+23 ; Required fields needed to save the policy
+24 IF ($GET(DFN)="")!($GET(GRPNUM)="")!($GET(EFFDT)="")!($GET(SOI)="")
SET PTLOAD=0
GOTO SAVEMWRX
+25 ; Get data from the eIV Response
+26 SET RDATA0=$GET(^IBCN(365,RIEN,0))
SET RDATA1=$GET(^IBCN(365,RIEN,1))
+27 SET RDATA4=$GET(^IBCN(365,RIEN,4))
SET RDATA5=$GET(^IBCN(365,RIEN,5))
+28 SET RDATA12=$GET(^IBCN(365,RIEN,12))
SET RDATA13=$GET(^IBCN(365,RIEN,13))
+29 SET TQN=$PIECE(RDATA0,U,5)
+30 ; Get other required data
+31 SET (IBINS,IBGRP,IBAUUSR,IBEIVUSR)=""
+32 SET IBINS=$ORDER(^DIC(36,"B","MEDICARE (WNR)",""))
+33 ;find the Medicare Group Plan - Part A or Part B. There could be more than 1 Part A or Part B
+34 IF IBINS'=""
DO GETGRP
+35 SET IBAUUSR=$ORDER(^VA(200,"B","AUTOUPDATE,IBEIV",""))
+36 SET IBEIVUSR=$ORDER(^VA(200,"B","INTERFACE,IB EIV",""))
+37 IF (IBINS="")!(IBGRP="")!(IBAUUSR="")!(IBEIVUSR="")
SET PTLOAD=0
GOTO SAVEMWRX
+38 ;
+39 ; --Medicare Required fields--
+40 ; Add a new patient policy
+41 KILL DA,DD,DIC,DO,X,Y
+42 SET DIC("DR")=".01///"_IBINS_";.18///"_IBGRP_";1.01///NOW;1.02///"_IBEIVUSR_";1.05///NOW"
+43 SET DA(1)=DFN
SET DIC="^DPT("_DFN_",.312,"
SET DIC(0)="L"
SET X=IBINS
+44 DO FILE^DICN
SET (IEN312,IBCDFN)=+Y
SET IBNEW=1
+45 ;this sets variables that will be used in COVERED
DO BEFORE^IBCNSEVT
+46 SET IENS=IEN312_","_DFN_","
+47 ;
+48 KILL DATA
+49 ;'1' for PRIMARY
SET DATA(2.312,IENS,.2)=1
+50 ;'18' for SELF
SET DATA(2.312,IENS,4.03)=18
+51 ;SOURCE OF INFORMATION (from 270 Inquiry)
SET DATA(2.312,IENS,1.09)=SOI
+52 ;SUBSCRIBER ID
SET DATA(2.312,IENS,7.02)=$PIECE(RDATA13,U,2)
+53 ;EFFECTIVE DATE
SET DATA(2.312,IENS,8)=EFFDT
+54 ; --Medicare - Optional fields on 271 Payer Response--
+55 ;WHOSE INSURANCE - 'v' for VETERAN
SET DATA(2.312,IENS,6)="v"
+56 ;NAME OF INSURED
SET DATA(2.312,IENS,7.01)=$PIECE(RDATA13,U)
+57 ;
+58 ; Get DOB from 271 Payer Response, if null pull from the PATIENT file
+59 NEW PRDOB
SET PRDOB=$PIECE(RDATA1,U,2)
+60 SET DATA(2.312,IENS,3.01)=$SELECT(PRDOB'="":PRDOB,1:$$GET1^DIQ(2,DFN_",",.03))
+61 ;
+62 ; if DOB from 271 Payer Response DOESN'T match the DOB on the PATIENT file, then store
+63 ; the DOB from the 271 and add a patient policy comment indicating there is a difference
+64 IF PRDOB'=""
IF PRDOB'=$$GET1^DIQ(2,DFN_",",.03,"I")
Begin DoDot:1
+65 SET DATA(2.312,IENS,3.01)=PRDOB
+66 SET DOBCMT="The DOB on the Patient record is "_$$GET1^DIQ(2,DFN_",",.03)_". The DOB on the eIV Payer Response, which was saved to the insurance record, is "_$$FMTE^XLFDT(PRDOB,5)_"."
+67 DO ADDCOM(DFN,IEN312,DOBCMT)
End DoDot:1
+68 ;
+69 ; Get SEX from 271 Payer Response, if null pull from the PATIENT file
+70 SET DATA(2.312,IENS,3.12)=$SELECT($PIECE(RDATA1,U,4)'="":$PIECE(RDATA1,U,4),1:$$GET1^DIQ(2,DFN_",",.02))
+71 ;
+72 ; Get Address from 271 Payer Response - the Response MUST contain Address Line 1,
+73 ; City, State, Zip. Otherwise pull from PATIENT file
+74 IF ($PIECE(RDATA5,U)="")!($PIECE(RDATA5,U,3)="")!($PIECE(RDATA5,U,4)="")!($PIECE(RDATA5,U,5)="")
SET ADDFLG=2
+75 IF ADDFLG=365
Begin DoDot:1
+76 ;Street line 1
SET DATA(2.312,IENS,3.06)=$PIECE(RDATA5,U)
+77 ;City
SET DATA(2.312,IENS,3.08)=$PIECE(RDATA5,U,3)
+78 ;State
SET DATA(2.312,IENS,3.09)=$PIECE(RDATA5,U,4)
+79 ;Zip
SET DATA(2.312,IENS,3.1)=$PIECE(RDATA5,U,5)
End DoDot:1
+80 IF ADDFLG=2
Begin DoDot:1
+81 ;Street line 1
SET DATA(2.312,IENS,3.06)=$$GET1^DIQ(2,DFN_",",.111)
+82 ;City
SET DATA(2.312,IENS,3.08)=$$GET1^DIQ(2,DFN_",",.114)
+83 ;State
SET DATA(2.312,IENS,3.09)=$$GET1^DIQ(2,DFN_",",.115)
+84 ;Zip
SET DATA(2.312,IENS,3.1)=$$GET1^DIQ(2,DFN_",",.116)
End DoDot:1
+85 ; --Medicare - other fields from 271 Payer Response--
+86 NEW XX
+87 SET XX=$PIECE(RDATA4,U,2)
+88 ;Street 2
IF XX'=""
SET DATA(2.312,IENS,3.07)=XX
+89 SET XX=$PIECE(RDATA4,U,6)
+90 ;Country
IF XX'=""
SET DATA(2.312,IENS,3.13)=XX
+91 SET XX=$PIECE(RDATA4,U,9)
+92 ;Country subdivision
IF XX'=""
SET DATA(2.312,IENS,3.14)=XX
+93 SET XX=$PIECE(RDATA12,U)
+94 ;Military Info Status Code
IF XX'=""
SET DATA(2.312,IENS,12.01)=XX
+95 SET XX=$PIECE(RDATA12,U,7)
+96 ;Date Time Period
IF XX'=""
SET DATA(2.312,IENS,12.07)=XX
+97 ;
+98 IF $DATA(DATA)
DO FILE^DIE("","DATA","ERROR")
+99 IF $DATA(ERROR)
DO WARN^IBCNEHL3
KILL ERROR
DO FIL^IBCNEHL1
SET PTLOAD=0
GOTO SAVEMWRX
+100 KILL DATA
+101 ;DATE LAST VERIFIED
SET DATA(2.312,IENS,1.03)=$$NOW^XLFDT
+102 ;VERIFIED BY - AUTOUPDATE,IBEIV
SET DATA(2.312,IENS,1.04)=IBAUUSR
+103 ;LAST EDITED BY - AUTOUPDATE,IBEIV
SET DATA(2.312,IENS,1.06)=IBAUUSR
+104 DO FILE^DIE("","DATA","ERROR")
+105 IF $DATA(ERROR)
DO WARN^IBCNEHL3
QUIT
+106 ;
+107 ; Set the insurance record IEN in the IIV Response file to track
+108 ; which policy was updated based on the response
+109 DO UPDIREC^IBCNEHL3(RIEN,IEN312)
+110 ;
+111 ; Set the EIV AUTO-LOAD field (#.16) in the response file #365 to '1' for "YES" to indicate auto load occurred
+112 KILL DATA
+113 SET DATA(365,RIEN_",",.16)=1
+114 DO FILE^DIE("","DATA")
+115 ;
+116 ; File data at 2.312, 9, 10 & 11 subfiles; if error is produced update buffer entry & then quit processing
+117 SET ERFLG=$$GRPFILE^IBCNEHL1(DFN,IEN312,RIEN,1)
+118 IF $GET(ERFLG)
QUIT
+119 ;
+120 ; File new EB data
+121 SET ERFLG=$$EBFILE^IBCNEHL1(DFN,IEN312,RIEN,1)
+122 ;bail out if something went wrong during filing of EB data
IF $GET(ERFLG)
QUIT
+123 ;
+124 ; File Auto Updated policy in INTERFACILITY INSURANCE UPDATE File (#365.19)
+125 ; IBCNBAR added a field the param list when calling LOC^IBCNIUF. For consistency we added a 'null'.
+126 DO LOC^IBCNIUF(DFN,$$GET1^DIQ(2.312,IEN312_","_DFN_",",.01,"I"),IEN312,$$GET1^DIQ(365,RIEN_",",.13,"I"),"",$$GET1^DIQ(365.1,TQN_",",3.02,"E"),"")
+127 ;
+128 ; Get the buffer entry from the IIV RESPONSE File (#365)
+129 SET BUFF=+$PIECE($GET(^IBCN(365,RIEN,0)),U,4)
+130 ;
+131 ; If there is a Buffer entry associated with the Response and it is already processed,
+132 ; DO NOT touch/update files #355.33 or #355.36
+133 IF BUFF
IF $$GET1^DIQ(355.33,BUFF,.04,"I")'="E"
SET PTLOAD=0
GOTO SAVEMWRX
+134 ;
+135 ; Update the buffer status to ACCEPTED, then call DELDATA^IBCNBED so only the stub remains
+136 IF BUFF
Begin DoDot:1
+137 ;update status to accepted
DO STATUS^IBCNBEE(BUFF,"A",0,0,1)
+138 ;save auto update user to buffer
+139 SET IBIFN=BUFF_","
KILL IBARR
+140 SET IBARR(355.33,IBIFN,.06)=$GET(IBEIVUSR)
+141 DO FILE^DIE("","IBARR")
+142 ;delete buffer's insurance/patient data
DO DELDATA^IBCNBED(BUFF)
End DoDot:1
+143 ;
+144 ; File data to #355.36 file.
+145 NEW BUFF,ERROR,FDA,WE
+146 SET WE=$$GET1^DIQ(365.1,TQN_",",.1,"I")
+147 SET BUFF=$$GET1^DIQ(365,RIEN_",",.04,"I")
+148 ;Date Processed
SET FDA(355.36,"+1,",.01)=$$NOW^XLFDT
+149 ;"WE" can only be a 1 or a 6 at this point
SET FDA(355.36,"+1,",.02)=$SELECT("^6^"[(U_WE_U):3,"^1^"[(U_WE_U):1,1:"")
+150 ;Source of Information
SET FDA(355.36,"+1,",.03)=$$GET1^DIQ(365.1,TQN_",",3.02,"I")
+151 ;EIV Inquiry
SET FDA(355.36,"+1,",.05)=TQN
+152 ;EIV Response
SET FDA(355.36,"+1,",.06)=RIEN
+153 ;Buffer
SET FDA(355.36,"+1,",.07)=BUFF
+154 ;Source of Request (Which Extract)
SET FDA(355.36,"+1,",.08)=WE
+155 ;EIV Auto-load
SET FDA(355.36,"+1,",.09)=$$GET1^DIQ(365,RIEN_",",.16,"I")
+156 DO UPDATE^DIE("","FDA",,"ERROR")
+157 IF $DATA(ERROR)
Begin DoDot:1
+158 DO MSG003^IBCNEMS1(.IBMSG,.ERROR,TQN,RIEN,BUFF)
+159 DO MSG^IBCNEUT5($$MGRP^IBCNEUT5(),"eIV Problem: Error writing to the CREATION TO PROCESSING TRACKING File (#355.36)","IBMSG(")
End DoDot:1
+160 ;
SAVEMWRX ;
+1 QUIT PTLOAD
+2 ;
MWRUNLOCK ;unlock ins subfile
+1 LOCK -^DPT(DFN,.312)
+2 QUIT
+3 ;
GETGRP ;find the Medicare Group Plan - Part A or Part B
+1 NEW FOUND,GIEN
+2 SET FOUND=0
+3 SET GIEN=""
FOR
SET GIEN=$ORDER(^IBA(355.3,"B",IBINS,GIEN))
if (GIEN="")!(FOUND=1)
QUIT
Begin DoDot:1
+4 IF $GET(^IBA(355.3,GIEN,0))=""
QUIT
+5 IF $PIECE(^IBA(355.3,GIEN,0),U,3)=$SELECT(GRPNUM="Medicare Part A":"PART A",1:"PART B")
SET FOUND=1
SET IBGRP=GIEN
End DoDot:1
+6 QUIT
+7 ;
ADDCOM(IBDFN,IBPOLDA,IBPOLCOM) ;
+1 ; Add new patient policy comment (2.312, 1.18) Multiple #2.342
+2 NEW CIEN,FDA
+3 ;
+4 ;To keep the Patient Policy Comment trigger from looping and creating two entries
+5 ; we need to set DUZ to the INTERFACE,IB EIV user (IBEIVUSR)
+6 IF +$GET(IBEIVUSR)'=0
NEW DUZ
SET DUZ=$GET(IBEIVUSR)
+7 ;
+8 ; -- populate FDA array
+9 SET CIEN="+1"_","_IBPOLDA_","_IBDFN_","
+10 SET FDA(2.342,CIEN,.01)=$$NOW^XLFDT()
+11 SET FDA(2.342,CIEN,.02)=DUZ
+12 SET FDA(2.342,CIEN,.03)=IBPOLCOM
+13 ; -- add comments
+14 DO UPDATE^DIE(,"FDA")
+15 QUIT