| 1 | IVMZ07C ;BAJ - HL7 Z07 CONSISTENCY CHECKER -- DRIVER ROUTINE ; 9/27/2006
 | 
|---|
| 2 |  ;;2.0;INCOME VERIFICATION MATCH;**105**;JUL 8,1996;Build 2
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; 
 | 
|---|
| 5 |  ; This routine calls various checking subroutines and manages arrays and data filing
 | 
|---|
| 6 |  ; for inconsistency checking prior to building a Z07 HL7 record.  This routine returns
 | 
|---|
| 7 |  ; a value and must be called as an API:
 | 
|---|
| 8 |  ; 
 | 
|---|
| 9 |  ; I '$$EN^IVMZ07C(DFN) Q
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ; Values returned:
 | 
|---|
| 12 |  ; 0 = Fail: inconsistencies found, do not build Z07 record
 | 
|---|
| 13 |  ; 1 = Pass: No inconsistencies found, Ok to build Z07 record
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 |  ; Must be called from entry point
 | 
|---|
| 16 |  Q
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 | EN(DFN) ; entry point.  Patient DFN is sent from calling routine.
 | 
|---|
| 19 |  ; initialize working variables
 | 
|---|
| 20 |  N PASS,DGP,DGSD,U
 | 
|---|
| 21 |  S U="^"
 | 
|---|
| 22 |  ; 
 | 
|---|
| 23 |  ; Input:        DFN     = ^DPT(DFN) of record to check
 | 
|---|
| 24 |  ;                       BATCH   = 1     batch/background job records should be counted
 | 
|---|
| 25 |  ;                                       = 0     single job, do not count records
 | 
|---|
| 26 |  ; structure:
 | 
|---|
| 27 |  ; 1. delete existing Z07 inconsistencies
 | 
|---|
| 28 |  ; 2. load data arrays
 | 
|---|
| 29 |  ; 3. call subroutines
 | 
|---|
| 30 |  ; 4. check for Pass/Fail
 | 
|---|
| 31 |  ; 5. update file 38.5 if necessary
 | 
|---|
| 32 |  ; 6. return Pass/Fail
 | 
|---|
| 33 |  ; 
 | 
|---|
| 34 |  ; Set flag
 | 
|---|
| 35 |  S PASS=0
 | 
|---|
| 36 |  I '$D(^DPT(DFN)) Q PASS
 | 
|---|
| 37 |  S PASS=1
 | 
|---|
| 38 |  ;
 | 
|---|
| 39 |  ; Load Patient and Spouse/dependent data
 | 
|---|
| 40 |  D LOADPT(DFN,.DGP),LOADSD^IVMZ072(DFN,.DGSD)
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  ; Do checks and file inconsistencies
 | 
|---|
| 43 |  D WORK(DFN,.DGP,.DGSD)
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 |  ; Delete old Inconsistency info
 | 
|---|
| 46 |  D DELETE(DFN)
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 |  ; File new inconsistencies if necessary
 | 
|---|
| 49 |  I $$FILE(DFN) S PASS=0
 | 
|---|
| 50 |  ;
 | 
|---|
| 51 |  ; update counters
 | 
|---|
| 52 |  D COUNT(PASS)
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  ; return pass/fail flag
 | 
|---|
| 55 |  Q PASS
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 | COUNT(PASS) ; counter for batch run
 | 
|---|
| 58 |  N I
 | 
|---|
| 59 |  ; Set it up the first time through
 | 
|---|
| 60 |  I '$D(^TMP($J,"CC")) D
 | 
|---|
| 61 |  . F I=0,1 S ^TMP($J,"CC",I)=0
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 |  ; Increment Batch counter
 | 
|---|
| 64 |  S ^TMP($J,"CC",PASS)=^TMP($J,"CC",PASS)+1
 | 
|---|
| 65 |  Q
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 | LOADPT(DFN,DGP) ; load patient data into arrays
 | 
|---|
| 68 |  N NIEN,IEN,I,DTTM,NAMCOM,NAME
 | 
|---|
| 69 |  ; we need to load data from the following files
 | 
|---|
| 70 |  ; Patient File                          2
 | 
|---|
| 71 |  ; Name Components                       20
 | 
|---|
| 72 |  ; Patient Enrollment                    27.11
 | 
|---|
| 73 |  ; Means test file                       408.31
 | 
|---|
| 74 |  ; MST History file                      29.11
 | 
|---|
| 75 |  ; Note: we also need Catastrophic data info, but that subroutine loads its own data array.
 | 
|---|
| 76 |  ; 
 | 
|---|
| 77 |  ; ***************************
 | 
|---|
| 78 |  ; DGP("PAT") Patient file
 | 
|---|
| 79 |  F I=0,.3,.15,.29,.31,.32,.321,.322,.35,.36,.361,.38,.52,"SSN","TYPE","VET" S DGP("PAT",I)=$G(^DPT(DFN,I))
 | 
|---|
| 80 |  S NAME=$P($G(^DPT(DFN,0)),"^",1),NAMCOM=$P($G(^DPT(DFN,"NAME")),"^",1)'=""
 | 
|---|
| 81 |  ; 
 | 
|---|
| 82 |  ; ***************************
 | 
|---|
| 83 |  ; DGP("NAME") Name Components
 | 
|---|
| 84 |  I NAMCOM S NIEN=$P(^DPT(DFN,"NAME"),U,1) I '$D(^VA(20,NIEN,1)) S NAMCOM=0
 | 
|---|
| 85 |  S DGP("NAME",1)=$S(NAMCOM:$G(^VA(20,NIEN,1)),1:$P(NAME,",")_"^"_$P($P(NAME,",",2)," ",1)_"^"_$P($P(NAME,",",2)," ",2))
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 |  ; ***************************
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 |  ; DGP("ENR") Patient Enrollment
 | 
|---|
| 90 |  S NIEN="",NIEN=$P($G(^DPT(DFN,"ENR")),U,1)
 | 
|---|
| 91 |  I NIEN]"",$D(^DGEN(27.11,NIEN)) M DGP("ENR")=^DGEN(27.11,NIEN)
 | 
|---|
| 92 |  ; 
 | 
|---|
| 93 |  ; ***************************
 | 
|---|
| 94 |  ; DGP("MEANS") Means Test
 | 
|---|
| 95 |  S NIEN=+$$LST^DGMTU(DFN) I NIEN,$D(^DGMT(408.31,NIEN,0)) S DGP("MEANS",0)=^DGMT(408.31,NIEN,0)
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 |  ; ***************************
 | 
|---|
| 98 |  ; DGP("MST") MST History
 | 
|---|
| 99 |  S (DTTM,NIEN)=""
 | 
|---|
| 100 |  S DTTM=$O(^DGMS(29.11,"APDT",DFN,""),-1)
 | 
|---|
| 101 |  I DTTM'="" D
 | 
|---|
| 102 |  . S DTTM=$O(^DGMS(29.11,"APDT",DFN,""))
 | 
|---|
| 103 |  . S NIEN=$O(^DGMS(29.11,"APDT",DFN,DTTM,""))
 | 
|---|
| 104 |  . I $D(^DGMS(29.11,NIEN,0)) S DGP("MST",0)=^DGMS(29.11,NIEN,0)
 | 
|---|
| 105 |  ;
 | 
|---|
| 106 |  ; ***************************
 | 
|---|
| 107 |  Q
 | 
|---|
| 108 |  ;
 | 
|---|
| 109 | WORK(DFN,DGP,DGSD) ;
 | 
|---|
| 110 |  ; call subroutines to run rules and file any inconsistencies
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 |  ; Demographics rules
 | 
|---|
| 113 |  D EN^IVMZ7CD(DFN,.DGP,.DGSD)
 | 
|---|
| 114 |  ;
 | 
|---|
| 115 |  ; Enrollment/Eligibility rules
 | 
|---|
| 116 |  D EN^IVMZ7CE(DFN,.DGP)
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 |  ; Service rules
 | 
|---|
| 119 |  D EN^IVMZ7CS(DFN,.DGP)
 | 
|---|
| 120 |  ;
 | 
|---|
| 121 |  ; Catastrophic Disability rules
 | 
|---|
| 122 |  D EN^IVMZ7CCD(DFN)
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 |  ; Registration Inconsistencies
 | 
|---|
| 125 |  D EN^IVMZ7CR(DFN,.DGP,.DGSD)
 | 
|---|
| 126 |  ;
 | 
|---|
| 127 |  Q
 | 
|---|
| 128 |  ;
 | 
|---|
| 129 | DELETE(DFN) ; delete all Z07 inconsistencies from INCONSISTENT DATA file (#38.5).  Since we're not sure which rules
 | 
|---|
| 130 |  ; will block a Z07 record, we need to loop through the INCONSISTENT DATA ELEMENTS file (#38.6) and grab only 
 | 
|---|
| 131 |  ; those rules which are marked to prevent building a Z07 record:
 | 
|---|
| 132 |  ; 
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 |  N DELARRY,RULE,DIK,DA
 | 
|---|
| 135 |  ; 
 | 
|---|
| 136 |  ; create an array of rules which prevent Z07 records 
 | 
|---|
| 137 |  S RULE=0 F  S RULE=$O(^DGIN(38.6,RULE)) Q:RULE=""  Q:$A(RULE)>$A(9)  D
 | 
|---|
| 138 |  . I '$P(^DGIN(38.6,RULE,0),U,5),$P(^DGIN(38.6,RULE,0),U,6) S DELARRY(RULE)=""
 | 
|---|
| 139 |  ;
 | 
|---|
| 140 |  ; Now we have to check the patient INCONSISTENT DATA file (#38.5) and delete any records which have to be rechecked.
 | 
|---|
| 141 |  ; 
 | 
|---|
| 142 |  S DIK="^DGIN(38.5,"_DFN_","_"""I"""_","
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 |  S DA="" F  S DA=$O(DELARRY(DA)) Q:DA=""  D ^DIK
 | 
|---|
| 145 |  Q
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 | FILE(DFN) ;
 | 
|---|
| 148 |  N FILE,SUCCESS,CCS,I,DGENDA,DATA,SUBFILE,DIK,DA
 | 
|---|
| 149 |  S FILE=38.5,CCS=0
 | 
|---|
| 150 |  ; if no inconsistencies, return 0
 | 
|---|
| 151 |  I '$D(^TMP($J,DFN)) D  Q CCS
 | 
|---|
| 152 |  . ; clean up INCONSISTENT DATA file if no inconsistencies exist
 | 
|---|
| 153 |  . I '$P($G(^DGIN(38.5,DFN,"I",0)),"^",4) D
 | 
|---|
| 154 |  . . S DIK="^DGIN(38.5,",DA=DFN
 | 
|---|
| 155 |  . . D ^DIK
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  ; else process inconsistencies and return PASS=0
 | 
|---|
| 158 |  S CCS=1
 | 
|---|
| 159 |  ; if a new entry, create a stub
 | 
|---|
| 160 |  S DATA(.01)=DFN
 | 
|---|
| 161 |  I '$D(^DGIN(FILE,"B",DFN)) D
 | 
|---|
| 162 |  . S DATA(2)=$$DT^XLFDT,DATA(3)=.5
 | 
|---|
| 163 |  . S SUCCESS=$$ADD^DGENDBS(FILE,,.DATA,,DFN)
 | 
|---|
| 164 |  ;
 | 
|---|
| 165 |  ; update file header with data and user info.
 | 
|---|
| 166 |  ; Last Updated field (#4) = Today's date
 | 
|---|
| 167 |  ; Last Updated by field (#5) = Postmaster
 | 
|---|
| 168 |  S DGENDA=DFN,DATA(4)=$$DT^XLFDT,DATA(5)=.5
 | 
|---|
| 169 |  S SUCCESS=$$UPD^DGENDBS(FILE,.DGENDA,.DATA)
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 |  ; add inconsistencies to file
 | 
|---|
| 172 |  K DATA
 | 
|---|
| 173 |  S SUBFILE=38.51,DGENDA(1)=DFN
 | 
|---|
| 174 |  S I="" F  S I=$O(^TMP($J,DFN,I)) Q:I=""  D
 | 
|---|
| 175 |  . S (DATA(.01),DATA(.001),DGENDA)=I
 | 
|---|
| 176 |  . S SUCCESS=$$ADD^DGENDBS(SUBFILE,.DGENDA,.DATA)
 | 
|---|
| 177 |  ;
 | 
|---|
| 178 |  ; kill temp file before exit
 | 
|---|
| 179 |  K ^TMP($J,DFN)
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 |  Q CCS
 | 
|---|
| 182 |  ;
 | 
|---|