| 1 | IVMZ7CR ;BAJ - HL7 Z07 CONSISTENCY CHECKER -- REGISTRATION SUBROUTINE ; 12/7/05 12:24pm
 | 
|---|
| 2 |  ;;2.0;INCOME VERIFICATION MATCH;**105**;JUL 8,1996;Build 2
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; Registration Consistency Checks
 | 
|---|
| 5 |  Q       ; Entry point must be specified
 | 
|---|
| 6 | EN(DFN,DGP,DGSD) ;Entry point
 | 
|---|
| 7 |  ;  input:  DFN - Patient IEN
 | 
|---|
| 8 |  ;          DGP - Patient data array
 | 
|---|
| 9 |  ;          DGSD - Spouse and Dependent data array
 | 
|---|
| 10 |  ; output: ^TMP($J,DFN,RULE) global
 | 
|---|
| 11 |  ;          DFN - Patient IEN
 | 
|---|
| 12 |  ;          RULE - Consistency rule #
 | 
|---|
| 13 |  ;initialize variables
 | 
|---|
| 14 |  N RULE,Y,X,FILERR,SPDEP
 | 
|---|
| 15 |  S SPDEP=$D(DGSD("DEP"))
 | 
|---|
| 16 |  ; we do not count through all numbers to save routine space
 | 
|---|
| 17 |  F RULE=4,7,9,11,13,15,16,19,24,29:1:31,34,60,72,74,78,81,83,85,86 I $D(^DGIN(38.6,RULE)) D
 | 
|---|
| 18 |  . I $$ON(RULE) D @RULE
 | 
|---|
| 19 |  I $D(FILERR) M ^TMP($J,DFN)=FILERR
 | 
|---|
| 20 |  Q
 | 
|---|
| 21 | 4 ; DOB UNSPECIFIED
 | 
|---|
| 22 |  ; Note: RULE #302 in IVMZ7CD is a duplicate of this rule
 | 
|---|
| 23 |  N RIEN
 | 
|---|
| 24 |  I $P($G(DGP("PAT",0)),U,3)="" S FILERR(RULE)=""
 | 
|---|
| 25 |  I 'SPDEP Q
 | 
|---|
| 26 |  S RIEN=0 F  S RIEN=$O(DGSD("DEP",RIEN)) Q:RIEN=""  D
 | 
|---|
| 27 |  . I $P(DGSD("DEP",RIEN,0),U,3)="" S FILERR(RULE)=""
 | 
|---|
| 28 |  Q
 | 
|---|
| 29 | 7 ; SSN UNSPECIFIED
 | 
|---|
| 30 |  ; Note: RULE #305 in IVMZ7CD is a duplicate of this rule
 | 
|---|
| 31 |  I $P($G(DGP("PAT",0)),U,9)="" S FILERR(RULE)=""
 | 
|---|
| 32 |  Q
 | 
|---|
| 33 | 9 ; VETERAN STATUS UNSPECIFIED
 | 
|---|
| 34 |  I $P($G(DGP("PAT","VET")),U)="" S FILERR(RULE)=""
 | 
|---|
| 35 |  Q
 | 
|---|
| 36 | 11 ; SC PROMPT INCONSISTENT
 | 
|---|
| 37 |  N VET,SC,PTYPE
 | 
|---|
| 38 |  ; If VET Status is not specified (RULE 9) no need for this test
 | 
|---|
| 39 |  Q:$P($G(DGP("PAT","VET")),U)=""
 | 
|---|
| 40 |  S VET=$P(DGP("PAT","VET"),U,1)="Y",SC=$P(DGP("PAT",.3),U,1)="Y"
 | 
|---|
| 41 |  I 'VET,SC S FILERR(RULE)=""
 | 
|---|
| 42 |  Q
 | 
|---|
| 43 | 13 ; POS UNSPECIFIED
 | 
|---|
| 44 |  ; Note: Rule #413 IN IVMZ7CE is a duplicate of this rule
 | 
|---|
| 45 |  Q:$P($G(DGP("PAT","VET")),U,1)'="Y"
 | 
|---|
| 46 |  ; Make sure that the value in the field is valid -- DGRPC does this as well
 | 
|---|
| 47 |  I '$D(^DIC(21,+$P(DGP("PAT",.32),U,3),0)) S FILERR(RULE)=""
 | 
|---|
| 48 |  Q
 | 
|---|
| 49 | 15 ; INEL REASON UNSPECIFIED
 | 
|---|
| 50 |  ; Note: Rule #404 IN IVMZ7CE is a duplicate of this rule
 | 
|---|
| 51 |  I $P(DGP("PAT",.15),U,2),$P($G(DGP("PAT",.3)),U,7)="" S FILERR(RULE)=""
 | 
|---|
| 52 |  Q
 | 
|---|
| 53 | 16 ; DATE OF DEATH IN FUTURE
 | 
|---|
| 54 |  ; Note: Rule #308 IN IVMZ7CD is a duplicate of this rule
 | 
|---|
| 55 |  S X=$P($G(DGP("PAT",.35)),U) I X']"" Q
 | 
|---|
| 56 |  ; Compare DOD to right now
 | 
|---|
| 57 |  I X>$$DT^XLFDT S FILERR(RULE)=""
 | 
|---|
| 58 |  Q
 | 
|---|
| 59 | 19 ; ELIG/NONVET STAT INCONSISTENT
 | 
|---|
| 60 |  ; Note: Rule #405 in IVMZ7CE is a duplicate of this rule
 | 
|---|
| 61 |  N VET,ELIG,FILE8,FILE81,MPTR,MTYPE,PTYPE
 | 
|---|
| 62 |  ; Patient's VET status
 | 
|---|
| 63 |  S VET=$P($G(DGP("PAT","VET")),U,1) I VET="" S FILERR(RULE)="" Q
 | 
|---|
| 64 |  ; do this check for NON-VET status only
 | 
|---|
| 65 |  Q:VET="Y"
 | 
|---|
| 66 |  ; Check PT type to see if we skip VET checks
 | 
|---|
| 67 |  S PTYPE=$P($G(DGP("PAT","TYPE")),U,1)
 | 
|---|
| 68 |  I PTYPE]"",$P(^DG(391,PTYPE,0),U,2) Q
 | 
|---|
| 69 |  ; Eligibility Code
 | 
|---|
| 70 |  S ELIG=$P($G(DGP("PAT",.36)),U,1) I ELIG="" S FILERR(RULE)="" Q
 | 
|---|
| 71 |  ;start in File #8
 | 
|---|
| 72 |  S FILE8=$G(^DIC(8,ELIG,0)) I FILE8="" S FILERR(RULE)="" Q
 | 
|---|
| 73 |  ;using the pointer value in field #8 (node 0; piece 9)
 | 
|---|
| 74 |  S MPTR=$P(FILE8,U,9)
 | 
|---|
| 75 |  ;find the record in File #8.1
 | 
|---|
| 76 |  S FILE81=$G(^DIC(8.1,MPTR,0)) I FILE81="" S FILERR(RULE)="" Q
 | 
|---|
| 77 |  ;check the Type field #4 (node 0; piece 5). 
 | 
|---|
| 78 |  S MTYPE=$P(FILE81,U,5)
 | 
|---|
| 79 |  ; Pt's VET status must match NON-VET Status of Eligibility Code
 | 
|---|
| 80 |  I VET'=MTYPE S FILERR(RULE)=""
 | 
|---|
| 81 |  Q
 | 
|---|
| 82 | 24 ; POS/ELIG CODE INCONSISTENT
 | 
|---|
| 83 |  ; Note: Rule #412 in IVMZ7CE is a duplicate of this rule
 | 
|---|
| 84 |  I '$D(^DIC(21,+$P(DGP("PAT",.32),U,3),"E",+$P(DGP("PAT",.36),U,1))) S FILERR(RULE)=""
 | 
|---|
| 85 |  Q
 | 
|---|
| 86 | 29 ; A&A CLAIMED, NONVET
 | 
|---|
| 87 |  I $P(DGP("PAT","VET"),U,1)'="Y",$P($G(^DPT(DFN,.362)),U,12)="Y" S FILERR(RULE)=""
 | 
|---|
| 88 |  Q
 | 
|---|
| 89 | 30 ; HOUSEBOUND CLAIMED, NONVET
 | 
|---|
| 90 |  I $P(DGP("PAT","VET"),U,1)'="Y",$P($G(^DPT(DFN,.362)),U,13)="Y" S FILERR(RULE)=""
 | 
|---|
| 91 |  Q
 | 
|---|
| 92 | 31 ; VA PENSION CLAIMED, NONVET
 | 
|---|
| 93 |  I $P(DGP("PAT","VET"),U,1)'="Y",$P($G(^DPT(DFN,.362)),U,14)="Y" S FILERR(RULE)=""
 | 
|---|
| 94 |  Q
 | 
|---|
| 95 | 34 ; POW CLAIMED, NONVET
 | 
|---|
| 96 |  I $P(DGP("PAT","VET"),U,1)'="Y",$P($G(^DPT(DFN,.52)),U,5)="Y" S FILERR(RULE)=""
 | 
|---|
| 97 |  Q
 | 
|---|
| 98 | 60 ; AGENT ORANGE EXP LOC MISSING
 | 
|---|
| 99 |  ; Note: Rule #512 in IVMZ7CS is a duplicate of this rule.
 | 
|---|
| 100 |  I $P(DGP("PAT",.321),U,2)="Y",$P(DGP("PAT",.321),U,13)="" S FILERR(RULE)=""
 | 
|---|
| 101 |  Q
 | 
|---|
| 102 | 72 ; MSE DATA MISSING/INCOMPLETE
 | 
|---|
| 103 |  ; Note: Rule #513 in IVMZ7CS is a duplicate of this rule.
 | 
|---|
| 104 |  N I,X
 | 
|---|
| 105 |  S X=DGP("PAT",.32)
 | 
|---|
| 106 |  F I=4,5,8 I $P(X,U,I)'="",'$$YY^IVMZ7CS($P(X,U,6)) S FILERR(RULE)="" Q     ;LAST
 | 
|---|
| 107 |  F I=9,10,13 I $P(X,U,I)'="",'$$YY^IVMZ7CS($P(X,U,11)) S FILERR(RULE)="" Q  ;NTL
 | 
|---|
| 108 |  F I=14,15,18 I $P(X,U,I)'="",'$$YY^IVMZ7CS($P(X,U,11)) S FILERR(RULE)=""   ;NNTL
 | 
|---|
| 109 |  Q
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 | 74 ; CONFLICT DT MISSING/INCOMPLETE
 | 
|---|
| 112 |  ; Note: Rule #515 in IVMZ7CS is a duplicate of this rule.
 | 
|---|
| 113 |  ; ALSO # 75 CONFLICT TO DT BEFORE FROM DT
 | 
|---|
| 114 |  ;      # 76 INACCURATE CONFLICT DATE
 | 
|---|
| 115 |  ; 
 | 
|---|
| 116 |  N I,T,FROM,TO,RULE1,RULE2,NODE,PCE,PCEFR,PCETO,CONFL,RANGE,RFR,RTO,RNGE,ERR,COM,ON75,ON76
 | 
|---|
| 117 |  S RULE1=75,RULE2=76
 | 
|---|
| 118 |  S ON75=$$ON(75),ON76=$$ON(76)
 | 
|---|
| 119 |  S I=$$RANGE^DGMSCK()    ; load range table
 | 
|---|
| 120 |  F I=1:1 S CONFL=$P($T(CONLIST+I),";;",3) Q:CONFL="QUIT"  D
 | 
|---|
| 121 |  . ;we have to have a flag ERR because we don't want multiple
 | 
|---|
| 122 |  . ;inconsistencies on a single conflict but we do want to
 | 
|---|
| 123 |  . ;flag a single inconsistency on multiple conflicts
 | 
|---|
| 124 |  . S ERR=0
 | 
|---|
| 125 |  . S NODE=$P(CONFL,U,1),PCE=$P(CONFL,U,2),PCEFR=$P(CONFL,U,3),PCETO=$P(CONFL,U,4)
 | 
|---|
| 126 |  . S RNGE=$P(CONFL,U,5)
 | 
|---|
| 127 |  . Q:$P(DGP("PAT",NODE),U,PCE)'="Y"
 | 
|---|
| 128 |  . S FROM=$P(DGP("PAT",NODE),U,PCEFR),TO=$P(DGP("PAT",NODE),U,PCETO)
 | 
|---|
| 129 |  . ; check rule 74 CONFLICT DT MISSING/INCOMPLETE
 | 
|---|
| 130 |  . F T=FROM,TO I '$$YM^IVMZ7CS(T) S FILERR(RULE)="",ERR=1
 | 
|---|
| 131 |  . Q:ERR
 | 
|---|
| 132 |  . ; check rule 75 CONFLICT TO DT BEFORE CONFLICT FROM DT
 | 
|---|
| 133 |  . I ON75,FROM>TO S FILERR(RULE1)="",ERR=1
 | 
|---|
| 134 |  . Q:ERR
 | 
|---|
| 135 |  . ; check rule 76 INACCURATE CONFLICT DATE
 | 
|---|
| 136 |  . Q:ERR
 | 
|---|
| 137 |  . Q:'$D(RANGE(RNGE))  ; can't calculate if range table is missing
 | 
|---|
| 138 |  . ; determine whether dates are withing conflict range
 | 
|---|
| 139 |  . S RFR=$P(RANGE(RNGE),U,1),RTO=$P(RANGE(RNGE),U,2)
 | 
|---|
| 140 |  . I ON76 D
 | 
|---|
| 141 |  . . I '((RFR'>FROM)&((RTO'<TO))) S FILERR(RULE2)=""
 | 
|---|
| 142 |  Q
 | 
|---|
| 143 | 78 ; INACCURATE COMBAT DT/LOC
 | 
|---|
| 144 |  N I,T,FROM,TO,RULE,NODE,PCE,PCEFR,PCETO,CONFL,RANGE,RFR,RTO,RNGE,ERR,COM,ON78,LOC
 | 
|---|
| 145 |  ; This tag checks COMBAT status and verifies that valid FROM & TO dates are found
 | 
|---|
| 146 |  S RULE=78
 | 
|---|
| 147 |  I '$$ON(RULE) Q
 | 
|---|
| 148 |  S I=$$RANGE^DGMSCK()    ; load range table
 | 
|---|
| 149 |  F I=1:1 S CONFL=$P($T(COMLIST+I),";;",3) Q:CONFL="QUIT"  D
 | 
|---|
| 150 |  . S NODE=$P(CONFL,U,1),PCE=$P(CONFL,U,2),PCEFR=$P(CONFL,U,3),PCETO=$P(CONFL,U,4)
 | 
|---|
| 151 |  . S RNGE=$P(CONFL,U,5)
 | 
|---|
| 152 |  . ; if we have COMBAT data, get Service Location info, it comes under a different rule
 | 
|---|
| 153 |  . Q:$P(DGP("PAT",NODE),U,PCE)'="Y"
 | 
|---|
| 154 |  . S RNGE=$$COMPOW^DGRPMS($P(DGP("PAT",.52),U,12)) I $G(RNGE)="" S FILERR(RULE)="" Q
 | 
|---|
| 155 |  . S FROM=$P(DGP("PAT",NODE),U,PCEFR),TO=$P(DGP("PAT",NODE),U,PCETO)
 | 
|---|
| 156 |  . ; determine whether Pt dates are within conflict range for specified location
 | 
|---|
| 157 |  . S RFR=$P(RANGE(RNGE),U,1),RTO=$P(RANGE(RNGE),U,2)
 | 
|---|
| 158 |  . I '(RFR'>FROM&((FROM'>RTO)&((RTO'<TO)&((TO'<RFR))))) S FILERR(RULE)=""
 | 
|---|
| 159 |  Q
 | 
|---|
| 160 | 81 ; COMBAT DT NOT WITHIN MSE
 | 
|---|
| 161 |  ; this code is copied from DGRP3
 | 
|---|
| 162 |  ; MSFROMTO^DGMSCK creates a block for a continual MSE
 | 
|---|
| 163 |  N MSE,MSECHK,MSESET,ANYMSE,DGP81
 | 
|---|
| 164 |  I '$P($G(DGP("PAT",.52)),U,12) Q
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  ; we're calling into DG Legacy code so we have to modify some arrays
 | 
|---|
| 167 |  M DGP81=DGP K DGP
 | 
|---|
| 168 |  M DGP=DGP81("PAT")
 | 
|---|
| 169 |  ; set up the check
 | 
|---|
| 170 |  S:'$G(MSECHK) MSECHK=$$MSCK^DGMSCK S:'$G(MSESET) MSESET=$$MSFROMTO^DGMSCK
 | 
|---|
| 171 |  ; If COMBAT, but no MSE, then Range is NOT within MSE
 | 
|---|
| 172 |  I '$G(ANYMSE) D  Q
 | 
|---|
| 173 |  . S FILERR(RULE)=""
 | 
|---|
| 174 |  . K DGP M DGP=DGP81
 | 
|---|
| 175 |  I '$$RWITHIN^DGRPDT($P(MSESET,U,1),$P(MSESET,U,2),$P($G(DGP81("PAT",.52)),U,13),$P($G(DGP81("PAT",.52)),U,14)) S FILERR(RULE)=""
 | 
|---|
| 176 |  K DGP M DGP=DGP81
 | 
|---|
| 177 |  Q
 | 
|---|
| 178 |  ;
 | 
|---|
| 179 | 83 ; BOS REQUIRES DATE W/IN WWII
 | 
|---|
| 180 |  ; this code is copied from DGRP3
 | 
|---|
| 181 |  N BOS,BOSN,MS,MSE,DGP83
 | 
|---|
| 182 |  Q:'$D(DGP("PAT",.32))
 | 
|---|
| 183 |  ; we're calling into DG Legacy code so we have to modify some arrays
 | 
|---|
| 184 |  M DGP83=DGP K DGP
 | 
|---|
| 185 |  M DGP=DGP83("PAT")
 | 
|---|
| 186 |  F MS=1:1:3 D
 | 
|---|
| 187 |  . I MS=2,$P(DGP83("PAT",.32),U,19)'="Y" Q
 | 
|---|
| 188 |  . I MS=3,$P(DGP83("PAT",.32),U,20)'="Y" Q
 | 
|---|
| 189 |  . S BOS=$P(DGP83("PAT",.32),U,(5*MS)) Q:'BOS  S BOSN=$P($G(^DIC(23,BOS,0)),U)
 | 
|---|
| 190 |  . S MSE=$P("MSL^MSNTL^MSNNTL",U,MS)
 | 
|---|
| 191 |  . I $$BRANCH^DGRPMS(BOS_U_BOSN),'$$WWII^DGRPMS(DFN,"",MSE) S FILERR(RULE)=""
 | 
|---|
| 192 |  ; fix the arrays before we leave
 | 
|---|
| 193 |  K DGP M DGP=DGP83
 | 
|---|
| 194 |  Q
 | 
|---|
| 195 | 85 ; FILIPINO VET SHOULD BE VET='Y'
 | 
|---|
| 196 |  ; this code is copied from DGRP3
 | 
|---|
| 197 |  N MS,BOS,FV,FILV,NOTFV,MSE,RULE2,DGVT,DGP85
 | 
|---|
| 198 |  Q:'$D(DGP("PAT",.32))
 | 
|---|
| 199 |  ; we're calling into DG Legacy code so we have to modify some arrays
 | 
|---|
| 200 |  S DGVT=$P($G(DGP("PAT","VET")),U)="Y"
 | 
|---|
| 201 |  M DGP85=DGP K DGP
 | 
|---|
| 202 |  M DGP=DGP85("PAT")
 | 
|---|
| 203 |  S RULE2=86   ; will also check RULE #86 INEL FIL VET SHOULD BE VET='N'
 | 
|---|
| 204 |  F MS=1:1:3 D
 | 
|---|
| 205 |  . I MS=2,$P(DGP85("PAT",.32),U,19)'="Y" Q
 | 
|---|
| 206 |  . I MS=3,$P(DGP85("PAT",.32),U,20)'="Y" Q
 | 
|---|
| 207 |  . S BOS=$P(DGP85("PAT",.32),U,(5*MS)),FV=$$FV^DGRPMS(BOS) I 'FV S NOTFV="" Q
 | 
|---|
| 208 |  . S MSE=$P("MSL^MSNTL^MSNNTL",U,MS)
 | 
|---|
| 209 |  . I '$$WWII^DGRPMS(DFN,"",MSE) S FILV("I")="" Q
 | 
|---|
| 210 |  . I FV=2 S FILV("E")="" Q
 | 
|---|
| 211 |  . I $P(DGP85("PAT",.321),U,14)=""!($P(DGP85("PAT",.321),U,14)="NO") S FILV("I")="" Q
 | 
|---|
| 212 |  . S FILV("E")=""
 | 
|---|
| 213 |  I $D(FILV) D
 | 
|---|
| 214 |  . I DGVT'=1,$D(FILV("E")) S FILERR(RULE)=""
 | 
|---|
| 215 |  . I DGVT=1,'$D(NOTFV),'$D(FILV("E")),$D(FILV("I")) S FILERR(RULE2)=""
 | 
|---|
| 216 |  ; fix the arrays before we leave
 | 
|---|
| 217 |  K DGP M DGP=DGP85
 | 
|---|
| 218 |  Q
 | 
|---|
| 219 | 86 ; INEL FIL VET SHOULD BE VET='N'
 | 
|---|
| 220 |  ; This rule is satisfied in #85 above
 | 
|---|
| 221 |  Q
 | 
|---|
| 222 | ON(RULE) ;verify RULE is turned on
 | 
|---|
| 223 |  N ON,Y
 | 
|---|
| 224 |  S ON=0
 | 
|---|
| 225 |  S Y=^DGIN(38.6,RULE,0)
 | 
|---|
| 226 |  I '$P(Y,U,5),$P(Y,U,6) S ON=1
 | 
|---|
| 227 |  Q ON
 | 
|---|
| 228 | CONLIST ;;CONFLICT;;NODE^PIECE^FROM^TO^RANGE  -- offset list, do not add comments
 | 
|---|
| 229 |  ;;VIETNAM;;.321^1^4^5^VIET
 | 
|---|
| 230 |  ;;LEBANON;;.322^1^2^3^LEB
 | 
|---|
| 231 |  ;;GRENADA;;.322^4^5^6^GREN
 | 
|---|
| 232 |  ;;PANAMA;;.322^7^8^9^PAN
 | 
|---|
| 233 |  ;;PERSIAN GULF;;.322^10^11^12^GULF
 | 
|---|
| 234 |  ;;SOMALIA;;.322^16^17^18^SOM
 | 
|---|
| 235 |  ;;YUGOSLAVIA;;.322^19^20^21^YUG
 | 
|---|
| 236 |  ;;QUIT;;QUIT
 | 
|---|
| 237 | COMLIST ;;COMBAT;;NODE^PIECE^FROM^TO^RANGE  -- offset list, do not add comments
 | 
|---|
| 238 |  ;;WWI;;.52^11^13^14^WWI
 | 
|---|
| 239 |  ;;WWIIE;;.52^11^13^14^WWIIE
 | 
|---|
| 240 |  ;;WWIIP;;.52^11^13^14^WWIIP
 | 
|---|
| 241 |  ;;KOREA;;.52^11^13^14^KOR
 | 
|---|
| 242 |  ;;OTHER;;.52^11^13^14^OTHER
 | 
|---|
| 243 |  ;;VIETNAM;;.52^11^13^14^VIET
 | 
|---|
| 244 |  ;;LEBANON;;.52^11^13^14^LEB
 | 
|---|
| 245 |  ;;GRENADA;;.52^11^13^14^GREN
 | 
|---|
| 246 |  ;;PANAMA;;.52^11^13^14^PAN
 | 
|---|
| 247 |  ;;PERSIAN GULF;;.52^11^13^14^GULF
 | 
|---|
| 248 |  ;;SOMALIA;;.52^11^13^14^SOM
 | 
|---|
| 249 |  ;;YUGOSLAVIA;;.52^11^13^14^YUG
 | 
|---|
| 250 |  ;;QUIT;;QUIT
 | 
|---|