---
title: ProviderIndexer
summary: API reference for ProviderIndexer.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-09-24
library: SAIF.Domain
reference_type: package
---

# ProviderIndexer

`ProviderIndexer` is the original (v1) implementation of `IProviderIndexer` for operation OP-DOM-03: it looks up the billing provider by tax ID, filters candidate addresses for institutional bills, matches the physical (or facility) address against the provider's known addresses, and then resolves a single payment address — either confirming the matched location has no active PAY address, or intersecting the physical and payment matches by location — before setting the provider's location. `ProviderIndexerV2` supersedes it with a rule-set-based matcher (OP-DOM-04); this class remains the simpler, address-role-specific algorithm.

## Purpose
- Requires the billing provider's tax ID to resolve to a known SAIF provider before matching can proceed, recording "Provider Tax Id not found" otherwise ([DOM-BR-020](../../business-rules.md#dom-br-020-provider-indexing)).
- Filters candidate provider addresses to institutional provider types (`NU`/`HO`/`HH`) when any of the e-bill's bills is institutional (`SetType` `"INST"`) ([DOM-BR-021](../../business-rules.md#dom-br-021-provider-indexing)).
- Matches the biller's physical (falling back to facility) address against candidate provider addresses on Line1/City (trimmed, case-insensitive) and zero-padded zip, failing the bill when no physical match exists ([DOM-BR-022](../../business-rules.md#dom-br-022-address-match), [DOM-BR-023](../../business-rules.md#dom-br-023-address-match)).
- Resolves the payment address: with none supplied, requires the matched physical location to have no active PAY address and to be unique; with one supplied, requires the physical and payment matches to intersect to exactly one location ([DOM-BR-024](../../business-rules.md#dom-br-024-payment-resolution), [DOM-BR-025](../../business-rules.md#dom-br-025-payment-resolution)).

## Context
- Namespace: `SAIF.Domain.Claims.Ebilling.Indexing`
- Assembly/package: `SAIF.Domain` (`Domain/SAIF.Domain/SAIF.Domain.csproj`, .NET Framework 4.6.2 class library)

## Public members
| Member | Signature | Purpose |
| --- | --- | --- |
| IndexProvidersToLocation | `public ResultCount IndexProvidersToLocation(long batchId, IEbillingQueryProvider queryProvider, IErrorConditionHandler errorConditionHandler, string updateUser)` | Indexes every non-indexed e-billing provider in the batch, tallying successes/failures into a `ResultCount` and rethrowing any per-provider exception with the provider id attached. |
| IndexProviderToLocation | `public static bool IndexProviderToLocation(EbillProvider ebillProvider, IEbillingQueryProvider queryProvider, IErrorConditionHandler errorConditionHandler, string updateUser)` | Resolves the provider by tax ID, matches its physical/facility address, and resolves the payment address to determine the final provider location ([DOM-BR-020](../../business-rules.md#dom-br-020-provider-indexing)–[DOM-BR-025](../../business-rules.md#dom-br-025-payment-resolution)). |
| GetMatchingProviderAddresses (institutional-aware) | `public static IEnumerable<ProviderAddress> GetMatchingProviderAddresses(EbillAddress ebillAddress, IEnumerable<ProviderAddress> providerAddresses, bool isInstitutional)` | Filters candidate addresses to institutional provider types when `isInstitutional` is true, then matches on Line1, City, and zero-padded zip ([DOM-BR-021](../../business-rules.md#dom-br-021-provider-indexing)). |
| GetMatchingProviderAddresses (unfiltered) | `public static IEnumerable<ProviderAddress> GetMatchingProviderAddresses(EbillAddress ebillAddress, IEnumerable<ProviderAddress> providerAddresses)` | Matches candidate addresses to the e-bill address on Line1, City, and zero-padded zip without the institutional-type filter. |
| IndexProviderLocationWithNoPaymentAddress | `public static bool IndexProviderLocationWithNoPaymentAddress(EbillProvider ebillProvider, IEnumerable<ProviderAddress> matchedProviderPhysicalAddresses, IErrorConditionHandler errorConditionHandler, string updateUser)` | Requires exactly one matched physical location with no active PAY address and indexes the provider to it, or records "Multiple physical locations found without a payment address"/"Physical location having no payment address not found" ([DOM-BR-024](../../business-rules.md#dom-br-024-payment-resolution)). |
| IndexProviderLocationWithPaymentAddress | `public static bool IndexProviderLocationWithPaymentAddress(EbillProvider ebillProvider, IEnumerable<ProviderAddress> matchedProviderPhysicalAddresses, IEnumerable<ProviderAddress> matchedProviderPaymentAddresses, IErrorConditionHandler errorConditionHandler, string updateUser)` | Intersects the matched physical and payment addresses by provider location and indexes the provider to the single common location, or records "Multiple physical locations found with matching payment address"/"Payment address not found" ([DOM-BR-025](../../business-rules.md#dom-br-025-payment-resolution)). |
| IndexProviderLocation | `public static void IndexProviderLocation(EbillProvider ebillProvider, ProviderLocation providerLocation, string updateUser)` | Sets the provider's resolved location and stamps the update user/date. |

## Behavioral notes
- Institutional detection checks whether any bill under any of the provider's patients has `SetType.Code == "INST"`, so a mixed institutional/non-institutional provider is still filtered as institutional ([DOM-BR-021](../../business-rules.md#dom-br-021-provider-indexing)).
- Unlike `ProviderIndexerV2`, this class does not exclude correspondence or expired addresses before matching, and does not concatenate two-line bill addresses on a retry*.

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

## Sources
- `Domain/SAIF.Domain/Claims/Ebilling/Indexing/ProviderIndexer.cs`
