BillService¶
Orchestrates bill-level lifecycle operations — approval, disallowance, pending, sending to audit, regeneration, and payment-option updates — by loading a domain Bill (via the internal domainBill/Domain.Model.Claims.Bills.Bill type built from IBillQueryProvider, IClaimQueryProvider, IAuditNoteQueryProvider, IWorkerQueryProvider, ICCClaimApiService, and IClaimDataApiClient) and invoking its state-changing behavior inside IUnitOfWork transactions. It also determines whether a bill can be treated as non-chargeable based on claim denial/WCD-closure history obtained through IWorkCalendarService-independent domain claim data, and assembles the composite BillHeader view by merging bill, claim, and MCO detail data.
Purpose¶
- Determines whether an IME-provider bill can be marked non-chargeable, based on the claim's denial decisions or WCD closure date relative to the bill's statement date.
- Computes the reviewed/allowed bill amount total for a claim, payment category, and set of bill types.
- Approves a bill, disallows or allows all its services, sends bills to pend, sends bills to audit, and regenerates duplicate/erroneous bills — all as validated, transactional request operations.
- Updates a bill's payment options.
- Supplies read views used by the bill UI: status history, status codes, bill type codes, a composite bill header (with claim, MCO, and adjuster details), disallow reason codes, diagnoses, procedures, medical conditions, claim request decisions, WCD status history, audited services, and other (non-audited) services.
Context¶
- Namespace:
SAIF.Services.Claims.Bills - Assembly/package:
SAIF.Services(packaged inside theSAIF.SAIFCode.CoreNuGet package).
Public members¶
| Member | Signature | Purpose |
|---|---|---|
| BillService (constructor) | public BillService(IUnitOfWork uow, IUserProfileService uprof, IValidationService val, IWorkCalendarService workCalendarService, IBillQueryProvider billQueryProvider, IServiceCodeQueryProvider serviceCodeQueryProvider, IProviderQueryProvider providerQueryProvider, IAuditNoteQueryProvider auditNoteQueryProvider, IClaimQueryProvider claimQueryProvider, IAuditQueryProvider auditQueryProvider, IWorkerQueryProvider workerQueryProvider, ICCClaimApiService claimApiService, IClaimDataApiClient gwClaimDataApiClient) |
Wires the unit of work, user-profile, validation, work-calendar, and the full set of query-provider/API-client collaborators used to build the domain bill and claim objects underlying every operation. |
| CanBillBeNonChargeable | public bool CanBillBeNonChargeable(long billId) |
Returns true only for a reviewed IME-provider bill with chargeable audit cost whose claim was closed (WCD status) on or before the bill's statement-from date, or whose claim has a "Denied" decision dated on or before that date. |
| GetBillAmounts | public decimal GetBillAmounts(long claimId, string paymentCategory, IList<string> billTypes) |
Sums the allowed amount of audited services for the claim, restricted to the given bill statuses and payment category, returning 0 when there are no matching services. |
| ApproveBill | public IValidationResult ApproveBill(ApproveBillRequest request) |
Validates the request, then approves the bill and sets its payment issue date, committing the change transactionally; returns the validation result either way. |
| DisallowAllServices | public bool DisallowAllServices(long billId, string reasonId) |
Marks every service on the bill's audit as disallowed for the given reason, attributed to the current user, and commits the change; always returns true. |
| AllowAllServices | public bool AllowAllServices(long billId) |
Marks every service on the bill's audit as allowed, attributed to the current user, and commits the change; always returns true. |
| SendPendBill | public IValidationResult SendPendBill(SendPendRequest request) |
Validates the request, then sends each listed bill to pend status with the given pend date and mail ID, committing the change; returns the validation result either way. |
| SendToAudit | public IValidationResult SendToAudit(SendToAuditRequest request) |
Validates the request, then sends each listed bill to audit with the supplied note text, committing the change; returns the validation result either way. |
| RegenerateBill | public IValidationResult RegenerateBill(RegenerateRequest request) |
Validates the request, then regenerates each listed bill via BillRegenerator.Regenerate unless it is a full duplicate (in which case a message identifying the original bill is added instead), committing the change and appending a success or partial-exception summary message. |
| UpdatePaymentOptions | public IValidationResult UpdatePaymentOptions(PaymentOptionsRequest request) |
Validates the request, then applies the requested payment-option changes to the bill and commits them; returns the validation result either way. |
| GetBillStatusHistory | public IEnumerable<BillStatusItem> GetBillStatusHistory(long billId) |
Returns the bill's status-change history, most recent first, retrieved through a locally constructed BillQueryProvider. |
| GetBillStatusCodes | public IEnumerable<BillStatusCode> GetBillStatusCodes() |
Returns the selectable bill status codes, excluding the internal "PEN" and "DIS" codes. |
| GetBillTypes | public IEnumerable<BillTypeCode> GetBillTypes() |
Returns all configured bill type codes. |
| GetBillHeader | public BillHeader GetBillHeader(long billId) |
Assembles the composite header view for a bill: base bill data plus attending physician, claim status/type, injury date, adjuster display/navigation info, MCO plan/enrollment status, and physical-medicine service count; throws if the bill has no associated claim in Claim Center. |
| GetDisallowReasonCodes | public IEnumerable<DisallowReasonCode> GetDisallowReasonCodes() |
Returns the fixed, alphabetically ordered list of reasons a service can be disallowed (e.g. claim denied, condition not related, no pre-certification). |
| GetBillDiagnosis | public IEnumerable<BillDiagnosis> GetBillDiagnosis(long billId) |
Returns the bill's diagnoses, each enriched with its description looked up from the CBP diagnosis reference table. |
| GetBillProcedure | public IEnumerable<BillProcedure> GetBillProcedure(long billId) |
Returns the bill's procedure line items. |
| GetConditions | public IEnumerable<Condition> GetConditions(long claimId) |
Returns the claim's medical conditions, sourced from a locally constructed domain Claim. |
| GetClaimRequestDecisions | public IEnumerable<ClaimRequestDecision> GetClaimRequestDecisions(long claimId) |
Returns the claim's request decisions, sourced from a locally constructed domain Claim. |
| GetClaimWcdStatusHistory | public IEnumerable<ClaimStatusDetail> GetClaimWcdStatusHistory(long claimId) |
Returns the claim's WCD (workers' comp division) status history via IClaimQueryProvider. |
| GetAuditedService | public IEnumerable<AuditedService> GetAuditedService(long billId) |
Returns the bill audit's reviewed/audited service lines. |
| GetOtherServices | public IEnumerable<AuditedService> GetOtherServices(long billId, DateTime fromDate, DateTime thruDate) |
Returns the bill's services outside the audit within the given date range (i.e., services not part of the formal audit set). |
Behavioral notes¶
- Wraps every state-changing operation (
ApproveBill,DisallowAllServices,AllowAllServices,SendPendBill,SendToAudit,RegenerateBill,UpdatePaymentOptions) inunitOfWork.Begin()/unitOfWork.Commit(), only entering the transaction afterIValidationService.Validatereports the request valid. - Validates all mutation request DTOs (
ApproveBillRequest,SendPendRequest,SendToAuditRequest,RegenerateRequest,PaymentOptionsRequest) viaIValidationServicebefore performing any work, returning theIValidationResultunchanged when invalid. RegenerateBillskips regeneration for bills flagged as full duplicates and instead records a message referencing the original bill ID(s); it aggregates success/exception messages after the transaction commits.GetBillHeaderthrows a plainExceptionwhen the bill has no associated Claim Center claim, rather than returning a partial/null result.- A static constructor calls
BillMappingHelper.MapBillService()andBillMappingHelper.MapForBillHeader(), registering AutoMapper mappings once per process. GetBillStatusHistoryconstructs its own localBillQueryProviderinstance rather than using an injected query-provider abstraction, coupling this method directly to that concrete type.*GetConditionsandGetClaimRequestDecisionsconstruct aDomain.Model.Claims.Claimobject directly per call rather than retrieving it through a cached or injected service.*- The class carries a
CA1506:AvoidExcessiveClassCouplingsuppression, reflecting its dependency on a large number of query providers and API clients.*
Constraints and usage notes¶
- Only
uowis null-checked in the constructor viaEnforce.ArgumentNotNull; the remaining collaborator parameters are not validated for null.* - Multi-bill operations (
SendPendBill,SendToAudit,RegenerateBill) process each listed bill within a single shared transaction; a failure partway through affects the whole batch's commit.*
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/BillService.cs