Add Contact Center module#501
Open
MikeAlhayek wants to merge 50 commits into
Open
Conversation
MikeAlhayek
commented
Jun 29, 2026
MikeAlhayek
commented
Jun 29, 2026
MikeAlhayek
commented
Jun 29, 2026
MikeAlhayek
commented
Jun 29, 2026
…er-agnostic dialing (#502)
…modal Telephony: - Add incoming-call extensibility contracts (IncomingCallCard, IncomingCallContext, IIncomingCallContextProvider, IIncomingCallDispatcher) and DefaultIncomingCallDispatcher, which pushes a ringing call to a user via IHubContext.Clients.User after running the registered context providers. - Add a capability-gated voicemail operation (ITelephonyProvider.SendToVoicemailAsync and TelephonyCapabilities.Voicemail), a Voicemail hub method, and a DialPad implementation. - Add the soft-phone incoming-call modal (Answer/Voicemail/Ignore) with contributed contact cards, an Answer-and-open shortcut, and accept/decline offer-lifecycle posts. Contact Center (Voice feature): - Add InboundVoiceEvent/IInboundVoiceService/InboundVoiceService, which route an inbound call into an OmnichannelActivity (Kind=Call, Source=Inbound) with its Subject and a voice Interaction, enqueue it, reserve the longest-idle available agent signed in to the inbound queue, and offer the call through the dispatcher; re-offer on decline. - Add ContactCenterIncomingCallContextProvider (matched customers + offer lifecycle), IInboundContactLookup, a provider-agnostic ingress endpoint, an offer-lifecycle VoiceController, and an optional ActivityQueue.InboundChannelEndpointId mapping. Disposition unification: - Implement DefaultActivityDispositionService (previously a contract only) and route ActivitiesController.Complete through it so inbound and outbound activities are dispositioned through the same subject workflow. Add 5 unit tests (25 Contact Center tests pass); update the Telephony and Contact Center docs and the v2.0.0 changelog; update the Contact Center plan progress. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> AI-Model: gpt-5.5
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> AI-Model: gpt-5.5
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> AI-Model: gpt-5.5
…outbox foundations Routing depth (G7 / Phase 3): - Per-queue routing policy on ActivityQueue: RoutingStrategy (LongestIdle/RoundRobin/LeastBusy), PreferStickyAgent, EnableSlaAging, BusinessHoursCalendarId + AfterHoursAction, OverflowQueueId + OverflowAfterSeconds. - StickyAgent/RoundRobin/LeastBusy routing strategies; primary scorers gated by queue policy. QueueItem.StickyAgentUserId captured at enqueue; AgentProfile.LastAssignedUtc stamped on reserve. - QueueItemPrioritizer SLA aging; business-hours hold in assignment; IActivityQueueService.OverflowDueAsync + QueueItemOverflowed event. - Reusable BusinessHoursCalendar catalog + IBusinessHoursService (time-zone weekly schedule + holidays); Interaction Center -> Business hours admin CRUD; extended queue editor. - +21 unit tests (106 ContactCenter tests pass); clean full-solution -warnaserror build; docs + changelog + PLAN updated. Also lands accumulated real-time (G5) and outbox (G6) foundations that were pending in the working tree. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…enforcement (G6/P1 #18) - IProviderVoiceWebhookAdapter (Abstractions): provider signature validation + normalization to ProviderVoiceEvent from an HTTP-agnostic ProviderVoiceWebhookRequest. - HmacProviderVoiceWebhookAdapterBase: constant-time HMAC-SHA256 signature verification. - IProviderVoiceWebhookProcessor: resolves adapter by technical name, verifies signature, requires an idempotency key on every parsed event, forwards accepted events to IProviderVoiceEventService. - Anonymous ProviderVoiceWebhookController POST /api/contact-center/voice/webhook/{provider}, authenticated by provider signature; maps outcomes to 200/401/404/400. - +6 unit tests (112 ContactCenter tests pass); clean -warnaserror build; changelog + PLAN updated. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ActivityReservationService.ReserveAsync re-reads the queue item and aborts unless it is still Waiting, preventing double-reservation across nodes. +1 test; updated existing reserve tests to mock the re-fetch. 113 ContactCenter tests pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…pletes Phase 4) - InteractionTransferType/TargetType enums; TransferRequest/TransferResult; IContactCenterTransferService records transfer history, sets Transferring, publishes InteractionTransferred, and re-enqueues the activity for queue transfers. - ContactCenterVoiceProviderCapabilities gains CallTransfer + Conference flags. - +3 tests (116 ContactCenter tests pass); clean -warnaserror build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- ContactCenterEntryPoint catalog: DID->queue mapping, priority, business-hours gating, closed action (hold/voicemail/overflow/reject), welcome/closed messages. - IEntryPointResolver + EntryPointRoutingPlanner build an EntryPointRoutingPlan from the matched DID and business-hours state. - VoiceContactCenterCallRouter consults the resolver first: open -> entry point queue at its priority; closed -> hold/overflow or voicemail/reject; falls back to endpoint->queue mapping. - Interaction Center -> Entry points admin CRUD (Voice feature, ManageQueues). - +6 tests (122 ContactCenter tests pass); clean -warnaserror build; changelog + PLAN updated. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- CallbackRequest catalog + CallbackRequestStatus; ICallbackService schedules pending callbacks and promotes due ones into outbound Callback-source activities (enqueued when a queue is set). - Per-minute CallbackDispatchBackgroundTask; registered in the Dialer feature. - +3 tests (125 ContactCenter tests pass); clean full-solution -warnaserror build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- ContactCenterEventMetric projection + IContactCenterMetricsService (record + range summary) + ContactCenterMetricsProjectionHandler projecting every domain event into rebuildable per-day, per-event-type counts. - Registered in the always-on base feature. - +4 tests (129 ContactCenter tests pass); clean -warnaserror build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- RecordingState/MonitorMode enums + Interaction.RecordingState; provider capability flags Recording/Monitor/Whisper/Barge/TakeOver. - IContactCenterRecordingService recording state machine with Recording* events. - IContactCenterMonitoringService capability-gated, audited supervisor monitor/whisper/barge/take-over (SupervisorMonitorStarted). - +4 tests (133 ContactCenter tests pass); clean full-solution -warnaserror build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- ContactCenterEvent workflow event activity (optional EventType filter, Matched/Ignored outcomes) + display driver + views. - ContactCenterWorkflowEventHandler triggers the activity for every published domain event via IWorkflowManager. - Feature-gated on OrchardCore.Workflows; module builds clean; 133 ContactCenter tests pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- ContactCenterRetentionOptions (config-bound) + IContactCenterRetentionService batch-purge of interaction events older than a cutoff + daily ContactCenterRetentionBackgroundTask. - IInteractionEventStore.ListOlderThanAsync added (indexed OccurredUtc); base Startup binds options from IShellConfiguration. - +2 tests (135 ContactCenter tests pass); clean full-solution -warnaserror build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
This pull request has merge conflicts. Please resolve those before requesting a review. |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> AI-Model: gpt-5.5
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> AI-Model: gpt-5.5
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> AI-Model: gpt-5.5
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
This pull request has merge conflicts. Please resolve those before requesting a review. |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…conference state - TelephonyHub: guard completion-log LogInformation calls with IsEnabled to resolve 5 CA1873 warnings (clean -warnaserror build) - ActivityReservationService.ReserveAsync: re-read and re-validate the agent (compare-and-set on ActiveReservationId) before booking so a concurrent assignment on another shared queue cannot double-book the agent - Asterisk dashboard: report 'In conference' for bridged 3+ party calls instead of collapsing to 'Connected' - Add self-healing test (stale Ringing interaction requeued) and reserve double-book guard test - Update contact-center PLAN.md change log with review findings Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: a71f4e1c-3ca9-4e08-8d68-81a75d79e03d
Make provider events durable and terminal-safe, serialize assignment and reconciliation races, and improve Asterisk and DialPad recovery behavior. Add regression coverage and update Contact Center documentation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e704d92f-38e9-4d41-9a89-17dfd6e6fc95
|
This pull request has merge conflicts. Please resolve those before requesting a review. |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e704d92f-38e9-4d41-9a89-17dfd6e6fc95
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e704d92f-38e9-4d41-9a89-17dfd6e6fc95
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.