Calculation type

MedicareASC

Computes a per-unit Medicare Ambulatory Surgical Center price via SQL (wage-adjusting 50% of the national ASC payment using a CBSA wage index resolved through a fallback chain, with special handling for non-wage-adjusted or non-covered payment indicators), then the same shared ChargeLevelSqlCalculator multiplies by the charge's Units and applies Percentage/RuleMultipliers before storing it as the base allowed amount.

152
uses
13
customers
Base
category
Charge
applies at

What it computes

Per row (SQL, MedicareASCSqlGenerator.GetQuery): PerUnitAmount = 0 if PaymentIndicator = 'N1'; Payment (unadjusted, no wage index) if PaymentIndicator in ('F4','K2','H2','L6'); otherwise 0.5*Payment + 0.5*Payment*WageIndex -- each branch cast to MONEY. WageIndex = FixedWageIndex ?? (WageIndex looked up for FixedCBSA if set, else tried in order: facility CBSA-Metropolitan-Division -> facility CBSA -> facility state-level CBSA, each step attempted only if the previous step's lookup returned no wage-index row for @BaseDate). Rows require Payment IS NOT NULL OR PaymentIndicator='N1' (a non-N1 row with NULL Payment matches nothing and the charge gets no Details set at all, not zero). In C# (ChargeLevelSqlCalculator.SetDetails, same shared code path as MedicareRVU): decimalAmount = PerUnitAmount * charge.Units; round to 2dp AwayFromZero; multiplied by matched RuleMultipliers rule or Percentage/100 DefaultMultiplier; round to 2dp AwayFromZero again; detail.SetBase(decimalAmount, calc).

Parameters

KeyMeaning
FixedCBSAOptional integer override of the CBSA code used to look up the wage index directly, bypassing all facility-location fallback resolution.
FixedWageIndexOptional decimal override of the wage index itself; if set, the entire CBSA lookup (including FixedCBSA) is skipped for wage-index purposes, though @CBSA is still reported as FixedCBSA in the result row if present.
BaseDateInherited; effective date for the MedicareDataASC payment row and the MedicareWageIndexASC row; defaults to context.ServiceDate if null.
PercentageInherited; percent multiplier applied by the shared ChargeLevelSqlCalculator when no RuleMultipliers rule matches (default 100).
RuleMultipliersInherited IHasRuleMultipliers list; matching rule's Multiplier replaces the Percentage-derived DefaultMultiplier.

Gotchas

(1) Same core miss as MedicareRVU: the SQL query's Amount column is a PER-UNIT dollar figure; ChargeLevelSqlCalculator multiplies it by charge.Units before it becomes the charge's priced amount -- a formula that stops at the wage-index math (as the draft's did) is wrong by a factor of Units. (2) No modifier logic exists anywhere in this type -- unlike MedicareRVU, the ASC price is keyed purely on ProcedureCode + BaseDate; TC/26/50/etc modifiers on the charge are ignored entirely. (3) CMS's specified CBSA fallback order (Metropolitan Division -> CBSA -> state) is deliberately checked step-by-step for a non-null wage index rather than resolving 'the' CBSA first and then looking up its wage index -- per the code's own comment, CMS does not publish wage-index data for every CBSA, so a facility's Metro-Division CBSA could resolve to a real CBSA code with no wage-index row, in which case the next fallback step runs even though a CBSA was technically found. (4) Same double decimal-AwayFromZero rounding and Percentage/RuleMultipliers mutual-exclusivity as MedicareRVU, applied by the identical shared ChargeLevelSqlCalculator.ApplyMultipliers path. (5) A charge whose code has a non-N1 PaymentIndicator but a NULL Payment value is filtered out of the result set entirely (WHERE Payment IS NOT NULL OR PaymentIndicator='N1'), so that charge's Details are left unset/uncalculated rather than priced at 0 -- different downstream behavior than an explicit zero.

In the source

class · /home/cary/src/mdc/MdClarity/MDClarity/MDClarityCore/Backend/PricingEngine/Calculations/Medicare/MedicareASCCalculation.cs:6
calculator · /home/cary/src/mdc/MdClarity/MDClarity/MDClarityCore/Backend/PricingEngine/Calculations/Medicare/MedicareASCSqlGenerator.cs
dispatch · /home/cary/src/mdc/MdClarity/MDClarity/MDClarityCore/Backend/CalculationEngine.cs:703 (ApplyBaseCalculation switch: `case ChargeLevelSqlCalculation chargeLevelSqlCalc:`) -- same single shared case arm as MedicareRVU/MedicareAnesthesia/MedicareDME/MedicareDrug/MedicareLab. Factory (SqlCalculationSqlGeneratorFactory.cs:13-14) picks MedicareASCSqlGenerator; execution runs through the generic ChargeLevelSqlCalculator.

CORRECTED: same class of omission as MedicareRVU -- the draft's formula stopped at the wage-index arithmetic and never mentioned the shared ChargeLevelSqlCalculator's post-multiplication by charge.Units, Percentage/RuleMultipliers scaling, or double AwayFromZero rounding, and gave no dispatch_site. The wage-index fallback chain, PaymentIndicator branches, and CBSA resolution order in the draft were confirmed correct against MedicareASCSqlGenerator.cs and MedicareASCCalculation.cs.