AgencyService¶
Implements IAgencyService, the facade for agency lookup, paperless-status management, document-notification email lists, and paperless-agreement confirmation emailing/imaging. It depends on IUnitOfWork for repository access and transactions, IUserProfileService to detect demo users (for masking producer/agent names) and resolve the current user's contact email, IDocumentService to send confirmation emails and distribute a generated PDF document, IEnvironmentService to gate active-user checks by production status, and IImagingClient (from the external ImagingAPI.Client/ImagingAPI.Core packages) to upload the signed paperless agreement PDF.
Purpose¶
- Retrieves agency search results and full agency details (masking producer/agent names for demo users), including for a given producer.
- Determines whether an agency currently has any active external users, accounting for production test-user exclusions.
- Builds email address lists for agency- or producer-level document notifications, and reads/creates/deletes individual
DocumentNotificationrecords. - Updates an agency's paperless-request and paperless-enrollment flags, each within its own transaction with rollback on failure.
- Processes a paperless-agreement confirmation: emails the agent the signed PDF, and images both a notification-email record and the signed agreement itself via the imaging API.
- Computes the set of paperless agencies that are "reverting" (no longer have active users) and thus need paperless status reconsidered.
Context¶
- Namespace:
SAIF.Services.Agencies - Assembly/package:
SAIF.Services(packaged inside theSAIF.SAIFCode.CoreNuGet package)
Public members¶
| Member | Signature | Purpose |
|---|---|---|
| AgencyService(...) | public AgencyService(IUnitOfWork unitOfWork, IUserProfileService userProfileService, IDocumentService documentService, IEnvironmentService environmentService, IImagingClient imagingApiClient) |
Validates all five collaborators are non-null and stores them; registers the agency and agency-search-result AutoMapper maps in its static constructor. |
| GetAgencySearchResults() | public IEnumerable<AgencySearchResult> GetAgencySearchResults() |
Returns every agency mapped to lightweight AgencySearchResult contracts. |
| GetAgency | public Agency GetAgency(long agencyId) |
Returns the full Agency (with contracts, producers, agent, underwriter, document notifications) for agencyId, masking producer and agent names to "Producer" when the current user is a demo user; returns null if not found. |
| GetPaperlessAgencyIds | public ReadOnlyCollection<long> GetPaperlessAgencyIds() |
Returns the IDs of all agencies flagged as paperless for agency copies of documents. |
| GetRevertingAgencies | public ReadOnlyCollection<Agency> GetRevertingAgencies() |
Returns the full Agency records for paperless agencies that currently have no active external users. |
| GetAgencyForProducer | public Agency GetAgencyForProducer(long producerId) |
Returns the owning agency's full details for the given producer/agent ID, or null if the producer is not found. |
| GetAgencyActiveUserStatus | public bool GetAgencyActiveUserStatus(long agencyId) |
Returns true for agencyId == 0; otherwise returns whether the agency has any non-deleted external user who (in production) is not a test/production-test user, or (outside production) any non-deleted external user. |
| GetEmailListForAgencyNotification | public ReadOnlyCollection<string> GetEmailListForAgencyNotification(long agencyId) |
Returns the distinct active email addresses of external users registered for document notifications at the agency level. |
| GetEmailListForProducerNotification | public ReadOnlyCollection<string> GetEmailListForProducerNotification(long producerId) |
Returns the distinct active email addresses of external users registered for document notifications at the individual-producer level. |
| GetDocumentNotification | public DocumentNotification GetDocumentNotification(long agencyId, long userSeqNumber) |
Returns the agency's DocumentNotification entry matching userSeqNumber, or null if none exists. |
| UpdateEmailNotification | public bool UpdateEmailNotification(long agencyId, long userSeqNumber, bool isUserNotified) |
Creates a document-notification record when isUserNotified is true (and none exists), or deletes the existing one when false; returns whether the operation succeeded. |
| UpdatePaperlessRequest | public bool UpdatePaperlessRequest(long agencyId, bool requested, string updateUserId) |
Within a transaction, sets IsPaperlessForAgencyRequested, stamps update date/user, and commits; rolls back and rethrows a wrapping Exception on failure. Returns false if the agency is not found. |
| UpdateAgencyPaperless | public bool UpdateAgencyPaperless(long agencyId, bool paperless, string updateUserId) |
Within a transaction, sets IsPaperlessForAgencyCopyOfDocuments, stamps update date/user, and commits; rolls back and rethrows a wrapping Exception on failure. Returns false if the agency is not found. |
| ProcessConfirmationEmail | public bool ProcessConfirmationEmail(long agencyId, string pathToPaperlessAgreementPdf, string emailAttachmentFileName) |
Returns false if no PDF path is supplied; otherwise emails the current user's contact address the signed agreement, images a copy of the notification email, and images the signed agreement itself, returning true. |
| GetAgencySearchResults(searchTerm, maxHits) | public IEnumerable<AgencySearchResult> GetAgencySearchResults(string searchTerm, int maxHits = 0) |
Returns agencies whose ID or name (case-insensitive) matches searchTerm; when maxHits is non-zero, ranks results (active first, then name-starts-with, then name-contains, then alphabetically) and takes the top maxHits. |
Behavioral notes¶
UpdatePaperlessRequestandUpdateAgencyPaperlessare the only members that wrap writes inunitOfWork.Begin()/Commit()/Rollback()with a catch-and-rethrow, giving them transactional safety that other mutating members (UpdateEmailNotification's private helpers) also apply individually.CreateEmailNotification/DeleteEmailNotification(invoked viaUpdateEmailNotification) each independently begin/commit/rollback their own transaction and throw a wrappingExceptionwith a description of the failed operation.ProcessConfirmationEmailperforms external I/O: reading the PDF from disk, sending an email throughIDocumentService.EmailService, callingIDocumentService.DistributeDocumentto generate/route an XML-described email-notification document, and callingIImagingClient.Uploadagainst the external Imaging API.- Demo-user masking in
GetAgencyreplaces producer and agency-agent names with the literal string "Producer" wheneveruserProfileService.GetCurrentUser().IsDemoUser()is true, guarding against null user/profile at each step.
Sources¶
- Services/SAIF.Services/Agencies/AgencyService.cs