| [613] | 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 | ; | 
|---|