| 1 | IBCIUT2 ;DSI/SLM - CLAIMSMANAGER MESSAGE UTILITIES ;21-DEC-2000
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**161**;21-MAR-94
 | 
|---|
| 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  Q
 | 
|---|
| 6 | MSGHDR ;build message id segment
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  K IBCIU
 | 
|---|
| 9 |  S IBCIU(1)=$C(28),IBCIU(2)=$C(29),IBCIU(3)=$C(30),IBCIU(4)=$C(94),IBCIU(5)=$C(39),IBCIU(6)=$C(37)
 | 
|---|
| 10 |  S IBCIAA="" F I=1:1:6 S IBCIAA=IBCIAA_IBCIU(I)
 | 
|---|
| 11 |  K IBCIHDR S IBCIHDR=IBCIAA_"CLAIM"_IBCIU(1)
 | 
|---|
| 12 |  ;
 | 
|---|
| 13 | RSEG ;build route segment
 | 
|---|
| 14 |  N X,X1,X2,X3,X4,Y
 | 
|---|
| 15 |  S IBCIHDR=IBCIHDR_IBCIU(3)_IBCIU(3)
 | 
|---|
| 16 |  S X=IBCIMT,X1=3,IBCIMT=$$FILL
 | 
|---|
| 17 |  K X D NOW^IBCIUT1 S X=Y,X1=16,IBCIMDT=$$FILL
 | 
|---|
| 18 |  S X="",X1=20,IBCIMCID=$$FILL,IBCIMP="H"
 | 
|---|
| 19 |  S IBCIUID="DVAUSER",X=IBCIUID,X1=10,IBCIUID=$$FILL
 | 
|---|
| 20 |  S IBCISAP="VISTA",X=IBCISAP,X1=20,IBCISAP=$$FILL
 | 
|---|
| 21 |  S IBCIRAP="CLAIMS MANAGER",X=IBCIRAP,X1=20,IBCIRAP=$$FILL
 | 
|---|
| 22 |  S IBCISI="",X=IBCISI,X1=30,X3=".",IBCISI=$$FILL K X3
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  S IBCIHDR=IBCIHDR_IBCIMT_IBCIMDT_IBCIMCID_IBCIMP_IBCIUID
 | 
|---|
| 25 |  S IBCIHDR=IBCIHDR_IBCIU(3)_IBCISAP_IBCIU(3)_IBCIRAP
 | 
|---|
| 26 |  S IBCIHDR=IBCIHDR_IBCIU(3)_IBCISI_IBCIU(1)
 | 
|---|
| 27 |  ;
 | 
|---|
| 28 |  Q
 | 
|---|
| 29 | FILL() ;pad x with characters
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  ;Input variables
 | 
|---|
| 32 |  ;  X  = input value in non-fixed format
 | 
|---|
| 33 |  ;  X1 = desired length of the output (default is 80 if undefined)
 | 
|---|
| 34 |  ;  X2 = justify 'R' or 'L' (if undefined or not [ R or L, default is 'L')
 | 
|---|
| 35 |  ;  X3 = character you want x padded with (default is " ")
 | 
|---|
| 36 |  ;  X4 = truncate flag - if [ 'T' and x>x1 it will be truncated (default is 'T')
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  ;Output variable
 | 
|---|
| 39 |  ;  Y
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 |  S Y=""
 | 
|---|
| 42 |  Q:'$D(X) Y
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 |  ;initialize variables for fill
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 |  I '$D(X1) S X1=80
 | 
|---|
| 47 |  I X1<1 S X1=80
 | 
|---|
| 48 |  I '$D(X2) S X2="L"
 | 
|---|
| 49 |  I "RL"'[X2 S X2="L"
 | 
|---|
| 50 |  I X2["R"&(X2["L") S X2="L"
 | 
|---|
| 51 |  I '$D(X3) S X3=" "
 | 
|---|
| 52 |  I X3']"" S X3=" "
 | 
|---|
| 53 |  I '$D(X4) S X4="T"
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  I X4["T"&($L(X)>X1) S Y=$E(X,1,X1) Q Y
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 |  S Y="",$P(Y,X3,X1+1)="",Y=$E(Y,1,X1-$L(X))
 | 
|---|
| 58 |  I X2["R" S Y=Y_X
 | 
|---|
| 59 |  I X2["L" S Y=X_Y
 | 
|---|
| 60 |  Q Y
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 |  ;asnd(ibifn) comments
 | 
|---|
| 63 |  ;Input Variable
 | 
|---|
| 64 |  ;  ibifn
 | 
|---|
| 65 |  ;Output Variable
 | 
|---|
| 66 |  ;  y = 1 if successful, = 0 if not.
 | 
|---|
| 67 | ASND(IBIFN) ;auto send to ClaimsManager
 | 
|---|
| 68 |  N IBCIY S IBCIY=0,IBCIERR="" K PROBLEM
 | 
|---|
| 69 |  Q:'$D(IBIFN) IBCIY
 | 
|---|
| 70 |  ;change status in 351.9
 | 
|---|
| 71 |  I IBCISNT'=3 D
 | 
|---|
| 72 |  .S IBCIST=$S(IBCISNT=6:8,IBCISNT=5:5,IBCISNT=4:9,1:2)
 | 
|---|
| 73 |  .D ST^IBCIUT1(IBCIST)
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  D UPDT^IBCIADD1   ;update 351.9 for all cases
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  I IBCISNT<3 D  ;a normal claim that has not been authorized
 | 
|---|
| 78 |  .D EN^IBCIMSG,SEND
 | 
|---|
| 79 |  .I '$G(PROBLEM) S IBCIY=1 D
 | 
|---|
| 80 |  ..I $P(^IBA(351.9,IBIFN,0),U,15)'=1 D  ;set received by cm to yes
 | 
|---|
| 81 |  ...S DIE="^IBA(351.9,",DA=IBIFN,DR=".15///1" D ^DIE K DIE,DA,DR
 | 
|---|
| 82 |  ..I $P($G(^IBA(351.9,IBIFN,2,0)),U,4) D DCOM^IBCIUT4(IBIFN)
 | 
|---|
| 83 |  ..I $$CKNER^IBCIUT1() D  Q  ;if no errors then...
 | 
|---|
| 84 |  ...S (IBCISTAT,IBCIST)=3 D ST^IBCIUT1(IBCIST)    ;update status=3
 | 
|---|
| 85 |  ...D DELTI^IBCIUT4   ;delete temp info when passed w/o errors
 | 
|---|
| 86 |  ...D DELER^IBCIUT4   ;delete error information too
 | 
|---|
| 87 |  ...D DASN^IBCIUT5(IBIFN)   ;remove the assigned to person
 | 
|---|
| 88 |  ...Q
 | 
|---|
| 89 |  ..D Z1AR^IBCIUT4           ;errors found then..
 | 
|---|
| 90 |  ..S (IBCISTAT,IBCIST)=4 D ST^IBCIUT1(IBCIST)
 | 
|---|
| 91 |  ..I IBCISNT=2 D COMMENT^IBCIUT7(IBIFN,4)  ; log a comment in auto-send
 | 
|---|
| 92 |  ..Q                                       ; mode when errors are found
 | 
|---|
| 93 |  .I $G(PROBLEM) S IBCIERR=$$P1^IBCIUT4(PROBLEM) D  ;comm errors
 | 
|---|
| 94 |  ..S (IBCISTAT,IBCIST)=6 D ST^IBCIUT1(IBCIST) Q
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 |  I IBCISNT=3 D  ;test send
 | 
|---|
| 97 |  .D EN^IBCIMSG,SEND
 | 
|---|
| 98 |  .I '$G(PROBLEM) S IBCIY=1 D
 | 
|---|
| 99 |  ..I $$CKNER^IBCIUT1() S IBCISTAT=3 Q  ;no errors...
 | 
|---|
| 100 |  ..D Z1AR^IBCIUT4 S IBCISTAT=4 Q  ;error(s) found
 | 
|---|
| 101 |  .I $G(PROBLEM) S IBCIERR=$$P1^IBCIUT4(PROBLEM),IBCISTAT=6 Q  ;comm errors
 | 
|---|
| 102 |  .D TST ;put in tmp global
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 |  I IBCISNT=4!(IBCISNT=5) D  ;canceled, overridden
 | 
|---|
| 105 |  .D EN^IBCIMSG,SEND
 | 
|---|
| 106 |  .I '$G(PROBLEM) S IBCIY=1 D
 | 
|---|
| 107 |  ..S IBCISTAT=$$STAT^IBCIUT1(IBIFN)
 | 
|---|
| 108 |  ..D DELTI^IBCIUT4                ;delete temp information
 | 
|---|
| 109 |  ..D DASN^IBCIUT5(IBIFN)          ;remove the assigned to person
 | 
|---|
| 110 |  ..I IBCISNT=4 D DELER^IBCIUT4    ;delete errors
 | 
|---|
| 111 |  .I $G(PROBLEM) D  ;comm error
 | 
|---|
| 112 |  ..S (IBCISTAT,IBCIST)=$S(IBCISNT=5:11,IBCISNT=4:10,1:6)
 | 
|---|
| 113 |  ..D ST^IBCIUT1(IBCIST)
 | 
|---|
| 114 |  ..S IBCIERR=$$P1^IBCIUT4(PROBLEM)
 | 
|---|
| 115 |  ;
 | 
|---|
| 116 |  I IBCISNT=6 D  ;historical
 | 
|---|
| 117 |  .S IBCISNT=1 D EN^IBCIMSG,SEND ;send first as a normal claim
 | 
|---|
| 118 |  .I '$G(PROBLEM) D  Q
 | 
|---|
| 119 |  ..I '$$CKNER^IBCIUT1() D Z1AR^IBCIUT4 ;store them
 | 
|---|
| 120 |  ..H 2      ; pause between sendings to CM
 | 
|---|
| 121 |  ..S IBCISNT=6 D EN^IBCIMSG,SEND ;reset ibcisnt to 6 and send again
 | 
|---|
| 122 |  ..I '$G(PROBLEM) S IBCIY=1 D  Q
 | 
|---|
| 123 |  ...S (IBCISTAT,IBCIST)=8 D ST^IBCIUT1(IBCIST)
 | 
|---|
| 124 |  ...D DELTI^IBCIUT4    ; remove the temp nodes
 | 
|---|
| 125 |  ...Q
 | 
|---|
| 126 |  ..I $G(PROBLEM) D  Q  ;comm error on second send
 | 
|---|
| 127 |  ...S (IBCISTAT,IBCIST)=6 D ST^IBCIUT1(IBCIST)
 | 
|---|
| 128 |  ...S IBCIERR=$$P1^IBCIUT4(PROBLEM)
 | 
|---|
| 129 |  .I $G(PROBLEM) D  Q  ;comm error on first send
 | 
|---|
| 130 |  ..S (IBCISTAT,IBCIST)=6 D ST^IBCIUT1(IBCIST)
 | 
|---|
| 131 |  ..S IBCIERR=$$P1^IBCIUT4(PROBLEM)
 | 
|---|
| 132 |  ..S IBCISNT=6
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 |  ; Add new send type - esg - 1/3/2002
 | 
|---|
| 135 |  I IBCISNT=7 D         ; delete lines from a UB bill on CM
 | 
|---|
| 136 |  . D EN^IBCIMSG,SEND
 | 
|---|
| 137 |  . S IBCISTAT=""
 | 
|---|
| 138 |  . I '$G(PROBLEM) S IBCIY=1
 | 
|---|
| 139 |  . I $G(PROBLEM) S IBCIERR=$$P1^IBCIUT4(PROBLEM)
 | 
|---|
| 140 |  . Q
 | 
|---|
| 141 |  ;
 | 
|---|
| 142 |  I '$G(IBCIERR) S IBCIERR=""
 | 
|---|
| 143 |  Q IBCIY
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 | WRT ;write the message to io
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 |  N I,J,ICD0,LITMS,MOD,TOTMOD
 | 
|---|
| 148 |  S IBCICC=0,IBCIOS=^%ZOSF("OS") D MSGHDR W IBCIHDR
 | 
|---|
| 149 |  S FLUSH=$S(IBCIOS["MSM":"#",IBCIOS["OpenM":"!",1:"!")
 | 
|---|
| 150 |  S IBCICC=IBCICC+$L(IBCIHDR) D ^IBCIUDF
 | 
|---|
| 151 |  ;
 | 
|---|
| 152 |  ; Data elements in the Header Segment
 | 
|---|
| 153 |  F I=1:1:19 D
 | 
|---|
| 154 |  .S IBCICC=IBCICC+$L(^TMP("IBCIMSG",$J,IBIFN,IBCICLNP,I))
 | 
|---|
| 155 |  .I IBCICC>200 W @FLUSH S IBCICC=0
 | 
|---|
| 156 |  .W ^TMP("IBCIMSG",$J,IBIFN,IBCICLNP,I)
 | 
|---|
| 157 |  ;
 | 
|---|
| 158 |  ; Determine the # of line items.  Write the data elements in the
 | 
|---|
| 159 |  ; Line Segments (ExtLineID field through Units field)
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 |  S LITMS=$P($G(^IBA(351.9,IBIFN,5,0)),U,4)
 | 
|---|
| 162 |  I LITMS W IBCIU(1) F J=1:1:LITMS D
 | 
|---|
| 163 |  .F I=20:1:52 D
 | 
|---|
| 164 |  ..S IBCICC=IBCICC+$L(^TMP("IBCIMSG",$J,IBIFN,IBCICLNP,J,I))
 | 
|---|
| 165 |  ..I IBCICC>200 W @FLUSH S IBCICC=0
 | 
|---|
| 166 |  ..W ^TMP("IBCIMSG",$J,IBIFN,IBCICLNP,J,I)
 | 
|---|
| 167 |  .;
 | 
|---|
| 168 |  .W IBCIU(3)    ; field delimiter between Units and ICDCode
 | 
|---|
| 169 |  .;
 | 
|---|
| 170 |  .; icd codes - was node 53, now just an array
 | 
|---|
| 171 |  .; Repeating Field
 | 
|---|
| 172 |  .F I=1:1:$P($G(^TMP("IBCIMSG",$J,IBIFN,"ICD",J,0)),U,2) D
 | 
|---|
| 173 |  ..S IBCICC=IBCICC+$L(^TMP("IBCIMSG",$J,IBIFN,"ICD",J,I))
 | 
|---|
| 174 |  ..I IBCICC>200 W @FLUSH S IBCICC=0
 | 
|---|
| 175 |  ..W ^TMP("IBCIMSG",$J,IBIFN,"ICD",J,I)
 | 
|---|
| 176 |  ..I I'=$P(^TMP("IBCIMSG",$J,IBIFN,"ICD",J,0),U,2) W IBCIU(4)
 | 
|---|
| 177 |  .;
 | 
|---|
| 178 |  .W IBCIU(3)    ; field delimiter between ICDCode and Modifier
 | 
|---|
| 179 |  .;
 | 
|---|
| 180 |  .; cpt code node 54 multiple
 | 
|---|
| 181 |  .; CPT Modifier(s). Repeating Field
 | 
|---|
| 182 |  .S TOTMOD=$P(^TMP("IBCIMSG",$J,IBIFN,IBCICLNP,J,54,0),U,1)
 | 
|---|
| 183 |  .F I=1:1:TOTMOD D
 | 
|---|
| 184 |  ..S MOD=^TMP("IBCIMSG",$J,IBIFN,IBCICLNP,J,54,I)
 | 
|---|
| 185 |  ..S IBCICC=IBCICC+$L(MOD)
 | 
|---|
| 186 |  ..I IBCICC>200 W @FLUSH S IBCICC=0
 | 
|---|
| 187 |  ..W MOD
 | 
|---|
| 188 |  ..I I'=TOTMOD W IBCIU(4)
 | 
|---|
| 189 |  .;
 | 
|---|
| 190 |  .W IBCIU(3)    ; field delimiter between Modifier and UDF#1
 | 
|---|
| 191 |  .;
 | 
|---|
| 192 |  .; insert the user defined fields, 2 extra field delimiters, and
 | 
|---|
| 193 |  .; a line segment repetition delimiter if we're not done
 | 
|---|
| 194 |  .;
 | 
|---|
| 195 |  .F I=1:1:25 W IBCIUDF(I),IBCIU(3)
 | 
|---|
| 196 |  .W IBCIU(3),IBCIU(3)
 | 
|---|
| 197 |  .I J'=LITMS W IBCIU(2)
 | 
|---|
| 198 |  ;
 | 
|---|
| 199 |  D CLEAN1
 | 
|---|
| 200 |  Q
 | 
|---|
| 201 |  ;
 | 
|---|
| 202 | SEND ;open the tcp/ip port and send msg then read response
 | 
|---|
| 203 |  I '$$OPENUSE^IBCIUT5 S PROBLEM=99 Q
 | 
|---|
| 204 |  W $C(1) D WRT W $C(3),@FLUSH
 | 
|---|
| 205 |  D READ^IBCIUT3(.IBCIZ,.PROBLEM,IBCISOCK)
 | 
|---|
| 206 |  KILL FLUSH,IBCICC,IBCIOS,IBCISOCK
 | 
|---|
| 207 |  Q
 | 
|---|
| 208 |  ;
 | 
|---|
| 209 | TST ;if test send, put errors in tmp global
 | 
|---|
| 210 |  N IBCIDA,IBCIDA1,IBCICNT K ^TMP("IBCITST",$J) S IBCICNT=1
 | 
|---|
| 211 |  S IBCIDA=0 F  S IBCIDA=$O(IBCIZ1(IBCIDA)) Q:'IBCIDA  D
 | 
|---|
| 212 |  .S IBCIDA1=0 S ^TMP("IBCITST",$J,IBCICNT,IBCIDA1)=IBCIZ1(IBCIDA,IBCIDA1)
 | 
|---|
| 213 |  .F  S IBCIDA1=$O(IBCIZ1(IBCIDA,IBCIDA1)) Q:'IBCIDA1  D
 | 
|---|
| 214 |  ..S ^TMP("IBCITST",$J,IBCICNT,1,IBCIDA1,0)=IBCIZ1(IBCIDA,IBCIDA1)
 | 
|---|
| 215 |  .S IBCICNT=IBCICNT+1
 | 
|---|
| 216 |  Q
 | 
|---|
| 217 |  ;
 | 
|---|
| 218 | CLEAN1 ; clean up the variables
 | 
|---|
| 219 |  K ^TMP("IBCIMSG",$J),IBCIU,IBCICLNP,IBCIUDF
 | 
|---|
| 220 | CLEAN ;
 | 
|---|
| 221 |  K ^TMP("IBXSAVE",$J)
 | 
|---|
| 222 |  K X,Y,N1,D0,DA,DIC,DIE,DR,I,II,J,%,CT
 | 
|---|
| 223 |  K IBCIAA,IBCIAPC,IBCIAPID,IBCIBDPS,IBCIBPDE
 | 
|---|
| 224 |  K IBCIBPDI,IBCIBPFI,IBCIBPID,IBCIBPLA,IBCIBPMI,IBCIBPSP
 | 
|---|
| 225 |  K IBCIBPTI,IBCIBPUP,IBCICL,IBCICPT,IBCIDE,IBCIDFN,IBCIBDOS
 | 
|---|
| 226 |  K IBCIDOB,IBCIEB,IBCIEBID,IBCIEDOS,IBCIET,IBCIHDR
 | 
|---|
| 227 |  K IBCILSEG,IBCILSTA,IBCIMCID,IBCIMDT,IBCIMP
 | 
|---|
| 228 |  K IBCIOGID,IBCIOID,IBCIPAC,IBCIPID,IBCIPOS,IBCIPPID
 | 
|---|
| 229 |  K IBCIPTFI,IBCIPTLA,IBCIPTMI,IBCIRAP,IBCIRPDE,IBCIRPDI,IBCIRPFI
 | 
|---|
| 230 |  K IBCIRPID,IBCIRPLA,IBCIRPMI,IBCIRPSP,IBCIRPTI,IBCIRPUP,IBCISAMT
 | 
|---|
| 231 |  K IBCISAP,IBCISEX,IBCISI,IBCISPAI,IBCISPC,IBCISPDE,IBCISPDI
 | 
|---|
| 232 |  K IBCISPFI,IBCISPID,IBCISPLA,IBCISPMI,IBCISPSP,IBCISPTI,IBCISPUP
 | 
|---|
| 233 |  K IBCIST,IBCITC,IBCITOS,IBCIUID,IBCIUNIT,IBCIXLID,IBX,IBY
 | 
|---|
| 234 |  K IENS,NODE3,NODE4,NODE50,NODE51,NODE52,RCD1,CPD1
 | 
|---|
| 235 |  K IBCIZ,IBCIZ1,IBXARRAY,IBXARRY,IBXDAT1,IBXDATA,IBXERR
 | 
|---|
| 236 |  K IBCITSI,X1,X2,X3,X4,IBCILSI,CTR
 | 
|---|
| 237 |  Q
 | 
|---|
| 238 |  ;
 | 
|---|