BillPaymentService¶
Generates payments for approved legal bills — zero-payment print letters via IDocumentService/PrintData.XPrintControl, financial check transactions via IFinancialTransactionService.CreateLegalCheckTransaction, and partial-refund recovery transactions via IFinancialDataApiClient.CreateRecoveryAsync — and reverses (ReturnBillPayment) previously paid, non-amended bills by creating a recovery transaction through Guidewire's claim-financial data. It also compiles per-attorney pending-bill notification counts and moves bills between status codes, wrapping each mutating operation in IUnitOfWork.Begin()/Commit() transactions.
Purpose¶
- Produces zero-payment letters (print batch + XML) for approved bills whose services net to a zero paid amount, then advances those bills to
Paidstatus. - Compiles the list of attorneys with pending-approval legal bills, for notification purposes.
- Generates financial check transactions for approved-and-ready-to-pay bills (
GenerateCheckTransactionsAsync), handling top-level and adjusted/child bills differently, including invalid-payment-address rejection and partial-refund recovery for reduced adjusted payments. - Bulk-transitions bill status codes (
UpdateBillStatus) and creates the corresponding status-history entries. - Reverses a paid bill's payment (
ReturnBillPayment) by creating a recovery financial transaction and resetting paid amounts to zero, refusing to do so for amended bills.
Context¶
- Namespace:
SAIF.Services.Legal.Bills - Assembly/package:
SAIF.Services(packaged inside theSAIF.SAIFCode.CoreNuGet package).
Public members¶
| Member | Signature | Purpose |
|---|---|---|
| BillPaymentService (constructor) | public BillPaymentService(IUnitOfWork unitOfWork, IUserProfileService userProfileService, ProviderContract.IProviderInformationService providerInformationService, ILegalQueryProvider legalQueryProvider, UtilDocument.IDocumentService documentService, IEnvironmentService environmentService, ILogService logService, IFinancialTransactionService financialTransactionService, IClaimDataApiClient gwclaimDataApiClient, IActivityDataApiClient activityDataApiClient, IFinancialDataApiClient financialDataApiClient, string developerEmails) |
Wires the unit of work, user-profile, provider-information, legal-query, document, environment, log, financial-transaction, claim-data/activity-data/financial-data API clients, and a development-team email address used for address-correction alerts. |
| GenerateZeroPaymentLetters | public long GenerateZeroPaymentLetters(ZeroPaymentBatchArguments batchArguments) |
Within a transaction, creates an XPrintControl/XDocument print batch, generates a ZeroPayment record for each zero-paid service on ready-to-pay bills with an adjustment reason, advances those bills to Paid, writes the resulting XML to disk (with document-element renaming), and returns the count of zero-payment records produced. |
| GetAttorneysWithPendingLegalBills | public IList<AttorneyNotificationRequest> GetAttorneysWithPendingLegalBills() |
Returns one AttorneyNotificationRequest per attorney who has pending-approval bills assigned, including their pending-bill count, for use in notification batch jobs. |
| GenerateCheckTransactionsAsync | public async Task<FinancialTransactionControlStats> GenerateCheckTransactionsAsync(DateTime issueDate, ILogWriter controlReport) |
Moves Approved bills to ReadyToPay, then for each ready-to-pay bill either counts it as a zero-pay letter (already handled elsewhere), generates a check transaction (top-level bills), or generates an adjusted-bill transaction (child bills), accumulating counts/failures into the returned FinancialTransactionControlStats. |
| UpdateBillStatus | public long UpdateBillStatus(string fromCode, string toCode) |
Transactionally transitions every bill with the given fromCode status to toCode, recording a status-history entry for each, and returns the number of bills updated. |
| ReturnBillPayment | public async Task<long> ReturnBillPayment(long billId, IMessageContainer messageContainer) |
Reverses a paid, non-amended bill's payment by creating a recovery financial transaction against Guidewire claim financials, zeroing the bill's service paid amounts and setting status to PaymentReturned; adds an error and rolls back (returning 0) if the bill is not found, is amended, or the recovery call fails. |
Behavioral notes¶
- A static constructor calls
BillMappingHelper.MapBillService(), registering the AutoMapper mappings this service relies on once per process. GenerateCheckTransactionAsync/GenerateTransactionsForAdjustedBillAsyncopen the unit of work before re-querying the bill by ID specifically to initialize the NHibernate lazy-load proxy and avoidLazyInitializationException, per an inline code comment.- On
InvalidPaymentAddressException, the bill is rejected for address correction (RejectBillForAddressCorrection) — its status is set toApprovedWithChange, a comment is appended, and an email is sent to either the bill creator or the configured development team depending on environment — rather than aborting the whole batch. - On any other exception during check-transaction generation,
ReportProgressOnAbortwrites progress statistics to the control report before the exception is rethrown, aborting the run. GenerateTransactionsForAdjustedBillAsyncrequires an adjusted/child bill to have exactly one service line and a resolvable parent bill/original service; missing any of these records a failure message and commits without generating a transaction.- A negative change in the adjusted service's paid amount triggers a partial-refund recovery transaction (
CreatePartialRefundAsync) instead of a check transaction. ReturnBillPaymentlooks up the existing Guidewire payment transaction for the bill viaIClaimDataApiClient.GetGWClaimFinancialsbefore creating aRecoveryFinancialDatarecovery request throughIFinancialDataApiClient.CreateRecoveryAsync.
Constraints and usage notes¶
- Only
unitOfWork,userProfileService,providerInformationService,legalQueryProvider,documentService,environmentService,logService,financialTransactionService, anddeveloperEmailsare null-checked in the constructor viaEnforce.ArgumentNotNull;gwclaimDataApiClient,activityDataApiClient, andfinancialDataApiClientare not validated for null.* GenerateZeroPaymentLetterswrites directly to the file system (batchArguments.FullXmlFileName) as part of its side effects, outside the database transaction.*- The class carries a
CA1506:AvoidExcessiveClassCouplingsuppression, reflecting its dependency on a large number of API clients and services.*
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/Legal/Bills/BillPaymentService.cs