IBCNEDE5 ;DAOU/DAC - IIV DATA EXTRACTS ;15-OCT-2002
 ;;2.0;INTEGRATED BILLING;**184,271**;21-MAR-94
 ;;Per VHA Directive 10-93-142, this routine should not be modified.
 ;
 Q    ; no direct calls allowed
 ;
SIDCHK(PIEN,DFN,BSID,SIDARRAY,FRESHDT) ; Checks the flag settings of 'Identification
 ; Requires Subscriber ID' and 'Use SSN as Subscriber ID'.  The function 
 ; returns a "^" delimited string.  The first value is between 1 and 5
 ; telling the calling program what action(s) it should perform.  The
 ; 2nd piece indicates the Subcriber ID that the calling program should
 ; use for setting the Subscriber IDs in the IIV Transmission Queue file
 ; (365.1).  The calling program is to address the blank Sub IDs and 
 ; make sure the data extract does not exceed the max extract number.
 ;
 ; PIEN - Payer's IEN (file 365.12)
 ; DFN - Patient's IEN (file 2)
 ; INREC - Insurance IEN of Patients record (subfile 2.312)
 ; BSID - Subscriber ID from buffer file (file 355.3 field )
 ; SIDARRAY - Array of active subscribers - may be subscripted by SSN 
 ; FRESHDT - Freshness Date - used for checking verified date
 ;
 ; Logic to follow:
 ;
 ; Id. Req.| Use SSN  | Sub ID|Action|
 ;  Sub ID | as Sub ID| found |  #   | Create
 ; ________|__________|_______|______|________
 ; YES        -         YES     1     1 Verification TQ entry w/ Sub ID
 ; YES       YES        NO      2     1 Ver. TQ entry, use SSN as Sub ID
 ; YES       NO         NO      3     new buffer entry or modify existing
 ;                                    saying manual verification required
 ; NO        NO         NO      4     1 Ver. TQ entry w/ blank Sub ID
 ; NO        YES        NO      5     2 Ver. TQ entries, 1 w/ SSN as Sub
 ;                                    ID and other w/ blank Sub ID
 ;
 N SIDACT,SID,APPIEN,SIDSTR,SIDREQ,SIDSSN,SSN
 N INSSTR,INSSTR1,SYMBOL,EXP,SUBID,SUBIDS,SIDCNT,INREC,MVER,VFLG
 ;
 S FRESHDT=$G(FRESHDT),VFLG=0
 ;
 I $G(BSID)'="" D  G SIDCHKX
 . S SID=BSID,(SIDACT,SIDCNT)=1
 . S SIDARRAY($$STRIP(SID,,DFN)_"_")=""
 S APPIEN=$$PYRAPP^IBCNEUT5("IIV",PIEN)
 S SIDSTR=$G(^IBE(365.12,PIEN,1,APPIEN,0))
 S SIDREQ=$P(SIDSTR,U,8)
 S SIDSSN=$P(SIDSTR,U,9)
 ;
 S INSSTR="",SIDCNT=0,INREC=$O(^DPT(DFN,.312,0)) S:'INREC INREC=1
 ;
 I $D(BSID),BSID="" G SIDC1
 I $G(^DPT(DFN,.312,INREC,0)) F  D  Q:'INREC
 . S INSSTR=$G(^DPT(DFN,.312,INREC,0))
 . S INSSTR1=$G(^DPT(DFN,.312,INREC,1))
 . S SYMBOL=$$INSERROR^IBCNEUT3("I",+INSSTR)
 . I $P(SYMBOL,U)="" D            ; no IIV related error w/ ins. company
 .. I PIEN'=$P(SYMBOL,U,2) Q      ; wrong payer ien
 .. S SUBID=$P(INSSTR,U,2)
 .. I SUBID="" Q                           ; missing Subscriber ID
 .. I $P(INSSTR,U,8)>DT Q                  ; future effective date
 .. S EXP=$P(INSSTR,U,4) I EXP,EXP
FRESHDT S VFLG=1 Q     ; verified recently
 .. S SUBIDS=$$STRIP(SUBID,,DFN)
 .. I $D(SIDARRAY(SUBIDS_"_"_INREC)) Q            ; already in the array
 .. S SIDARRAY(SUBIDS_"_"_INREC)="",SIDCNT=SIDCNT+1
 . S INREC=$O(^DPT(DFN,.312,INREC))
 . Q
 ;
 I SIDCNT S SIDACT=1 G SIDCHKX
 I 'SIDCNT,VFLG S SIDACT=1 G SIDCHKX
SIDC1 I SIDREQ,SIDSSN S SIDACT=2 D SSN(DFN) G SIDCHKX
 I SIDREQ,'SIDSSN S SIDACT=3 G SIDCHKX
 I 'SIDREQ,'SIDSSN S SIDACT=4 G SIDCHKX
 I 'SIDREQ,SIDSSN S SIDACT=5 D SSN(DFN)
 ;
SIDCHKX ; EXIT POINT
 ;
 Q SIDACT_U_SIDCNT
 ;
SSN(DFN) ; Get Patient SSN and update SIDARRAY, if needed
 S SSN=$$GETSSN(DFN)
 N SSNS
 S SSNS=$$STRIP(SSN,1,DFN)
 I $P($O(SIDARRAY(SSNS_"_")),"_")=SSNS Q
 I SSNS'="",'$D(SIDARRAY(SSNS_"_")) S SIDARRAY(SSNS_"_")="",SIDCNT=SIDCNT+1
 Q
 ;
GETSSN(DFN) ; Get Patient SSN
 Q:'$G(DFN) ""
 Q $P($G(^DPT(DFN,0)),U,9)
 ;
STRIP(ID,SS,DFN) ; Strip dashes and spaces if ssn
 ;         ID can be ssn or subid
 ;         if SS, ssn is being passed
 N SSN,IDS,IDB
 S SS=$G(SS)
 ; If a ssn is passed, strip dashes and spaces
 I SS Q $TR(ID,"- ")
 ; If not ssn format, do not strip
 S IDB=$TR(ID," ")
 I IDB'?3N1"-"2N1"-"4N,IDB'?9N Q ID
 ; Compare w/SSN - if it matches, strip dashes and spaces
 S IDS=$TR(ID,"- ")
 S SSN=$TR($$GETSSN(DFN),"- ")
 I SSN=IDS Q IDS
 Q ID
 ;
SIDCHK2(DFN,PIEN,SIDARRAY,FRESHDT) ;Checks the flag settings of 
 ; 'Identification Requires Subscriber ID' and 'Use SSN as Subscriber
 ; ID'.  The function returns a "^" delimited string.  The first value 
 ; is between 1 and 8 telling the calling program what action(s) it 
 ; should perform.  The 2nd piece indicates the number of unique 
 ; Subscriber IDs found for the patient/payer combo.  In addition, a
 ; local array of Subcriber IDs are passed back by reference that the
 ; calling program should use for setting the Subscriber IDs in IIV 
 ; Transmission Queue file (#365.1).  The calling program is to address
 ; the blank Sub IDs and make sure the data extract does not exceed the
 ; max extract number.
 ;
 ; PIEN - Payer's IEN (file 365.12)
 ; DFN - Patient's IEN (file 2)
 ; SIDARRAY - Local array passed by reference.  This function returns
 ;            the array populated with the possible Subscriber IDs for
 ;            that patient/payer combination.
 ; FRESHDT - Freshness date used for checking last verified condition
 ;
 ; Logic to follow:
 ;
 ; Id. Req.| Use SSN  | Sub ID|Action|
 ;  Sub ID | as Sub ID| found |  #   | Create
 ; ________|__________|_______|______|________
 ; YES       YES        YES     1     1 Identification TQ entry w/ SSN 
 ;                                    as Sub ID, & 1 Iden. TQ entry for
 ;                                    each unique old Sub ID
 ; YES       YES        NO      2     1 Iden. TQ entry, use SSN as Sub ID
 ; YES       NO         YES     3     1 Iden. TQ entry for each unique 
 ;                                    old Sub ID
 ; YES       NO         NO      4     No TQ entries (may flag as error)
 ; NO        NO         YES     5     1 Iden. TQ entry w/ blank Sub ID, 
 ;                                    & 1 Iden. TQ entry for each unique 
 ;                                    old Sub ID
 ; NO        NO         NO      6     1 Iden. TQ entry w/ blank Sub ID
 ; NO        YES        YES     7     1 Iden. TQ entry w/ blank Sub ID,
 ;                                    & 1 Iden. TQ entry w/ SSN as Sub 
 ;                                    ID, & 1 Iden. TQ entry for each 
 ;                                    unique old Sub ID
 ; NO        YES        NO      8     2 Iden. TQ entries, 1 w/ SSN as Sub
 ;                                    ID and other w/ blank Sub ID
 ;
 N SIDACT,SID,APPIEN,SIDSTR,SIDREQ,SIDSSN,SSN,INSSTR,INSSTR1,INREC
 N SYMBOL,SUBID,SUBIDS,SIDCNT,MVER,VFLG
 ;
 S FRESHDT=$G(FRESHDT),VFLG=0
 S APPIEN=$$PYRAPP^IBCNEUT5("IIV",PIEN)
 S SIDSTR=$G(^IBE(365.12,PIEN,1,APPIEN,0))
 S SIDREQ=$P(SIDSTR,U,8)
 S SIDSSN=$P(SIDSTR,U,9)
 S INSSTR="",(SID,SIDCNT)=0,INREC=$O(^DPT(DFN,.312,0)) S:'INREC INREC=1
 ;
 I $G(^DPT(DFN,.312,INREC,0)) F  D  Q:'INREC!VFLG
 . S INSSTR=$G(^DPT(DFN,.312,INREC,0))
 . S INSSTR1=$G(^DPT(DFN,.312,INREC,1))
 . S SYMBOL=$$INSERROR^IBCNEUT3("I",+INSSTR)
 . I $P(SYMBOL,U)="" D            ; no IIV related error w/ ins. company
 .. I PIEN'=$P(SYMBOL,U,2) Q      ; wrong payer ien
 .. S SUBID=$P(INSSTR,U,2)
 .. I SUBID="" Q                           ; missing Subscriber ID
 .. S MVER=$P(INSSTR1,U,3)                 ; last verified date
 .. I MVER'="",FRESHDT'="",MVER>FRESHDT S VFLG=1 Q    ; verified recently
 .. S SUBIDS=$$STRIP(SUBID,,DFN)
 .. I $D(SIDARRAY(SUBIDS_"_")) Q            ; already in the array
 .. S SIDARRAY(SUBIDS_"_"_INREC)="",SID=1,SIDCNT=SIDCNT+1
 . S INREC=$O(^DPT(DFN,.312,INREC))
 ;
 I VFLG K SIDARRAY S SIDCNT=0,SIDACT=4 G SIDCK2X
 I SID,SIDREQ,SIDSSN S SIDACT=1 D SSN(DFN) G SIDCK2X
 I 'SID,SIDREQ,SIDSSN S SIDACT=2 D SSN(DFN) G SIDCK2X
 I SID,SIDREQ,'SIDSSN S SIDACT=3 G SIDCK2X
 I 'SID,SIDREQ,'SIDSSN S SIDACT=4 G SIDCK2X
 I SID,'SIDREQ,'SIDSSN S SIDACT=5 G SIDCK2X
 I 'SID,'SIDREQ,'SIDSSN S SIDACT=6 G SIDCK2X
 I SID,'SIDREQ,SIDSSN S SIDACT=7 D SSN(DFN) G SIDCK2X
 I 'SID,'SIDREQ,SIDSSN S SIDACT=8 D SSN(DFN) G SIDCK2X
 ;
SIDCK2X ; EXIT POINT
 ;
 Q SIDACT_U_SIDCNT
 ;