| 1 | OOPSUTL4 ;HINES/WAA-Utilities Routines ;3/24/98
 | 
|---|
| 2 |  ;;2.0;ASISTS;**7**;Jun 03, 2002
 | 
|---|
| 3 | DTVAL(DATE,FLD1,FLD2) ;
 | 
|---|
| 4 |  ; this subroutine called from ^DD so date error checking on fields
 | 
|---|
| 5 |  ; 143, 144, 145 (if CA1) and 254, 255 (if CA2).  returns a valid date 
 | 
|---|
| 6 |  ; (one passed in) if a date in FLD2 and is > than date passed in (DATE).
 | 
|---|
| 7 |  ;  Inputs:   DATE - date entered in prompt
 | 
|---|
| 8 |  ;            FLD1 - field of prompt date entered in
 | 
|---|
| 9 |  ;            FLD2 - field of date to be checked against
 | 
|---|
| 10 |  ; Outputs:   VAL  - contains valid date passed in if true & "" if false
 | 
|---|
| 11 |  N DTE2,VAL
 | 
|---|
| 12 |  S VAL=DATE,DTE2=""
 | 
|---|
| 13 |  I '$G(IEN) S IEN=$G(DA)
 | 
|---|
| 14 |  I IEN S DTE2=$$GET1^DIQ(2260,IEN,FLD2,"I")
 | 
|---|
| 15 |  I %DT'["R" S DTE2=DTE2\1
 | 
|---|
| 16 |  I DTE2>DATE!'$G(DTE2) S VAL=""
 | 
|---|
| 17 |  I 'VAL D
 | 
|---|
| 18 |  .I '$G(DTE2) W !!?5,$$GET1^DID(2260,FLD2,"","LABEL")_" cannot be blank if date entered in "_$$GET1^DID(2260,FLD1,"","LABEL"),! Q
 | 
|---|
| 19 |  .W !!?5,$$GET1^DID(2260,FLD1,"","LABEL")_" must be on or after the "_$$GET1^DID(2260,FLD2,"","LABEL"),!
 | 
|---|
| 20 |  Q VAL
 | 
|---|
| 21 | VALIDATE(IEN,FORM,CALLER,VALID) ;
 | 
|---|
| 22 |  ; Input: IEN    = Internal Entry Number of entry in file 2260
 | 
|---|
| 23 |  ;        FORM   = 2162,CA1, or CA2
 | 
|---|
| 24 |  ;        CALLER = "E" employee
 | 
|---|
| 25 |  ;               = "S" supervisor
 | 
|---|
| 26 |  ;               = "O" safety officer
 | 
|---|
| 27 |  ;               = "W" worker's comp personnel
 | 
|---|
| 28 |  ;        WCEMP  = from menu if 1 - need to execute emp validation
 | 
|---|
| 29 |  ;        VALID  = RESERVED FOR OUTPUT DATA
 | 
|---|
| 30 |  ; Output:VALID  = 1 ALL REQUIRED DATA FOR FORM IS COMPLETE
 | 
|---|
| 31 |  ;               = 0 DATA IS MISSING
 | 
|---|
| 32 |  N LIST,FLD,CNT,CHK
 | 
|---|
| 33 |  S (FLD,LIST)=""
 | 
|---|
| 34 |  S VALID=1,CHK=0,WCEMP=$G(WCEMP,0)
 | 
|---|
| 35 |  W !,"Validating data on form ",FORM,"."
 | 
|---|
| 36 |  I CALLER="E"!$G(WCEMP) D EMP
 | 
|---|
| 37 |  I CALLER="S" D SUP
 | 
|---|
| 38 |  I CALLER="O" D SOF
 | 
|---|
| 39 |  I CALLER="W" D WCP
 | 
|---|
| 40 |  F CNT=1:1 S FLD=$P(LIST,",",CNT) Q:FLD=""  D
 | 
|---|
| 41 |  .N LOC,NODE,PCE,BADFLD,TEXT,WP
 | 
|---|
| 42 |  .S BADFLD=1,WP=0
 | 
|---|
| 43 |  .S LOC=$$GET1^DID(2260,FLD,"","GLOBAL SUBSCRIPT LOCATION")
 | 
|---|
| 44 |  .S NODE=$P(LOC,";"),PCE=$P(LOC,";",2)
 | 
|---|
| 45 |  .I PCE=0 D  ;Work processing field
 | 
|---|
| 46 |  ..I '$D(^OOPS(2260,IEN,NODE,1,0)) S (BADFLD,VALID)=0
 | 
|---|
| 47 |  ..S WP=1
 | 
|---|
| 48 |  ..Q
 | 
|---|
| 49 |  .I PCE'=0  I $P($G(^OOPS(2260,IEN,NODE)),U,PCE)="" S (BADFLD,VALID)=0
 | 
|---|
| 50 |  .I 'BADFLD D  ; Display error messaged about fields not filled.
 | 
|---|
| 51 |  ..I 'CHK W !!,"The following fields must be completed before the "_FORM_" can be signed.",! S CHK=1
 | 
|---|
| 52 |  ..I WP D  ;Is this a wp field and where to get title
 | 
|---|
| 53 |  ...N NODE
 | 
|---|
| 54 |  ...S NODE=2260_".0"_FLD
 | 
|---|
| 55 |  ...; patch 11 - fix bug on fld 40, node '= 2260.040, it's 2260.01
 | 
|---|
| 56 |  ...I FLD=40 S NODE="2260.01"
 | 
|---|
| 57 |  ...S TEXT=$$GET1^DID(NODE,".01","","TITLE")
 | 
|---|
| 58 |  ..I 'WP S TEXT=$$GET1^DID(2260,FLD,"","TITLE") I $G(TEXT)="" S TEXT=$$GET1^DID(2260,FLD,"","LABEL")
 | 
|---|
| 59 |  ..; patch 2.7 - if body part affected - indicate the form
 | 
|---|
| 60 |  ..I FLD=30,(TEXT'="") S TEXT=TEXT_" (FORM 2162)"
 | 
|---|
| 61 |  ..W !,TEXT
 | 
|---|
| 62 |  I FORM="CA1"&(CALLER="E"!$G(WCEMP)) D   ; fld 110 check on Emp CA1 only
 | 
|---|
| 63 |  .I $$GET1^DIQ(2260,IEN,110,"I")<($$GET1^DIQ(2260,IEN,4,"I")\1) S VALID=0 D
 | 
|---|
| 64 |  ..W !?5,$$GET1^DID(2260,110,"","LABEL")_" must be on or after the "_$$GET1^DID(2260,4,"","LABEL")
 | 
|---|
| 65 | DTCHK ; Date error checking that may be missed w/input transform
 | 
|---|
| 66 |  ; patch 11 - Additional error checking has been added for CA2 field 214
 | 
|---|
| 67 |  I FORM=2162!(CALLER="O")!$G(WCEMP) Q
 | 
|---|
| 68 |  K CNT,FLD,LIST
 | 
|---|
| 69 |  N DATE,DTE1,DTE2,TITLE,EMPDOB
 | 
|---|
| 70 |  ; patch 11 - need to make sure 215 not before 214 on employee part
 | 
|---|
| 71 |  I CALLER="E",FORM="CA2" D  Q
 | 
|---|
| 72 |  .S DTE1=$$GET1^DIQ(2260,IEN,215,"I")
 | 
|---|
| 73 |  .S DTE2=$$GET1^DIQ(2260,IEN,214,"I")
 | 
|---|
| 74 |  .S EMPDOB=$$GET1^DIQ(2260,IEN,6,"I")
 | 
|---|
| 75 |  .I $$FMDIFF^XLFDT(DTE2,EMPDOB,2)<0 S VALID=0 D
 | 
|---|
| 76 |  ..W !?5,$$GET1^DID(2260,214,"","LABEL")_" must be on or after the "_$$GET1^DID(2260,6,"","LABEL")
 | 
|---|
| 77 |  .I $$FMDIFF^XLFDT(DTE1,DTE2,2)<0 S VALID=0 D
 | 
|---|
| 78 |  ..W !?5,$$GET1^DID(2260,215,"","LABEL")_" must be on or after the "_$$GET1^DID(2260,214,"","LABEL")
 | 
|---|
| 79 |  ; End of checks from Employee CA2
 | 
|---|
| 80 |  I FORM="CA1" D
 | 
|---|
| 81 |  .S LIST="142,161,175"
 | 
|---|
| 82 |  .S (DATE,DTE1)=$$GET1^DIQ(2260,IEN,4,"I")
 | 
|---|
| 83 |  .S TITLE=$$GET1^DID(2260,4,"","LABEL")
 | 
|---|
| 84 |  I FORM="CA2" D
 | 
|---|
| 85 |  .S LIST="215,250,252,253,255"
 | 
|---|
| 86 |  .S (DATE,DTE1)=$$GET1^DIQ(2260,IEN,214,"I")
 | 
|---|
| 87 |  .S TITLE=$$GET1^DID(2260,214,"","LABEL")
 | 
|---|
| 88 |  F CNT=1:1 S FLD=$P(LIST,",",CNT) Q:FLD=""  D
 | 
|---|
| 89 |  .S DTE2=$$GET1^DIQ(2260,IEN,FLD,"I") I FLD'=142 S DTE2=DTE2\1,DTE1=DATE\1
 | 
|---|
| 90 |  .I $G(DTE2),DTE2<DTE1 D  S VALID=0
 | 
|---|
| 91 |  ..W !?5,$$GET1^DID(2260,FLD,"","LABEL")_" must be on or after the "_TITLE
 | 
|---|
| 92 |  ; Need specific check on DATE/TIME STOPPED WORK
 | 
|---|
| 93 |  I FORM="CA1" D
 | 
|---|
| 94 |  .S LIST="143,144,145",DATE=$$GET1^DIQ(2260,IEN,142,"I")
 | 
|---|
| 95 |  .S TITLE=$$GET1^DID(2260,142,"","LABEL")
 | 
|---|
| 96 |  I FORM="CA2" D
 | 
|---|
| 97 |  .S LIST="254,256",DATE=$$GET1^DIQ(2260,IEN,253,"I")
 | 
|---|
| 98 |  .S TITLE=$$GET1^DID(2260,253,"","LABEL")
 | 
|---|
| 99 |  F CNT=1:1 S FLD=$P(LIST,",",CNT) Q:FLD=""  D
 | 
|---|
| 100 |  .S DTE2=$$GET1^DIQ(2260,IEN,FLD,"I"),DTE1=DATE D
 | 
|---|
| 101 |  ..I FLD=143!(FLD=144) S DTE1=DATE\1,DTE2=DTE2\1
 | 
|---|
| 102 |  ..I (DTE1>DTE2),$G(DTE2) D  S VALID=0
 | 
|---|
| 103 |  ...W !?5,$$GET1^DID(2260,FLD,"","LABEL")_" must be on or after the "_TITLE
 | 
|---|
| 104 |  ..I '$G(DTE1),$G(DTE2) D  S VALID=0
 | 
|---|
| 105 |  ...W !?5,TITLE_" cannot be blank if date in "_$$GET1^DID(2260,FLD,"","LABEL")
 | 
|---|
| 106 |  Q
 | 
|---|
| 107 | EMP ; Address fields are now all pulled from the 2162A node
 | 
|---|
| 108 |  ; added fields 126 & 181,183-185 to lists below - patch 8
 | 
|---|
| 109 |  I FORM="CA1" S LIST="8,9,10,11,12,108,109,110,111,112,113,114,126,181,183,184,185"
 | 
|---|
| 110 |  ; added field 213 - ASISTS V2.0
 | 
|---|
| 111 |  I FORM="CA2" S LIST="8,9,10,11,12,126,208,213,209,214,215,216,217"
 | 
|---|
| 112 |  Q
 | 
|---|
| 113 | SUP ;
 | 
|---|
| 114 |  N F165
 | 
|---|
| 115 |  I FORM="2162" D F2162 I $$ISEMP^OOPSUTL4(IEN) S LIST=LIST_",33" Q
 | 
|---|
| 116 |  S LIST="30,"
 | 
|---|
| 117 |  I FORM="CA1" D
 | 
|---|
| 118 |  .S LIST=LIST_"4,60,130,131,132,133,134,138,139,140,146,148,150,"
 | 
|---|
| 119 |  .S LIST=LIST_"162,163,172,173,174,175,176,177,178,179,"
 | 
|---|
| 120 |  .S LIST=LIST_"180,181,183,184,185,"
 | 
|---|
| 121 |  .I $$GET1^DIQ(2260,IEN,150,"I")="Y" S LIST=LIST_"151,152,153,154,155,"
 | 
|---|
| 122 |  .; V2.0 added required fields missed in patch 8
 | 
|---|
| 123 |  .I $$GET1^DIQ(2260,IEN,146)="No" S LIST=LIST_"147,"
 | 
|---|
| 124 |  .I $$GET1^DIQ(2260,IEN,148)="Yes" S LIST=LIST_"149,"
 | 
|---|
| 125 |  .I $$GET1^DIQ(2260,IEN,163)="No" S LIST=LIST_"164,"
 | 
|---|
| 126 |  .S F165=$G(^OOPS(2260,IEN,"CA1K",0))
 | 
|---|
| 127 |  .I $G(F165)'="",($P(F165,U,4)'=0) S LIST=LIST_"165,"
 | 
|---|
| 128 |  I FORM="CA2" D
 | 
|---|
| 129 |  .S LIST=LIST_"230,231,232,233,234,237,238,239,240,241,"
 | 
|---|
| 130 |  .S LIST=LIST_"242,243,244,251,252,255,258,60,268,269,"
 | 
|---|
| 131 |  .; below for ASISTS V2.0, needed for roll and scroll also
 | 
|---|
| 132 |  .; added next line, need to get 3rd party if 258 = y
 | 
|---|
| 133 |  .I $$GET1^DIQ(2260,IEN,258,"I")="Y" S LIST=LIST_"259,260,261,262,263,"
 | 
|---|
| 134 |  ; V2.0 if field 60="other" (3)  then 61 required for both CA1 & CA2
 | 
|---|
| 135 |  I $$GET1^DIQ(2260,IEN,60,"I")=3 S LIST=LIST_"61,"
 | 
|---|
| 136 |  ; need to check physician information
 | 
|---|
| 137 |  D PHYCHK^OOPSGUI9
 | 
|---|
| 138 |  Q
 | 
|---|
| 139 | SOF ;
 | 
|---|
| 140 |  I FORM="2162" D F2162 S LIST=LIST_",55,47"
 | 
|---|
| 141 |  Q
 | 
|---|
| 142 | WCP ; Get required fields for Workers Comp
 | 
|---|
| 143 |  I FORM="2162" D F2162 Q
 | 
|---|
| 144 |  S LIST="5,6,7,15,62,70,73,"
 | 
|---|
| 145 |  I FORM="CA1" D
 | 
|---|
| 146 |  . S LIST=LIST_"123,124,"
 | 
|---|
| 147 |  . ; flds 166 & 167 only required if personnel status = 1
 | 
|---|
| 148 |  . I $$GET1^DIQ(2260,IEN,2,"I")=1 S LIST=LIST_"166,167,"
 | 
|---|
| 149 |  I FORM="CA2" D
 | 
|---|
| 150 |  . S LIST=LIST_"226,227,"
 | 
|---|
| 151 |  D SUP
 | 
|---|
| 152 |  Q
 | 
|---|
| 153 | F2162 ; Set required fields for form 2162 - doesn't matter which menu
 | 
|---|
| 154 |  ; coming from, Supervisor, Safety, WC (for EDIT REPORT OF INCIDENT)
 | 
|---|
| 155 |  N TYP,SAF
 | 
|---|
| 156 |  I FORM'="2162" Q
 | 
|---|
| 157 |  S LIST="26,27,28,29,30,31"
 | 
|---|
| 158 |  S TYP=$$GET1^DIQ(2260,IEN,"3:.01","E")
 | 
|---|
| 159 |  I "^Sharps Exposure^Hollow Bore Needlestick^Suture Needlestick^"[TYP D
 | 
|---|
| 160 |  . S LIST=LIST_",34,35,36,37,38,82"
 | 
|---|
| 161 |  I $$GET1^DIQ(2260,IEN,"38:2","I")="N" S LIST=LIST_",83"
 | 
|---|
| 162 |  I "^Exposure to Body Fluids/Splash^"[TYP D
 | 
|---|
| 163 |  . S LIST=LIST_",34,39,40,41"
 | 
|---|
| 164 |  I $$GET1^DIQ(2260,IEN,3,"I")<11 Q
 | 
|---|
| 165 |  I $$GET1^DIQ(2260,IEN,42.5,"I")="Y" S LIST=LIST_",42"
 | 
|---|
| 166 |  S SAF=$$GET1^DIQ(2260,IEN,43,"I")
 | 
|---|
| 167 |  S LIST=$S(SAF="Y":LIST_",84,87",SAF="N":LIST_",85",1:LIST)
 | 
|---|
| 168 |  S LIST=LIST_",47"
 | 
|---|
| 169 |  Q
 | 
|---|
| 170 | UP(IN) ; Translate all lower to upper
 | 
|---|
| 171 |  N OUT
 | 
|---|
| 172 |  S OUT=$TR(IN,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 | 
|---|
| 173 |  Q OUT
 | 
|---|
| 174 | VCHAR(IN) ; Check to make sure no invalid characters have been used
 | 
|---|
| 175 |  ;   input  - IN, data entered by user
 | 
|---|
| 176 |  ;  output  - VALID, if invalid characters used, = 0
 | 
|---|
| 177 |  N VALID
 | 
|---|
| 178 |  S VALID=1
 | 
|---|
| 179 |  I IN'=$TR(IN,"~`@#$%*_|\}{[]><","") S VALID=0
 | 
|---|
| 180 |  Q VALID
 | 
|---|
| 181 | ISEMP(IEN) ; Determine if PERSONNEL STATUS = employee
 | 
|---|
| 182 |  ;  Input -  IEN     = internal Entry Number of case in File 2260
 | 
|---|
| 183 |  ;           CAT     = Personnel Status of Case in File 2260
 | 
|---|
| 184 |  ;           TST     = valid Personnel status categories for employee
 | 
|---|
| 185 |  ;  Output - EMP     = 1 Personnel status indicates employee
 | 
|---|
| 186 |  ;                     0 Personnel status indicates non-employee
 | 
|---|
| 187 |  NEW CAT,TST,EMP
 | 
|---|
| 188 |  S EMP=0
 | 
|---|
| 189 |  S CAT=$$GET1^DIQ(2260,IEN,2,"I")
 | 
|---|
| 190 |  ; 12/16/01 V2.0 removed personnel types 7,8,9,10
 | 
|---|
| 191 |  S TST=",1,2,6,"
 | 
|---|
| 192 |  I TST[(","_CAT_",") S EMP=1
 | 
|---|
| 193 |  Q EMP
 | 
|---|
| 194 | FUT(DATE) ; Check for dates prior to Date of Inj/Ill
 | 
|---|
| 195 |  N DAT,VIEW,FORM
 | 
|---|
| 196 |  S VIEW=1
 | 
|---|
| 197 |  S FORM=$$GET1^DIQ(2260,IEN,52,"I")
 | 
|---|
| 198 |  S DAT=$$GET1^DIQ(2260,IEN,4,"I")
 | 
|---|
| 199 |  I (DATE<$P(DAT,".")),FORM=1 D
 | 
|---|
| 200 |  . W !!?6,"This date cannot be prior to DATE/TIME INJURY OCCURRED entered on 2162.",! S VIEW=0
 | 
|---|
| 201 |  Q VIEW
 | 
|---|
| 202 | WP(OPFLD) ; Patch 8 - determine number of characters in WP fields that are
 | 
|---|
| 203 |  ;         limited to 532 characters & if invalid characters are present
 | 
|---|
| 204 |  ;  Input    IEN - Internal Record ID of Case
 | 
|---|
| 205 |  ;         OPFLD - Field number of WP field to be calculated
 | 
|---|
| 206 |  ; Output    OPT - Total number of characters in all lines of WP field
 | 
|---|
| 207 |  ;                 concatenated to VALID. ex: 165^1 or 180^0
 | 
|---|
| 208 |  ;         VALID - indicates whether invalid characters were detected
 | 
|---|
| 209 |  N DATA,DIWL,DIWR,DIWF,OPGLB,OPI,OPNODE,OPT,OPC,VALID
 | 
|---|
| 210 |  S VALID=1
 | 
|---|
| 211 |  K ^UTILITY($J,"W")
 | 
|---|
| 212 |  S DIWL=1,DIWR="",DIWF="|C264",OPT=0
 | 
|---|
| 213 |  S OPNODE=$P($$GET1^DID(2260,OPFLD,"","GLOBAL SUBSCRIPT LOCATION"),";")
 | 
|---|
| 214 |  S OPI=0 F  S OPI=$O(^OOPS(2260,IEN,OPNODE,OPI)) Q:'OPI  S X=$G(^OOPS(2260,IEN,OPNODE,OPI,0)) D:X]"" ^DIWP
 | 
|---|
| 215 |  I $G(^UTILITY($J,"W",1))+0 D
 | 
|---|
| 216 |  . S OPI=0 F OPC=1:1 S OPI=$O(^UTILITY($J,"W",1,OPI)) Q:'OPI  D
 | 
|---|
| 217 |  .. S DATA=^UTILITY($J,"W",1,OPI,0)
 | 
|---|
| 218 |  .. I DATA'=$TR(DATA,"~`@#$%^*_|\}{[]><","") S VALID=0
 | 
|---|
| 219 |  .. S OPT=OPT+$L(DATA)
 | 
|---|
| 220 |  K ^UTILITY($J,"W"),X
 | 
|---|
| 221 |  Q OPT_U_VALID
 | 
|---|