grm-shared-library 1.1.201 → 1.1.203
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/kafka/topics.js +26 -0
- package/dist/cjs/kafka/topics.js.map +1 -1
- package/dist/cjs/modules/common/constants/service.const.js +1 -0
- package/dist/cjs/modules/common/constants/service.const.js.map +1 -1
- package/dist/cjs/modules/permission/data/permissions.data.js +26 -0
- package/dist/cjs/modules/permission/data/permissions.data.js.map +1 -1
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js +40 -0
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/cjs/modules/permission/enums/permissions-module.enum.js +1 -0
- package/dist/cjs/modules/permission/enums/permissions-module.enum.js.map +1 -1
- package/dist/cjs/modules/role/data/roles.data.js +85 -0
- package/dist/cjs/modules/role/data/roles.data.js.map +1 -1
- package/dist/cjs/modules/socket/enums/redis-channel-name.enum.js +1 -0
- package/dist/cjs/modules/socket/enums/redis-channel-name.enum.js.map +1 -1
- package/dist/cjs/modules/socket/enums/room-type.enum.js +8 -0
- package/dist/cjs/modules/socket/enums/room-type.enum.js.map +1 -1
- package/dist/cjs/modules/socket/enums/socket-event-name.enum.js +5 -0
- package/dist/cjs/modules/socket/enums/socket-event-name.enum.js.map +1 -1
- package/dist/cjs/modules/support/constants/support-defaults.const.js +139 -0
- package/dist/cjs/modules/support/constants/support-defaults.const.js.map +1 -0
- package/dist/cjs/modules/support/constants/support-kafka.const.js +51 -0
- package/dist/cjs/modules/support/constants/support-kafka.const.js.map +1 -0
- package/dist/cjs/modules/support/dtos/create-support-ticket-message.dto.js +82 -0
- package/dist/cjs/modules/support/dtos/create-support-ticket-message.dto.js.map +1 -0
- package/dist/cjs/modules/support/dtos/create-support-ticket.dto.js +169 -0
- package/dist/cjs/modules/support/dtos/create-support-ticket.dto.js.map +1 -0
- package/dist/cjs/modules/support/dtos/customer-feedback.dto.js +401 -0
- package/dist/cjs/modules/support/dtos/customer-feedback.dto.js.map +1 -0
- package/dist/cjs/modules/support/dtos/support-configuration.dto.js +732 -0
- package/dist/cjs/modules/support/dtos/support-configuration.dto.js.map +1 -0
- package/dist/cjs/modules/support/dtos/support-related-entity.dto.js +38 -0
- package/dist/cjs/modules/support/dtos/support-related-entity.dto.js.map +1 -0
- package/dist/cjs/modules/support/dtos/support-report-query.dto.js +127 -0
- package/dist/cjs/modules/support/dtos/support-report-query.dto.js.map +1 -0
- package/dist/cjs/modules/support/dtos/support-sync.dto.js +175 -0
- package/dist/cjs/modules/support/dtos/support-sync.dto.js.map +1 -0
- package/dist/cjs/modules/support/dtos/support-ticket-actions.dto.js +191 -0
- package/dist/cjs/modules/support/dtos/support-ticket-actions.dto.js.map +1 -0
- package/dist/cjs/modules/support/dtos/support-ticket-query.dto.js +225 -0
- package/dist/cjs/modules/support/dtos/support-ticket-query.dto.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-audit-action.enum.js +87 -0
- package/dist/cjs/modules/support/enums/support-audit-action.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-feedback.enum.js +110 -0
- package/dist/cjs/modules/support/enums/support-feedback.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-provider-code.enum.js +66 -0
- package/dist/cjs/modules/support/enums/support-provider-code.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-related-entity-type.enum.js +50 -0
- package/dist/cjs/modules/support/enums/support-related-entity-type.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-routing.enum.js +58 -0
- package/dist/cjs/modules/support/enums/support-routing.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-sla.enum.js +55 -0
- package/dist/cjs/modules/support/enums/support-sla.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-sync.enum.js +133 -0
- package/dist/cjs/modules/support/enums/support-sync.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-ticket-channel.enum.js +36 -0
- package/dist/cjs/modules/support/enums/support-ticket-channel.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-ticket-message.enum.js +54 -0
- package/dist/cjs/modules/support/enums/support-ticket-message.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-ticket-priority.enum.js +41 -0
- package/dist/cjs/modules/support/enums/support-ticket-priority.enum.js.map +1 -0
- package/dist/cjs/modules/support/enums/support-ticket-status.enum.js +138 -0
- package/dist/cjs/modules/support/enums/support-ticket-status.enum.js.map +1 -0
- package/dist/cjs/modules/support/index.js +60 -0
- package/dist/cjs/modules/support/index.js.map +1 -0
- package/dist/cjs/modules/support/interfaces/customer-feedback.js +3 -0
- package/dist/cjs/modules/support/interfaces/customer-feedback.js.map +1 -0
- package/dist/cjs/modules/support/interfaces/support-configuration.js +3 -0
- package/dist/cjs/modules/support/interfaces/support-configuration.js.map +1 -0
- package/dist/cjs/modules/support/interfaces/support-events.js +3 -0
- package/dist/cjs/modules/support/interfaces/support-events.js.map +1 -0
- package/dist/cjs/modules/support/interfaces/support-provider-descriptor.js +3 -0
- package/dist/cjs/modules/support/interfaces/support-provider-descriptor.js.map +1 -0
- package/dist/cjs/modules/support/interfaces/support-realtime.js +18 -0
- package/dist/cjs/modules/support/interfaces/support-realtime.js.map +1 -0
- package/dist/cjs/modules/support/interfaces/support-reports.js +3 -0
- package/dist/cjs/modules/support/interfaces/support-reports.js.map +1 -0
- package/dist/cjs/modules/support/interfaces/support-sync.js +3 -0
- package/dist/cjs/modules/support/interfaces/support-sync.js.map +1 -0
- package/dist/cjs/modules/support/interfaces/support-ticket-message.js +3 -0
- package/dist/cjs/modules/support/interfaces/support-ticket-message.js.map +1 -0
- package/dist/cjs/modules/support/interfaces/support-ticket.js +3 -0
- package/dist/cjs/modules/support/interfaces/support-ticket.js.map +1 -0
- package/dist/cjs/modules/support/utils/support-feedback.util.js +66 -0
- package/dist/cjs/modules/support/utils/support-feedback.util.js.map +1 -0
- package/dist/cjs/modules/support/utils/support-redaction.util.js +173 -0
- package/dist/cjs/modules/support/utils/support-redaction.util.js.map +1 -0
- package/dist/cjs/modules/support/utils/support-routing.util.js +87 -0
- package/dist/cjs/modules/support/utils/support-routing.util.js.map +1 -0
- package/dist/cjs/modules/support/utils/support-sla.util.js +239 -0
- package/dist/cjs/modules/support/utils/support-sla.util.js.map +1 -0
- package/dist/cjs/modules/support/utils/support-status.util.js +93 -0
- package/dist/cjs/modules/support/utils/support-status.util.js.map +1 -0
- package/dist/cjs/modules/support/utils/support-sync.util.js +151 -0
- package/dist/cjs/modules/support/utils/support-sync.util.js.map +1 -0
- package/dist/cjs/modules/support/utils/support-ticket-number.util.js +61 -0
- package/dist/cjs/modules/support/utils/support-ticket-number.util.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/kafka/topics.js +26 -0
- package/dist/esm/kafka/topics.js.map +1 -1
- package/dist/esm/modules/common/constants/service.const.js +1 -0
- package/dist/esm/modules/common/constants/service.const.js.map +1 -1
- package/dist/esm/modules/permission/data/permissions.data.js +26 -0
- package/dist/esm/modules/permission/data/permissions.data.js.map +1 -1
- package/dist/esm/modules/permission/enums/permission-actions.enum.js +40 -0
- package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/esm/modules/permission/enums/permissions-module.enum.js +1 -0
- package/dist/esm/modules/permission/enums/permissions-module.enum.js.map +1 -1
- package/dist/esm/modules/role/data/roles.data.js +85 -0
- package/dist/esm/modules/role/data/roles.data.js.map +1 -1
- package/dist/esm/modules/socket/enums/redis-channel-name.enum.js +1 -0
- package/dist/esm/modules/socket/enums/redis-channel-name.enum.js.map +1 -1
- package/dist/esm/modules/socket/enums/room-type.enum.js +8 -0
- package/dist/esm/modules/socket/enums/room-type.enum.js.map +1 -1
- package/dist/esm/modules/socket/enums/socket-event-name.enum.js +5 -0
- package/dist/esm/modules/socket/enums/socket-event-name.enum.js.map +1 -1
- package/dist/esm/modules/support/constants/support-defaults.const.js +136 -0
- package/dist/esm/modules/support/constants/support-defaults.const.js.map +1 -0
- package/dist/esm/modules/support/constants/support-kafka.const.js +48 -0
- package/dist/esm/modules/support/constants/support-kafka.const.js.map +1 -0
- package/dist/esm/modules/support/dtos/create-support-ticket-message.dto.js +77 -0
- package/dist/esm/modules/support/dtos/create-support-ticket-message.dto.js.map +1 -0
- package/dist/esm/modules/support/dtos/create-support-ticket.dto.js +165 -0
- package/dist/esm/modules/support/dtos/create-support-ticket.dto.js.map +1 -0
- package/dist/esm/modules/support/dtos/customer-feedback.dto.js +392 -0
- package/dist/esm/modules/support/dtos/customer-feedback.dto.js.map +1 -0
- package/dist/esm/modules/support/dtos/support-configuration.dto.js +716 -0
- package/dist/esm/modules/support/dtos/support-configuration.dto.js.map +1 -0
- package/dist/esm/modules/support/dtos/support-related-entity.dto.js +34 -0
- package/dist/esm/modules/support/dtos/support-related-entity.dto.js.map +1 -0
- package/dist/esm/modules/support/dtos/support-report-query.dto.js +123 -0
- package/dist/esm/modules/support/dtos/support-report-query.dto.js.map +1 -0
- package/dist/esm/modules/support/dtos/support-sync.dto.js +169 -0
- package/dist/esm/modules/support/dtos/support-sync.dto.js.map +1 -0
- package/dist/esm/modules/support/dtos/support-ticket-actions.dto.js +180 -0
- package/dist/esm/modules/support/dtos/support-ticket-actions.dto.js.map +1 -0
- package/dist/esm/modules/support/dtos/support-ticket-query.dto.js +221 -0
- package/dist/esm/modules/support/dtos/support-ticket-query.dto.js.map +1 -0
- package/dist/esm/modules/support/enums/support-audit-action.enum.js +84 -0
- package/dist/esm/modules/support/enums/support-audit-action.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-feedback.enum.js +107 -0
- package/dist/esm/modules/support/enums/support-feedback.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-provider-code.enum.js +63 -0
- package/dist/esm/modules/support/enums/support-provider-code.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-related-entity-type.enum.js +47 -0
- package/dist/esm/modules/support/enums/support-related-entity-type.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-routing.enum.js +55 -0
- package/dist/esm/modules/support/enums/support-routing.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-sla.enum.js +52 -0
- package/dist/esm/modules/support/enums/support-sla.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-sync.enum.js +130 -0
- package/dist/esm/modules/support/enums/support-sync.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-ticket-channel.enum.js +33 -0
- package/dist/esm/modules/support/enums/support-ticket-channel.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-ticket-message.enum.js +51 -0
- package/dist/esm/modules/support/enums/support-ticket-message.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-ticket-priority.enum.js +38 -0
- package/dist/esm/modules/support/enums/support-ticket-priority.enum.js.map +1 -0
- package/dist/esm/modules/support/enums/support-ticket-status.enum.js +135 -0
- package/dist/esm/modules/support/enums/support-ticket-status.enum.js.map +1 -0
- package/dist/esm/modules/support/index.js +44 -0
- package/dist/esm/modules/support/index.js.map +1 -0
- package/dist/esm/modules/support/interfaces/customer-feedback.js +2 -0
- package/dist/esm/modules/support/interfaces/customer-feedback.js.map +1 -0
- package/dist/esm/modules/support/interfaces/support-configuration.js +2 -0
- package/dist/esm/modules/support/interfaces/support-configuration.js.map +1 -0
- package/dist/esm/modules/support/interfaces/support-events.js +2 -0
- package/dist/esm/modules/support/interfaces/support-events.js.map +1 -0
- package/dist/esm/modules/support/interfaces/support-provider-descriptor.js +2 -0
- package/dist/esm/modules/support/interfaces/support-provider-descriptor.js.map +1 -0
- package/dist/esm/modules/support/interfaces/support-realtime.js +15 -0
- package/dist/esm/modules/support/interfaces/support-realtime.js.map +1 -0
- package/dist/esm/modules/support/interfaces/support-reports.js +2 -0
- package/dist/esm/modules/support/interfaces/support-reports.js.map +1 -0
- package/dist/esm/modules/support/interfaces/support-sync.js +2 -0
- package/dist/esm/modules/support/interfaces/support-sync.js.map +1 -0
- package/dist/esm/modules/support/interfaces/support-ticket-message.js +2 -0
- package/dist/esm/modules/support/interfaces/support-ticket-message.js.map +1 -0
- package/dist/esm/modules/support/interfaces/support-ticket.js +2 -0
- package/dist/esm/modules/support/interfaces/support-ticket.js.map +1 -0
- package/dist/esm/modules/support/utils/support-feedback.util.js +60 -0
- package/dist/esm/modules/support/utils/support-feedback.util.js.map +1 -0
- package/dist/esm/modules/support/utils/support-redaction.util.js +164 -0
- package/dist/esm/modules/support/utils/support-redaction.util.js.map +1 -0
- package/dist/esm/modules/support/utils/support-routing.util.js +82 -0
- package/dist/esm/modules/support/utils/support-routing.util.js.map +1 -0
- package/dist/esm/modules/support/utils/support-sla.util.js +229 -0
- package/dist/esm/modules/support/utils/support-sla.util.js.map +1 -0
- package/dist/esm/modules/support/utils/support-status.util.js +81 -0
- package/dist/esm/modules/support/utils/support-status.util.js.map +1 -0
- package/dist/esm/modules/support/utils/support-sync.util.js +142 -0
- package/dist/esm/modules/support/utils/support-sync.util.js.map +1 -0
- package/dist/esm/modules/support/utils/support-ticket-number.util.js +56 -0
- package/dist/esm/modules/support/utils/support-ticket-number.util.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/kafka/topics.d.ts +21 -0
- package/dist/types/modules/common/constants/service.const.d.ts +4 -0
- package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +21 -0
- package/dist/types/modules/permission/enums/permissions-module.enum.d.ts +2 -1
- package/dist/types/modules/socket/enums/redis-channel-name.enum.d.ts +2 -1
- package/dist/types/modules/socket/enums/room-type.enum.d.ts +8 -0
- package/dist/types/modules/socket/enums/socket-event-name.enum.d.ts +2 -1
- package/dist/types/modules/support/constants/support-defaults.const.d.ts +129 -0
- package/dist/types/modules/support/constants/support-kafka.const.d.ts +47 -0
- package/dist/types/modules/support/dtos/create-support-ticket-message.dto.d.ts +30 -0
- package/dist/types/modules/support/dtos/create-support-ticket.dto.d.ts +35 -0
- package/dist/types/modules/support/dtos/customer-feedback.dto.d.ts +83 -0
- package/dist/types/modules/support/dtos/support-configuration.dto.d.ts +130 -0
- package/dist/types/modules/support/dtos/support-related-entity.dto.d.ts +13 -0
- package/dist/types/modules/support/dtos/support-report-query.dto.d.ts +29 -0
- package/dist/types/modules/support/dtos/support-sync.dto.d.ts +40 -0
- package/dist/types/modules/support/dtos/support-ticket-actions.dto.d.ts +61 -0
- package/dist/types/modules/support/dtos/support-ticket-query.dto.d.ts +41 -0
- package/dist/types/modules/support/enums/support-audit-action.enum.d.ts +80 -0
- package/dist/types/modules/support/enums/support-feedback.enum.d.ts +65 -0
- package/dist/types/modules/support/enums/support-provider-code.enum.d.ts +57 -0
- package/dist/types/modules/support/enums/support-related-entity-type.enum.d.ts +41 -0
- package/dist/types/modules/support/enums/support-routing.enum.d.ts +48 -0
- package/dist/types/modules/support/enums/support-sla.enum.d.ts +47 -0
- package/dist/types/modules/support/enums/support-sync.enum.d.ts +108 -0
- package/dist/types/modules/support/enums/support-ticket-channel.enum.d.ts +30 -0
- package/dist/types/modules/support/enums/support-ticket-message.enum.d.ts +42 -0
- package/dist/types/modules/support/enums/support-ticket-priority.enum.d.ts +24 -0
- package/dist/types/modules/support/enums/support-ticket-status.enum.d.ts +58 -0
- package/dist/types/modules/support/index.d.ts +38 -0
- package/dist/types/modules/support/interfaces/customer-feedback.d.ts +115 -0
- package/dist/types/modules/support/interfaces/support-configuration.d.ts +170 -0
- package/dist/types/modules/support/interfaces/support-events.d.ts +126 -0
- package/dist/types/modules/support/interfaces/support-provider-descriptor.d.ts +92 -0
- package/dist/types/modules/support/interfaces/support-realtime.d.ts +65 -0
- package/dist/types/modules/support/interfaces/support-reports.d.ts +122 -0
- package/dist/types/modules/support/interfaces/support-sync.d.ts +105 -0
- package/dist/types/modules/support/interfaces/support-ticket-message.d.ts +66 -0
- package/dist/types/modules/support/interfaces/support-ticket.d.ts +180 -0
- package/dist/types/modules/support/utils/support-feedback.util.d.ts +23 -0
- package/dist/types/modules/support/utils/support-redaction.util.d.ts +48 -0
- package/dist/types/modules/support/utils/support-routing.util.d.ts +50 -0
- package/dist/types/modules/support/utils/support-sla.util.d.ts +69 -0
- package/dist/types/modules/support/utils/support-status.util.d.ts +44 -0
- package/dist/types/modules/support/utils/support-sync.util.d.ts +76 -0
- package/dist/types/modules/support/utils/support-ticket-number.util.d.ts +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { CountryCode } from '../../country/enums/country-code.enum';
|
|
2
|
+
import { CustomerFeedbackStatus, CustomerFeedbackType } from '../enums/support-feedback.enum';
|
|
3
|
+
import { SupportProviderCode } from '../enums/support-provider-code.enum';
|
|
4
|
+
import { SupportSlaState, SupportSlaTarget } from '../enums/support-sla.enum';
|
|
5
|
+
import { SupportSyncFailureReason, SupportSyncOperation } from '../enums/support-sync.enum';
|
|
6
|
+
import { SupportTicketMessageType } from '../enums/support-ticket-message.enum';
|
|
7
|
+
import { SupportTicketPriority } from '../enums/support-ticket-priority.enum';
|
|
8
|
+
import { SupportTicketStatus } from '../enums/support-ticket-status.enum';
|
|
9
|
+
/**
|
|
10
|
+
* Fields every support domain event carries.
|
|
11
|
+
*
|
|
12
|
+
* Secret-free by construction: identifiers, states and timestamps only. No
|
|
13
|
+
* message body, no customer contact detail, no provider credential and no
|
|
14
|
+
* provider payload ever appears on a topic - a Kafka topic is read by consumers
|
|
15
|
+
* nobody enumerated in advance, and a support message is exactly the kind of
|
|
16
|
+
* thing that turns out to contain a password somebody pasted in.
|
|
17
|
+
*
|
|
18
|
+
* Versioned in the topic name, so a later shape change never breaks a consumer
|
|
19
|
+
* that has not been redeployed.
|
|
20
|
+
*/
|
|
21
|
+
export interface SupportEventEnvelopeV1 {
|
|
22
|
+
/** Deterministic where possible, so a redelivered message can be deduped. */
|
|
23
|
+
eventId: string;
|
|
24
|
+
eventType: string;
|
|
25
|
+
/** ISO-8601 instant the event was produced. */
|
|
26
|
+
occurredAt: string;
|
|
27
|
+
sourceService: 'clarion-support';
|
|
28
|
+
version: 1;
|
|
29
|
+
organizationId: number;
|
|
30
|
+
controlCentreId?: number | null;
|
|
31
|
+
countryCode: CountryCode;
|
|
32
|
+
/** Ties every event raised by one user action together. */
|
|
33
|
+
correlationId?: string | null;
|
|
34
|
+
/** Who caused it. Null for a scheduled job. */
|
|
35
|
+
actorUserId?: number | null;
|
|
36
|
+
}
|
|
37
|
+
/** Ticket lifecycle. Emitted for created, updated, assigned, status and priority changes. */
|
|
38
|
+
export interface SupportTicketEventV1 extends SupportEventEnvelopeV1 {
|
|
39
|
+
ticketId: string;
|
|
40
|
+
ticketNumber: string;
|
|
41
|
+
/** The customer whose ticket it is - the recipient a notification consumer needs. */
|
|
42
|
+
customerUserId: number;
|
|
43
|
+
status: SupportTicketStatus;
|
|
44
|
+
previousStatus?: SupportTicketStatus | null;
|
|
45
|
+
priority: SupportTicketPriority;
|
|
46
|
+
previousPriority?: SupportTicketPriority | null;
|
|
47
|
+
categoryId?: string | null;
|
|
48
|
+
queueId?: string | null;
|
|
49
|
+
assignedAgentId?: number | null;
|
|
50
|
+
previousAssignedAgentId?: number | null;
|
|
51
|
+
assignedTeamId?: string | null;
|
|
52
|
+
/**
|
|
53
|
+
* The subject line.
|
|
54
|
+
*
|
|
55
|
+
* The one piece of customer-authored text on a topic, and it is here because
|
|
56
|
+
* a notification that cannot say which ticket it is about is useless. It is
|
|
57
|
+
* the same string already shown in a list; the body never travels.
|
|
58
|
+
*/
|
|
59
|
+
subject: string;
|
|
60
|
+
externalProvider?: SupportProviderCode | null;
|
|
61
|
+
externalTicketId?: string | null;
|
|
62
|
+
}
|
|
63
|
+
/** A new entry in a ticket conversation. */
|
|
64
|
+
export interface SupportTicketMessageEventV1 extends SupportEventEnvelopeV1 {
|
|
65
|
+
ticketId: string;
|
|
66
|
+
ticketNumber: string;
|
|
67
|
+
customerUserId: number;
|
|
68
|
+
messageId: string;
|
|
69
|
+
messageType: SupportTicketMessageType;
|
|
70
|
+
authorUserId?: number | null;
|
|
71
|
+
/** Length only. The body itself is deliberately absent. */
|
|
72
|
+
bodyLength: number;
|
|
73
|
+
hasAttachments: boolean;
|
|
74
|
+
/** Who should be told: the customer for an agent reply, the agent for a customer reply. */
|
|
75
|
+
assignedAgentId?: number | null;
|
|
76
|
+
queueId?: string | null;
|
|
77
|
+
subject: string;
|
|
78
|
+
/** False for an internal note, which no customer-facing consumer may act on. */
|
|
79
|
+
customerVisible: boolean;
|
|
80
|
+
}
|
|
81
|
+
/** An SLA clock crossing a threshold. */
|
|
82
|
+
export interface SupportSlaEventV1 extends SupportEventEnvelopeV1 {
|
|
83
|
+
ticketId: string;
|
|
84
|
+
ticketNumber: string;
|
|
85
|
+
subject: string;
|
|
86
|
+
target: SupportSlaTarget;
|
|
87
|
+
state: SupportSlaState;
|
|
88
|
+
dueAt: string;
|
|
89
|
+
/** Negative before the deadline, positive after it. */
|
|
90
|
+
overdueMinutes: number;
|
|
91
|
+
priority: SupportTicketPriority;
|
|
92
|
+
assignedAgentId?: number | null;
|
|
93
|
+
assignedTeamId?: string | null;
|
|
94
|
+
queueId?: string | null;
|
|
95
|
+
/** Who should hear about it - supervisors first, then managers. */
|
|
96
|
+
escalationUserIds: number[];
|
|
97
|
+
}
|
|
98
|
+
/** Customer feedback lifecycle. */
|
|
99
|
+
export interface SupportFeedbackEventV1 extends SupportEventEnvelopeV1 {
|
|
100
|
+
feedbackId: string;
|
|
101
|
+
submittedByUserId: number;
|
|
102
|
+
type: CustomerFeedbackType;
|
|
103
|
+
status: CustomerFeedbackStatus;
|
|
104
|
+
previousStatus?: CustomerFeedbackStatus | null;
|
|
105
|
+
rating?: number | null;
|
|
106
|
+
/** Set on the converted event. */
|
|
107
|
+
convertedTicketId?: string | null;
|
|
108
|
+
convertedTicketNumber?: string | null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Provider synchronization health.
|
|
112
|
+
*
|
|
113
|
+
* Emitted when a row is dead-lettered and again when the provider recovers, so
|
|
114
|
+
* an operations dashboard can show a helpdesk outage without polling and
|
|
115
|
+
* without reading the support database.
|
|
116
|
+
*/
|
|
117
|
+
export interface SupportProviderSyncEventV1 extends SupportEventEnvelopeV1 {
|
|
118
|
+
provider: SupportProviderCode;
|
|
119
|
+
syncId: string;
|
|
120
|
+
ticketId?: string | null;
|
|
121
|
+
operation: SupportSyncOperation;
|
|
122
|
+
failureReason?: SupportSyncFailureReason | null;
|
|
123
|
+
attempts: number;
|
|
124
|
+
/** How many rows are currently dead-lettered for this provider. */
|
|
125
|
+
deadLetterCount: number;
|
|
126
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { SupportProviderCapability, SupportProviderCode } from '../enums/support-provider-code.enum';
|
|
2
|
+
/** One non-secret setting an adapter needs, described so a UI can render it. */
|
|
3
|
+
export interface SupportProviderConfigField {
|
|
4
|
+
/** Key in the integration's `configuration` object. */
|
|
5
|
+
key: string;
|
|
6
|
+
label: string;
|
|
7
|
+
description?: string | null;
|
|
8
|
+
type: 'string' | 'number' | 'boolean' | 'select';
|
|
9
|
+
required: boolean;
|
|
10
|
+
/** Options when `type` is select. */
|
|
11
|
+
options?: {
|
|
12
|
+
value: string;
|
|
13
|
+
label: string;
|
|
14
|
+
}[];
|
|
15
|
+
/** Shown as a placeholder. Never a real value. */
|
|
16
|
+
example?: string | null;
|
|
17
|
+
defaultValue?: string | number | boolean | null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A credential the adapter needs, described by NAME only.
|
|
21
|
+
*
|
|
22
|
+
* The admin renders a field for the credential's REFERENCE - the name of a
|
|
23
|
+
* secret in the deployment's secret store - and never for the credential
|
|
24
|
+
* itself. There is no code path anywhere in the platform that accepts a
|
|
25
|
+
* helpdesk API token over HTTP, which is the point: a token typed into a
|
|
26
|
+
* browser is a token in a browser history, a proxy log and an admin's
|
|
27
|
+
* clipboard.
|
|
28
|
+
*/
|
|
29
|
+
export interface SupportProviderCredentialField {
|
|
30
|
+
key: string;
|
|
31
|
+
label: string;
|
|
32
|
+
description?: string | null;
|
|
33
|
+
required: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Everything the platform can say about one helpdesk without contacting it.
|
|
37
|
+
*
|
|
38
|
+
* The admin builds its configuration form and its action buttons from this, so
|
|
39
|
+
* adding a provider is a backend change with no frontend change - and an action
|
|
40
|
+
* a provider cannot perform is never offered to an operator as if it worked.
|
|
41
|
+
*/
|
|
42
|
+
export interface SupportProviderDescriptor {
|
|
43
|
+
code: SupportProviderCode;
|
|
44
|
+
/** Operator-facing name, e.g. Zammad. */
|
|
45
|
+
name: string;
|
|
46
|
+
description: string;
|
|
47
|
+
/** What this adapter can actually do. */
|
|
48
|
+
capabilities: SupportProviderCapability[];
|
|
49
|
+
/** Hostnames a base URL may point at, beyond the deployment allowlist. Empty means self-hosted. */
|
|
50
|
+
allowedHosts: string[];
|
|
51
|
+
/** True when the deployment can reach this provider - credential present and adapter enabled. */
|
|
52
|
+
available: boolean;
|
|
53
|
+
/** Why it is unavailable, when it is. Never contains a secret. */
|
|
54
|
+
unavailableReason?: string | null;
|
|
55
|
+
configFields: SupportProviderConfigField[];
|
|
56
|
+
credentialFields: SupportProviderCredentialField[];
|
|
57
|
+
/** True when the provider signs its webhooks and Clarion verifies the signature. */
|
|
58
|
+
verifiesWebhookSignature: boolean;
|
|
59
|
+
/** Path the provider should be configured to call, relative to the public API host. */
|
|
60
|
+
webhookPath?: string | null;
|
|
61
|
+
}
|
|
62
|
+
/** The outcome of an operator pressing Test Connection. Never carries a credential. */
|
|
63
|
+
export interface SupportProviderConnectionTestResult {
|
|
64
|
+
provider: SupportProviderCode;
|
|
65
|
+
success: boolean;
|
|
66
|
+
/** Human-readable, already scrubbed of anything credential-shaped. */
|
|
67
|
+
message: string;
|
|
68
|
+
latencyMs?: number | null;
|
|
69
|
+
checkedAt: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The provider a deployment is running, as the admin sees it.
|
|
73
|
+
*
|
|
74
|
+
* Configuration-driven and read-only over the API: switching provider is a
|
|
75
|
+
* deployment decision made with an environment variable and a documented
|
|
76
|
+
* migration procedure, not a button. A screen that let somebody flip the
|
|
77
|
+
* platform's helpdesk in one click would be a screen that orphans every open
|
|
78
|
+
* ticket.
|
|
79
|
+
*/
|
|
80
|
+
export interface SupportProviderStatus {
|
|
81
|
+
/** What SUPPORT_PROVIDER resolves to right now. */
|
|
82
|
+
activeProvider: SupportProviderCode;
|
|
83
|
+
/** Every adapter the build carries, whether or not it is configured. */
|
|
84
|
+
providers: SupportProviderDescriptor[];
|
|
85
|
+
/** Outstanding synchronization work, as a health signal. */
|
|
86
|
+
pendingSyncCount: number;
|
|
87
|
+
deadLetterSyncCount: number;
|
|
88
|
+
/** True while the circuit breaker is open for the active provider. */
|
|
89
|
+
circuitOpen: boolean;
|
|
90
|
+
lastSuccessfulSyncAt?: string | null;
|
|
91
|
+
lastFailedSyncAt?: string | null;
|
|
92
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { SupportSlaState } from '../enums/support-sla.enum';
|
|
2
|
+
import { SupportTicketMessageType } from '../enums/support-ticket-message.enum';
|
|
3
|
+
import { SupportTicketPriority } from '../enums/support-ticket-priority.enum';
|
|
4
|
+
import { SupportTicketStatus } from '../enums/support-ticket-status.enum';
|
|
5
|
+
/** What a live support update is about. */
|
|
6
|
+
export declare enum SupportRealtimeEventType {
|
|
7
|
+
TICKET_CREATED = "support.ticket.created",
|
|
8
|
+
TICKET_UPDATED = "support.ticket.updated",
|
|
9
|
+
TICKET_STATUS_CHANGED = "support.ticket.status.changed",
|
|
10
|
+
TICKET_PRIORITY_CHANGED = "support.ticket.priority.changed",
|
|
11
|
+
TICKET_ASSIGNED = "support.ticket.assigned",
|
|
12
|
+
TICKET_MESSAGE_CREATED = "support.ticket.message.created",
|
|
13
|
+
TICKET_SLA_CHANGED = "support.ticket.sla.changed",
|
|
14
|
+
TICKET_SYNC_CHANGED = "support.ticket.sync.changed",
|
|
15
|
+
FEEDBACK_CREATED = "support.feedback.created",
|
|
16
|
+
FEEDBACK_RESPONDED = "support.feedback.responded"
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The flat envelope clarion-support publishes on the support Redis channel and
|
|
20
|
+
* clarion-socket re-broadcasts to rooms.
|
|
21
|
+
*
|
|
22
|
+
* Flat rather than the rich incident `EventEnvelope<T>` for the same reason
|
|
23
|
+
* newsfeed and tracking are: support events span tickets, messages and
|
|
24
|
+
* feedback, and forcing three unrelated payload shapes through one generic
|
|
25
|
+
* costs more than it buys.
|
|
26
|
+
*
|
|
27
|
+
* The payload is CLIENT-SAFE and minimal - enough to update a row or append a
|
|
28
|
+
* bubble, never enough to be an unauthorized read. In particular an internal
|
|
29
|
+
* note is broadcast ONLY to the queue and agent rooms and never to the
|
|
30
|
+
* customer's ticket room, and its body is not in the envelope at all: a client
|
|
31
|
+
* that needs it re-reads the ticket through the authorized REST path.
|
|
32
|
+
*/
|
|
33
|
+
export interface SupportRealtimeEnvelope {
|
|
34
|
+
eventId: string;
|
|
35
|
+
eventType: SupportRealtimeEventType;
|
|
36
|
+
occurredAt: string;
|
|
37
|
+
organizationId: number;
|
|
38
|
+
controlCentreId?: number | null;
|
|
39
|
+
/** Rooms clarion-socket should deliver to. Built with SUPPORT_ROOMS. */
|
|
40
|
+
rooms: string[];
|
|
41
|
+
ticketId?: string;
|
|
42
|
+
ticketNumber?: string;
|
|
43
|
+
feedbackId?: string;
|
|
44
|
+
actorUserId?: number | null;
|
|
45
|
+
payload: SupportRealtimePayload;
|
|
46
|
+
}
|
|
47
|
+
/** The client-safe body of a live support update. */
|
|
48
|
+
export interface SupportRealtimePayload {
|
|
49
|
+
status?: SupportTicketStatus;
|
|
50
|
+
previousStatus?: SupportTicketStatus | null;
|
|
51
|
+
priority?: SupportTicketPriority;
|
|
52
|
+
assignedAgentId?: number | null;
|
|
53
|
+
queueId?: string | null;
|
|
54
|
+
messageId?: string;
|
|
55
|
+
messageType?: SupportTicketMessageType;
|
|
56
|
+
/** Whether the new message is one the customer may see. */
|
|
57
|
+
customerVisible?: boolean;
|
|
58
|
+
authorName?: string | null;
|
|
59
|
+
firstResponseSlaState?: SupportSlaState;
|
|
60
|
+
resolutionSlaState?: SupportSlaState;
|
|
61
|
+
externalSyncPending?: boolean;
|
|
62
|
+
externalSyncFailed?: boolean;
|
|
63
|
+
/** Server time the ticket last changed, so a client can discard a stale update. */
|
|
64
|
+
updatedAt?: string;
|
|
65
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { CountryCode } from '../../country/enums/country-code.enum';
|
|
2
|
+
import { CustomerFeedbackStatus, CustomerFeedbackType } from '../enums/support-feedback.enum';
|
|
3
|
+
import { SupportTicketChannel } from '../enums/support-ticket-channel.enum';
|
|
4
|
+
import { SupportTicketPriority } from '../enums/support-ticket-priority.enum';
|
|
5
|
+
import { SupportTicketStatus } from '../enums/support-ticket-status.enum';
|
|
6
|
+
/** A count against a dimension value. The shape every breakdown uses. */
|
|
7
|
+
export interface SupportMetricBucket {
|
|
8
|
+
key: string;
|
|
9
|
+
/** Display label resolved server-side, so a client never has to own a label map. */
|
|
10
|
+
label: string;
|
|
11
|
+
count: number;
|
|
12
|
+
}
|
|
13
|
+
/** A count at a point in time, for the trend charts. */
|
|
14
|
+
export interface SupportTimeSeriesPoint {
|
|
15
|
+
/** Bucket start, ISO-8601. */
|
|
16
|
+
at: string;
|
|
17
|
+
count: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The support overview.
|
|
21
|
+
*
|
|
22
|
+
* Every number is scoped to the caller's tenant and to the requested date
|
|
23
|
+
* range. Averages are in MINUTES throughout - one unit across the whole
|
|
24
|
+
* contract, because a mixed seconds-and-minutes API is how a dashboard ends up
|
|
25
|
+
* silently reporting a sixty-fold error.
|
|
26
|
+
*/
|
|
27
|
+
export interface SupportDashboardMetrics {
|
|
28
|
+
/** Range the figures cover. */
|
|
29
|
+
from: string;
|
|
30
|
+
to: string;
|
|
31
|
+
totalTickets: number;
|
|
32
|
+
newTickets: number;
|
|
33
|
+
openTickets: number;
|
|
34
|
+
resolvedTickets: number;
|
|
35
|
+
closedTickets: number;
|
|
36
|
+
unassignedTickets: number;
|
|
37
|
+
/** Open tickets with at least one breached clock. */
|
|
38
|
+
breachedTickets: number;
|
|
39
|
+
/** Open tickets in WARNING on either clock. */
|
|
40
|
+
atRiskTickets: number;
|
|
41
|
+
byStatus: SupportMetricBucket[];
|
|
42
|
+
byPriority: SupportMetricBucket[];
|
|
43
|
+
byChannel: SupportMetricBucket[];
|
|
44
|
+
byCategory: SupportMetricBucket[];
|
|
45
|
+
byQueue: SupportMetricBucket[];
|
|
46
|
+
byCountry: SupportMetricBucket[];
|
|
47
|
+
/** Only populated for a super-admin, who is the only caller who spans tenants. */
|
|
48
|
+
byOrganization: SupportMetricBucket[];
|
|
49
|
+
/** Percentage of tickets in range that met their first-response target. */
|
|
50
|
+
firstResponseComplianceRate: number;
|
|
51
|
+
/** Percentage that met their resolution target. */
|
|
52
|
+
resolutionComplianceRate: number;
|
|
53
|
+
slaBreachCount: number;
|
|
54
|
+
averageFirstResponseMinutes?: number | null;
|
|
55
|
+
averageResolutionMinutes?: number | null;
|
|
56
|
+
/** Reopened tickets as a percentage of tickets closed in range. */
|
|
57
|
+
reopenRate: number;
|
|
58
|
+
feedbackCount: number;
|
|
59
|
+
averageRating?: number | null;
|
|
60
|
+
feedbackByType: SupportMetricBucket[];
|
|
61
|
+
/** Percentage of feedback that received a reply. */
|
|
62
|
+
feedbackResponseRate: number;
|
|
63
|
+
/** Percentage of feedback that became a ticket. */
|
|
64
|
+
feedbackConversionRate: number;
|
|
65
|
+
ticketsCreatedTrend: SupportTimeSeriesPoint[];
|
|
66
|
+
ticketsResolvedTrend: SupportTimeSeriesPoint[];
|
|
67
|
+
}
|
|
68
|
+
/** One agent's board. */
|
|
69
|
+
export interface SupportAgentDashboardMetrics {
|
|
70
|
+
agentUserId: number;
|
|
71
|
+
from: string;
|
|
72
|
+
to: string;
|
|
73
|
+
assignedToMe: number;
|
|
74
|
+
overdue: number;
|
|
75
|
+
atRisk: number;
|
|
76
|
+
waitingOnCustomer: number;
|
|
77
|
+
waitingOnInternalTeam: number;
|
|
78
|
+
resolvedInRange: number;
|
|
79
|
+
closedInRange: number;
|
|
80
|
+
averageFirstResponseMinutes?: number | null;
|
|
81
|
+
averageResolutionMinutes?: number | null;
|
|
82
|
+
/** Tickets assigned but never replied to. The number a supervisor actually acts on. */
|
|
83
|
+
awaitingFirstResponse: number;
|
|
84
|
+
}
|
|
85
|
+
/** Feedback analytics, which stand alone because feedback is its own domain. */
|
|
86
|
+
export interface SupportFeedbackAnalytics {
|
|
87
|
+
from: string;
|
|
88
|
+
to: string;
|
|
89
|
+
total: number;
|
|
90
|
+
byType: SupportMetricBucket[];
|
|
91
|
+
byStatus: SupportMetricBucket[];
|
|
92
|
+
byCountry: SupportMetricBucket[];
|
|
93
|
+
byOrganization: SupportMetricBucket[];
|
|
94
|
+
byApp: SupportMetricBucket[];
|
|
95
|
+
byAppVersion: SupportMetricBucket[];
|
|
96
|
+
byPlatform: SupportMetricBucket[];
|
|
97
|
+
bySentiment: SupportMetricBucket[];
|
|
98
|
+
averageRating?: number | null;
|
|
99
|
+
ratingDistribution: SupportMetricBucket[];
|
|
100
|
+
responseRate: number;
|
|
101
|
+
conversionRate: number;
|
|
102
|
+
volumeTrend: SupportTimeSeriesPoint[];
|
|
103
|
+
}
|
|
104
|
+
/** Filters every report endpoint accepts. */
|
|
105
|
+
export interface SupportReportQuery {
|
|
106
|
+
from?: string;
|
|
107
|
+
to?: string;
|
|
108
|
+
organizationId?: number;
|
|
109
|
+
controlCentreId?: number;
|
|
110
|
+
countryCode?: CountryCode;
|
|
111
|
+
queueId?: string;
|
|
112
|
+
teamId?: string;
|
|
113
|
+
categoryId?: string;
|
|
114
|
+
agentUserId?: number;
|
|
115
|
+
status?: SupportTicketStatus;
|
|
116
|
+
priority?: SupportTicketPriority;
|
|
117
|
+
channel?: SupportTicketChannel;
|
|
118
|
+
feedbackType?: CustomerFeedbackType;
|
|
119
|
+
feedbackStatus?: CustomerFeedbackStatus;
|
|
120
|
+
/** Bucket size for the trend series. */
|
|
121
|
+
granularity?: 'DAY' | 'WEEK' | 'MONTH';
|
|
122
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { SupportProviderCode } from '../enums/support-provider-code.enum';
|
|
2
|
+
import { SupportSyncEntityType, SupportSyncFailureReason, SupportSyncOperation, SupportSyncStatus, SupportWebhookStatus } from '../enums/support-sync.enum';
|
|
3
|
+
/**
|
|
4
|
+
* One unit of outbound work against a helpdesk.
|
|
5
|
+
*
|
|
6
|
+
* This row IS the queue. There is no broker behind it: a PENDING row whose
|
|
7
|
+
* `nextAttemptAt` has elapsed is work, claimed with SELECT ... FOR UPDATE SKIP
|
|
8
|
+
* LOCKED, so an operation survives a pod dying mid-send with nothing to replay
|
|
9
|
+
* from. Nothing is ever silently discarded - a row that cannot succeed becomes
|
|
10
|
+
* DEAD_LETTER and shows up on the synchronization dashboard for a human.
|
|
11
|
+
*/
|
|
12
|
+
export interface SupportProviderSync {
|
|
13
|
+
id: string;
|
|
14
|
+
organizationId: number;
|
|
15
|
+
provider: SupportProviderCode;
|
|
16
|
+
entityType: SupportSyncEntityType;
|
|
17
|
+
/** The Clarion id of the record being mirrored. */
|
|
18
|
+
entityId: string;
|
|
19
|
+
/** The ticket the work belongs to, for grouping on the dashboard. */
|
|
20
|
+
ticketId?: string | null;
|
|
21
|
+
/** The provider's id, once known. */
|
|
22
|
+
externalId?: string | null;
|
|
23
|
+
operation: SupportSyncOperation;
|
|
24
|
+
status: SupportSyncStatus;
|
|
25
|
+
attempts: number;
|
|
26
|
+
maxAttempts: number;
|
|
27
|
+
lastAttemptAt?: string | null;
|
|
28
|
+
nextAttemptAt?: string | null;
|
|
29
|
+
failureReason?: SupportSyncFailureReason | null;
|
|
30
|
+
/** The provider's own error code, when it publishes one. */
|
|
31
|
+
errorCode?: string | null;
|
|
32
|
+
/** Scrubbed and length-capped. Safe to show an operator. */
|
|
33
|
+
errorMessage?: string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Hash of the payload that was sent.
|
|
36
|
+
*
|
|
37
|
+
* Two purposes. It lets a redelivery be recognised without keeping the
|
|
38
|
+
* payload, and it lets a reconciliation job tell "we never sent this" from
|
|
39
|
+
* "we sent this and it did not take".
|
|
40
|
+
*/
|
|
41
|
+
payloadHash?: string | null;
|
|
42
|
+
/** Ties every row raised by one user action together. */
|
|
43
|
+
correlationId?: string | null;
|
|
44
|
+
createdAt: string;
|
|
45
|
+
updatedAt: string;
|
|
46
|
+
}
|
|
47
|
+
/** A synchronization row plus the small amount of context the dashboard shows. */
|
|
48
|
+
export interface SupportProviderSyncSummary extends SupportProviderSync {
|
|
49
|
+
ticketNumber?: string | null;
|
|
50
|
+
/** How long the row has been outstanding, in minutes. */
|
|
51
|
+
ageMinutes: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A webhook delivery from a helpdesk.
|
|
55
|
+
*
|
|
56
|
+
* Persisted BEFORE it is processed, and keyed on the provider's delivery id, so
|
|
57
|
+
* a replay is recognised as a replay rather than shown to a customer twice. A
|
|
58
|
+
* delivery whose signature does not verify is recorded as REJECTED and never
|
|
59
|
+
* processed, because knowing somebody is posting unsigned traffic at the
|
|
60
|
+
* endpoint is worth more than the disk it costs.
|
|
61
|
+
*/
|
|
62
|
+
export interface SupportWebhookEvent {
|
|
63
|
+
id: string;
|
|
64
|
+
provider: SupportProviderCode;
|
|
65
|
+
/** The provider's delivery id when it sends one; otherwise a hash of the body. */
|
|
66
|
+
externalEventId: string;
|
|
67
|
+
/** The provider's own event name, unmapped, for diagnosis. */
|
|
68
|
+
externalEventType?: string | null;
|
|
69
|
+
/** The Clarion ticket it resolved to, when it resolved to one. */
|
|
70
|
+
ticketId?: string | null;
|
|
71
|
+
externalTicketId?: string | null;
|
|
72
|
+
status: SupportWebhookStatus;
|
|
73
|
+
/** Why it was ignored or rejected. Never contains the signature or a secret. */
|
|
74
|
+
statusReason?: string | null;
|
|
75
|
+
receivedAt: string;
|
|
76
|
+
processedAt?: string | null;
|
|
77
|
+
/** How long processing took, for the latency panel. */
|
|
78
|
+
durationMs?: number | null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The result of reconciling one ticket against the provider.
|
|
82
|
+
*
|
|
83
|
+
* Reconciliation never guesses. Where the two disagree on workflow state the
|
|
84
|
+
* provider wins, because that is where agents work; where they disagree on
|
|
85
|
+
* tenancy, identity or the customer's own messages Clarion wins, because the
|
|
86
|
+
* provider has no authority over those. Anything it cannot place is reported
|
|
87
|
+
* rather than resolved.
|
|
88
|
+
*/
|
|
89
|
+
export interface SupportReconciliationResult {
|
|
90
|
+
ticketId: string;
|
|
91
|
+
ticketNumber: string;
|
|
92
|
+
provider: SupportProviderCode;
|
|
93
|
+
externalTicketId?: string | null;
|
|
94
|
+
/** True when the two copies already agreed. */
|
|
95
|
+
inSync: boolean;
|
|
96
|
+
/** Field-level differences found, e.g. `status`. */
|
|
97
|
+
differences: string[];
|
|
98
|
+
/** Changes actually applied to the Clarion copy. */
|
|
99
|
+
applied: string[];
|
|
100
|
+
/** Differences left alone for a human, with the reason. */
|
|
101
|
+
unresolved: string[];
|
|
102
|
+
/** Messages pulled in from the provider that Clarion had never seen. */
|
|
103
|
+
messagesImported: number;
|
|
104
|
+
reconciledAt: string;
|
|
105
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { SupportProviderCode } from '../enums/support-provider-code.enum';
|
|
2
|
+
import { SupportMessageAuthorType, SupportMessageOrigin, SupportTicketMessageType } from '../enums/support-ticket-message.enum';
|
|
3
|
+
/**
|
|
4
|
+
* A file attached to a ticket or a message.
|
|
5
|
+
*
|
|
6
|
+
* The bytes live in clarion-dms and nowhere else. What is stored here is a
|
|
7
|
+
* reference plus the metadata needed to render a list without fetching
|
|
8
|
+
* anything. `downloadUrl` is minted per request through Clarion after an
|
|
9
|
+
* authorization check - a provider's own attachment URL is never handed to a
|
|
10
|
+
* client, because those URLs are frequently unauthenticated and permanent.
|
|
11
|
+
*/
|
|
12
|
+
export interface SupportTicketAttachment {
|
|
13
|
+
id: string;
|
|
14
|
+
ticketId: string;
|
|
15
|
+
/** Null for an attachment added to the ticket rather than to one message. */
|
|
16
|
+
messageId?: string | null;
|
|
17
|
+
/** The clarion-dms document id. The only durable pointer to the bytes. */
|
|
18
|
+
documentId: number;
|
|
19
|
+
fileName: string;
|
|
20
|
+
mimeType: string;
|
|
21
|
+
sizeBytes: number;
|
|
22
|
+
uploadedByUserId?: number | null;
|
|
23
|
+
/** True when the file arrived from the helpdesk rather than from a Clarion client. */
|
|
24
|
+
fromProvider: boolean;
|
|
25
|
+
/** The provider's id for the same file, when it has one. */
|
|
26
|
+
externalAttachmentId?: string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Short-lived, authorization-checked URL. Present only on a single-ticket
|
|
29
|
+
* read, never on a list, and never persisted.
|
|
30
|
+
*/
|
|
31
|
+
downloadUrl?: string | null;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* One entry in a ticket conversation.
|
|
36
|
+
*
|
|
37
|
+
* Persisted in Clarion even when a helpdesk is the operational source of truth,
|
|
38
|
+
* because the local copy is what makes the customer's screen work during a
|
|
39
|
+
* provider outage, what makes analytics possible, and what makes a change of
|
|
40
|
+
* provider a migration rather than a data loss.
|
|
41
|
+
*/
|
|
42
|
+
export interface SupportTicketMessage {
|
|
43
|
+
id: string;
|
|
44
|
+
ticketId: string;
|
|
45
|
+
type: SupportTicketMessageType;
|
|
46
|
+
authorType: SupportMessageAuthorType;
|
|
47
|
+
/** Null for a system message, or for an agent who exists only in the helpdesk. */
|
|
48
|
+
authorUserId?: number | null;
|
|
49
|
+
/** Display name resolved at read time. For a provider agent, the name the provider gave. */
|
|
50
|
+
authorName?: string | null;
|
|
51
|
+
body: string;
|
|
52
|
+
/** Whether the entry was written here or arrived from the helpdesk. */
|
|
53
|
+
origin: SupportMessageOrigin;
|
|
54
|
+
externalProvider?: SupportProviderCode | null;
|
|
55
|
+
externalMessageId?: string | null;
|
|
56
|
+
attachments: SupportTicketAttachment[];
|
|
57
|
+
/**
|
|
58
|
+
* True once the message has been mirrored to the helpdesk, or when it never
|
|
59
|
+
* needed to be. A client shows an in-flight reply differently, rather than
|
|
60
|
+
* pretending a queued message has been delivered.
|
|
61
|
+
*/
|
|
62
|
+
externalSyncPending: boolean;
|
|
63
|
+
/** Structured detail for a STATUS_MESSAGE, e.g. the two statuses involved. */
|
|
64
|
+
metadata?: Record<string, unknown> | null;
|
|
65
|
+
createdAt: string;
|
|
66
|
+
}
|