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

# AuthorizationService

Manages medical authorization records, their surgery dates, and CPT code assignments for a claim, coordinating persistence through `IUnitOfWork`, current-user attribution through `IUserProfileService`, and business-rule enforcement through `IValidationService`. It applies optimistic-concurrency checks via an `UpdateNumber` comparison before overwriting an existing `CbpAuthorization`, and reconciles the CPT code set on update by diffing the incoming comma-separated code list against the authorization's current codes, removing stale codes and validating/adding new ones.

## Purpose
- Creates, updates, and deletes claim authorizations and their associated CPT codes and surgery dates.
- Validates candidate CPT codes against the `CbpServiceCode` reference table before allowing them onto an authorization.
- Detects concurrent-edit conflicts on authorization updates by comparing `UpdateNumber`.
- Supplies reference/code-table lookups (authorization type codes, service type codes, and a static "timely" yes/no list) for authorization entry forms.

## Context
- Namespace: `SAIF.Services.Claims.Bills`
- Assembly/package: `SAIF.Services` (packaged inside the `SAIF.SAIFCode.Core` NuGet package)

## Public members
| Member | Signature | Purpose |
| --- | --- | --- |
| AuthorizationService (constructor) | `public AuthorizationService(IUnitOfWork uow, IUserProfileService uprof, IValidationService val)` | Wires the repository unit of work, current-user resolver, and validation service used by all authorization operations; throws if `uow` is null. |
| GetAuthorizations | `public IEnumerable<AuthorizationItem> GetAuthorizations(long claimId)` | Returns every authorization recorded for the given claim, mapped to `AuthorizationItem` contracts. |
| ValidCptCode | `public bool ValidCptCode(string code)` | Returns whether `code` exists in the service-code table as a service type "M" (medical) code; returns false instead of throwing if the lookup fails. |
| GetSurgeryDates | `public IEnumerable<AuthorizationSurgery> GetSurgeryDates(long claimId)` | Returns the surgery dates recorded for the claim's authorizations. |
| AddSurgeryDate | `public bool AddSurgeryDate(long claimId, string surgeryDate)` | Adds a new surgery date to the claim unless a matching date already exists for it; always returns `true`. |
| DeleteSurgeryDate | `public bool DeleteSurgeryDate(long claimId, string surgeryDate)` | Removes the matching surgery date record for the claim if one exists; always returns `true`. |
| GetAuthorizationTypeCodes | `public IEnumerable<AuthorizationTypeCode> GetAuthorizationTypeCodes()` | Returns the full authorization type code reference list. |
| GetServiceTypeCodes | `public IEnumerable<ServiceTypeCode> GetServiceTypeCodes()` | Returns the full service/PM group type code reference list. |
| GetTimelyTypeCodes | `public IEnumerable<TimelyTypeCode> GetTimelyTypeCodes()` | Returns a static two-item Yes/No code list used for the "received timely" flag on authorization forms.* |
| UpdateAuthorization | `public bool UpdateAuthorization(long authorizationId, AuthorizationItemEdit authorization, string cptCodes, IMessageContainer messages)` | Applies edits to an existing authorization (type, service group, dates, visit max, billing provider) and reconciles its CPT codes against the supplied comma-separated `cptCodes` list; rejects the update and returns `false` if the update numbers no longer match or validation fails, otherwise commits and returns `true`. |
| CreateAuthorization | `public AuthorizationItem CreateAuthorization(AuthorizationItemEdit authorization, long claimId, string cptCode, IMessageContainer messages)` | Creates a new authorization for the claim with the supplied CPT codes, commits it if validation passes, and returns the mapped `AuthorizationItem`. |
| DeleteAuthorization | `public bool DeleteAuthorization(long authorizationId, IMessageContainer messages)` | Deletes the authorization with the given ID and commits the change; always returns `true`. |

## Behavioral notes
- A static constructor registers AutoMapper mappings (`CbpAuthorization`→`AuthorizationItem` and related code-table types) once per app domain via `Mapper.CreateMap`, so mapping failures would surface at first type use rather than per-call.
- `UpdateAuthorization` and `CreateAuthorization` both run the authorization through `IValidationService.Validate` before committing, adding any validation errors to the supplied `IMessageContainer` and aborting the commit on failure.
- All mutating operations (`AddSurgeryDate`, `DeleteSurgeryDate`, `UpdateAuthorization`, `CreateAuthorization`, `DeleteAuthorization`) wrap their changes in `unitOfWork.Begin()`/`unitOfWork.Commit()` transaction boundaries.
- `ValidCptCode` deliberately swallows all exceptions from the lookup query and treats any failure as an invalid code.*

## Constraints and usage notes
- `UpdateAuthorization` silently rejects the update (returns `false` with no message) when the caller's `UpdateNumber` does not match the persisted record, so callers must reload and retry on conflict.
- CPT codes passed to `UpdateAuthorization`/`CreateAuthorization` must be a single comma-separated string; codes failing `ValidCptCode` are silently skipped rather than reported as errors.*

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or
> contextual evidence where direct confirmation was not available in source artifacts. Statements
> marked with ** could not be confirmed; treat as unknown until verified.

## Sources
- `Services/SAIF.Services/Claims/Bills/AuthorizationService.cs`
