Skip to content

Add Contact Center module#501

Open
MikeAlhayek wants to merge 50 commits into
mainfrom
ma/add-contact-center
Open

Add Contact Center module#501
MikeAlhayek wants to merge 50 commits into
mainfrom
ma/add-contact-center

Conversation

@MikeAlhayek

Copy link
Copy Markdown
Member

No description provided.

Comment thread src/Core/CrestApps.OrchardCore.ContactCenter.Core/Services/IInteractionStore.cs Outdated
Comment thread src/Core/CrestApps.OrchardCore.ContactCenter.Core/Services/InteractionManager.cs Outdated
Comment thread src/Core/CrestApps.OrchardCore.ContactCenter.Core/Services/InteractionStore.cs Outdated
Comment thread src/Modules/CrestApps.OrchardCore.ContactCenter/Manifest.cs Outdated
MikeAlhayek and others added 16 commits June 29, 2026 09:01
…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>
MikeAlhayek and others added 6 commits June 30, 2026 22:24
- 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>
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown

This pull request has merge conflicts. Please resolve those before requesting a review.

MikeAlhayek and others added 2 commits July 1, 2026 10:43
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
MikeAlhayek and others added 7 commits July 1, 2026 11:46
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>
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

This pull request has merge conflicts. Please resolve those before requesting a review.

MikeAlhayek and others added 2 commits July 6, 2026 15:55
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
MikeAlhayek and others added 9 commits July 6, 2026 16:35
…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
@github-actions

Copy link
Copy Markdown

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants