---
title: Bill audit rule execution
summary: Runs the ordered audit rule set that computes basic allowance, applies provider contracts, checks cross-service and historical rules, and finalizes payable amounts.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-07-30
library: SAIF.Business.Claim.Bill.AutomatedAudit
reference_type: package
operation_id: OP-AA-05
trigger: BillAuditEngine.AuditBill calls clsBillAuditor.AuditBill(Bill) after bill/service edits pass and MCO determination completes
---

# Bill audit rule execution

`clsBillAuditor.AuditBill` runs thirteen rule handlers, in registration order, over the bill's auditable services. Together they validate bill-level codes (DRG, diagnosis/procedure, admit type), compute each service's basic allowance (fee schedule, pharmacy, mileage, cost-charge), apply provider contract pricing, check cross-service rules (global surgery periods, the three-point rule, procedure bundling), and run final checks (denied claim, ineligible providers/services, duplicates, late filing, non-MCO providers, MCO withhold, voided claim) before totaling the bill.

| Field | Value |
| --- | --- |
| **Operation ID** | OP-AA-05 |
| **Trigger** | `BillAuditEngine.AuditBill` calls `clsBillAuditor.AuditBill(Bill)` once bill edits, service edits, and (for non-Worker-Reimbursement bills) MCO determination have completed |
| **Inputs** | `clsBillAudit` with edited, MCO-resolved auditable services (`ReauditCode = "R"`); resolved `Claim`, `BillingProvider`, and service history |
| **Outputs** | Computed `AllowedAmount`/`TotalAdjustmentAmount`/adjustment codes per service; recomputed bill audit totals (`TotalChargedAmount`, `TotalAllowedAmount`, `TotalMcoAdminFeeAmount`); `Bill.BillTotalAmount`; audit messages; boolean pass/fail |
| **Primary components** | `clsBillAuditor.AuditBill` and its thirteen registered rule handlers |
| **Entry point** | `Business\SAIF.Business.Claim.Bill.AutomatedAudit\AuditUtilities\clsBillAuditor.vb` |

## Steps

`AuditBill` starts the `"Audit Bill"` trail group, clears broken rules, and runs the following rule handlers in order, then returns `ErrorCount = 0`:

1. **`UpdateMergeClaimID`.** If `Bill.ClaimID <> Bill.Claim.ClaimID` (the claim was merged), update the bill's claim ID/number/check digit to the merged claim's values and record informational message `"Claim has been merged"`.
2. **`ValidateDRGCode`.** `IsDRGCodeRequired` requires a DRG code only for `InpatientHospital` bills with a UB bill type code of `0111`–`0118`, no billed service code starting with `"002"`, and a billing provider that is not a critical-access hospital. When required, `IsDRGCodeValid` checks the code with an inline query ([SQL-001](../sql/SQL-001-saif-business-claim-bill-automatedaudit.md), [CBP_DRG_CODE](../database-tables.md#cbp_drg_code)). If missing/invalid: message `"Invalid or missing DRG Code"`, disallow all services with adjustment code `GS` (`DisallowAllServices`), and return `False` for this rule ([BR-005](../business-rules.md#br-005-drg-code-required-for-most-inpatient-hospital-bills)).
3. **`ValidateDiagnosisandProcedureCode`.** If the billing provider type requires a diagnosis and none exists: disallow all services with `GW` and stop. Otherwise, validate each diagnosis (must resolve and be effective on the statement-thru date; outpatient hospital bills additionally need at least one diagnosis of type `R`) and each procedure (must resolve and be effective on the statement-thru date). Any invalid diagnosis produces warning `"One or more diagnosis code is not valid."`; any invalid procedure produces warning `"One or more procedure code is not valid."` Either failure disallows all services with `GW` ([BR-006](../business-rules.md#br-006-diagnosis-and-procedure-codes-must-be-valid-and-effective)).
4. **`ComputeBasicAllowance`.** For each auditable service (with a compound-drug dispensing-fee override applied on/after 4/1/2016), dispatch by service type:
   - Revenue → no basic allowance is computed here.
   - Equipment → `ComputeFeeScheduleAllowance` (pre-/post-1/1/2012 logic, see step 5).
   - Pharmacy (not Worker Reimbursement) → `ComputeServiceLinePharmacyAllowance`, which resolves the effective pharmacy allowance record and NDC price and computes the fee schedule via `clsAuditCalculator.CalcPharmacyAllowance`; if the charge exceeds the computed fee schedule, a full-charge `FT` adjustment is created.
   - Worker Reimbursement `WMILE`/`FMILE` → `ComputeMileageAllowance` (fee-maximum-times-quantity; overwrites billed/audited amounts to the regulated amount if the charge is not larger, else creates `FT`).
   - All other types → `ComputeFeeScheduleAllowance`.
   - For inpatient/outpatient bills where the fee schedule amount remains `0`, additionally compute a cost-charge allowance (`ComputeCostChargeAllowance`) using the effective `clsDCBSCostCharge` factor on the billing provider (default factor `1` if none is found).

     > **Origin**: The DCBS cost/charge factor is implemented by [Retrieve DCBS cost charges](../../saif-business-view-provider/operations/provider-location-ancillary-data.md) in `SAIF.BOF.Business.View.Provider`.
   - `ComputeFeeScheduleAllowance` itself applies percent-off eligibility (80%, or 90% for dental on/after 4/1/2012), max-amount eligibility, facility/non-facility quantity rules, post-2012 equipment-modifier formulas (`UE` 75%, `RR` 10%, else full), and the DCBS conversion factor (defaulting to `1` if missing); it forces adjustment code `FT` for `SG`/`WMEAL`/`WDINR`/`WLODG` services and for `R0001` (which also adds a `9.5` base rate); if the charge exceeds the fee schedule, it creates the adjustment and marks `FeeScheduleCode = "F"`; for non-physician-assistant (NP/PA) CPT services it applies a further percentage reduction (`FC`, 80% before 4/1/2005 else 85%); and for modifiers `80`/`81`/`82`/`50`/`51` it calls `AlterFeeSchedule` to compute surgical-assistant (`FP`/`FQ`/`FO`/`SI`), multiple-surgery (`FL`, 50%), or bilateral-surgery (`SF`, 50%) adjustments.
5. **`MultipleRadiography`.** For each auditable service with a positive allowed amount whose CPT record (resolved via cached service reference data) flags multiple-radiography disallow codes (`MULCT`/`MULMR` pre-7/1/2007; `MULCT`/`MULCA`/`MULMA`/`MULMR` post-6/30/2007 without modifier `26`), find matching historical (via [SQL-002](../sql/SQL-002-saif-business-claim-bill-automatedaudit.md) history data, [CBP_BILL](../database-tables.md#cbp_bill)) and current same-provider, same-day services and apply a percentage-based `FH` adjustment (`AllowedAmount - FeeScheduleAmount * percent`, using the era-specific percentage table).

   > **Origin**: CPT/fee-schedule reference data and bundling flags used throughout this rule set (steps 4, 5, and 8) are resolved by [Service reference lookups](../../saif-business-claim-bill/operations/service-reference-lookups.md) in `SAIF.Business.Claim.Bill`.
6. **`ProviderContracts`.** If the billing provider has service contracts, first checks outpatient-hospital package pricing (`CheckForProviderContractPackagePrice` — a single-procedure MCO bill matched against package-priced contracts for the claim's MCO plan; spreads a computed `MA` adjustment across services when the package price is below the eligible amount), then for each auditable service finds a matching contract (`FindProviderServiceContract`/`ContractQualifies`, checked by service type/CBP code, purchase-vs-rental modifiers, ASC status, and MCO-plan match) and applies a discount-rate, additional-fee-discount-rate, or max-charge adjustment coded `MC` (MCO-plan contract) or `NA` (non-plan contract).

   > **Origin**: Provider service contracts are implemented by [Retrieve provider service contracts](../../saif-business-view-provider/operations/provider-location-ancillary-data.md) in `SAIF.BOF.Business.View.Provider`.
7. **`EquipmentAllowance`.** For DME equipment services before 1/1/2012 that are auditable, not rentals (`RR`), and have no provider contract already applied: if the charge is under `50`, no action; otherwise dispatch by `MsrpInvoiceCode` — `"M"` → `FG` at 85%, `"I"` → `SB` at 125% before 4/1/2006 else `FG` at 140%, anything else → error `"<ServiceCode> Invalid MSRP/Invoice Flag"`. If no MSRP/invoice amount exists, compute the standard fee schedule and disallow with `FZ` if still unreduced.
8. **`CrossServiceAudit2`.** For each auditable service with a positive allowed amount and a resolved CPT record: `CheckGlobal` (global-surgery-period checks against history and same-bill services, applying `CD`/`CC`/`CA` adjustments, unless modifiers `80`/`82` are present) and `CheckThreePTRule` (for CPT disallow code `3PT`, allows the first three already-paid-or-highest-amount services and fully disallows the rest with `FJ`). For Standard/OutpatientHospital bills, `CheckBundling` additionally runs on remaining positive-allowed services (excluding physical-medicine codes `97001`–`97799` and ASC `SG` services), applying `CB` bundling adjustments unless override modifiers `59`/`XE`/`XP`/`XS`/`XU` are present (which instead generate a bundle-override warning).
9. **`FinalAuditChecks`.** Runs, in order:
   - `CheckDeniedClaim` — for a denied claim (excluding `R0001`/`N0001`/`N0002` and IME services), disallows remaining auditable services fully with `DF`, or `DB` if there are no medical conditions or any decision is missing a final denial reason.
   - `CheckForInelligbleProviders` — for each positive-allowed auditable service, checks servicing-provider ineligibility periods covering the service date; disallows fully with `TD` by default, `TY` for reason `NPN`, or `TS` (also forcing `ReauditCode = "X"`) for reason `COL`.
   - `CheckForInelligbleServices` — looks up a disallow code from the national drug record (pharmacy) or the resolved service (non-pharmacy); if present, creates a full adjustment and sets `ReauditCode = "X"`.
   - `CheckForDuplicates` — compares each service against historical ([SQL-002](../sql/SQL-002-saif-business-claim-bill-automatedaudit.md)) and current bill services using type-specific matching rules (inpatient exact/partial match on provider+admission date+service+charge; non-hospital exact/provider/date/service/charge, a `WMILE`-specific audited-charge comparison, pharmacy same-date-NDC match, and same-date service/NDC+charge matches), sets `OriginalBillCode` to `"D"` (definite) or `"U"` (possible) and links `OriginalBillID`/`OriginalServiceID`, and reduces payment by the prior-paid amount using adjustment code `PA` (fully paid previously), `PB` (no prior allowed amount found), or `PC` (prior payment exists but original incomplete) ([BR-021](../business-rules.md#br-021-duplicate-services-are-reduced-to-the-unpaid-remainder-or-flagged)).
   - `CheckForLateFiling` — for original (non-rebill), non-Worker-Reimbursement, positive-allowed services of eligible types (Ambulance/Dental/Equipment/Medical/Pharmacy/Revenue/VocRehab), applies era-based reductions or disallowance using the later of service date/service end date: before 4/1/2006 (or any Vocational Rehabilitation date), 10% reduction per month after 60 days (`FD`), with Vocational Rehabilitation fully disallowed (`SO`) after 180 days; 4/1/2006–6/30/2007, a compounding 10% monthly reduction after 90 days (`FD`); after 6/30/2007, full disallowance (`FD`) after 365 days ([BR-020](../business-rules.md#br-020-late-filed-bills-are-subject-to-time-based-payment-reductions-or-disallowance)).
   - `CheckForNonMCOProvider` — for a claim with mandatory-MCO status `"Y"`, a positive-allowed, mandatory-MCO service with no active withhold, a service date more than 14 days after the MCO effective date, and a non-anesthesiology (`AN`) servicing provider: full-charge `MG` adjustment ([BR-019](../business-rules.md#br-019-non-mco-provider-services-past-the-grace-period-may-be-disallowed)).
10. **`MCOWithhold`.** For services flagged `IsMCOWithhold` by [MCO determination](mco-determination.md): if the provider-admin-fee flag applies and the service is not NDC-only, checks service-level MCO fee exemptions for the plan/date and clears the withhold flag if exempt. If still eligible, determines the withhold rate (service-specific admin-fee rate when under `1`, else the default `clsMCOProviderTypeAdminFee` for the plan/provider-type/date) and sets `McoAdminFeeAmount = Rate * AllowedAmount` and `McoAdminFeeRate = Rate`.
11. **`CheckVoidedClaim`.** If `Bill.Claim.ClaimStatus.IsVoid`: disallow all services fully with `WG`, warn `"Bill belongs to voided claim"`, and return `False` for this rule ([BR-018](../business-rules.md#br-018-bills-for-voided-claims-cannot-be-paid)).
12. **`CompleteAudit`.** For each service, verify `AllowedAmount = ChargeAmount + TotalAdjustmentAmount`; on mismatch, log detail and error `"<serviceCodeOrNDC> Error Computing Allowance - call Help Desk"`. Reset any remaining non-blank `ReauditCode` to a single blank, default null MCO admin-fee amounts to `0`, default blank service type codes to `"U"`, and default null fee schedule amounts to `0`. Recompute the bill's audit totals (charged, allowed, MCO admin fee) and set `Bill.BillTotalAmount` to the total charged amount. Return `False` if any mismatch error was generated.
13. **`ValidateAdmitTypeCode`.** For `InpatientHospital` bills, requires `AdmitTypeCode` in `1`,`2`,`3`,`4`,`5`,`9`; if invalid, message `"Invalid Admit Type Code({0})."` and disallow all services with `GY` ([BR-007](../business-rules.md#br-007-inpatient-hospital-admit-type-code-must-be-valid)).

`AuditBill` stops the `"Audit Bill"` trail group and returns `ErrorCount = 0` — a `False` return from any handler above (steps 2, 3, 11, 12, 13) contributes to that error count and is surfaced to `BillAuditEngine` as `FailAuditCheck`.

## Process flow

```mermaid
flowchart TD
	Start([clsBillAuditor.AuditBill invoked]) --> Merge[UpdateMergeClaimID]
	Merge --> DRG{DRG required<br>and valid?}
	DRG -->|No| DisallowGS([Disallow all: GS]) --> Diag
	DRG -->|Yes| Diag[ValidateDiagnosisandProcedureCode]
	Diag -->|Invalid| DisallowGW([Disallow all: GW]) --> Admit
	Diag -->|Valid| Basic[ComputeBasicAllowance per service]
	Basic --> Radio[MultipleRadiography]
	Radio --> Contracts[ProviderContracts]
	Contracts --> Equip[EquipmentAllowance]
	Equip --> Cross[CrossServiceAudit2:<br>global, 3PT, bundling]
	Cross --> Final[FinalAuditChecks:<br>denied claim, ineligible provider/service,<br>duplicates, late filing, non-MCO provider]
	Final --> Withhold[MCOWithhold]
	Withhold --> Void{Claim voided?}
	Void -->|Yes| DisallowWG([Disallow all: WG]) --> Complete
	Void -->|No| Complete[CompleteAudit:<br>verify totals, recompute bill totals]
	Complete --> Admit[ValidateAdmitTypeCode]
	Admit -->|Invalid| DisallowGY([Disallow all: GY])
	Admit -->|Valid| Done([Return ErrorCount = 0])
	DisallowGY --> Done
```

## Failure and edge-case behavior

- `DisallowAllServices` removes prior adjustments and applies a full-charge disallowance to every service, so an early bill-level failure (DRG, diagnosis/procedure, voided claim, admit type) overwrites any per-service work already done by `ComputeBasicAllowance`, `ProviderContracts`, and later steps for that run.
- `ComputeFeeScheduleAllowance`/`AlterFeeSchedule` layer many date-conditional percentages (NP/PA reduction era, surgical-assistant modifier era, package-price ratio); a service can match more than one adjustment path in sequence, and only the last-applied non-zero adjustment is persisted, since each helper checks for a positive computed amount before generating its own adjustment.*
- `CheckForProviderContractPackagePrice` only applies to outpatient-hospital bills with exactly one procedure and an MCO-enrolled billing provider; all other bill shapes skip package pricing even if the billing provider has service contracts.
- The three-point rule (`CheckThreePTRule`) and bundling (`CheckBundling`) both depend on accurate historical data from [SQL-002](../sql/SQL-002-saif-business-claim-bill-automatedaudit.md); missing or stale historical bill data silently allows services that should have been reduced.*
- `CheckForLateFiling` explicitly exempts Worker Reimbursement bills and rebills (non-`"O"` `OriginalBillCode`), so late-filed rebills are never reduced by this rule.
- A `AllowedAmount <> ChargeAmount + TotalAdjustmentAmount` mismatch in `CompleteAudit` is treated as a hard environment-level data error (`"...call Help Desk"`), not a business-rule warning, and fails the entire rule execution.

## Related documentation
- [Operations and processes](../operations-processes.md)
- [Business rules](../business-rules.md)
- [SQL catalog](../sql/index.md)
- [Database tables](../database-tables.md)

> **Note:** Statements marked with `*` were inferred from code structure, naming conventions, or
> contextual evidence where direct confirmation was not available in source artifacts.

## Sources
- `Business\SAIF.Business.Claim.Bill.AutomatedAudit\AuditUtilities\clsBillAuditor.vb`
- `Business\SAIF.Business.Claim.Bill.AutomatedAudit\AuditUtilities\clsAuditCalculator.vb`
- `Business\SAIF.Business.Claim.Bill.AutomatedAudit\AuditUtilities\clsClaimBillHistory.vb`
- `Business\SAIF.Business.Claim.Bill.AutomatedAudit\AuditUtilities\clsBillAuditUtility.vb`
