clarion-shared-types 1.0.112 → 1.0.114

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.
Files changed (26) hide show
  1. package/dist/cjs/modules/chat/index.js +1 -0
  2. package/dist/cjs/modules/chat/index.js.map +1 -1
  3. package/dist/cjs/modules/chat/interfaces/chat-analytics.js +35 -0
  4. package/dist/cjs/modules/chat/interfaces/chat-analytics.js.map +1 -0
  5. package/dist/cjs/modules/permission/enums/permission-actions.enum.js +6 -0
  6. package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
  7. package/dist/cjs/modules/support/index.js +1 -0
  8. package/dist/cjs/modules/support/index.js.map +1 -1
  9. package/dist/cjs/modules/support/interfaces/support-analytics.js +30 -0
  10. package/dist/cjs/modules/support/interfaces/support-analytics.js.map +1 -0
  11. package/dist/esm/modules/chat/index.js +1 -0
  12. package/dist/esm/modules/chat/index.js.map +1 -1
  13. package/dist/esm/modules/chat/interfaces/chat-analytics.js +34 -0
  14. package/dist/esm/modules/chat/interfaces/chat-analytics.js.map +1 -0
  15. package/dist/esm/modules/permission/enums/permission-actions.enum.js +6 -0
  16. package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
  17. package/dist/esm/modules/support/index.js +1 -0
  18. package/dist/esm/modules/support/index.js.map +1 -1
  19. package/dist/esm/modules/support/interfaces/support-analytics.js +29 -0
  20. package/dist/esm/modules/support/interfaces/support-analytics.js.map +1 -0
  21. package/dist/types/modules/chat/index.d.ts +1 -0
  22. package/dist/types/modules/chat/interfaces/chat-analytics.d.ts +275 -0
  23. package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +2 -0
  24. package/dist/types/modules/support/index.d.ts +1 -0
  25. package/dist/types/modules/support/interfaces/support-analytics.d.ts +390 -0
  26. package/package.json +45 -45
@@ -25,6 +25,7 @@ __exportStar(require("./interfaces/chat-conversation-with-participants"), export
25
25
  __exportStar(require("./interfaces/chat-message"), exports);
26
26
  __exportStar(require("./interfaces/chat-participant"), exports);
27
27
  __exportStar(require("./interfaces/chat-presence-info"), exports);
28
+ __exportStar(require("./interfaces/chat-analytics"), exports);
28
29
  // constants
29
30
  __exportStar(require("./constants/chat-ws-events"), exports);
30
31
  __exportStar(require("./constants/chat-room-names"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/chat/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,wEAAsD;AACtD,sEAAoD;AACpD,iEAA+C;AAC/C,qEAAmD;AAEnD,aAAa;AACb,iEAA+C;AAC/C,mFAAiE;AACjE,4DAA0C;AAC1C,gEAA8C;AAC9C,kEAAgD;AAEhD,YAAY;AACZ,6DAA2C;AAC3C,8DAA4C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/chat/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,wEAAsD;AACtD,sEAAoD;AACpD,iEAA+C;AAC/C,qEAAmD;AAEnD,aAAa;AACb,iEAA+C;AAC/C,mFAAiE;AACjE,4DAA0C;AAC1C,gEAA8C;AAC9C,kEAAgD;AAChD,8DAA4C;AAE5C,YAAY;AACZ,6DAA2C;AAC3C,8DAA4C"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Chat analytics (the admin's Chat Analytics): how the conversations on Clarion went over
4
+ * a period - incident chats, Follow Me chats and direct chats - how much was written and
5
+ * by whom, and above all how quickly a member who wrote was answered.
6
+ *
7
+ * One read, computed by clarion-chat from one consistent snapshot, with who each person
8
+ * is from clarion-authentication. Counts, rates and durations only: never a message, a
9
+ * member's name or a trip's label. The only people named are STAFF - the control room,
10
+ * responders and administrators - as agents are on the support analytics.
11
+ *
12
+ * DURATIONS ARE IN SECONDS, like every analytics contract.
13
+ *
14
+ * How it is counted:
15
+ * - A conversation belongs to the organization, control centre and country of the
16
+ * person who STARTED it: the member who raised the SOS, the traveller on a Follow Me
17
+ * trip, the administrator who opened a direct chat. clarion-chat keeps no organization
18
+ * of its own. Everything written in a conversation is its organization's, whoever
19
+ * wrote it - a guardian, or a responder from another organization.
20
+ * - What a conversation is for (`ChatAnalyticsContext`): INCIDENT is an incident's chat,
21
+ * including a Follow Me chat that an SOS adopted; FOLLOW_ME a trip's; DIRECT one person
22
+ * to another; GROUP any other group.
23
+ * - Who writes (`ChatAnalyticsSenderKind`), from the roles a person holds NOW: anybody
24
+ * with a control-centre role is the CONTROL_ROOM, then RESPONDER, then ADMINISTRATOR
25
+ * (organization roles, Super-Admin) - together, STAFF. Everybody else is a MEMBER: the
26
+ * people the service is for, their guardians included. UNKNOWN is an account that no
27
+ * longer exists. Whoever started an incident's or a Follow Me chat from the app is its
28
+ * MEMBER there, whatever else they hold - staff raise SOSes too.
29
+ * - A member's TURN starts with a member's message that opens a conversation or follows
30
+ * a staff message. It is ANSWERED by the first staff message after it, and the wait is
31
+ * the time between. Turns started in the period, answered whenever.
32
+ * - System messages are counted on their own and never take part in a turn.
33
+ */
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ //# sourceMappingURL=chat-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/chat/interfaces/chat-analytics.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG"}
@@ -54,6 +54,9 @@ var PermissionActions;
54
54
  PermissionActions["READ_INCIDENT"] = "read:incident";
55
55
  PermissionActions["UPDATE_INCIDENT"] = "update:incident";
56
56
  PermissionActions["DELETE_INCIDENT"] = "delete:incident";
57
+ // Chat Analytics: how the chats went and how quickly members were answered - totals
58
+ // only. Held by exactly the roles that read the user analytics.
59
+ PermissionActions["READ_CHAT_ANALYTICS"] = "read:chat-analytics";
57
60
  PermissionActions["CREATE_INCIDENT_CATEGORY_TYPE"] = "create:incident-category-type";
58
61
  PermissionActions["READ_INCIDENT_CATEGORY_TYPE"] = "read:incident-category-type";
59
62
  PermissionActions["UPDATE_INCIDENT_CATEGORY_TYPE"] = "update:incident-category-type";
@@ -115,6 +118,9 @@ var PermissionActions;
115
118
  PermissionActions["MANAGE_SUPPORT_SLA"] = "manage:support-sla";
116
119
  PermissionActions["MANAGE_SUPPORT_CONFIGURATION"] = "manage:support-configuration";
117
120
  PermissionActions["READ_SUPPORT_REPORT"] = "read:support-report";
121
+ // Support Analytics: how the desk did over a period - totals only. Held by
122
+ // exactly the roles that read the support reports.
123
+ PermissionActions["READ_SUPPORT_ANALYTICS"] = "read:support-analytics";
118
124
  PermissionActions["READ_SUPPORT_SYNC"] = "read:support-sync";
119
125
  PermissionActions["MANAGE_SUPPORT_SYNC"] = "manage:support-sync";
120
126
  // Module: Notification
@@ -1 +1 @@
1
- {"version":3,"file":"permission-actions.enum.js","sourceRoot":"","sources":["../../../../../src/modules/permission/enums/permission-actions.enum.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permission-actions.enum.js","sourceRoot":"","sources":["../../../../../src/modules/permission/enums/permission-actions.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,iBAmSX;AAnSD,WAAY,iBAAiB;IACzB,uBAAuB;IACvB,gEAA2C,CAAA;IAC3C,4DAAuC,CAAA;IACvC,gEAA2C,CAAA;IAC3C,gEAA2C,CAAA;IAE3C,kBAAkB;IAClB,sDAAiC,CAAA;IACjC,kDAA6B,CAAA;IAC7B,sDAAiC,CAAA;IACjC,sDAAiC,CAAA;IACjC,wEAAwE;IACxE,mEAAmE;IACnE,oEAA+C,CAAA;IAC/C,0EAAqD,CAAA;IACrD,wEAAmD,CAAA;IACnD,wEAAmD,CAAA;IACnD,wEAAmD,CAAA;IACnD,2EAA2E;IAC3E,4EAA4E;IAC5E,qEAAqE;IACrE,uDAAuD;IACvD,wEAAmD,CAAA;IACnD,4EAAuD,CAAA;IACvD,+EAA+E;IAC/E,2EAA2E;IAC3E,6EAA6E;IAC7E,8EAA8E;IAC9E,2EAA2E;IAC3E,sEAAiD,CAAA;IAEjD,wBAAwB;IACxB,oEAA+C,CAAA;IAC/C,gEAA2C,CAAA;IAC3C,oEAA+C,CAAA;IAC/C,oEAA+C,CAAA;IAE/C,eAAe;IACf,gDAA2B,CAAA;IAC3B,4CAAuB,CAAA;IACvB,gDAA2B,CAAA;IAC3B,gDAA2B,CAAA;IAE3B,eAAe;IACf,gDAA2B,CAAA;IAC3B,4CAAuB,CAAA;IACvB,gDAA2B,CAAA;IAC3B,gDAA2B,CAAA;IAC3B,4GAA4G;IAC5G,gEAA2C,CAAA;IAE3C,mBAAmB;IACnB,wDAAmC,CAAA;IACnC,oDAA+B,CAAA;IAC/B,wDAAmC,CAAA;IACnC,wDAAmC,CAAA;IACnC,oFAAoF;IACpF,gEAAgE;IAChE,gEAA2C,CAAA;IAC3C,oFAA+D,CAAA;IAC/D,gFAA2D,CAAA;IAC3D,oFAA+D,CAAA;IAC/D,oFAA+D,CAAA;IAE/D,uBAAuB;IACvB,kEAA6C,CAAA;IAC7C,8DAAyC,CAAA;IACzC,kEAA6C,CAAA;IAC7C,kEAA6C,CAAA;IAE7C,4EAA4E;IAC5E,wEAAwE;IACxE,6EAA6E;IAC7E,qDAAqD;IACrD,gGAA2E,CAAA;IAC3E,4FAAuE,CAAA;IACvE,gGAA2E,CAAA;IAC3E,gGAA2E,CAAA;IAC3E,sFAAiE,CAAA;IACjE,kFAA6D,CAAA;IAC7D,sFAAiE,CAAA;IACjE,sFAAiE,CAAA;IACjE,sEAAiD,CAAA;IACjD,oEAA+C,CAAA;IAC/C,0EAAqD,CAAA;IACrD,8EAAyD,CAAA;IAEzD,kBAAkB;IAClB,EAAE;IACF,2EAA2E;IAC3E,0EAA0E;IAC1E,uEAAuE;IACvE,+BAA+B;IAC/B,oEAA+C,CAAA;IAC/C,gEAA2C,CAAA;IAC3C,oEAA+C,CAAA;IAC/C,oEAA+C,CAAA;IAC/C,kEAA6C,CAAA;IAC7C,gEAA2C,CAAA;IAC3C,kFAA6D,CAAA;IAC7D,sFAAiE,CAAA;IACjE,kEAA6C,CAAA;IAC7C,oEAA+C,CAAA;IAC/C,yEAAyE;IACzE,gEAA2C,CAAA;IAC3C;;;OAGG;IACH,8DAAyC,CAAA;IACzC,mFAAmF;IACnF,wEAAmD,CAAA;IACnD,oEAA+C,CAAA;IAC/C,gFAAgF;IAChF,sEAAiD,CAAA;IACjD,wEAAmD,CAAA;IACnD,0EAAqD,CAAA;IACrD,0EAAqD,CAAA;IACrD,kEAA6C,CAAA;IAC7C,gEAA2C,CAAA;IAC3C,8DAAyC,CAAA;IACzC,kFAA6D,CAAA;IAC7D,gEAA2C,CAAA;IAC3C,2EAA2E;IAC3E,mDAAmD;IACnD,sEAAiD,CAAA;IACjD,4DAAuC,CAAA;IACvC,gEAA2C,CAAA;IAE3C,uBAAuB;IACvB,0EAA0E;IAC1E,4EAA4E;IAC5E,kFAAkF;IAClF,8EAAyD,CAAA;IACzD,kFAA6D,CAAA;IAC7D,0FAAqE,CAAA;IACrE,sFAAiE,CAAA;IACjE,0FAAqE,CAAA;IACrE,0FAAqE,CAAA;IACrE,sFAAiE,CAAA;IACjE,kFAA6D,CAAA;IAC7D,sFAAiE,CAAA;IACjE,sFAAiE,CAAA;IACjE,2EAA2E;IAC3E,uEAAuE;IACvE,gFAA2D,CAAA;IAC3D,yFAAyF;IACzF,8EAAyD,CAAA;IACzD,yFAAyF;IACzF,kFAA6D,CAAA;IAE7D,gFAAgF;IAChF,gFAAgF;IAChF,kFAAkF;IAClF,kFAAkF;IAClF,8EAA8E;IAC9E,kFAAkF;IAClF,8DAAyC,CAAA;IACzC,0DAAqC,CAAA;IACrC,8DAAyC,CAAA;IACzC,8DAAyC,CAAA;IAEzC,oEAA+C,CAAA;IAC/C,gEAA2C,CAAA;IAC3C,oEAA+C,CAAA;IAC/C,oEAA+C,CAAA;IAE/C,wEAAmD,CAAA;IACnD,oEAA+C,CAAA;IAC/C,wEAAmD,CAAA;IACnD,wEAAmD,CAAA;IAEnD,sFAAiE,CAAA;IACjE,kFAA6D,CAAA;IAC7D,sFAAiE,CAAA;IACjE,sFAAiE,CAAA;IAEjE,0EAAqD,CAAA;IACrD,sEAAiD,CAAA;IACjD,0EAAqD,CAAA;IACrD,0EAAqD,CAAA;IAErD,0DAAqC,CAAA;IAErC,sDAAiC,CAAA;IACjC,kDAA6B,CAAA;IAC7B,4DAAuC,CAAA;IAEvC,kDAA6B,CAAA;IAC7B,8CAAyB,CAAA;IACzB,oDAA+B,CAAA;IAE/B,sDAAiC,CAAA;IACjC,kDAA6B,CAAA;IAE7B,sDAAiC,CAAA;IACjC,kDAA6B,CAAA;IAC7B,sDAAiC,CAAA;IACjC,0DAAqC,CAAA;IACrC,8DAAyC,CAAA;IACzC,sDAAiC,CAAA;IAEjC,8DAAyC,CAAA;IACzC,sDAAiC,CAAA;IACjC,kDAA6B,CAAA;IAE7B,8FAAyE,CAAA;IACzE,kFAA6D,CAAA;IAC7D,0GAAqF,CAAA;IACrF,sFAAiE,CAAA;IAEjE,4FAAuE,CAAA;IACvE,gFAA2D,CAAA;IAC3D,wGAAmF,CAAA;IACnF,oFAA+D,CAAA;IAE/D,8DAAyC,CAAA;IAEzC,4DAAuC,CAAA;IACvC,wDAAmC,CAAA;IACnC,wEAAmD,CAAA;IACnD,kEAA6C,CAAA;IAE7C,oEAA+C,CAAA;IAC/C,wEAAmD,CAAA;IACnD,8EAAyD,CAAA;IAEzD,wEAAmD,CAAA;IACnD,wFAAwF;IACxF,sEAAiD,CAAA;IAEjD,8DAAyC,CAAA;IACzC,gEAA2C,CAAA;IAC3C,kEAA6C,CAAA;IAE7C,iFAAiF;IACjF,2EAA2E;IAC3E,2EAA2E;IAC3E,kEAA6C,CAAA;IAC7C,8DAAyC,CAAA;IACzC,kEAA6C,CAAA;IAC7C,oEAA+C,CAAA;IAC/C,oEAA+C,CAAA;IAC/C,kEAA6C,CAAA;IAC7C,8DAAyC,CAAA;IACzC,kEAA6C,CAAA;IAC7C,4EAAuD,CAAA;IACvD,gFAAgF;IAChF,gFAAgF;IAChF,wEAAmD,CAAA;IAEnD,uBAAuB;IACvB,+EAA+E;IAC/E,mFAAmF;IACnF,4DAA4D;IAC5D,sFAAiE,CAAA;IACjE,kFAA6D,CAAA;IAC7D,sFAAiE,CAAA;IACjE,sFAAiE,CAAA;IACjE,kFAA6D,CAAA;IAC7D,4EAAuD,CAAA;IACvD,8EAAyD,CAAA;IACzD,8FAAyE,CAAA;IACzE,kGAA6E,CAAA;IAC7E,gFAA2D,CAAA;IAC3D,gFAAgF;IAChF,sFAAsF;IACtF,kFAA6D,CAAA;IAE7D,gFAAgF;IAChF,0EAA0E;IAC1E,gDAAgD;IAChD,0DAAqC,CAAA;IACrC,4DAAuC,CAAA;IACvC,8EAAyD,CAAA;IACzD,2EAA2E;IAC3E,oEAA+C,CAAA;IAC/C,iFAAiF;IACjF,4EAA4E;IAC5E,mEAAmE;IACnE,oDAA+B,CAAA;IAC/B,sDAAiC,CAAA;IACjC,wDAAmC,CAAA;IAEnC,4DAA4D;IAC5D,8DAAyC,CAAA;IACzC,wGAAwG;IACxG,4DAAuC,CAAA;IACvC,wGAAwG;IACxG,gEAA2C,CAAA;AAC/C,CAAC,EAnSW,iBAAiB,iCAAjB,iBAAiB,QAmS5B"}
@@ -22,6 +22,7 @@ __exportStar(require("./interfaces/customer-feedback.dto"), exports);
22
22
  __exportStar(require("./interfaces/support-configuration.dto"), exports);
23
23
  __exportStar(require("./interfaces/support-sync.dto"), exports);
24
24
  __exportStar(require("./interfaces/support-reports.dto"), exports);
25
+ __exportStar(require("./interfaces/support-analytics"), exports);
25
26
  // Utilities
26
27
  __exportStar(require("./utils/support-display.util"), exports);
27
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/support/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,wDAAsC;AAEtC,oBAAoB;AACpB,kEAAgD;AAChD,qEAAmD;AACnD,yEAAuD;AACvD,gEAA8C;AAC9C,mEAAiD;AAEjD,YAAY;AACZ,+DAA6C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/support/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,wDAAsC;AAEtC,oBAAoB;AACpB,kEAAgD;AAChD,qEAAmD;AACnD,yEAAuD;AACvD,gEAA8C;AAC9C,mEAAiD;AACjD,iEAA+C;AAE/C,YAAY;AACZ,+DAA6C"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ /**
3
+ * Support analytics (the admin's Support Analytics): how the support desk did over a
4
+ * period - tickets raised and settled, how quickly they were answered and resolved,
5
+ * the SLA, what customers asked about, the agents, what customers thought of the
6
+ * help they got, the feedback they left, and whether the helpdesk mirror kept up.
7
+ *
8
+ * One read, computed by clarion-support from one consistent snapshot, so every number
9
+ * on a dashboard agrees with every other. Counts, rates and durations only: never a
10
+ * customer's name, a subject or a message. The only people named are AGENTS, as on
11
+ * the desk's own team report.
12
+ *
13
+ * DURATIONS ARE IN SECONDS, like every analytics contract (the support REPORTS use
14
+ * minutes; this is a separate contract). They are calendar time - an SLA measured in
15
+ * business hours can be met while the calendar duration looks long.
16
+ *
17
+ * How it is counted:
18
+ * - A ticket is RAISED when created. It is RESOLVED, CLOSED, REOPENED or CANCELLED
19
+ * when its status history says it moved there - a reopen clears the ticket's own
20
+ * resolvedAt, so the history is the only record of the earlier resolution.
21
+ * - Time to resolve runs from raising to the FIRST time the ticket was resolved or
22
+ * closed, for tickets first settled in the period: it measures the original
23
+ * request and does not move when a ticket is reopened.
24
+ * - SLA compliance counts SETTLED clocks only (met or breached); a running clock is
25
+ * neither. Breach alerts are the monitor's breach events in the period - a ticket
26
+ * whose deadline later moved (waiting on the customer, a reopen) can be breached
27
+ * once and still end up met.
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ //# sourceMappingURL=support-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/support/interfaces/support-analytics.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG"}
@@ -9,6 +9,7 @@ export * from './interfaces/chat-conversation-with-participants';
9
9
  export * from './interfaces/chat-message';
10
10
  export * from './interfaces/chat-participant';
11
11
  export * from './interfaces/chat-presence-info';
12
+ export * from './interfaces/chat-analytics';
12
13
  // constants
13
14
  export * from './constants/chat-ws-events';
14
15
  export * from './constants/chat-room-names';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/chat/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AAEnD,aAAa;AACb,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kDAAkD,CAAC;AACjE,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAEhD,YAAY;AACZ,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/chat/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AAEnD,aAAa;AACb,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kDAAkD,CAAC;AACjE,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,YAAY;AACZ,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Chat analytics (the admin's Chat Analytics): how the conversations on Clarion went over
3
+ * a period - incident chats, Follow Me chats and direct chats - how much was written and
4
+ * by whom, and above all how quickly a member who wrote was answered.
5
+ *
6
+ * One read, computed by clarion-chat from one consistent snapshot, with who each person
7
+ * is from clarion-authentication. Counts, rates and durations only: never a message, a
8
+ * member's name or a trip's label. The only people named are STAFF - the control room,
9
+ * responders and administrators - as agents are on the support analytics.
10
+ *
11
+ * DURATIONS ARE IN SECONDS, like every analytics contract.
12
+ *
13
+ * How it is counted:
14
+ * - A conversation belongs to the organization, control centre and country of the
15
+ * person who STARTED it: the member who raised the SOS, the traveller on a Follow Me
16
+ * trip, the administrator who opened a direct chat. clarion-chat keeps no organization
17
+ * of its own. Everything written in a conversation is its organization's, whoever
18
+ * wrote it - a guardian, or a responder from another organization.
19
+ * - What a conversation is for (`ChatAnalyticsContext`): INCIDENT is an incident's chat,
20
+ * including a Follow Me chat that an SOS adopted; FOLLOW_ME a trip's; DIRECT one person
21
+ * to another; GROUP any other group.
22
+ * - Who writes (`ChatAnalyticsSenderKind`), from the roles a person holds NOW: anybody
23
+ * with a control-centre role is the CONTROL_ROOM, then RESPONDER, then ADMINISTRATOR
24
+ * (organization roles, Super-Admin) - together, STAFF. Everybody else is a MEMBER: the
25
+ * people the service is for, their guardians included. UNKNOWN is an account that no
26
+ * longer exists. Whoever started an incident's or a Follow Me chat from the app is its
27
+ * MEMBER there, whatever else they hold - staff raise SOSes too.
28
+ * - A member's TURN starts with a member's message that opens a conversation or follows
29
+ * a staff message. It is ANSWERED by the first staff message after it, and the wait is
30
+ * the time between. Turns started in the period, answered whenever.
31
+ * - System messages are counted on their own and never take part in a turn.
32
+ */
33
+ export {};
34
+ //# sourceMappingURL=chat-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/chat/interfaces/chat-analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG"}
@@ -51,6 +51,9 @@ export var PermissionActions;
51
51
  PermissionActions["READ_INCIDENT"] = "read:incident";
52
52
  PermissionActions["UPDATE_INCIDENT"] = "update:incident";
53
53
  PermissionActions["DELETE_INCIDENT"] = "delete:incident";
54
+ // Chat Analytics: how the chats went and how quickly members were answered - totals
55
+ // only. Held by exactly the roles that read the user analytics.
56
+ PermissionActions["READ_CHAT_ANALYTICS"] = "read:chat-analytics";
54
57
  PermissionActions["CREATE_INCIDENT_CATEGORY_TYPE"] = "create:incident-category-type";
55
58
  PermissionActions["READ_INCIDENT_CATEGORY_TYPE"] = "read:incident-category-type";
56
59
  PermissionActions["UPDATE_INCIDENT_CATEGORY_TYPE"] = "update:incident-category-type";
@@ -112,6 +115,9 @@ export var PermissionActions;
112
115
  PermissionActions["MANAGE_SUPPORT_SLA"] = "manage:support-sla";
113
116
  PermissionActions["MANAGE_SUPPORT_CONFIGURATION"] = "manage:support-configuration";
114
117
  PermissionActions["READ_SUPPORT_REPORT"] = "read:support-report";
118
+ // Support Analytics: how the desk did over a period - totals only. Held by
119
+ // exactly the roles that read the support reports.
120
+ PermissionActions["READ_SUPPORT_ANALYTICS"] = "read:support-analytics";
115
121
  PermissionActions["READ_SUPPORT_SYNC"] = "read:support-sync";
116
122
  PermissionActions["MANAGE_SUPPORT_SYNC"] = "manage:support-sync";
117
123
  // Module: Notification
@@ -1 +1 @@
1
- {"version":3,"file":"permission-actions.enum.js","sourceRoot":"","sources":["../../../../../src/modules/permission/enums/permission-actions.enum.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permission-actions.enum.js","sourceRoot":"","sources":["../../../../../src/modules/permission/enums/permission-actions.enum.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export * from './interfaces/customer-feedback.dto';
6
6
  export * from './interfaces/support-configuration.dto';
7
7
  export * from './interfaces/support-sync.dto';
8
8
  export * from './interfaces/support-reports.dto';
9
+ export * from './interfaces/support-analytics';
9
10
  // Utilities
10
11
  export * from './utils/support-display.util';
11
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/support/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,uBAAuB,CAAC;AAEtC,oBAAoB;AACpB,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AAEjD,YAAY;AACZ,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/support/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,uBAAuB,CAAC;AAEtC,oBAAoB;AACpB,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAE/C,YAAY;AACZ,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Support analytics (the admin's Support Analytics): how the support desk did over a
3
+ * period - tickets raised and settled, how quickly they were answered and resolved,
4
+ * the SLA, what customers asked about, the agents, what customers thought of the
5
+ * help they got, the feedback they left, and whether the helpdesk mirror kept up.
6
+ *
7
+ * One read, computed by clarion-support from one consistent snapshot, so every number
8
+ * on a dashboard agrees with every other. Counts, rates and durations only: never a
9
+ * customer's name, a subject or a message. The only people named are AGENTS, as on
10
+ * the desk's own team report.
11
+ *
12
+ * DURATIONS ARE IN SECONDS, like every analytics contract (the support REPORTS use
13
+ * minutes; this is a separate contract). They are calendar time - an SLA measured in
14
+ * business hours can be met while the calendar duration looks long.
15
+ *
16
+ * How it is counted:
17
+ * - A ticket is RAISED when created. It is RESOLVED, CLOSED, REOPENED or CANCELLED
18
+ * when its status history says it moved there - a reopen clears the ticket's own
19
+ * resolvedAt, so the history is the only record of the earlier resolution.
20
+ * - Time to resolve runs from raising to the FIRST time the ticket was resolved or
21
+ * closed, for tickets first settled in the period: it measures the original
22
+ * request and does not move when a ticket is reopened.
23
+ * - SLA compliance counts SETTLED clocks only (met or breached); a running clock is
24
+ * neither. Breach alerts are the monitor's breach events in the period - a ticket
25
+ * whose deadline later moved (waiting on the customer, a reopen) can be breached
26
+ * once and still end up met.
27
+ */
28
+ export {};
29
+ //# sourceMappingURL=support-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/support/interfaces/support-analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG"}
@@ -7,5 +7,6 @@ export * from './interfaces/chat-conversation-with-participants';
7
7
  export * from './interfaces/chat-message';
8
8
  export * from './interfaces/chat-participant';
9
9
  export * from './interfaces/chat-presence-info';
10
+ export * from './interfaces/chat-analytics';
10
11
  export * from './constants/chat-ws-events';
11
12
  export * from './constants/chat-room-names';
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Chat analytics (the admin's Chat Analytics): how the conversations on Clarion went over
3
+ * a period - incident chats, Follow Me chats and direct chats - how much was written and
4
+ * by whom, and above all how quickly a member who wrote was answered.
5
+ *
6
+ * One read, computed by clarion-chat from one consistent snapshot, with who each person
7
+ * is from clarion-authentication. Counts, rates and durations only: never a message, a
8
+ * member's name or a trip's label. The only people named are STAFF - the control room,
9
+ * responders and administrators - as agents are on the support analytics.
10
+ *
11
+ * DURATIONS ARE IN SECONDS, like every analytics contract.
12
+ *
13
+ * How it is counted:
14
+ * - A conversation belongs to the organization, control centre and country of the
15
+ * person who STARTED it: the member who raised the SOS, the traveller on a Follow Me
16
+ * trip, the administrator who opened a direct chat. clarion-chat keeps no organization
17
+ * of its own. Everything written in a conversation is its organization's, whoever
18
+ * wrote it - a guardian, or a responder from another organization.
19
+ * - What a conversation is for (`ChatAnalyticsContext`): INCIDENT is an incident's chat,
20
+ * including a Follow Me chat that an SOS adopted; FOLLOW_ME a trip's; DIRECT one person
21
+ * to another; GROUP any other group.
22
+ * - Who writes (`ChatAnalyticsSenderKind`), from the roles a person holds NOW: anybody
23
+ * with a control-centre role is the CONTROL_ROOM, then RESPONDER, then ADMINISTRATOR
24
+ * (organization roles, Super-Admin) - together, STAFF. Everybody else is a MEMBER: the
25
+ * people the service is for, their guardians included. UNKNOWN is an account that no
26
+ * longer exists. Whoever started an incident's or a Follow Me chat from the app is its
27
+ * MEMBER there, whatever else they hold - staff raise SOSes too.
28
+ * - A member's TURN starts with a member's message that opens a conversation or follows
29
+ * a staff message. It is ANSWERED by the first staff message after it, and the wait is
30
+ * the time between. Turns started in the period, answered whenever.
31
+ * - System messages are counted on their own and never take part in a turn.
32
+ */
33
+ /** How the period is cut into points for the charts. Chosen by the service from the length of the period. */
34
+ export type ChatAnalyticsBucket = 'hour' | 'day' | 'week' | 'month';
35
+ /** What a conversation is for. */
36
+ export type ChatAnalyticsContext = 'INCIDENT' | 'FOLLOW_ME' | 'DIRECT' | 'GROUP';
37
+ /** Who wrote a message: the three kinds of staff, a member, or an account that no longer exists. */
38
+ export type ChatAnalyticsSenderKind = 'CONTROL_ROOM' | 'RESPONDER' | 'ADMINISTRATOR' | 'MEMBER' | 'UNKNOWN';
39
+ export interface ChatAnalyticsRange {
40
+ /** Inclusive, ISO 8601. The first conversation when the period asked for was "forever". */
41
+ from: string;
42
+ /** Exclusive, ISO 8601. */
43
+ to: string;
44
+ bucket: ChatAnalyticsBucket;
45
+ /** IANA time zone the buckets and the hour-of-week grid are cut in. */
46
+ timeZone: string;
47
+ }
48
+ /** A count by a key (a context, a kind, a band), largest first unless the section says otherwise. */
49
+ export interface ChatAnalyticsCount<K extends string = string> {
50
+ key: K;
51
+ count: number;
52
+ }
53
+ /** Median and 90th percentile of one duration, in seconds; null when nothing was measured. */
54
+ export interface ChatAnalyticsDuration {
55
+ median: number | null;
56
+ p90: number | null;
57
+ /** How many were measured. */
58
+ count: number;
59
+ }
60
+ /** One kind of conversation and how it went in the period. */
61
+ export interface ChatAnalyticsContextRow {
62
+ context: ChatAnalyticsContext;
63
+ /** Started in the period. */
64
+ started: number;
65
+ /** Of those, written in at least once (whenever). */
66
+ used: number;
67
+ /** Written in during the period, whenever started. */
68
+ active: number;
69
+ /** Messages written in the period, not counting system messages. */
70
+ messages: number;
71
+ memberMessages: number;
72
+ staffMessages: number;
73
+ /** Members' turns started in the period, and of those answered. */
74
+ turns: number;
75
+ answered: number;
76
+ /** answered / turns, as a percentage. */
77
+ replyRate: number | null;
78
+ medianSecondsToReply: number | null;
79
+ }
80
+ /** The conversations: what was started, what was used, and who was in them. */
81
+ export interface ChatAnalyticsConversations {
82
+ /** Started in the period. */
83
+ started: number;
84
+ /** Of those, written in at least once (whenever) - and as a percentage. */
85
+ used: number;
86
+ usedRate: number | null;
87
+ /** Of those, a member AND staff both wrote in - a conversation rather than a notice. */
88
+ twoWay: number;
89
+ /** Written in during the period, whenever started. */
90
+ active: number;
91
+ /** People seated in the conversations started in the period, each counted once. */
92
+ people: number;
93
+ /** People per conversation started in the period. */
94
+ averageParticipants: number | null;
95
+ /**
96
+ * In the period, in any conversation in scope: people added AFTER it started (a
97
+ * responder assigned, a guardian added - not the people it started with), and seats
98
+ * given up (removed, or left).
99
+ */
100
+ joined: number;
101
+ left: number;
102
+ /** Start to the first message - conversations started in the period that were used. */
103
+ toFirstMessage: ChatAnalyticsDuration;
104
+ /** Start to the first staff message - conversations started in the period that staff wrote in. */
105
+ toFirstStaffMessage: ChatAnalyticsDuration;
106
+ /** INCIDENT, FOLLOW_ME, DIRECT, GROUP - in that order, zeros included. */
107
+ byContext: ChatAnalyticsContextRow[];
108
+ /** Conversations started in the period by how many people are in them now: 1, 2, 3, 4, 5, 6+ - in that order. */
109
+ bySize: ChatAnalyticsCount[];
110
+ /** Conversations started in the period, by the country of whoever started them. */
111
+ byCountry: ChatAnalyticsCount[];
112
+ }
113
+ /** The messages written in the period. */
114
+ export interface ChatAnalyticsMessages {
115
+ /** Written by people (system messages are `system`). */
116
+ sent: number;
117
+ fromMembers: number;
118
+ fromStaff: number;
119
+ /** By accounts that no longer exist. */
120
+ fromUnknown: number;
121
+ system: number;
122
+ /** Removed in the period, whenever written. */
123
+ removed: number;
124
+ /** Different people who wrote. */
125
+ senders: number;
126
+ memberSenders: number;
127
+ staffSenders: number;
128
+ /** sent / active conversations. */
129
+ perActiveConversation: number | null;
130
+ /** CONTROL_ROOM, RESPONDER, ADMINISTRATOR, MEMBER, UNKNOWN - in that order, zeros included. */
131
+ bySenderKind: ChatAnalyticsCount<ChatAnalyticsSenderKind>[];
132
+ /** Characters, never the words. */
133
+ medianLength: number | null;
134
+ /** SHORT (under 20 characters), MEDIUM (20-79), LONG (80-279), VERY_LONG (280+) - in that order. */
135
+ byLength: ChatAnalyticsCount[];
136
+ }
137
+ /** How quickly members were answered. */
138
+ export interface ChatAnalyticsReplies {
139
+ /** Members' turns started in the period. */
140
+ turns: number;
141
+ answered: number;
142
+ /** Never answered - the last word in that conversation is still the member's. */
143
+ unanswered: number;
144
+ /** answered / turns, as a percentage. */
145
+ replyRate: number | null;
146
+ /** The member's message to the first staff message after it - turns answered. */
147
+ toReply: ChatAnalyticsDuration;
148
+ /** Answered within a minute, 5 minutes, 15 minutes, an hour, later: UNDER_1M, 1-5M, 5-15M, 15-60M, OVER_1H - in that order. */
149
+ byWait: ChatAnalyticsCount[];
150
+ /** Answered within 5 minutes, as a percentage of turns. */
151
+ withinFiveMinutes: number | null;
152
+ }
153
+ /** One member of staff who wrote in the period. Staff are named; members never are. */
154
+ export interface ChatAnalyticsStaffRow {
155
+ userId: number;
156
+ name: string | null;
157
+ kind: ChatAnalyticsSenderKind;
158
+ /** Messages they wrote in the period. */
159
+ messages: number;
160
+ /** Conversations they wrote in, in the period. */
161
+ conversations: number;
162
+ /** Members' turns started in the period that they were first to answer. */
163
+ replies: number;
164
+ medianSecondsToReply: number | null;
165
+ }
166
+ /** One conversation, for a table - never its messages, its members or its label. */
167
+ export interface ChatAnalyticsConversationRow {
168
+ id: string;
169
+ context: ChatAnalyticsContext;
170
+ /** The incident it belongs to, for an incident's chat. */
171
+ incidentId: number | null;
172
+ organizationId: number | null;
173
+ startedAt: string;
174
+ /** People in it now. */
175
+ participants: number;
176
+ /** Written in the period. */
177
+ messages: number;
178
+ memberMessages: number;
179
+ staffMessages: number;
180
+ /** Its latest message, whenever. */
181
+ lastMessageAt: string | null;
182
+ /** Its members' turns started in the period, answered. */
183
+ medianSecondsToReply: number | null;
184
+ /** The last word is a member's, and nobody from staff has answered it. */
185
+ awaitingReply: boolean;
186
+ /** When that unanswered member's turn began; null when nothing is waiting. */
187
+ waitingSince: string | null;
188
+ }
189
+ /** One point on the charts: a bucket of the period. */
190
+ export interface ChatAnalyticsPoint {
191
+ /** Local wall-clock start of the bucket, in `range.timeZone` (no offset). */
192
+ bucket: string;
193
+ /** Conversations started in the bucket, and of those incident chats. */
194
+ started: number;
195
+ incidentChats: number;
196
+ memberMessages: number;
197
+ staffMessages: number;
198
+ /** Conversations written in during the bucket. */
199
+ active: number;
200
+ /** Members' turns started in the bucket, and of those answered. */
201
+ turns: number;
202
+ answered: number;
203
+ medianSecondsToReply: number | null;
204
+ }
205
+ /** One hour of the week. Weekday 1 is Monday. */
206
+ export interface ChatAnalyticsHeatCell {
207
+ weekday: number;
208
+ hour: number;
209
+ /** When members write. */
210
+ memberMessages: number;
211
+ /** When staff write. */
212
+ staffMessages: number;
213
+ }
214
+ /** The previous period of the same length, for the change on each headline figure. */
215
+ export interface ChatAnalyticsPrevious {
216
+ from: string;
217
+ to: string;
218
+ started: number;
219
+ used: number;
220
+ active: number;
221
+ sent: number;
222
+ memberMessages: number;
223
+ staffMessages: number;
224
+ senders: number;
225
+ turns: number;
226
+ answered: number;
227
+ replyRate: number | null;
228
+ medianSecondsToReply: number | null;
229
+ }
230
+ /** A Super-Admin's view of every organization: one row each, busiest first. */
231
+ export interface ChatAnalyticsOrganizationRow {
232
+ organizationId: number;
233
+ started: number;
234
+ active: number;
235
+ sent: number;
236
+ memberMessages: number;
237
+ staffMessages: number;
238
+ turns: number;
239
+ replyRate: number | null;
240
+ medianSecondsToReply: number | null;
241
+ }
242
+ export interface ChatAnalytics {
243
+ /** Whose figures: one organization (and one control centre in it), or null for every organization. */
244
+ organizationId: number | null;
245
+ controlCentreId: number | null;
246
+ /** The one country the figures are narrowed to, or null for every country. */
247
+ countryCode: string | null;
248
+ range: ChatAnalyticsRange;
249
+ generatedAt: string;
250
+ previous: ChatAnalyticsPrevious | null;
251
+ /** Countries with conversations in scope, whatever country is chosen - for narrowing to one. */
252
+ countryOptions: ChatAnalyticsCount[];
253
+ conversations: ChatAnalyticsConversations;
254
+ messages: ChatAnalyticsMessages;
255
+ replies: ChatAnalyticsReplies;
256
+ /** Staff who wrote in the period, busiest first - at most 25. */
257
+ staff: ChatAnalyticsStaffRow[];
258
+ /** The 15 conversations most written in during the period. */
259
+ busiest: ChatAnalyticsConversationRow[];
260
+ /** Conversations written in during the period whose member is still waiting for an answer, latest first - at most 25. */
261
+ waiting: ChatAnalyticsConversationRow[];
262
+ timeline: ChatAnalyticsPoint[];
263
+ /** All 168 hours of the week, Monday first, zeros included. */
264
+ heatmap: ChatAnalyticsHeatCell[];
265
+ /** A Super-Admin looking at every organization only. */
266
+ byOrganization?: ChatAnalyticsOrganizationRow[];
267
+ }
268
+ /** What a dashboard asks: the period, one country - and, for a Super-Admin, whose figures. */
269
+ export interface ChatAnalyticsQuery {
270
+ from?: string;
271
+ to?: string;
272
+ timeZone?: string;
273
+ organizationId?: number;
274
+ countryCode?: string;
275
+ }
@@ -32,6 +32,7 @@ export declare enum PermissionActions {
32
32
  READ_INCIDENT = "read:incident",
33
33
  UPDATE_INCIDENT = "update:incident",
34
34
  DELETE_INCIDENT = "delete:incident",
35
+ READ_CHAT_ANALYTICS = "read:chat-analytics",
35
36
  CREATE_INCIDENT_CATEGORY_TYPE = "create:incident-category-type",
36
37
  READ_INCIDENT_CATEGORY_TYPE = "read:incident-category-type",
37
38
  UPDATE_INCIDENT_CATEGORY_TYPE = "update:incident-category-type",
@@ -82,6 +83,7 @@ export declare enum PermissionActions {
82
83
  MANAGE_SUPPORT_SLA = "manage:support-sla",
83
84
  MANAGE_SUPPORT_CONFIGURATION = "manage:support-configuration",
84
85
  READ_SUPPORT_REPORT = "read:support-report",
86
+ READ_SUPPORT_ANALYTICS = "read:support-analytics",
85
87
  READ_SUPPORT_SYNC = "read:support-sync",
86
88
  MANAGE_SUPPORT_SYNC = "manage:support-sync",
87
89
  READ_NOTIFICATION_BRANDING = "read:notification-branding",
@@ -4,4 +4,5 @@ export * from './interfaces/customer-feedback.dto';
4
4
  export * from './interfaces/support-configuration.dto';
5
5
  export * from './interfaces/support-sync.dto';
6
6
  export * from './interfaces/support-reports.dto';
7
+ export * from './interfaces/support-analytics';
7
8
  export * from './utils/support-display.util';
@@ -0,0 +1,390 @@
1
+ /**
2
+ * Support analytics (the admin's Support Analytics): how the support desk did over a
3
+ * period - tickets raised and settled, how quickly they were answered and resolved,
4
+ * the SLA, what customers asked about, the agents, what customers thought of the
5
+ * help they got, the feedback they left, and whether the helpdesk mirror kept up.
6
+ *
7
+ * One read, computed by clarion-support from one consistent snapshot, so every number
8
+ * on a dashboard agrees with every other. Counts, rates and durations only: never a
9
+ * customer's name, a subject or a message. The only people named are AGENTS, as on
10
+ * the desk's own team report.
11
+ *
12
+ * DURATIONS ARE IN SECONDS, like every analytics contract (the support REPORTS use
13
+ * minutes; this is a separate contract). They are calendar time - an SLA measured in
14
+ * business hours can be met while the calendar duration looks long.
15
+ *
16
+ * How it is counted:
17
+ * - A ticket is RAISED when created. It is RESOLVED, CLOSED, REOPENED or CANCELLED
18
+ * when its status history says it moved there - a reopen clears the ticket's own
19
+ * resolvedAt, so the history is the only record of the earlier resolution.
20
+ * - Time to resolve runs from raising to the FIRST time the ticket was resolved or
21
+ * closed, for tickets first settled in the period: it measures the original
22
+ * request and does not move when a ticket is reopened.
23
+ * - SLA compliance counts SETTLED clocks only (met or breached); a running clock is
24
+ * neither. Breach alerts are the monitor's breach events in the period - a ticket
25
+ * whose deadline later moved (waiting on the customer, a reopen) can be breached
26
+ * once and still end up met.
27
+ */
28
+ /** How the period is cut into points for the charts. Chosen by the service from the length of the period. */
29
+ export type SupportAnalyticsBucket = 'hour' | 'day' | 'week' | 'month';
30
+ export interface SupportAnalyticsRange {
31
+ /** Inclusive, ISO 8601. The first ticket or feedback when the period asked for was "forever". */
32
+ from: string;
33
+ /** Exclusive, ISO 8601. */
34
+ to: string;
35
+ bucket: SupportAnalyticsBucket;
36
+ /** IANA time zone the buckets and the hour-of-week grid are cut in. */
37
+ timeZone: string;
38
+ }
39
+ /** A count by a key (a status, a channel, a reason), largest first unless the section says otherwise. */
40
+ export interface SupportAnalyticsCount<K extends string = string> {
41
+ key: K;
42
+ count: number;
43
+ }
44
+ /** Median and 90th percentile of one duration, in seconds; null when nothing was measured. */
45
+ export interface SupportAnalyticsDuration {
46
+ median: number | null;
47
+ p90: number | null;
48
+ /** How many were measured. */
49
+ count: number;
50
+ }
51
+ /** A configured thing tickets are grouped by - a category, a queue, a team - and how its tickets went. */
52
+ export interface SupportAnalyticsGroupRow {
53
+ /** The category, queue or team id; null for tickets with none. */
54
+ id: string | null;
55
+ name: string | null;
56
+ /** Raised in the period. */
57
+ raised: number;
58
+ /** First settled (resolved or closed) in the period. */
59
+ resolved: number;
60
+ /** Open now, whenever raised. */
61
+ openNow: number;
62
+ medianSecondsToFirstResponse: number | null;
63
+ medianSecondsToResolve: number | null;
64
+ /** Raised in the period with a breached clock. */
65
+ breached: number;
66
+ }
67
+ /** Tickets: what came in, what was settled, and what is open now. */
68
+ export interface SupportAnalyticsTickets {
69
+ raised: number;
70
+ /** Different customers who raised them. */
71
+ customers: number;
72
+ /** Raised by promoting a piece of customer feedback. */
73
+ fromFeedback: number;
74
+ /** Tickets resolved in the period (a status move to RESOLVED). */
75
+ resolved: number;
76
+ closed: number;
77
+ reopened: number;
78
+ cancelled: number;
79
+ /** Reopened / (resolved or closed) in the period, as a percentage. */
80
+ reopenRate: number | null;
81
+ /** Open at the start and at the end of the period (from the status history). */
82
+ backlogStart: number;
83
+ backlogEnd: number;
84
+ /** NOW, whatever the period. */
85
+ openNow: number;
86
+ unassignedNow: number;
87
+ waitingOnCustomerNow: number;
88
+ waitingOnInternalTeamNow: number;
89
+ /** Open, and nobody has answered yet. */
90
+ awaitingFirstResponseNow: number;
91
+ /** When the oldest open ticket was raised; null when nothing is open. */
92
+ oldestOpenAt: string | null;
93
+ /** Tickets raised in the period, by where they stand now - every status, in lifecycle order. */
94
+ byStatus: SupportAnalyticsCount[];
95
+ /** CRITICAL, URGENT, HIGH, NORMAL, LOW - in that order, zeros included. */
96
+ byPriority: SupportAnalyticsCount[];
97
+ byChannel: SupportAnalyticsCount[];
98
+ bySource: SupportAnalyticsCount[];
99
+ byCountry: SupportAnalyticsCount[];
100
+ /** The app it was raised from; NONE when not recorded. */
101
+ byApp: SupportAnalyticsCount[];
102
+ /** What the ticket is about (an incident, a payment...), each linked kind counted once per ticket. */
103
+ byRelatedType: SupportAnalyticsCount[];
104
+ /** The ten most used tags. */
105
+ byTag: SupportAnalyticsCount[];
106
+ byCategory: SupportAnalyticsGroupRow[];
107
+ byQueue: SupportAnalyticsGroupRow[];
108
+ byTeam: SupportAnalyticsGroupRow[];
109
+ }
110
+ /** How long each step took. */
111
+ export interface SupportAnalyticsTimings {
112
+ /** Raised to the first assignment to an agent - tickets raised in the period. */
113
+ toAssign: SupportAnalyticsDuration;
114
+ /** Raised to the first reply - tickets raised in the period. */
115
+ toFirstResponse: SupportAnalyticsDuration;
116
+ /** Raised to first resolved or closed - tickets first settled in the period. */
117
+ toResolve: SupportAnalyticsDuration;
118
+ /** Time spent waiting on the customer (the SLA clock paused) - tickets first settled in the period that waited. */
119
+ waitingOnCustomer: SupportAnalyticsDuration;
120
+ }
121
+ /** One SLA clock over the tickets raised in the period. */
122
+ export interface SupportAnalyticsSlaClock {
123
+ met: number;
124
+ breached: number;
125
+ /** On track, at risk or paused - not settled yet. */
126
+ running: number;
127
+ /** No policy applied. */
128
+ notApplicable: number;
129
+ /** met / (met + breached), as a percentage. */
130
+ rate: number | null;
131
+ }
132
+ /** The SLA by priority - tickets raised in the period. */
133
+ export interface SupportAnalyticsSlaPriorityRow {
134
+ priority: string;
135
+ raised: number;
136
+ firstResponseMet: number;
137
+ firstResponseBreached: number;
138
+ resolutionMet: number;
139
+ resolutionBreached: number;
140
+ medianSecondsToFirstResponse: number | null;
141
+ medianSecondsToResolve: number | null;
142
+ /** The policy's targets, as applied to these tickets (average), in minutes as policies are written. */
143
+ firstResponseTargetMinutes: number | null;
144
+ resolutionTargetMinutes: number | null;
145
+ }
146
+ export interface SupportAnalyticsSla {
147
+ firstResponse: SupportAnalyticsSlaClock;
148
+ resolution: SupportAnalyticsSlaClock;
149
+ /** Breach alerts raised by the monitor in the period - first response and resolution. */
150
+ breachAlerts: number;
151
+ firstResponseBreachAlerts: number;
152
+ resolutionBreachAlerts: number;
153
+ /** Warnings raised in the period (a deadline close). */
154
+ warnings: number;
155
+ /** NOW: open tickets with a clock at risk, or already breached. */
156
+ atRiskNow: number;
157
+ breachedOpenNow: number;
158
+ byPriority: SupportAnalyticsSlaPriorityRow[];
159
+ }
160
+ /** The messages on tickets in the period. */
161
+ export interface SupportAnalyticsConversation {
162
+ customerMessages: number;
163
+ agentReplies: number;
164
+ /** Of the agent replies, those written in the helpdesk (Zammad, Freshdesk) and synced in. */
165
+ repliesFromHelpdesk: number;
166
+ internalNotes: number;
167
+ /** System and status messages. */
168
+ systemMessages: number;
169
+ /** Agents who replied from Clarion (helpdesk agents have no Clarion account to count). */
170
+ agentsReplying: number;
171
+ /** Agent replies on the tickets first settled in the period, per ticket. */
172
+ repliesPerResolvedTicket: number | null;
173
+ /** Customer messages on those tickets, per ticket - the back-and-forth it took. */
174
+ customerMessagesPerResolvedTicket: number | null;
175
+ }
176
+ /** One agent's work. Agents are named, as on the desk's team report. */
177
+ export interface SupportAnalyticsAgentRow {
178
+ agentUserId: number;
179
+ name: string | null;
180
+ /** Open and assigned to them now. */
181
+ openNow: number;
182
+ /** Tickets raised in the period that are assigned to them. */
183
+ raised: number;
184
+ /** Tickets assigned to them first settled in the period. */
185
+ resolved: number;
186
+ /** Replies they wrote in the period. */
187
+ replies: number;
188
+ medianSecondsToFirstResponse: number | null;
189
+ medianSecondsToResolve: number | null;
190
+ /** Their tickets raised in the period with a breached clock. */
191
+ breached: number;
192
+ /** Ratings left in the period on their tickets. */
193
+ ratings: number;
194
+ ratingAverage: number | null;
195
+ }
196
+ export interface SupportAnalyticsAgents {
197
+ /** Agents assigned anything open, or who settled, were given or replied to anything in the period. */
198
+ rows: SupportAnalyticsAgentRow[];
199
+ /** Assignments made in the period, and of those reassignments from one agent to another. */
200
+ assignments: number;
201
+ reassignments: number;
202
+ }
203
+ /** An open ticket, oldest first - for a supervisor to act on. No subject, no customer. */
204
+ export interface SupportAnalyticsOpenTicketRow {
205
+ id: string;
206
+ ticketNumber: string;
207
+ organizationId: number;
208
+ status: string;
209
+ priority: string;
210
+ createdAt: string;
211
+ agentUserId: number | null;
212
+ agentName: string | null;
213
+ categoryName: string | null;
214
+ queueName: string | null;
215
+ firstResponseSlaState: string;
216
+ resolutionSlaState: string;
217
+ /** Nobody has replied yet. */
218
+ awaitingFirstResponse: boolean;
219
+ }
220
+ /** What customers thought of the help they got: the ratings left on resolved tickets. */
221
+ export interface SupportAnalyticsSatisfaction {
222
+ ratings: number;
223
+ /** Out of 5. */
224
+ average: number | null;
225
+ /** Rated 4 or 5, as a percentage of ratings. */
226
+ csat: number | null;
227
+ /** 1 to 5, in that order. */
228
+ distribution: SupportAnalyticsCount[];
229
+ /** Ratings in the period / tickets first settled in the period, as a percentage. */
230
+ ratedShare: number | null;
231
+ }
232
+ /** Customer feedback - a separate domain from tickets. Support ratings are counted in `satisfaction`, not here. */
233
+ export interface SupportAnalyticsFeedback {
234
+ received: number;
235
+ people: number;
236
+ /** Of those received in the period: reviewed, responded to, turned into a ticket, dismissed. */
237
+ reviewed: number;
238
+ responded: number;
239
+ converted: number;
240
+ dismissed: number;
241
+ /** Received to the desk's first response. */
242
+ toRespond: SupportAnalyticsDuration;
243
+ /** NOW: feedback nobody has dealt with (new or under review), whenever received. */
244
+ openNow: number;
245
+ byType: SupportAnalyticsCount[];
246
+ /** Every status, in workflow order, zeros included. */
247
+ byStatus: SupportAnalyticsCount[];
248
+ /** POSITIVE, NEUTRAL, NEGATIVE, UNKNOWN - in that order. */
249
+ bySentiment: SupportAnalyticsCount[];
250
+ byChannel: SupportAnalyticsCount[];
251
+ byPlatform: SupportAnalyticsCount[];
252
+ /** "app version" - the ten with most feedback. */
253
+ byAppVersion: SupportAnalyticsCount[];
254
+ /** Ratings of the SERVICE (not of support): how many, the average out of 5, and 1 to 5. */
255
+ serviceRatings: number;
256
+ serviceRatingAverage: number | null;
257
+ serviceRatingDistribution: SupportAnalyticsCount[];
258
+ }
259
+ /** One kind of helpdesk operation and how it went. */
260
+ export interface SupportAnalyticsSyncOperationRow {
261
+ operation: string;
262
+ attempts: number;
263
+ succeeded: number;
264
+ failed: number;
265
+ deadLettered: number;
266
+ pending: number;
267
+ }
268
+ /**
269
+ * The helpdesk mirror (Zammad or Freshdesk). Per ORGANIZATION: the country picked does
270
+ * not narrow it, and a control centre sees its organization's.
271
+ */
272
+ export interface SupportAnalyticsHelpdesk {
273
+ /** The helpdesks written to in the period. */
274
+ providers: SupportAnalyticsCount[];
275
+ /** Synchronizations queued in the period, by where they stand now. */
276
+ operations: number;
277
+ succeeded: number;
278
+ failed: number;
279
+ deadLettered: number;
280
+ pending: number;
281
+ /** Skipped or superseded by a later change - nothing to send. */
282
+ skipped: number;
283
+ /** succeeded / (succeeded + failed + dead-lettered). */
284
+ successRate: number | null;
285
+ /** Queued to sent, for those that succeeded. */
286
+ toSync: SupportAnalyticsDuration;
287
+ /** NOW: dead-lettered rows waiting for a person, and rows still to send - whenever queued. */
288
+ deadLetteredNow: number;
289
+ pendingNow: number;
290
+ /** NOW: tickets whose last mirror attempt failed. */
291
+ ticketsWithFailedSyncNow: number;
292
+ byOperation: SupportAnalyticsSyncOperationRow[];
293
+ failureReasons: SupportAnalyticsCount[];
294
+ /** Webhooks the helpdesk sent in the period, by what became of them. */
295
+ webhooks: number;
296
+ webhooksByStatus: SupportAnalyticsCount[];
297
+ medianWebhookMs: number | null;
298
+ }
299
+ /** One point on the charts: a bucket of the period. */
300
+ export interface SupportAnalyticsPoint {
301
+ /** Local wall-clock start of the bucket, in `range.timeZone` (no offset). */
302
+ bucket: string;
303
+ raised: number;
304
+ resolved: number;
305
+ closed: number;
306
+ reopened: number;
307
+ cancelled: number;
308
+ /** Open at the END of the bucket. */
309
+ backlog: number;
310
+ breachAlerts: number;
311
+ /** Of the tickets raised in the bucket. */
312
+ medianSecondsToFirstResponse: number | null;
313
+ ratings: number;
314
+ ratingAverage: number | null;
315
+ feedback: number;
316
+ }
317
+ /** One hour of the week. Weekday 1 is Monday. */
318
+ export interface SupportAnalyticsHeatCell {
319
+ weekday: number;
320
+ hour: number;
321
+ /** Tickets raised in it - when customers need help. */
322
+ raised: number;
323
+ /** Agent replies written in it - when the desk answers. */
324
+ replies: number;
325
+ }
326
+ /** The previous period of the same length, for the change on each headline figure. */
327
+ export interface SupportAnalyticsPrevious {
328
+ from: string;
329
+ to: string;
330
+ raised: number;
331
+ resolved: number;
332
+ reopened: number;
333
+ breachAlerts: number;
334
+ medianSecondsToFirstResponse: number | null;
335
+ medianSecondsToResolve: number | null;
336
+ firstResponseRate: number | null;
337
+ resolutionRate: number | null;
338
+ ratings: number;
339
+ ratingAverage: number | null;
340
+ csat: number | null;
341
+ feedback: number;
342
+ }
343
+ /** A Super-Admin's view of every organization: one row each, busiest first. */
344
+ export interface SupportAnalyticsOrganizationRow {
345
+ organizationId: number;
346
+ raised: number;
347
+ resolved: number;
348
+ openNow: number;
349
+ breachAlerts: number;
350
+ medianSecondsToFirstResponse: number | null;
351
+ firstResponseRate: number | null;
352
+ ratings: number;
353
+ ratingAverage: number | null;
354
+ feedback: number;
355
+ }
356
+ export interface SupportAnalytics {
357
+ /** Whose figures: one organization (and one control centre in it), or null for every organization. */
358
+ organizationId: number | null;
359
+ controlCentreId: number | null;
360
+ /** The one country the figures are narrowed to, or null for every country. */
361
+ countryCode: string | null;
362
+ range: SupportAnalyticsRange;
363
+ generatedAt: string;
364
+ previous: SupportAnalyticsPrevious | null;
365
+ /** Countries with tickets or feedback in scope, whatever country is chosen - for narrowing to one. */
366
+ countryOptions: SupportAnalyticsCount[];
367
+ tickets: SupportAnalyticsTickets;
368
+ timings: SupportAnalyticsTimings;
369
+ sla: SupportAnalyticsSla;
370
+ conversation: SupportAnalyticsConversation;
371
+ agents: SupportAnalyticsAgents;
372
+ /** The 25 oldest open tickets. */
373
+ oldestOpen: SupportAnalyticsOpenTicketRow[];
374
+ satisfaction: SupportAnalyticsSatisfaction;
375
+ feedback: SupportAnalyticsFeedback;
376
+ helpdesk: SupportAnalyticsHelpdesk;
377
+ timeline: SupportAnalyticsPoint[];
378
+ /** All 168 hours of the week, Monday first, zeros included. */
379
+ heatmap: SupportAnalyticsHeatCell[];
380
+ /** A Super-Admin looking at every organization only. */
381
+ byOrganization?: SupportAnalyticsOrganizationRow[];
382
+ }
383
+ /** What a dashboard asks: the period, one country - and, for a Super-Admin, whose figures. */
384
+ export interface SupportAnalyticsQuery {
385
+ from?: string;
386
+ to?: string;
387
+ timeZone?: string;
388
+ organizationId?: number;
389
+ countryCode?: string;
390
+ }
package/package.json CHANGED
@@ -1,45 +1,45 @@
1
- {
2
- "name": "clarion-shared-types",
3
- "version": "1.0.112",
4
- "main": "dist/cjs/index.js",
5
- "module": "dist/esm/index.js",
6
- "types": "dist/types/index.d.ts",
7
- "exports": {
8
- ".": {
9
- "types": "./dist/types/index.d.ts",
10
- "import": "./dist/esm/index.js",
11
- "require": "./dist/cjs/index.js"
12
- },
13
- "./dist/modules/*": {
14
- "types": "./dist/types/modules/*.d.ts",
15
- "import": "./dist/esm/modules/*.js",
16
- "require": "./dist/cjs/modules/*.js"
17
- }
18
- },
19
- "files": [
20
- "dist/**/*"
21
- ],
22
- "scripts": {
23
- "clean": "rimraf dist dist-test",
24
- "build:cjs": "tsc -p tsconfig.cjs.json",
25
- "build:esm": "tsc -p tsconfig.esm.json",
26
- "build:types": "tsc -p tsconfig.types.json",
27
- "build": "npm run clean && npm run build:types && npm run build:cjs && npm run build:esm",
28
- "prepublishOnly": "npm run build",
29
- "pretest": "rimraf dist-test",
30
- "test": "tsc -p tsconfig.spec.json && node --test \"dist-test/**/*.spec.js\""
31
- },
32
- "keywords": [],
33
- "author": "vince_lawino",
34
- "license": "ISC",
35
- "description": "",
36
- "publishConfig": {
37
- "access": "public"
38
- },
39
- "devDependencies": {
40
- "@types/geojson": "^7946.0.16",
41
- "@types/node": "^20.11.2",
42
- "rimraf": "^5.0.5",
43
- "typescript": "^5.7.3"
44
- }
45
- }
1
+ {
2
+ "name": "clarion-shared-types",
3
+ "version": "1.0.114",
4
+ "main": "dist/cjs/index.js",
5
+ "module": "dist/esm/index.js",
6
+ "types": "dist/types/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/types/index.d.ts",
10
+ "import": "./dist/esm/index.js",
11
+ "require": "./dist/cjs/index.js"
12
+ },
13
+ "./dist/modules/*": {
14
+ "types": "./dist/types/modules/*.d.ts",
15
+ "import": "./dist/esm/modules/*.js",
16
+ "require": "./dist/cjs/modules/*.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist/**/*"
21
+ ],
22
+ "scripts": {
23
+ "clean": "rimraf dist dist-test",
24
+ "build:cjs": "tsc -p tsconfig.cjs.json",
25
+ "build:esm": "tsc -p tsconfig.esm.json",
26
+ "build:types": "tsc -p tsconfig.types.json",
27
+ "build": "npm run clean && npm run build:types && npm run build:cjs && npm run build:esm",
28
+ "prepublishOnly": "npm run build",
29
+ "pretest": "rimraf dist-test",
30
+ "test": "tsc -p tsconfig.spec.json && node --test \"dist-test/**/*.spec.js\""
31
+ },
32
+ "keywords": [],
33
+ "author": "vince_lawino",
34
+ "license": "ISC",
35
+ "description": "",
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "devDependencies": {
40
+ "@types/geojson": "^7946.0.16",
41
+ "@types/node": "^20.11.2",
42
+ "rimraf": "^5.0.5",
43
+ "typescript": "^5.7.3"
44
+ }
45
+ }