| [613] | 1 | FBUTL2 ;WOIFO/SAB-FEE BASIS UTILITY ;7/1/2003
 | 
|---|
 | 2 |  ;;3.5;FEE BASIS;**61,73**;JAN 30, 1995
 | 
|---|
 | 3 |  Q
 | 
|---|
 | 4 | ADJ(FBTAS,FBADJ,FBMAX,FBDT,FBADJD,FBNOOUT) ; Prompt for adjustments
 | 
|---|
 | 5 |  ;
 | 
|---|
 | 6 |  ; Input
 | 
|---|
 | 7 |  ;   FBTAS  - required, total amount suspended, number, may be negative
 | 
|---|
 | 8 |  ;            the sum of all adjustment amounts must equal this value
 | 
|---|
 | 9 |  ;   FBADJ  - required, array passed by reference
 | 
|---|
 | 10 |  ;            will be initialized (killed)
 | 
|---|
 | 11 |  ;            array of any entered adjustments
 | 
|---|
 | 12 |  ;            format
 | 
|---|
 | 13 |  ;              FBADJ(#)=FBADJR^FBADJG^FBADJA
 | 
|---|
 | 14 |  ;            where
 | 
|---|
 | 15 |  ;              # = sequentially assigned number starting with 1
 | 
|---|
 | 16 |  ;              FBADJR = adjustment reason (internal value file 162.91)
 | 
|---|
 | 17 |  ;              FBADJG = adjustment group (inernal value file 162.92)
 | 
|---|
 | 18 |  ;              FBADJA = adjustment amount (dollar value)
 | 
|---|
 | 19 |  ;   FBMAX  -  optional, number, default to 1
 | 
|---|
 | 20 |  ;             maximum number of adjustments that may be entered by user
 | 
|---|
 | 21 |  ;   FBDT   -  optional, effective date, FileMan internal format
 | 
|---|
 | 22 |  ;             default to current date, used to determine available codes
 | 
|---|
 | 23 |  ;   FBADJD -  optional, array passed by reference
 | 
|---|
 | 24 |  ;             same format as FBADJ
 | 
|---|
 | 25 |  ;             if passed, it will be used to supply default values
 | 
|---|
 | 26 |  ;             normally only used when editing an existing payment 
 | 
|---|
 | 27 |  ;   FBNOOUT-  optional, boolean value, default 0, set =1 if user
 | 
|---|
 | 28 |  ;             should not be allowed to exit using an uparrow
 | 
|---|
 | 29 |  ; Result (value of $$ADJ extrinsic function)
 | 
|---|
 | 30 |  ;   FBRET  - boulean value (0 or 1)
 | 
|---|
 | 31 |  ;             = 1 when valid adjustments entered
 | 
|---|
 | 32 |  ;             = 0 when processed ended due to time-out or entry of '^'
 | 
|---|
 | 33 |  ; Output
 | 
|---|
 | 34 |  ;   FBADJ  - the FBADJ input array passed by reference will be modified
 | 
|---|
 | 35 |  ;            if the result = 1 then it will contain entered adjustments
 | 
|---|
 | 36 |  ;            if the result = 0 then it will be undefined
 | 
|---|
 | 37 |  ;
 | 
|---|
 | 38 |  N FBADJR,FBCAS,FBCNT,FBEDIT,FBERR,FBI,FBNEW,FBRET
 | 
|---|
 | 39 |  N DIR,DIRUT,DTOUT,DUOUT,X,Y
 | 
|---|
 | 40 |  S FBRET=1
 | 
|---|
 | 41 |  S FBMAX=$G(FBMAX,1)
 | 
|---|
 | 42 |  S FBDT=$G(FBDT,DT)
 | 
|---|
 | 43 |  S FBNOOUT=$G(FBNOOUT,0)
 | 
|---|
 | 44 |  S FBTAS=+FBTAS
 | 
|---|
 | 45 |  K FBADJ
 | 
|---|
 | 46 |  ;
 | 
|---|
 | 47 |  I +FBTAS=0 G EXIT ; no adjustment since total amount susp. is 0
 | 
|---|
 | 48 |  ;
 | 
|---|
 | 49 |  ; if default adjustments exist then load them into array
 | 
|---|
 | 50 |  I $D(FBADJD) M FBADJ=FBADJD
 | 
|---|
 | 51 |  S (FBCNT,FBCAS)=0
 | 
|---|
 | 52 |  I $D(FBADJ) S FBI=0 F  S FBI=$O(FBADJ(FBI)) Q:'FBI  D
 | 
|---|
 | 53 |  . S FBCNT=FBCNT+1
 | 
|---|
 | 54 |  . S FBCAS=FBCAS+$P(FBADJ(FBI),U,3)
 | 
|---|
 | 55 |  ;
 | 
|---|
 | 56 |  ; if more than one adjustment can be entered then display number
 | 
|---|
 | 57 |  ;
 | 
|---|
 | 58 |  ;
 | 
|---|
 | 59 | ASKADJ ; multiply prompt for adjustments
 | 
|---|
 | 60 |  ;
 | 
|---|
 | 61 |  ; display current list of adjustments when more than 1 allowed
 | 
|---|
 | 62 |  I FBMAX>1!(FBCNT>1) D
 | 
|---|
 | 63 |  . W !!,"Current list of Adjustments: "
 | 
|---|
 | 64 |  . I '$O(FBADJ(0)) W "none"
 | 
|---|
 | 65 |  . S FBI=0 F  S FBI=$O(FBADJ(FBI)) Q:'FBI  D
 | 
|---|
 | 66 |  . . W ?30,"Code: "
 | 
|---|
 | 67 |  . . W:$P(FBADJ(FBI),U)]"" $P($G(^FB(161.91,$P(FBADJ(FBI),U),0)),U)
 | 
|---|
 | 68 |  . . W ?44,"Group: "
 | 
|---|
 | 69 |  . . W:$P(FBADJ(FBI),U,2)]"" $P($G(^FB(161.92,$P(FBADJ(FBI),U,2),0)),U)
 | 
|---|
 | 70 |  . . W ?56,"Amount: "
 | 
|---|
 | 71 |  . . W "$",$FN($P(FBADJ(FBI),U,3),"",2),!
 | 
|---|
 | 72 |  ;
 | 
|---|
 | 73 |  ; prompt for adjustment reason
 | 
|---|
 | 74 |  ;   if max is 1 and reason already on list then automatically select it
 | 
|---|
 | 75 |  I FBMAX=1,FBCNT=1 D
 | 
|---|
 | 76 |  . N FBI,FBADJR
 | 
|---|
 | 77 |  . S FBI=$O(FBADJ(0))
 | 
|---|
 | 78 |  . S:FBI FBADJR=$P(FBADJ(FBI),U)
 | 
|---|
 | 79 |  . I FBADJR S Y=FBADJR_U_$P($G(^FB(161.91,FBADJR,0)),U)
 | 
|---|
 | 80 |  E  D  I $D(DTOUT)!$D(DUOUT) S FBRET=0 G EXIT  ; prompt user
 | 
|---|
 | 81 |  . S DIR(0)="PO^161.91:EMZ"
 | 
|---|
 | 82 |  . S DIR("A")="Select ADJUSTMENT REASON"
 | 
|---|
 | 83 |  . S DIR("S")="I $P($$AR^FBUTL1(Y,,FBDT),U,4)=1"
 | 
|---|
 | 84 |  . S DIR("?")="Select a HIPAA Adjustment (suspense) Reason Code"
 | 
|---|
 | 85 |  . S DIR("?",1)="Adjustment reason codes explain why the amount paid differs"
 | 
|---|
 | 86 |  . S DIR("?",2)="from the amount claimed."
 | 
|---|
 | 87 |  . D ^DIR K DIR
 | 
|---|
 | 88 |  ; if value was entered then process it and ask another if not max and
 | 
|---|
 | 89 |  ;   total amount suspended has not been accounted for
 | 
|---|
 | 90 |  I +Y>0 D  G:FBRET=0 EXIT I FBCNT<FBMAX,FBCAS'=FBTAS G ASKADJ
 | 
|---|
 | 91 |  . S FBADJR=+Y
 | 
|---|
 | 92 |  . ; if specified adj. reason already in list set FBEDIT = it's number
 | 
|---|
 | 93 |  . S (FBI,FBEDIT)=0 F  S FBI=$O(FBADJ(FBI)) Q:'FBI  D  Q:FBEDIT
 | 
|---|
 | 94 |  . . I $P(FBADJ(FBI),U)=FBADJR S FBEDIT=FBI
 | 
|---|
 | 95 |  . S FBNEW=$S(FBEDIT:0,1:1) ; flag as new if not on list
 | 
|---|
 | 96 |  . ; if in list then edit the existing adj. reason
 | 
|---|
 | 97 |  . I FBEDIT D  Q:$D(DIRUT)  Q:FBADJR=""
 | 
|---|
 | 98 |  . . S DIR(0)="162.558,.01"
 | 
|---|
 | 99 |  . . ;S DIR(0)="PO^161.91:EMZ"
 | 
|---|
 | 100 |  . . ;S DIR("S")="I $P($$AR^FBUTL1(Y,,FBDT),U,4)=1"
 | 
|---|
 | 101 |  . . ;S DIR("A")="  ADJUSTMENT REASON"
 | 
|---|
 | 102 |  . . S DIR("B")=$P($G(^FB(161.91,FBADJR,0)),U)
 | 
|---|
 | 103 |  . . ;S DIR("?")="Enter a HIPAA Adjustment (suspense) Reason Code"
 | 
|---|
 | 104 |  . . ;S DIR("?",1)="Adjustment reason codes explain why the amount paid differs"
 | 
|---|
 | 105 |  . . ;S DIR("?",2)="from the amount claimed."
 | 
|---|
 | 106 |  . . D ^DIR K DIR I $D(DTOUT)!$D(DUOUT) S:FBMAX=1 FBRET=0 Q
 | 
|---|
 | 107 |  . . I X="@" D  Q  ; "@" removes from list
 | 
|---|
 | 108 |  . . . D DEL(FBEDIT)
 | 
|---|
 | 109 |  . . . S FBADJR=""
 | 
|---|
 | 110 |  . . . W "   (deleted)"
 | 
|---|
 | 111 |  . . I +Y>0 S FBADJR=+Y
 | 
|---|
 | 112 |  . . ; ensure new value of edited reason is not already on list
 | 
|---|
 | 113 |  . . S FBI=0 F  S FBI=$O(FBADJ(FBI)) Q:'FBI  D  Q:FBADJR=""
 | 
|---|
 | 114 |  . . . I $P(FBADJ(FBI),U)=FBADJR,FBI'=FBEDIT S FBADJR="" W !,$C(7),"     Change was not accepted because the new value is already on the list."
 | 
|---|
 | 115 |  . . Q:FBADJR=""
 | 
|---|
 | 116 |  . . ; upate the existing reason
 | 
|---|
 | 117 |  . . S $P(FBADJ(FBEDIT),U)=FBADJR
 | 
|---|
 | 118 |  . ;
 | 
|---|
 | 119 |  . ; if new reason then add to list
 | 
|---|
 | 120 |  . I 'FBEDIT D  Q:FBADJR=""
 | 
|---|
 | 121 |  . . I (FBCNT+1)>FBMAX D  Q
 | 
|---|
 | 122 |  . . . S FBADJR=""
 | 
|---|
 | 123 |  . . . W !,$C(7),"ERROR: A new reason would exceed maximum number (",FBMAX,") allowed for this invoice."
 | 
|---|
 | 124 |  . . . W !,"   Select a reason code on the current list instead."
 | 
|---|
 | 125 |  . . S FBEDIT=$O(FBADJ(" "),-1)+1
 | 
|---|
 | 126 |  . . S $P(FBADJ(FBEDIT),U)=FBADJR,FBCNT=FBCNT+1
 | 
|---|
 | 127 |  . ;
 | 
|---|
 | 128 |  . ; ask for adjustment group
 | 
|---|
 | 129 |  . S DIR(0)="162.558,1"
 | 
|---|
 | 130 |  . ;S DIR(0)="P^161.92:EMZ"
 | 
|---|
 | 131 |  . ;S DIR("S")="I $P($$AG^FBUTL1(Y,,FBDT),U,4)=1"
 | 
|---|
 | 132 |  . ;S DIR("A")="  ADJUSTMENT GROUP"
 | 
|---|
 | 133 |  . I $P(FBADJ(FBEDIT),U,2)]"" S DIR("B")=$P($G(^FB(161.92,$P(FBADJ(FBEDIT),U,2),0)),U)
 | 
|---|
 | 134 |  . D ^DIR K DIR I $D(DIRUT) D:FBNEW DEL(FBEDIT) Q
 | 
|---|
 | 135 |  . S $P(FBADJ(FBEDIT),U,2)=+Y
 | 
|---|
 | 136 |  . ;
 | 
|---|
 | 137 |  . ; ask for adjustment amount
 | 
|---|
 | 138 |  . S DIR(0)="162.558,2"
 | 
|---|
 | 139 |  . ;S DIR(0)="NA^-9999999.99:9999999.99:2^K:+X=0 X"
 | 
|---|
 | 140 |  . ;S DIR("A")="  ADJUSTMENT AMOUNT: "
 | 
|---|
 | 141 |  . S DIR("B")=$FN(FBTAS-FBCAS+$P(FBADJ(FBEDIT),U,3),"",2)
 | 
|---|
 | 142 |  . D ^DIR K DIR I $D(DIRUT) D:FBNEW DEL(FBEDIT) Q
 | 
|---|
 | 143 |  . S FBCAS=FBCAS-$P($G(FBADJ(FBEDIT)),U,3)+Y
 | 
|---|
 | 144 |  . S $P(FBADJ(FBEDIT),U,3)=+Y
 | 
|---|
 | 145 |  ;
 | 
|---|
 | 146 | VAL ; validate
 | 
|---|
 | 147 |  S FBERR=0
 | 
|---|
 | 148 |  I FBCAS'=FBTAS D
 | 
|---|
 | 149 |  . S FBERR=1
 | 
|---|
 | 150 |  . W !,$C(7),"ERROR: Must account for $",$FN(FBTAS-FBCAS,"",2)," more to cover the total amount suspended."
 | 
|---|
 | 151 |  . W !,"   The current sum of adjustments is $",$FN(FBCAS,"",2),"."
 | 
|---|
 | 152 |  . W !,"   The total amount suspended is $",$FN(FBTAS,"",2),"."
 | 
|---|
 | 153 |  I FBCNT>FBMAX D
 | 
|---|
 | 154 |  . S FBERR=1
 | 
|---|
 | 155 |  . W !,$C(7),"ERROR: Maximum number of adjustment reasons (",FBMAX,") have been exceeded."
 | 
|---|
 | 156 |  I FBERR G ASKADJ
 | 
|---|
 | 157 |  ;
 | 
|---|
 | 158 | EXIT ;
 | 
|---|
 | 159 |  ; if time-out or uparrow and total amount not covered then check if
 | 
|---|
 | 160 |  ; exit is allowed by the calling routine. (not allowed during edit)
 | 
|---|
 | 161 |  I FBRET=0,FBNOOUT S FBRET=1 I FBTAS'=FBCAS G VAL
 | 
|---|
 | 162 |  I FBRET=0 K FBADJ
 | 
|---|
 | 163 |  ;
 | 
|---|
 | 164 |  Q FBRET
 | 
|---|
 | 165 |  ;
 | 
|---|
 | 166 | DEL(FBI) ; delete adjustment reason from list
 | 
|---|
 | 167 |  S FBCAS=FBCAS-$P($G(FBADJ(FBI)),U,3)
 | 
|---|
 | 168 |  S FBCNT=FBCNT-1
 | 
|---|
 | 169 |  K FBADJ(FBI)
 | 
|---|
 | 170 |  S FBADJR=""
 | 
|---|
 | 171 |  W "   (reason deleted)"
 | 
|---|
 | 172 |  Q
 | 
|---|
 | 173 |  ;
 | 
|---|
 | 174 | ADJL(FBADJ) ; build list of adjustments extrinsic function
 | 
|---|
 | 175 |  ; Input
 | 
|---|
 | 176 |  ;   FBADJ  - required, array passed by reference
 | 
|---|
 | 177 |  ;            array adjustments
 | 
|---|
 | 178 |  ;            format
 | 
|---|
 | 179 |  ;              FBADJ(#)=FBADJR^FBADJG^FBADJA
 | 
|---|
 | 180 |  ;            where
 | 
|---|
 | 181 |  ;              # = integer number greater than 0
 | 
|---|
 | 182 |  ;              FBADJR = adjustment reason (internal value file 162.91)
 | 
|---|
 | 183 |  ;              FBADJG = adjustment group (inernal value file 162.92)
 | 
|---|
 | 184 |  ;              FBADJA = adjustment amount (dollar value)
 | 
|---|
 | 185 |  ; Result
 | 
|---|
 | 186 |  ;   string containing sorted list (by external reason) of adjustments
 | 
|---|
 | 187 |  ;   format
 | 
|---|
 | 188 |  ;      FBADJRE 1^FBADJGE 1^FBADJAE 1^FBADJRE 2^FBADJGE 2^FBADJAE 2
 | 
|---|
 | 189 |  ;   where
 | 
|---|
 | 190 |  ;      FBADJRE = adjustment reason (external value)
 | 
|---|
 | 191 |  ;      FBADJGE = adjustment group (external value)
 | 
|---|
 | 192 |  ;      FBADJAE = adjustment amount (with cents)
 | 
|---|
 | 193 |  N FBRET
 | 
|---|
 | 194 |  N FBARJR,FBADJRE,FBADJG,FBADJGE,FBADJA,FBADJAE
 | 
|---|
 | 195 |  N FBI,FBADJS
 | 
|---|
 | 196 |  S FBRET=""
 | 
|---|
 | 197 |  ;
 | 
|---|
 | 198 |  ; build sorted array containing external values
 | 
|---|
 | 199 |  S FBI=0 F  S FBI=$O(FBADJ(FBI)) Q:'FBI  D
 | 
|---|
 | 200 |  . ; obtain internal values
 | 
|---|
 | 201 |  . S FBADJR=$P(FBADJ(FBI),U)
 | 
|---|
 | 202 |  . S FBADJG=$P(FBADJ(FBI),U,2)
 | 
|---|
 | 203 |  . S FBADJA=$P(FBADJ(FBI),U,3)
 | 
|---|
 | 204 |  . ; convert to external values
 | 
|---|
 | 205 |  . S FBADJRE=$S(FBADJR:$P($G(^FB(161.91,FBADJR,0)),U),1:"")
 | 
|---|
 | 206 |  . S FBADJGE=$S(FBADJG:$P($G(^FB(161.92,FBADJG,0)),U),1:"")
 | 
|---|
 | 207 |  . S FBADJAE=$FN(FBADJA,"",2)
 | 
|---|
 | 208 |  . ; store in sorted array
 | 
|---|
 | 209 |  . S FBADJS(FBADJRE_U_FBI)=FBADJRE_U_FBADJGE_U_FBADJAE_U
 | 
|---|
 | 210 |  ;
 | 
|---|
 | 211 |  ; build list from sorted array
 | 
|---|
 | 212 |  S FBI="" F  S FBI=$O(FBADJS(FBI)) Q:FBI=""  D
 | 
|---|
 | 213 |  . S FBRET=FBRET_FBADJS(FBI)
 | 
|---|
 | 214 |  ; strip trailing "^" from list
 | 
|---|
 | 215 |  I $E(FBRET,$L(FBRET))="^" S FBRET=$E(FBRET,1,$L(FBRET)-1)
 | 
|---|
 | 216 |  ;
 | 
|---|
 | 217 |  Q FBRET
 | 
|---|
 | 218 |  ;
 | 
|---|
 | 219 | ADJLR(FBADJL) ; build list of adjustment reasons extrinsic function
 | 
|---|
 | 220 |  ; Input
 | 
|---|
 | 221 |  ;   FBADJL - required, string containing sorted list
 | 
|---|
 | 222 |  ;           (by external reason) of adjustments (see $$ADJL result)
 | 
|---|
 | 223 |  ; Result
 | 
|---|
 | 224 |  ;   sting of adjustment reasons delimited by commas
 | 
|---|
 | 225 |  ;
 | 
|---|
 | 226 |  N FBRET,FBADJRE
 | 
|---|
 | 227 |  N FBI
 | 
|---|
 | 228 |  S FBRET=""
 | 
|---|
 | 229 |  F FBI=1:3 S FBADJRE=$P(FBADJL,U,FBI) Q:FBADJRE=""  S FBRET=FBRET_FBADJRE_","
 | 
|---|
 | 230 |  ; strip trailing "," from list
 | 
|---|
 | 231 |  I $E(FBRET,$L(FBRET))="," S FBRET=$E(FBRET,1,$L(FBRET)-1)
 | 
|---|
 | 232 |  ;
 | 
|---|
 | 233 |  Q FBRET
 | 
|---|
 | 234 |  ;
 | 
|---|
 | 235 | ADJLA(FBADJL) ; build list of adjustment amounts extrinsic function
 | 
|---|
 | 236 |  ; Input
 | 
|---|
 | 237 |  ;   FBADJL - required, string containing sorted list
 | 
|---|
 | 238 |  ;           (by external reason) of adjustments (see $$ADJL result)
 | 
|---|
 | 239 |  ; Result
 | 
|---|
 | 240 |  ;   sting of adjustment reasons delimited by commas
 | 
|---|
 | 241 |  ;
 | 
|---|
 | 242 |  N FBRET,FBADJRE
 | 
|---|
 | 243 |  N FBI
 | 
|---|
 | 244 |  S FBRET=""
 | 
|---|
 | 245 |  F FBI=3:3 S FBADJRE=$P(FBADJL,U,FBI) Q:FBADJRE=""  S FBRET=FBRET_FBADJRE_","
 | 
|---|
 | 246 |  ; strip trailing "," from list
 | 
|---|
 | 247 |  I $E(FBRET,$L(FBRET))="," S FBRET=$E(FBRET,1,$L(FBRET)-1)
 | 
|---|
 | 248 |  ;
 | 
|---|
 | 249 |  Q FBRET
 | 
|---|
 | 250 |  ;
 | 
|---|
 | 251 |  ;FBUTL2
 | 
|---|