| 1 | IBCIUT6 ;DSI/ESG - MAILMAN UTILITIES ;22-JUN-2001
 | 
|---|
| 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 |  ;
 | 
|---|
| 7 | CAT(IBIFN,IBCIFRM,IBCITO,IBCIGRP,GRPONLY) ; MailMan message sending
 | 
|---|
| 8 |  ; This procedure is called when the user is assigning a bill to
 | 
|---|
| 9 |  ; another user.
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ; Input variables
 | 
|---|
| 12 |  ;   IBIFN    -  IEN of claim
 | 
|---|
| 13 |  ;   IBCIFRM  -  DUZ of person assigning the claim
 | 
|---|
| 14 |  ;   IBCITO   -  DUZ of person being assigned the claim
 | 
|---|
| 15 |  ;   IBCIGRP  -  IEN of the Mail Group to receive this msg
 | 
|---|
| 16 |  ;               (optional - default is "")
 | 
|---|
| 17 |  ;   GRPONLY  -  1/0 flag indicating if the Mail Group is the only
 | 
|---|
| 18 |  ;               entity to receive the mail message.
 | 
|---|
| 19 |  ;               (optional - default is 0)
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  NEW ERRDATA,ERRLVL,IBCIASI,IBCIASN,IBCIBII,IBCIBIL,IBCIBIR,IBCICAR
 | 
|---|
| 22 |  NEW IBCICLNO,IBCICLNP,IBCICNM,IBCICOD,IBCIDAT,IBCIDOB,IBCIDPT,IBCIEVEN
 | 
|---|
| 23 |  NEW IBCIEVV,IBCIFRM1,IBCIINS,IBCINAM,IBCIPAD,IBCIPRV,IBCIPTI,IBCISER
 | 
|---|
| 24 |  NEW IBCISEX,IBCISRR,IBCISSN,IBCITO1,L1,L2,L3,LINENO,MNEMONIC,PREVLINE
 | 
|---|
| 25 |  NEW SEP,TEXT,VALMHDR,XMDUN,XMDUZ,XMZ,XMMG,XMSUB,XMTEXT,XMY
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  S IBCIGRP=$G(IBCIGRP,"")
 | 
|---|
| 28 |  S GRPONLY=$G(GRPONLY,0)
 | 
|---|
| 29 |  I IBCIGRP S IBCIGRP=$P($G(^XMB(3.8,IBCIGRP,0)),U,1)   ; Mail Group name
 | 
|---|
| 30 |  S IBCICLNP=$P(^DGCR(399,IBIFN,0),U,1)
 | 
|---|
| 31 |  S IBCIFRM1=$P(^VA(200,IBCIFRM,0),U,1)
 | 
|---|
| 32 |  S IBCITO1=$P(^VA(200,IBCITO,0),U,1)
 | 
|---|
| 33 |  S XMDUZ=IBCIFRM
 | 
|---|
| 34 |  S XMSUB="ClaimsManager Claim "_IBCICLNP_" Assigned to "_IBCITO1
 | 
|---|
| 35 |  ;
 | 
|---|
| 36 |  S L1=1
 | 
|---|
| 37 |  S TEXT(L1)=$J(IBCICLNP_" has been assigned to: ",32)_IBCITO1,L1=L1+1
 | 
|---|
| 38 |  S TEXT(L1)=$J("by: ",32)_IBCIFRM1,L1=L1+1
 | 
|---|
| 39 |  S TEXT(L1)=" ",L1=L1+1
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 |  ; If comments exist, then display them here
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  I $P($G(^IBA(351.9,IBIFN,2,0)),U,4) D
 | 
|---|
| 44 |  . S TEXT(L1)=$$CMTINFO^IBCIUT5(IBIFN),L1=L1+1
 | 
|---|
| 45 |  . S TEXT(L1)=" ",L1=L1+1
 | 
|---|
| 46 |  . S L2=0
 | 
|---|
| 47 |  . F  S L2=$O(^IBA(351.9,IBIFN,2,L2)) Q:'L2  D
 | 
|---|
| 48 |  .. S TEXT(L1)=^IBA(351.9,IBIFN,2,L2,0),L1=L1+1
 | 
|---|
| 49 |  .. Q
 | 
|---|
| 50 |  . S TEXT(L1)=" ",L1=L1+1
 | 
|---|
| 51 |  . S TEXT(L1)=" ",L1=L1+1
 | 
|---|
| 52 |  . Q
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  ; Now get and display the patient and claim data
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 |  D GDATA^IBCIWK,HDR^IBCIMG
 | 
|---|
| 57 |  S $P(SEP,"-",80)=""       ; 79 dashes
 | 
|---|
| 58 |  S TEXT(L1)=$E(SEP,1,24)_" Patient and Claim Information "
 | 
|---|
| 59 |  S TEXT(L1)=TEXT(L1)_$E(SEP,1,24),L1=L1+1
 | 
|---|
| 60 |  S TEXT(L1)=VALMHDR(1),L1=L1+1
 | 
|---|
| 61 |  S TEXT(L1)=VALMHDR(2),L1=L1+1
 | 
|---|
| 62 |  S TEXT(L1)=VALMHDR(3),L1=L1+1
 | 
|---|
| 63 |  S TEXT(L1)=SEP,L1=L1+1
 | 
|---|
| 64 |  S TEXT(L1)=" ",L1=L1+1
 | 
|---|
| 65 |  S TEXT(L1)=$J("ClaimsManager Errors and Line Item Data",59),L1=L1+1
 | 
|---|
| 66 |  S TEXT(L1)=" ",L1=L1+1
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 |  ; Display a message if there are no errors in the file
 | 
|---|
| 69 |  I '$P($G(^IBA(351.9,IBIFN,1,0)),U,4) D
 | 
|---|
| 70 |  . S TEXT(L1)=$J("*** No ClaimsManager Errors to Report ***",60),L1=L1+1
 | 
|---|
| 71 |  . S TEXT(L1)=" ",L1=L1+1
 | 
|---|
| 72 |  . Q
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  ; Loop through the CM errors and get and display the data
 | 
|---|
| 75 |  S L2=0
 | 
|---|
| 76 |  S PREVLINE=-9999999
 | 
|---|
| 77 |  F  S L2=$O(^IBA(351.9,IBIFN,1,L2)) Q:'L2  D
 | 
|---|
| 78 |  . S ERRDATA=$G(^IBA(351.9,IBIFN,1,L2,0))
 | 
|---|
| 79 |  . S LINENO=+$P(ERRDATA,U,2)
 | 
|---|
| 80 |  . I LINENO'=PREVLINE D LINEDATA(IBIFN,LINENO) S PREVLINE=LINENO
 | 
|---|
| 81 |  . S MNEMONIC=$P(ERRDATA,U,1)
 | 
|---|
| 82 |  . S ERRLVL="Error Level: "_$P(ERRDATA,"~",2)
 | 
|---|
| 83 |  . S TEXT(L1)="("_L2_") ClaimsManager Error: "_MNEMONIC
 | 
|---|
| 84 |  . S TEXT(L1)=(TEXT(L1)_$J(ERRLVL,78-$L(TEXT(L1)))),L1=L1+1
 | 
|---|
| 85 |  . S L3=0
 | 
|---|
| 86 |  . F  S L3=$O(^IBA(351.9,IBIFN,1,L2,1,L3)) Q:'L3  D
 | 
|---|
| 87 |  .. S TEXT(L1)="     "_$G(^IBA(351.9,IBIFN,1,L2,1,L3,0)),L1=L1+1
 | 
|---|
| 88 |  .. Q
 | 
|---|
| 89 |  . S TEXT(L1)=" ",L1=L1+1
 | 
|---|
| 90 |  . Q
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 |  ; Now time to do the MailMan stuff
 | 
|---|
| 93 |  S XMTEXT="TEXT("                           ; msg text
 | 
|---|
| 94 |  I 'GRPONLY S XMY("I:"_IBCITO)=""           ; info only msg to recipient
 | 
|---|
| 95 |  I 'GRPONLY S XMY("I:"_IBCIFRM)=""          ; info only msg to sender
 | 
|---|
| 96 |  I IBCIGRP'="" S XMY("I:G."_IBCIGRP)=""     ; info only msg to group
 | 
|---|
| 97 |  D ^XMD
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 |  ; look at the IB site parameter file to see if we should send
 | 
|---|
| 100 |  ; priority or normal MailMan messages
 | 
|---|
| 101 |  I '$G(XMZ) G CATX                            ; no msg created
 | 
|---|
| 102 |  I $P($G(^IBE(350.9,1,50)),U,7)="N" G CATX    ; normal messages
 | 
|---|
| 103 |  S $P(^XMB(3.9,XMZ,0),U,7)="P"                ; priority messages
 | 
|---|
| 104 | CATX ;
 | 
|---|
| 105 |  Q
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  ;
 | 
|---|
| 108 | LINEDATA(IBIFN,LINE) ; Get and display the line item info
 | 
|---|
| 109 |  NEW BEGDATE,CHRG,COLHDR,CPT,DXCODE,DXSTRING,ENDDATE,KILLTMP
 | 
|---|
| 110 |  NEW LNA,LNB,MOD,MODS,MOD2,POS,SEQ,TOS,UNIT,X,X1,X2,X3,X4,Y
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 |  ; Conditionally build the 3,4,5 nodes.  Use this flag to indicate
 | 
|---|
| 113 |  ; whether or not to kill these nodes when we're done.
 | 
|---|
| 114 |  S KILLTMP=0
 | 
|---|
| 115 |  I '$P($G(^IBA(351.9,IBIFN,3)),U,1) S KILLTMP=1 D UPDT^IBCIADD1
 | 
|---|
| 116 |  S COLHDR="----------BEG DATE----END DATE----POS---TOS--CPT------"
 | 
|---|
| 117 |  S COLHDR=COLHDR_"MOD-------CHARGE-----UNIT"
 | 
|---|
| 118 |  S LNA=$G(^IBA(351.9,IBIFN,5,LINE,0))
 | 
|---|
| 119 |  S LNB=$G(^IBA(351.9,IBIFN,5,LINE,2))
 | 
|---|
| 120 |  S BEGDATE=$P(LNA,U,6)
 | 
|---|
| 121 |  S BEGDATE=$E(BEGDATE,5,6)_"/"_$E(BEGDATE,7,8)_"/"_$E(BEGDATE,1,4)
 | 
|---|
| 122 |  S ENDDATE=$P(LNA,U,7)
 | 
|---|
| 123 |  S ENDDATE=$E(ENDDATE,5,6)_"/"_$E(ENDDATE,7,8)_"/"_$E(ENDDATE,1,4)
 | 
|---|
| 124 |  S POS=$P(LNA,U,8)
 | 
|---|
| 125 |  S TOS=$P(LNB,U,11)
 | 
|---|
| 126 |  S CPT=$P(LNA,U,9)
 | 
|---|
| 127 |  S MODS=$TR($P($G(^IBA(351.9,IBIFN,5,LINE,3)),U,1),",")
 | 
|---|
| 128 |  S MOD=$E(MODS,1,6),MOD2=$E(MODS,7,999)
 | 
|---|
| 129 |  S CHRG=$FN($P(LNA,U,11),"",2)
 | 
|---|
| 130 |  S UNIT=$P(LNB,U,12)
 | 
|---|
| 131 |  ;
 | 
|---|
| 132 |  ; Get the diagnosis information for this line
 | 
|---|
| 133 |  KILL ^TMP("DISPLAY",$J)
 | 
|---|
| 134 |  S DXSTRING=""
 | 
|---|
| 135 |  D DIAG^IBCIUT1(IBIFN)
 | 
|---|
| 136 |  S SEQ=0
 | 
|---|
| 137 |  F  S SEQ=$O(^TMP("DISPLAY",$J,IBIFN,"ICD",LINE,SEQ)) Q:'SEQ  D
 | 
|---|
| 138 |  . S DXCODE=^TMP("DISPLAY",$J,IBIFN,"ICD",LINE,SEQ)
 | 
|---|
| 139 |  . I DXSTRING="" S DXSTRING=DXCODE
 | 
|---|
| 140 |  . E  S DXSTRING=DXSTRING_" / "_DXCODE
 | 
|---|
| 141 |  . Q
 | 
|---|
| 142 |  KILL ^TMP("DISPLAY",$J)
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 |  ; Now build the text strings for the line item data
 | 
|---|
| 145 |  S TEXT(L1)=COLHDR,L1=L1+1
 | 
|---|
| 146 |  S TEXT(L1)=" Line: "
 | 
|---|
| 147 |  S X=LINE,X1=3,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 148 |  S X=BEGDATE,X1=12,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 149 |  S X=ENDDATE,X1=12,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 150 |  S X=POS,X1=6,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 151 |  S X=TOS,X1=5,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 152 |  S X=CPT,X1=9,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 153 |  S X=MOD,X1=6,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 154 |  S X=CHRG,X1=10,X2="R" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 155 |  S TEXT(L1)=TEXT(L1)_"      "
 | 
|---|
| 156 |  S X=UNIT,X1=3,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 157 |  S L1=L1+1
 | 
|---|
| 158 |  S TEXT(L1)=" Dx's: "
 | 
|---|
| 159 |  I $L(DXSTRING)<46,MOD2'="" D
 | 
|---|
| 160 |  . S X=DXSTRING,X1=47,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 161 |  . S X=MOD2,X1=8,X2="L" S TEXT(L1)=TEXT(L1)_$$FILL^IBCIUT2
 | 
|---|
| 162 |  . Q
 | 
|---|
| 163 |  E  S TEXT(L1)=TEXT(L1)_DXSTRING
 | 
|---|
| 164 |  S L1=L1+1
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 | LINDATX ;
 | 
|---|
| 167 |  I KILLTMP D DELTI^IBCIUT4
 | 
|---|
| 168 |  Q
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 | TOP(IBIFN)  ; This utility returns the type of plan for the current payer
 | 
|---|
| 171 |  ; sequenced insurance company.  This is currently used for the
 | 
|---|
| 172 |  ; ClaimsManager UserDefined field #4.
 | 
|---|
| 173 |  ; The data in this field is the actual type of plan defined on VistA.
 | 
|---|
| 174 |  N IBCITOP,GRPPLAN,IBCISEQ,INSSEQ,TOPIEN
 | 
|---|
| 175 |  S IBCITOP=""
 | 
|---|
| 176 |  S IBCISEQ=$$COBN^IBCEF(IBIFN)
 | 
|---|
| 177 |  S INSSEQ="I"_IBCISEQ
 | 
|---|
| 178 |  S GRPPLAN=$P($G(^DGCR(399,IBIFN,INSSEQ)),U,18)
 | 
|---|
| 179 |  I GRPPLAN="" G TOPX
 | 
|---|
| 180 |  S TOPIEN=$P($G(^IBA(355.3,GRPPLAN,0)),U,9)
 | 
|---|
| 181 |  I TOPIEN="" G TOPX
 | 
|---|
| 182 |  S IBCITOP=$P($G(^IBE(355.1,TOPIEN,0)),U,2)
 | 
|---|
| 183 | TOPX ;
 | 
|---|
| 184 |  Q IBCITOP
 | 
|---|
| 185 |  ;
 | 
|---|
| 186 | CLRCMQ(MSG) ;
 | 
|---|
| 187 |  ; This procedure will try to clear out the CM result queue by opening
 | 
|---|
| 188 |  ; and using every available port and just reading in any and all 
 | 
|---|
| 189 |  ; data CM is wanting to send.
 | 
|---|
| 190 |  ;
 | 
|---|
| 191 |  ; Input:  MSG is either 0 or 1 which will determine if status messages
 | 
|---|
| 192 |  ;         and/or error messages are displayed on the screen.
 | 
|---|
| 193 |  ;         MSG=0 silent mode
 | 
|---|
| 194 |  ;         MSG=1 display on screen mode
 | 
|---|
| 195 |  ;
 | 
|---|
| 196 |  ; Output:  None (either it will work or it won't)
 | 
|---|
| 197 |  ;
 | 
|---|
| 198 |  NEW IBCIIP,PORTS,IBCISOCK,JTOT,POP,J,TRASH,SET,IBCIMT
 | 
|---|
| 199 |  NEW X,Y,DTOUT,DUOUT,DIRUT,DIROUT
 | 
|---|
| 200 |  S MSG=$G(MSG,1)
 | 
|---|
| 201 |  S IBCIMT=$$ENV^IBCIUT5
 | 
|---|
| 202 |  I 'MSG,IBCIMT="T" G CLRX    ; don't allow silent mode from TEST acct
 | 
|---|
| 203 |  ;
 | 
|---|
| 204 |  ; If a site isn't using the interface, then display message and exit
 | 
|---|
| 205 |  I '$$CK0^IBCIUT1(),MSG D  G CLRX
 | 
|---|
| 206 |  . U IO(0)
 | 
|---|
| 207 |  . W !!!?5,"The ClaimsManager product is not being used."
 | 
|---|
| 208 |  . W !!?5,"This option is not available.",!!
 | 
|---|
| 209 |  . S DIR(0)="E" D ^DIR K DIR
 | 
|---|
| 210 |  . Q
 | 
|---|
| 211 |  ;
 | 
|---|
| 212 |  I MSG D  I 'Y G CLRX
 | 
|---|
| 213 |  . U IO(0)
 | 
|---|
| 214 |  . W @IOF
 | 
|---|
| 215 |  . W !?20,"Clear ClaimsManager Results Queue",!
 | 
|---|
| 216 |  . W !?2,"This option attempts to clear out the ClaimsManager Results Queue so"
 | 
|---|
| 217 |  . W !?2,"ClaimsManager can get back in sync with VistA.  If this process doesn't"
 | 
|---|
| 218 |  . W !?2,"correct the problems, then Ingenix should be called (800-765-6818)."
 | 
|---|
| 219 |  . W !
 | 
|---|
| 220 |  . I IBCIMT="T" D
 | 
|---|
| 221 |  .. W !?2,"Please note that you're doing this from the TEST account.  This may be"
 | 
|---|
| 222 |  .. W !?2,"risky if there are Production users using ClaimsManager."
 | 
|---|
| 223 |  .. W !
 | 
|---|
| 224 |  .. Q
 | 
|---|
| 225 |  . S DIR(0)="Y"
 | 
|---|
| 226 |  . S DIR("A")="OK to proceed"
 | 
|---|
| 227 |  . S DIR("B")="YES"
 | 
|---|
| 228 |  . DO ^DIR K DIR
 | 
|---|
| 229 |  . Q
 | 
|---|
| 230 |  ;
 | 
|---|
| 231 |  L +^IBCITCP:15 E  W:MSG !!,"Couldn't Lock all Ports" G CLRX
 | 
|---|
| 232 |  S IBCIIP=$P($G(^IBE(350.9,1,50)),U,5)
 | 
|---|
| 233 |  I IBCIIP="" W:MSG !!,"No IP address" G CLRX
 | 
|---|
| 234 |  M PORTS=^IBE(350.9,1,50.06,"B")
 | 
|---|
| 235 |  I '$D(PORTS) W:MSG !!,"No Ports defined" G CLRX
 | 
|---|
| 236 |  S SET=0
 | 
|---|
| 237 | AGAIN ;
 | 
|---|
| 238 |  S SET=SET+1
 | 
|---|
| 239 |  W:MSG !!,"Set ",SET
 | 
|---|
| 240 |  S IBCISOCK="",JTOT=0
 | 
|---|
| 241 |  F  S IBCISOCK=$O(PORTS(IBCISOCK)) Q:IBCISOCK=""  D
 | 
|---|
| 242 |  . W:MSG !?1,"Port# ",IBCISOCK
 | 
|---|
| 243 |  . D CALL^%ZISTCP(IBCIIP,IBCISOCK,1)
 | 
|---|
| 244 |  . I POP W:MSG ?16,"FAILURE:  Couldn't open port!!" Q
 | 
|---|
| 245 |  . F J=0:1 R TRASH#1:1 Q:'$T  Q:$A(TRASH)=3  Q:TRASH=""
 | 
|---|
| 246 |  . S JTOT=JTOT+J
 | 
|---|
| 247 |  . W $C(1,6,3),!
 | 
|---|
| 248 |  . D CLOSE^%ZISTCP
 | 
|---|
| 249 |  . I 'MSG Q
 | 
|---|
| 250 |  . U IO(0)
 | 
|---|
| 251 |  . W ?15,$J(J,5)," characters read"
 | 
|---|
| 252 |  . W ?40,"ACK sent to CM"
 | 
|---|
| 253 |  . W ?58,"Port Closed"
 | 
|---|
| 254 |  . Q
 | 
|---|
| 255 |  W:MSG !,"Results of Set ",SET,":  "
 | 
|---|
| 256 |  I JTOT W:MSG "Data was detected.  Repeating the process." H 1 G AGAIN
 | 
|---|
| 257 |  W:MSG "No data found.  Process is complete.",!!
 | 
|---|
| 258 | CLRX ;
 | 
|---|
| 259 |  L -^IBCITCP
 | 
|---|
| 260 |  Q
 | 
|---|
| 261 |  ;
 | 
|---|