clarion-shared-types 1.0.109 → 1.0.111
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/modules/partner/index.js +1 -0
- package/dist/cjs/modules/partner/index.js.map +1 -1
- package/dist/cjs/modules/partner/interfaces/partner-analytics.js +17 -0
- package/dist/cjs/modules/partner/interfaces/partner-analytics.js.map +1 -0
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js +8 -0
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/cjs/modules/user/index.js +1 -0
- package/dist/cjs/modules/user/index.js.map +1 -1
- package/dist/cjs/modules/user/interfaces/account-analytics.js +17 -0
- package/dist/cjs/modules/user/interfaces/account-analytics.js.map +1 -0
- package/dist/esm/modules/partner/index.js +1 -0
- package/dist/esm/modules/partner/index.js.map +1 -1
- package/dist/esm/modules/partner/interfaces/partner-analytics.js +16 -0
- package/dist/esm/modules/partner/interfaces/partner-analytics.js.map +1 -0
- package/dist/esm/modules/permission/enums/permission-actions.enum.js +8 -0
- package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/esm/modules/user/index.js +1 -0
- package/dist/esm/modules/user/index.js.map +1 -1
- package/dist/esm/modules/user/interfaces/account-analytics.js +16 -0
- package/dist/esm/modules/user/interfaces/account-analytics.js.map +1 -0
- package/dist/types/modules/partner/index.d.ts +1 -0
- package/dist/types/modules/partner/interfaces/partner-analytics.d.ts +378 -0
- package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +2 -0
- package/dist/types/modules/user/index.d.ts +1 -0
- package/dist/types/modules/user/interfaces/account-analytics.d.ts +278 -0
- package/package.json +1 -1
|
@@ -24,6 +24,7 @@ __exportStar(require("./interfaces/partner-dispatch-progress.dto"), exports);
|
|
|
24
24
|
__exportStar(require("./interfaces/partner-dispatch.dto"), exports);
|
|
25
25
|
__exportStar(require("./interfaces/incident-partner-routing.dto"), exports);
|
|
26
26
|
__exportStar(require("./interfaces/partner-membership.dto"), exports);
|
|
27
|
+
__exportStar(require("./interfaces/partner-analytics"), exports);
|
|
27
28
|
// Utilities
|
|
28
29
|
__exportStar(require("./utils/partner-display.util"), exports);
|
|
29
30
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/partner/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,wDAAsC;AAEtC,oBAAoB;AACpB,oEAAkD;AAClD,uEAAqD;AACrD,yEAAuD;AACvD,6EAA2D;AAC3D,oEAAkD;AAClD,4EAA0D;AAC1D,sEAAoD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/partner/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,wDAAsC;AAEtC,oBAAoB;AACpB,oEAAkD;AAClD,uEAAqD;AACrD,yEAAuD;AACvD,6EAA2D;AAC3D,oEAAkD;AAClD,4EAA0D;AAC1D,sEAAoD;AACpD,iEAA+C;AAE/C,YAAY;AACZ,+DAA6C"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Partner analytics (the admin's Partner Analytics): the partnerships an organization
|
|
4
|
+
* has with third-party responders, the emergencies routed to them and what became of
|
|
5
|
+
* each, how the partners' systems answered, and the subscribers registered with them.
|
|
6
|
+
*
|
|
7
|
+
* One read, computed by clarion-partner-services from one consistent snapshot, so every
|
|
8
|
+
* number on a dashboard agrees with every other. Counts, durations and the names an
|
|
9
|
+
* organization gave its own partnerships only: never a caller's name, a phone number,
|
|
10
|
+
* a member id, a payload or a partner's error text.
|
|
11
|
+
*
|
|
12
|
+
* Emergencies are counted by when they were ROUTED (the dispatch was raised) and shown
|
|
13
|
+
* as they stand now: a dispatch raised in the period and delivered after it counts as
|
|
14
|
+
* delivered. Partner calls and memberships are counted by when they happened.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
//# sourceMappingURL=partner-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partner-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/partner/interfaces/partner-analytics.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -26,6 +26,12 @@ var PermissionActions;
|
|
|
26
26
|
// allowed to read than a base URL and a coverage rule.
|
|
27
27
|
PermissionActions["READ_PARTNER_MEMBERSHIP"] = "read:partner-membership";
|
|
28
28
|
PermissionActions["MANAGE_PARTNER_MEMBERSHIP"] = "manage:partner-membership";
|
|
29
|
+
// Partner Analytics: the partnerships, the emergencies routed through them and
|
|
30
|
+
// what became of each, how the partners' systems answered, and the members
|
|
31
|
+
// registered with them - totals, rates and durations only, never a caller, a
|
|
32
|
+
// member id or a payload. Held by everybody who reads partnerships; scoped by
|
|
33
|
+
// clarion-partner-services to the caller's organization or control centre.
|
|
34
|
+
PermissionActions["READ_PARTNER_ANALYTICS"] = "read:partner-analytics";
|
|
29
35
|
// Module: ControlCentre
|
|
30
36
|
PermissionActions["CREATE_CONTROL_CENTRE"] = "create:control-centre";
|
|
31
37
|
PermissionActions["READ_CONTROL_CENTRE"] = "read:control-centre";
|
|
@@ -41,6 +47,8 @@ var PermissionActions;
|
|
|
41
47
|
PermissionActions["READ_USER"] = "read:user";
|
|
42
48
|
PermissionActions["UPDATE_USER"] = "update:user";
|
|
43
49
|
PermissionActions["DELETE_USER"] = "delete:user";
|
|
50
|
+
// User Analytics - accounts, sign-ups, sign-ins, codes, guardians and deletions over a period, counts only.
|
|
51
|
+
PermissionActions["READ_USER_ANALYTICS"] = "read:user-analytics";
|
|
44
52
|
// Module: Incident
|
|
45
53
|
PermissionActions["CREATE_INCIDENT"] = "create:incident";
|
|
46
54
|
PermissionActions["READ_INCIDENT"] = "read:incident";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-actions.enum.js","sourceRoot":"","sources":["../../../../../src/modules/permission/enums/permission-actions.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,
|
|
1
|
+
{"version":3,"file":"permission-actions.enum.js","sourceRoot":"","sources":["../../../../../src/modules/permission/enums/permission-actions.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,iBA0RX;AA1RD,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,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,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;IAEvD,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,EA1RW,iBAAiB,iCAAjB,iBAAiB,QA0R5B"}
|
|
@@ -24,4 +24,5 @@ __exportStar(require("./interfaces/guardian"), exports);
|
|
|
24
24
|
__exportStar(require("./interfaces/guardian-relation"), exports);
|
|
25
25
|
__exportStar(require("./interfaces/guardians-response"), exports);
|
|
26
26
|
__exportStar(require("./interfaces/user-analytics-data"), exports);
|
|
27
|
+
__exportStar(require("./interfaces/account-analytics"), exports);
|
|
27
28
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/user/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,qEAAmD;AACnD,wEAAsD;AAEtD,oDAAkC;AAClC,4DAA0C;AAC1C,4DAA0C;AAC1C,wDAAsC;AACtC,iEAA+C;AAC/C,kEAAgD;AAChD,mEAAiD"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/user/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,qEAAmD;AACnD,wEAAsD;AAEtD,oDAAkC;AAClC,4DAA0C;AAC1C,4DAA0C;AAC1C,wDAAsC;AACtC,iEAA+C;AAC/C,kEAAgD;AAChD,mEAAiD;AACjD,iEAA+C"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Account analytics (the admin's User Analytics): who has an account and how they got
|
|
4
|
+
* one, whether they finished signing up, who signs in and how often, what goes wrong
|
|
5
|
+
* signing in, one-time codes and passwords, guardians, and who asked to leave.
|
|
6
|
+
*
|
|
7
|
+
* One read, computed by clarion-authentication from one consistent snapshot, so every
|
|
8
|
+
* number on a dashboard agrees with every other. Counts only: never a name, an e-mail
|
|
9
|
+
* address, a phone number or anything a user typed.
|
|
10
|
+
*
|
|
11
|
+
* Two kinds of source. Accounts, guardians and deletion requests are records the service
|
|
12
|
+
* has always kept, so their history goes back to the first account. Sign-ins, one-time
|
|
13
|
+
* codes and password changes come from the service's activity log, which begins on
|
|
14
|
+
* `activitySince`: before it, the only trace of a sign-in is each account's LAST one.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
//# sourceMappingURL=account-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/user/interfaces/account-analytics.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -8,6 +8,7 @@ export * from './interfaces/partner-dispatch-progress.dto';
|
|
|
8
8
|
export * from './interfaces/partner-dispatch.dto';
|
|
9
9
|
export * from './interfaces/incident-partner-routing.dto';
|
|
10
10
|
export * from './interfaces/partner-membership.dto';
|
|
11
|
+
export * from './interfaces/partner-analytics';
|
|
11
12
|
// Utilities
|
|
12
13
|
export * from './utils/partner-display.util';
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/partner/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,uBAAuB,CAAC;AAEtC,oBAAoB;AACpB,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/partner/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,uBAAuB,CAAC;AAEtC,oBAAoB;AACpB,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAE/C,YAAY;AACZ,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Partner analytics (the admin's Partner Analytics): the partnerships an organization
|
|
3
|
+
* has with third-party responders, the emergencies routed to them and what became of
|
|
4
|
+
* each, how the partners' systems answered, and the subscribers registered with them.
|
|
5
|
+
*
|
|
6
|
+
* One read, computed by clarion-partner-services from one consistent snapshot, so every
|
|
7
|
+
* number on a dashboard agrees with every other. Counts, durations and the names an
|
|
8
|
+
* organization gave its own partnerships only: never a caller's name, a phone number,
|
|
9
|
+
* a member id, a payload or a partner's error text.
|
|
10
|
+
*
|
|
11
|
+
* Emergencies are counted by when they were ROUTED (the dispatch was raised) and shown
|
|
12
|
+
* as they stand now: a dispatch raised in the period and delivered after it counts as
|
|
13
|
+
* delivered. Partner calls and memberships are counted by when they happened.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=partner-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partner-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/partner/interfaces/partner-analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -23,6 +23,12 @@ export var PermissionActions;
|
|
|
23
23
|
// allowed to read than a base URL and a coverage rule.
|
|
24
24
|
PermissionActions["READ_PARTNER_MEMBERSHIP"] = "read:partner-membership";
|
|
25
25
|
PermissionActions["MANAGE_PARTNER_MEMBERSHIP"] = "manage:partner-membership";
|
|
26
|
+
// Partner Analytics: the partnerships, the emergencies routed through them and
|
|
27
|
+
// what became of each, how the partners' systems answered, and the members
|
|
28
|
+
// registered with them - totals, rates and durations only, never a caller, a
|
|
29
|
+
// member id or a payload. Held by everybody who reads partnerships; scoped by
|
|
30
|
+
// clarion-partner-services to the caller's organization or control centre.
|
|
31
|
+
PermissionActions["READ_PARTNER_ANALYTICS"] = "read:partner-analytics";
|
|
26
32
|
// Module: ControlCentre
|
|
27
33
|
PermissionActions["CREATE_CONTROL_CENTRE"] = "create:control-centre";
|
|
28
34
|
PermissionActions["READ_CONTROL_CENTRE"] = "read:control-centre";
|
|
@@ -38,6 +44,8 @@ export var PermissionActions;
|
|
|
38
44
|
PermissionActions["READ_USER"] = "read:user";
|
|
39
45
|
PermissionActions["UPDATE_USER"] = "update:user";
|
|
40
46
|
PermissionActions["DELETE_USER"] = "delete:user";
|
|
47
|
+
// User Analytics - accounts, sign-ups, sign-ins, codes, guardians and deletions over a period, counts only.
|
|
48
|
+
PermissionActions["READ_USER_ANALYTICS"] = "read:user-analytics";
|
|
41
49
|
// Module: Incident
|
|
42
50
|
PermissionActions["CREATE_INCIDENT"] = "create:incident";
|
|
43
51
|
PermissionActions["READ_INCIDENT"] = "read:incident";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-actions.enum.js","sourceRoot":"","sources":["../../../../../src/modules/permission/enums/permission-actions.enum.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"permission-actions.enum.js","sourceRoot":"","sources":["../../../../../src/modules/permission/enums/permission-actions.enum.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,iBA0RX;AA1RD,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,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,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;IAEvD,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,EA1RW,iBAAiB,KAAjB,iBAAiB,QA0R5B"}
|
|
@@ -8,4 +8,5 @@ export * from './interfaces/guardian';
|
|
|
8
8
|
export * from './interfaces/guardian-relation';
|
|
9
9
|
export * from './interfaces/guardians-response';
|
|
10
10
|
export * from './interfaces/user-analytics-data';
|
|
11
|
+
export * from './interfaces/account-analytics';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/user/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AAEtD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/user/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AAEtD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Account analytics (the admin's User Analytics): who has an account and how they got
|
|
3
|
+
* one, whether they finished signing up, who signs in and how often, what goes wrong
|
|
4
|
+
* signing in, one-time codes and passwords, guardians, and who asked to leave.
|
|
5
|
+
*
|
|
6
|
+
* One read, computed by clarion-authentication from one consistent snapshot, so every
|
|
7
|
+
* number on a dashboard agrees with every other. Counts only: never a name, an e-mail
|
|
8
|
+
* address, a phone number or anything a user typed.
|
|
9
|
+
*
|
|
10
|
+
* Two kinds of source. Accounts, guardians and deletion requests are records the service
|
|
11
|
+
* has always kept, so their history goes back to the first account. Sign-ins, one-time
|
|
12
|
+
* codes and password changes come from the service's activity log, which begins on
|
|
13
|
+
* `activitySince`: before it, the only trace of a sign-in is each account's LAST one.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=account-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/user/interfaces/account-analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -6,4 +6,5 @@ export * from './interfaces/partner-dispatch-progress.dto';
|
|
|
6
6
|
export * from './interfaces/partner-dispatch.dto';
|
|
7
7
|
export * from './interfaces/incident-partner-routing.dto';
|
|
8
8
|
export * from './interfaces/partner-membership.dto';
|
|
9
|
+
export * from './interfaces/partner-analytics';
|
|
9
10
|
export * from './utils/partner-display.util';
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Partner analytics (the admin's Partner Analytics): the partnerships an organization
|
|
3
|
+
* has with third-party responders, the emergencies routed to them and what became of
|
|
4
|
+
* each, how the partners' systems answered, and the subscribers registered with them.
|
|
5
|
+
*
|
|
6
|
+
* One read, computed by clarion-partner-services from one consistent snapshot, so every
|
|
7
|
+
* number on a dashboard agrees with every other. Counts, durations and the names an
|
|
8
|
+
* organization gave its own partnerships only: never a caller's name, a phone number,
|
|
9
|
+
* a member id, a payload or a partner's error text.
|
|
10
|
+
*
|
|
11
|
+
* Emergencies are counted by when they were ROUTED (the dispatch was raised) and shown
|
|
12
|
+
* as they stand now: a dispatch raised in the period and delivered after it counts as
|
|
13
|
+
* delivered. Partner calls and memberships are counted by when they happened.
|
|
14
|
+
*/
|
|
15
|
+
/** How the period is cut into points for the charts. Chosen by the service from the length of the period. */
|
|
16
|
+
export type PartnerAnalyticsBucket = 'hour' | 'day' | 'week' | 'month';
|
|
17
|
+
export interface PartnerAnalyticsRange {
|
|
18
|
+
/** Inclusive, ISO 8601. The first partnership's creation when the period asked for was "forever". */
|
|
19
|
+
from: string;
|
|
20
|
+
/** Exclusive, ISO 8601. */
|
|
21
|
+
to: string;
|
|
22
|
+
bucket: PartnerAnalyticsBucket;
|
|
23
|
+
/** IANA time zone the buckets and the hour-of-week grid are cut in. */
|
|
24
|
+
timeZone: string;
|
|
25
|
+
}
|
|
26
|
+
/** A count by a key (a status, a reason, a capability), largest first unless the section says otherwise. */
|
|
27
|
+
export interface PartnerAnalyticsCount<K extends string = string> {
|
|
28
|
+
key: K;
|
|
29
|
+
count: number;
|
|
30
|
+
}
|
|
31
|
+
/** A partnership the dashboard can be narrowed to - every one in scope, whatever is being shown. */
|
|
32
|
+
export interface PartnerAnalyticsPartnershipOption {
|
|
33
|
+
id: number;
|
|
34
|
+
organizationId: number;
|
|
35
|
+
name: string;
|
|
36
|
+
providerCode: string;
|
|
37
|
+
environment: string;
|
|
38
|
+
enabled: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The partnerships as configured now, and how each has been used in the period.
|
|
42
|
+
*
|
|
43
|
+
* Figures (`raised` onwards) are the period's; everything before them is the
|
|
44
|
+
* partnership's configuration and health as they stand now.
|
|
45
|
+
*/
|
|
46
|
+
export interface PartnerAnalyticsPartnershipRow {
|
|
47
|
+
integrationId: number;
|
|
48
|
+
organizationId: number;
|
|
49
|
+
/** Null: every control centre in the organization may route through it. */
|
|
50
|
+
controlCentreId: number | null;
|
|
51
|
+
name: string;
|
|
52
|
+
providerCode: string;
|
|
53
|
+
environment: string;
|
|
54
|
+
enabled: boolean;
|
|
55
|
+
/** AUTO, MANUAL or DISABLED. */
|
|
56
|
+
routingMode: string;
|
|
57
|
+
/** The last health check's verdict: HEALTHY, DEGRADED, UNREACHABLE or UNKNOWN. */
|
|
58
|
+
status: string;
|
|
59
|
+
capabilities: string[];
|
|
60
|
+
membershipEnabled: boolean;
|
|
61
|
+
requireCoverForDispatch: boolean;
|
|
62
|
+
countryCode: string;
|
|
63
|
+
coverageRules: number;
|
|
64
|
+
enabledCoverageRules: number;
|
|
65
|
+
lastSuccessAt: string | null;
|
|
66
|
+
lastErrorAt: string | null;
|
|
67
|
+
lastHealthCheckAt: string | null;
|
|
68
|
+
createdAt: string;
|
|
69
|
+
/** Emergencies routed to it in the period. */
|
|
70
|
+
raised: number;
|
|
71
|
+
/** Of those, reached the partner (sent at least once). */
|
|
72
|
+
delivered: number;
|
|
73
|
+
failed: number;
|
|
74
|
+
acknowledged: number;
|
|
75
|
+
/** delivered / (delivered + failed), as a percentage; null when nothing was attempted. */
|
|
76
|
+
deliveryRate: number | null;
|
|
77
|
+
medianSecondsToAcknowledge: number | null;
|
|
78
|
+
/** Calls made to the partner's system in the period, and those that failed. */
|
|
79
|
+
calls: number;
|
|
80
|
+
failedCalls: number;
|
|
81
|
+
/** Memberships registered and live now, and those waiting for a person to act. */
|
|
82
|
+
activeMembers: number;
|
|
83
|
+
membersNeedingAttention: number;
|
|
84
|
+
}
|
|
85
|
+
/** The partnerships in scope, as configured now. */
|
|
86
|
+
export interface PartnerAnalyticsPartnerships {
|
|
87
|
+
total: number;
|
|
88
|
+
enabled: number;
|
|
89
|
+
disabled: number;
|
|
90
|
+
/** Routing modes of the ENABLED partnerships. */
|
|
91
|
+
autoRouting: number;
|
|
92
|
+
manualRouting: number;
|
|
93
|
+
routingOff: number;
|
|
94
|
+
production: number;
|
|
95
|
+
sandbox: number;
|
|
96
|
+
/** Health of the ENABLED partnerships. */
|
|
97
|
+
healthy: number;
|
|
98
|
+
degraded: number;
|
|
99
|
+
unreachable: number;
|
|
100
|
+
unknown: number;
|
|
101
|
+
membershipEnabled: number;
|
|
102
|
+
/** Withhold an emergency from the partner when the caller is not covered. */
|
|
103
|
+
coverGate: number;
|
|
104
|
+
coverageRules: number;
|
|
105
|
+
enabledCoverageRules: number;
|
|
106
|
+
byProvider: PartnerAnalyticsCount[];
|
|
107
|
+
/** Services bought, a partnership counted once under each of its capabilities. */
|
|
108
|
+
byCapability: PartnerAnalyticsCount[];
|
|
109
|
+
/** What the enabled coverage rules match on: ALL, INCIDENT_TYPE, INCIDENT_CATEGORY, EMERGENCY_TYPE. */
|
|
110
|
+
rulesByMatchType: PartnerAnalyticsCount[];
|
|
111
|
+
rows: PartnerAnalyticsPartnershipRow[];
|
|
112
|
+
}
|
|
113
|
+
/** Median and 90th percentile of one duration, in seconds; null when nothing was measured. */
|
|
114
|
+
export interface PartnerAnalyticsDuration {
|
|
115
|
+
median: number | null;
|
|
116
|
+
p90: number | null;
|
|
117
|
+
/** How many were measured. */
|
|
118
|
+
count: number;
|
|
119
|
+
}
|
|
120
|
+
/** A row per routing mode: AUTO goes straight out; MANUAL waits for an operator to confirm it. */
|
|
121
|
+
export interface PartnerAnalyticsModeRow {
|
|
122
|
+
mode: string;
|
|
123
|
+
raised: number;
|
|
124
|
+
delivered: number;
|
|
125
|
+
failed: number;
|
|
126
|
+
/** Rejected by an operator, or left to expire, or cancelled before it went. */
|
|
127
|
+
declined: number;
|
|
128
|
+
}
|
|
129
|
+
/** A row per partner: what it was sent and how it answered. */
|
|
130
|
+
export interface PartnerAnalyticsProviderRow {
|
|
131
|
+
provider: string;
|
|
132
|
+
raised: number;
|
|
133
|
+
delivered: number;
|
|
134
|
+
failed: number;
|
|
135
|
+
acknowledged: number;
|
|
136
|
+
medianSecondsToAcknowledge: number | null;
|
|
137
|
+
}
|
|
138
|
+
/** Emergencies routed to partners in the period, as they stand now. */
|
|
139
|
+
export interface PartnerAnalyticsDispatches {
|
|
140
|
+
/** Dispatches raised in the period - one per incident per partnership. */
|
|
141
|
+
raised: number;
|
|
142
|
+
/** Distinct incidents among them. */
|
|
143
|
+
incidents: number;
|
|
144
|
+
/** Reached the partner at least once (whatever became of them afterwards). */
|
|
145
|
+
delivered: number;
|
|
146
|
+
/** The partner assigned a responder - a crew or a vehicle is on it. */
|
|
147
|
+
acknowledged: number;
|
|
148
|
+
/** The partner closed it as done (a partner that never reports back never closes one). */
|
|
149
|
+
completed: number;
|
|
150
|
+
/** Could not be delivered: refused, or out of attempts. */
|
|
151
|
+
failed: number;
|
|
152
|
+
/** An operator declined to send it. */
|
|
153
|
+
rejected: number;
|
|
154
|
+
/** Nobody decided before the approval window closed. */
|
|
155
|
+
expired: number;
|
|
156
|
+
/** Stopped before it was sent. */
|
|
157
|
+
cancelled: number;
|
|
158
|
+
/** Stood down after it reached the partner. */
|
|
159
|
+
withdrawn: number;
|
|
160
|
+
/** Still waiting for an operator to confirm it, now. */
|
|
161
|
+
awaitingDecision: number;
|
|
162
|
+
/** Queued or being sent, now. */
|
|
163
|
+
inFlight: number;
|
|
164
|
+
/** delivered / (delivered + failed) - of the dispatches that were tried, the share that got through. */
|
|
165
|
+
deliveryRate: number | null;
|
|
166
|
+
/** acknowledged / delivered. */
|
|
167
|
+
acknowledgementRate: number | null;
|
|
168
|
+
/** completed / delivered. */
|
|
169
|
+
completionRate: number | null;
|
|
170
|
+
/** Delivered on the first attempt / delivered. */
|
|
171
|
+
firstAttemptRate: number | null;
|
|
172
|
+
/** Needed more than one attempt. */
|
|
173
|
+
retried: number;
|
|
174
|
+
/** Average attempts of the dispatches that were tried at all. */
|
|
175
|
+
averageAttempts: number | null;
|
|
176
|
+
timings: {
|
|
177
|
+
/** From routing to reaching the partner - for MANUAL, the operator's decision included. */
|
|
178
|
+
toSend: PartnerAnalyticsDuration;
|
|
179
|
+
/** From reaching the partner to the partner assigning a responder. */
|
|
180
|
+
toAcknowledge: PartnerAnalyticsDuration;
|
|
181
|
+
/** From reaching the partner to the partner closing it - completed ones only. */
|
|
182
|
+
toClose: PartnerAnalyticsDuration;
|
|
183
|
+
/** MANUAL only: from routing to an operator confirming or rejecting it. */
|
|
184
|
+
toDecide: PartnerAnalyticsDuration;
|
|
185
|
+
};
|
|
186
|
+
approvals: {
|
|
187
|
+
/** Dispatches routed in MANUAL mode. */
|
|
188
|
+
needed: number;
|
|
189
|
+
approved: number;
|
|
190
|
+
rejected: number;
|
|
191
|
+
expired: number;
|
|
192
|
+
/** Still waiting, now. */
|
|
193
|
+
waiting: number;
|
|
194
|
+
/** approved / (approved + rejected + expired). */
|
|
195
|
+
approvalRate: number | null;
|
|
196
|
+
};
|
|
197
|
+
/** Every status, in lifecycle order, zeros included. */
|
|
198
|
+
byStatus: PartnerAnalyticsCount[];
|
|
199
|
+
byMode: PartnerAnalyticsModeRow[];
|
|
200
|
+
byProvider: PartnerAnalyticsProviderRow[];
|
|
201
|
+
byCapability: PartnerAnalyticsCount[];
|
|
202
|
+
byCountry: PartnerAnalyticsCount[];
|
|
203
|
+
/** From the incident as it was routed. */
|
|
204
|
+
byEmergencyType: PartnerAnalyticsCount[];
|
|
205
|
+
byChannel: PartnerAnalyticsCount[];
|
|
206
|
+
byPriority: PartnerAnalyticsCount[];
|
|
207
|
+
/** Why the failed ones failed. */
|
|
208
|
+
failureReasons: PartnerAnalyticsCount[];
|
|
209
|
+
/**
|
|
210
|
+
* Whether the partner was told who the emergency was about: IDENTIFIED,
|
|
211
|
+
* COVERED_NOT_REGISTERED, NOT_COVERED, IDENTIFIER_REJECTED - or NOT_RECORDED for a
|
|
212
|
+
* dispatch made before this was kept.
|
|
213
|
+
*/
|
|
214
|
+
memberIdentification: PartnerAnalyticsCount[];
|
|
215
|
+
/** The partner's own view, now: ACTIVE, CLOSED, UNKNOWN - or NONE when never heard. */
|
|
216
|
+
engagement: PartnerAnalyticsCount[];
|
|
217
|
+
}
|
|
218
|
+
/** Calls made to the partners' systems on the emergencies' behalf - sending, signing in, checking progress, standing down. */
|
|
219
|
+
export interface PartnerAnalyticsCalls {
|
|
220
|
+
calls: number;
|
|
221
|
+
succeeded: number;
|
|
222
|
+
failed: number;
|
|
223
|
+
successRate: number | null;
|
|
224
|
+
medianMs: number | null;
|
|
225
|
+
p95Ms: number | null;
|
|
226
|
+
/** SEND (DISPATCH), AUTHENTICATE, FETCH_STATUS, WITHDRAW, AMEND, LOOKUP... */
|
|
227
|
+
byOperation: {
|
|
228
|
+
operation: string;
|
|
229
|
+
calls: number;
|
|
230
|
+
failed: number;
|
|
231
|
+
medianMs: number | null;
|
|
232
|
+
p95Ms: number | null;
|
|
233
|
+
}[];
|
|
234
|
+
/** 2xx, 3xx, 4xx, 5xx - or NO_RESPONSE when the partner never answered. */
|
|
235
|
+
byResponse: PartnerAnalyticsCount[];
|
|
236
|
+
failureReasons: PartnerAnalyticsCount[];
|
|
237
|
+
}
|
|
238
|
+
/** Subscribers registered with partners ahead of any emergency. */
|
|
239
|
+
export interface PartnerAnalyticsMemberships {
|
|
240
|
+
/** Every membership in scope, now. */
|
|
241
|
+
total: number;
|
|
242
|
+
/** Registered, and the partner's cover has started and not ended. */
|
|
243
|
+
covered: number;
|
|
244
|
+
/** Registered, but the partner's cover has not started yet (a waiting period). */
|
|
245
|
+
waitingPeriod: number;
|
|
246
|
+
/** INCOMPLETE_PROFILE, NEEDS_REVIEW or FAILED: a person has to act. */
|
|
247
|
+
needsAttention: number;
|
|
248
|
+
/** Created in the period. */
|
|
249
|
+
created: number;
|
|
250
|
+
/** Given a member id by the partner in the period. */
|
|
251
|
+
provisioned: number;
|
|
252
|
+
/** From the membership being created to the partner issuing a member id - those provisioned in the period. */
|
|
253
|
+
medianHoursToProvision: number | null;
|
|
254
|
+
/** Every status, in lifecycle order, zeros included. */
|
|
255
|
+
byStatus: PartnerAnalyticsCount[];
|
|
256
|
+
/** The partner's standing for registered members: PENDING_ACTIVATION, ACTIVE, SUSPENDED, LAPSED, UNKNOWN. */
|
|
257
|
+
byMemberState: PartnerAnalyticsCount[];
|
|
258
|
+
/** INDIVIDUAL_SUBSCRIBER or CORPORATE_MEMBER. */
|
|
259
|
+
bySubjectType: PartnerAnalyticsCount[];
|
|
260
|
+
/** Why registrations failed or were stopped, now. */
|
|
261
|
+
failureReasons: PartnerAnalyticsCount[];
|
|
262
|
+
/** What stops incomplete profiles being sent: a field, and whether it is MISSING or MALFORMED. */
|
|
263
|
+
missingDetails: {
|
|
264
|
+
field: string;
|
|
265
|
+
problem: string;
|
|
266
|
+
count: number;
|
|
267
|
+
}[];
|
|
268
|
+
dependents: number;
|
|
269
|
+
/** Dependents the partner has accepted. */
|
|
270
|
+
dependentsAccepted: number;
|
|
271
|
+
/** No longer covered here, but the partner keeps them to the end of the term. */
|
|
272
|
+
pendingRemoval: number;
|
|
273
|
+
/** People who declined to give a detail a partner asks for - in the period, and ever. */
|
|
274
|
+
declined: number;
|
|
275
|
+
declinedTotal: number;
|
|
276
|
+
/** Partnerships whose partner has no memberships feature, and those it is currently rate limiting. */
|
|
277
|
+
unsupportedPartnerships: number;
|
|
278
|
+
throttledPartnerships: number;
|
|
279
|
+
}
|
|
280
|
+
/** One kind of incident routed to partners. Names are the organization's own taxonomy. */
|
|
281
|
+
export interface PartnerAnalyticsIncidentTypeRow {
|
|
282
|
+
incidentTypeId: number | null;
|
|
283
|
+
name: string | null;
|
|
284
|
+
category: string | null;
|
|
285
|
+
raised: number;
|
|
286
|
+
delivered: number;
|
|
287
|
+
failed: number;
|
|
288
|
+
acknowledged: number;
|
|
289
|
+
medianSecondsToAcknowledge: number | null;
|
|
290
|
+
}
|
|
291
|
+
/** One point on the charts: a bucket of the period. */
|
|
292
|
+
export interface PartnerAnalyticsPoint {
|
|
293
|
+
/** Local wall-clock start of the bucket, in `range.timeZone` (no offset). */
|
|
294
|
+
bucket: string;
|
|
295
|
+
/** Dispatches raised in the bucket, and what became of them. */
|
|
296
|
+
raised: number;
|
|
297
|
+
delivered: number;
|
|
298
|
+
failed: number;
|
|
299
|
+
/** Rejected, expired or cancelled. */
|
|
300
|
+
declined: number;
|
|
301
|
+
/** Still waiting or being sent, now. */
|
|
302
|
+
pending: number;
|
|
303
|
+
acknowledged: number;
|
|
304
|
+
/** Of the dispatches that reached the partner in the bucket. */
|
|
305
|
+
medianSecondsToAcknowledge: number | null;
|
|
306
|
+
calls: number;
|
|
307
|
+
failedCalls: number;
|
|
308
|
+
medianCallMs: number | null;
|
|
309
|
+
membershipsCreated: number;
|
|
310
|
+
membershipsProvisioned: number;
|
|
311
|
+
}
|
|
312
|
+
/** One hour of the week: emergencies routed in it. Weekday 1 is Monday. */
|
|
313
|
+
export interface PartnerAnalyticsHeatCell {
|
|
314
|
+
weekday: number;
|
|
315
|
+
hour: number;
|
|
316
|
+
raised: number;
|
|
317
|
+
}
|
|
318
|
+
/** The previous period of the same length, for the change on each headline figure. */
|
|
319
|
+
export interface PartnerAnalyticsPrevious {
|
|
320
|
+
from: string;
|
|
321
|
+
to: string;
|
|
322
|
+
raised: number;
|
|
323
|
+
delivered: number;
|
|
324
|
+
failed: number;
|
|
325
|
+
acknowledged: number;
|
|
326
|
+
completed: number;
|
|
327
|
+
declined: number;
|
|
328
|
+
medianSecondsToSend: number | null;
|
|
329
|
+
medianSecondsToAcknowledge: number | null;
|
|
330
|
+
calls: number;
|
|
331
|
+
failedCalls: number;
|
|
332
|
+
membershipsCreated: number;
|
|
333
|
+
membershipsProvisioned: number;
|
|
334
|
+
}
|
|
335
|
+
/** A Super-Admin's view of every organization: one row each, busiest first. */
|
|
336
|
+
export interface PartnerAnalyticsOrganizationRow {
|
|
337
|
+
organizationId: number;
|
|
338
|
+
partnerships: number;
|
|
339
|
+
enabledPartnerships: number;
|
|
340
|
+
raised: number;
|
|
341
|
+
delivered: number;
|
|
342
|
+
failed: number;
|
|
343
|
+
deliveryRate: number | null;
|
|
344
|
+
activeMembers: number;
|
|
345
|
+
calls: number;
|
|
346
|
+
failedCalls: number;
|
|
347
|
+
}
|
|
348
|
+
export interface PartnerAnalytics {
|
|
349
|
+
/** Whose figures: one organization (and one control centre in it), or null for every organization. */
|
|
350
|
+
organizationId: number | null;
|
|
351
|
+
controlCentreId: number | null;
|
|
352
|
+
/** The one partnership the figures are narrowed to, or null for all of them. */
|
|
353
|
+
integrationId: number | null;
|
|
354
|
+
range: PartnerAnalyticsRange;
|
|
355
|
+
generatedAt: string;
|
|
356
|
+
previous: PartnerAnalyticsPrevious | null;
|
|
357
|
+
timeline: PartnerAnalyticsPoint[];
|
|
358
|
+
/** All 168 hours of the week, Monday first, zeros included. */
|
|
359
|
+
heatmap: PartnerAnalyticsHeatCell[];
|
|
360
|
+
/** Every partnership in scope, for narrowing the dashboard to one. */
|
|
361
|
+
partnershipOptions: PartnerAnalyticsPartnershipOption[];
|
|
362
|
+
partnerships: PartnerAnalyticsPartnerships;
|
|
363
|
+
dispatches: PartnerAnalyticsDispatches;
|
|
364
|
+
calls: PartnerAnalyticsCalls;
|
|
365
|
+
memberships: PartnerAnalyticsMemberships;
|
|
366
|
+
/** The kinds of incident routed, busiest first - at most 25. */
|
|
367
|
+
incidentTypes: PartnerAnalyticsIncidentTypeRow[];
|
|
368
|
+
/** A Super-Admin looking at every organization only. */
|
|
369
|
+
byOrganization?: PartnerAnalyticsOrganizationRow[];
|
|
370
|
+
}
|
|
371
|
+
/** What a dashboard asks: the period, one partnership - and, for a Super-Admin, whose figures. */
|
|
372
|
+
export interface PartnerAnalyticsQuery {
|
|
373
|
+
from?: string;
|
|
374
|
+
to?: string;
|
|
375
|
+
timeZone?: string;
|
|
376
|
+
organizationId?: number;
|
|
377
|
+
integrationId?: number;
|
|
378
|
+
}
|
|
@@ -14,6 +14,7 @@ export declare enum PermissionActions {
|
|
|
14
14
|
RESEND_PARTNER_DISPATCH = "resend:partner-dispatch",
|
|
15
15
|
READ_PARTNER_MEMBERSHIP = "read:partner-membership",
|
|
16
16
|
MANAGE_PARTNER_MEMBERSHIP = "manage:partner-membership",
|
|
17
|
+
READ_PARTNER_ANALYTICS = "read:partner-analytics",
|
|
17
18
|
CREATE_CONTROL_CENTRE = "create:control-centre",
|
|
18
19
|
READ_CONTROL_CENTRE = "read:control-centre",
|
|
19
20
|
UPDATE_CONTROL_CENTRE = "update:control-centre",
|
|
@@ -26,6 +27,7 @@ export declare enum PermissionActions {
|
|
|
26
27
|
READ_USER = "read:user",
|
|
27
28
|
UPDATE_USER = "update:user",
|
|
28
29
|
DELETE_USER = "delete:user",
|
|
30
|
+
READ_USER_ANALYTICS = "read:user-analytics",
|
|
29
31
|
CREATE_INCIDENT = "create:incident",
|
|
30
32
|
READ_INCIDENT = "read:incident",
|
|
31
33
|
UPDATE_INCIDENT = "update:incident",
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Account analytics (the admin's User Analytics): who has an account and how they got
|
|
3
|
+
* one, whether they finished signing up, who signs in and how often, what goes wrong
|
|
4
|
+
* signing in, one-time codes and passwords, guardians, and who asked to leave.
|
|
5
|
+
*
|
|
6
|
+
* One read, computed by clarion-authentication from one consistent snapshot, so every
|
|
7
|
+
* number on a dashboard agrees with every other. Counts only: never a name, an e-mail
|
|
8
|
+
* address, a phone number or anything a user typed.
|
|
9
|
+
*
|
|
10
|
+
* Two kinds of source. Accounts, guardians and deletion requests are records the service
|
|
11
|
+
* has always kept, so their history goes back to the first account. Sign-ins, one-time
|
|
12
|
+
* codes and password changes come from the service's activity log, which begins on
|
|
13
|
+
* `activitySince`: before it, the only trace of a sign-in is each account's LAST one.
|
|
14
|
+
*/
|
|
15
|
+
/** How the period is cut into points for the charts. Chosen by the service from the length of the period. */
|
|
16
|
+
export type AccountAnalyticsBucket = 'hour' | 'day' | 'week' | 'month';
|
|
17
|
+
export interface AccountAnalyticsRange {
|
|
18
|
+
/** Inclusive, ISO 8601. The first account when the period asked for was "forever". */
|
|
19
|
+
from: string;
|
|
20
|
+
/** Exclusive, ISO 8601. */
|
|
21
|
+
to: string;
|
|
22
|
+
bucket: AccountAnalyticsBucket;
|
|
23
|
+
/** IANA time zone the buckets, the days and the hour-of-week grid are cut in. */
|
|
24
|
+
timeZone: string;
|
|
25
|
+
}
|
|
26
|
+
/** A count by a key (a status, a role, a band), largest first unless the section says otherwise. */
|
|
27
|
+
export interface AccountAnalyticsCount<K extends string = string> {
|
|
28
|
+
key: K;
|
|
29
|
+
count: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* What an account is for, from its roles - one per account, the first that applies:
|
|
33
|
+
* - PLATFORM Super-Admin;
|
|
34
|
+
* - ORGANIZATION an organization's staff (any Organization:* role);
|
|
35
|
+
* - CONTROL_CENTRE a control room's staff (any Control-Centre:* role);
|
|
36
|
+
* - RESPONDER a responder;
|
|
37
|
+
* - CORPORATE_CLIENT a corporate client's own staff;
|
|
38
|
+
* - MOBILE somebody using the app (Mobile-User);
|
|
39
|
+
* - NONE no role.
|
|
40
|
+
*/
|
|
41
|
+
export type AccountKind = 'PLATFORM' | 'ORGANIZATION' | 'CONTROL_CENTRE' | 'RESPONDER' | 'CORPORATE_CLIENT' | 'MOBILE' | 'NONE';
|
|
42
|
+
/** How long ago an account last signed in, as it stands now. */
|
|
43
|
+
export type AccountRecencyBand = '1d' | '7d' | '30d' | '90d' | 'older' | 'never';
|
|
44
|
+
/** A row per brand of app: accounts that belong to it. */
|
|
45
|
+
export interface AccountAnalyticsAppRow {
|
|
46
|
+
/** IncidentAppId: Upesy, G4S, GardaWorld, GRM, Pasha... */
|
|
47
|
+
app: string;
|
|
48
|
+
/** At the end of the period. */
|
|
49
|
+
total: number;
|
|
50
|
+
/** Created in the period. */
|
|
51
|
+
created: number;
|
|
52
|
+
/** Signed in during the period (as far as is known - see `AccountAnalyticsAccounts.activeInPeriod`). */
|
|
53
|
+
active: number;
|
|
54
|
+
}
|
|
55
|
+
export interface AccountAnalyticsKindRow {
|
|
56
|
+
kind: AccountKind;
|
|
57
|
+
total: number;
|
|
58
|
+
created: number;
|
|
59
|
+
active: number;
|
|
60
|
+
}
|
|
61
|
+
/** Of the accounts created in the period, how far each got - as they stand now. */
|
|
62
|
+
export interface AccountAnalyticsFunnel {
|
|
63
|
+
created: number;
|
|
64
|
+
/** Confirmed their phone or e-mail with a one-time code. */
|
|
65
|
+
verified: number;
|
|
66
|
+
acceptedTerms: number;
|
|
67
|
+
/** Signed in at least once. */
|
|
68
|
+
signedIn: number;
|
|
69
|
+
}
|
|
70
|
+
export interface AccountAnalyticsAccounts {
|
|
71
|
+
/** Null for "forever". */
|
|
72
|
+
totalAtStart: number | null;
|
|
73
|
+
totalAtEnd: number;
|
|
74
|
+
created: number;
|
|
75
|
+
/** Of those: somebody using the app, and everybody else (staff of any kind). */
|
|
76
|
+
createdMobile: number;
|
|
77
|
+
createdStaff: number;
|
|
78
|
+
/**
|
|
79
|
+
* Accounts that signed in during the period: every account with a sign-in in the
|
|
80
|
+
* activity log, and - for the time before the log - every account whose LAST sign-in
|
|
81
|
+
* falls in the period. Exact from `activitySince` on; a floor before it.
|
|
82
|
+
*/
|
|
83
|
+
activeInPeriod: number;
|
|
84
|
+
/** Active accounts that were created in an earlier period. */
|
|
85
|
+
returning: number;
|
|
86
|
+
funnel: AccountAnalyticsFunnel;
|
|
87
|
+
/** Now: never confirmed their phone or e-mail with a one-time code. */
|
|
88
|
+
pendingNow: number;
|
|
89
|
+
/** Now: never signed in. */
|
|
90
|
+
neverSignedIn: number;
|
|
91
|
+
/** Now: last signed in more than 90 days ago. */
|
|
92
|
+
dormant: number;
|
|
93
|
+
/** Hours from creating the account to its first sign-in, for first sign-ins in the period (activity log only). */
|
|
94
|
+
medianHoursToFirstSignIn: number | null;
|
|
95
|
+
byKind: AccountAnalyticsKindRow[];
|
|
96
|
+
byApp: AccountAnalyticsAppRow[];
|
|
97
|
+
/** At the end of the period: an account is counted under every role it holds. */
|
|
98
|
+
byRole: AccountAnalyticsCount[];
|
|
99
|
+
/** Now: active, pending, inactive. */
|
|
100
|
+
byStatus: AccountAnalyticsCount[];
|
|
101
|
+
/** At the end of the period: KE, UG, TZ. */
|
|
102
|
+
byCountry: AccountAnalyticsCount[];
|
|
103
|
+
/** Now, fixed order, zeros included. */
|
|
104
|
+
recency: AccountAnalyticsCount<AccountRecencyBand>[];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* How somebody signed in:
|
|
108
|
+
* - PASSWORD e-mail and password (the admin and the web);
|
|
109
|
+
* - OTP phone number and a one-time code (the app);
|
|
110
|
+
* - REVIEWER the app-store reviewers' account.
|
|
111
|
+
*/
|
|
112
|
+
export type AccountSignInMethod = 'PASSWORD' | 'OTP' | 'REVIEWER';
|
|
113
|
+
export interface AccountAnalyticsMethodRow {
|
|
114
|
+
method: string;
|
|
115
|
+
succeeded: number;
|
|
116
|
+
failed: number;
|
|
117
|
+
}
|
|
118
|
+
export interface AccountAnalyticsSignIns {
|
|
119
|
+
attempts: number;
|
|
120
|
+
succeeded: number;
|
|
121
|
+
failed: number;
|
|
122
|
+
/** succeeded / attempts; null with none. */
|
|
123
|
+
successRate: number | null;
|
|
124
|
+
/** Distinct accounts that signed in. */
|
|
125
|
+
users: number;
|
|
126
|
+
/** An account's very first sign-in. */
|
|
127
|
+
firstSignIns: number;
|
|
128
|
+
/** Failed for an e-mail or a code that matches no account (counted, never stored). */
|
|
129
|
+
unknownAccount: number;
|
|
130
|
+
byMethod: AccountAnalyticsMethodRow[];
|
|
131
|
+
/** INVALID_CREDENTIALS, UNVERIFIED, UNKNOWN_ACCOUNT, INVALID_TOKEN, ERROR... */
|
|
132
|
+
failureReasons: AccountAnalyticsCount[];
|
|
133
|
+
averageDailyUsers: number;
|
|
134
|
+
peakDailyUsers: number;
|
|
135
|
+
/** YYYY-MM-DD, local to the range's time zone. */
|
|
136
|
+
peakDay: string | null;
|
|
137
|
+
}
|
|
138
|
+
export interface AccountAnalyticsOtpActionRow {
|
|
139
|
+
/** What the code was for: login, register, verify_phone, reset_password, create_user... */
|
|
140
|
+
action: string;
|
|
141
|
+
sent: number;
|
|
142
|
+
verified: number;
|
|
143
|
+
}
|
|
144
|
+
export interface AccountAnalyticsOtp {
|
|
145
|
+
/** First sends and resends. */
|
|
146
|
+
sent: number;
|
|
147
|
+
resent: number;
|
|
148
|
+
/** Refused for asking too often. */
|
|
149
|
+
refused: number;
|
|
150
|
+
verified: number;
|
|
151
|
+
failed: number;
|
|
152
|
+
/** verified / (verified + failed); null with none. */
|
|
153
|
+
successRate: number | null;
|
|
154
|
+
/** From a code being sent to it being confirmed. */
|
|
155
|
+
medianSecondsToVerify: number | null;
|
|
156
|
+
byAction: AccountAnalyticsOtpActionRow[];
|
|
157
|
+
/** INVALID_OTP, EXPIRED_OTP, NO_OTP, INVALID_TOKEN. */
|
|
158
|
+
failureReasons: AccountAnalyticsCount[];
|
|
159
|
+
}
|
|
160
|
+
export interface AccountAnalyticsPasswords {
|
|
161
|
+
resetRequested: number;
|
|
162
|
+
resetCompleted: number;
|
|
163
|
+
resetFailed: number;
|
|
164
|
+
changed: number;
|
|
165
|
+
changeFailed: number;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The people an account holder chose to be alerted when they raise an SOS: app users
|
|
169
|
+
* (a two-way link, which the guardian accepts) and people reached by SMS.
|
|
170
|
+
*/
|
|
171
|
+
export interface AccountAnalyticsGuardians {
|
|
172
|
+
/** Accepted app-guardian links at the end of the period. */
|
|
173
|
+
links: number;
|
|
174
|
+
/** Links made in the period. */
|
|
175
|
+
linksCreated: number;
|
|
176
|
+
/** Accounts with at least one accepted app guardian, at the end of the period. */
|
|
177
|
+
protectedAccounts: number;
|
|
178
|
+
/** Distinct app users guarding somebody. */
|
|
179
|
+
guardians: number;
|
|
180
|
+
/** Share of app (Mobile-User) accounts with at least one guardian of either kind, now. */
|
|
181
|
+
mobileCoverage: number | null;
|
|
182
|
+
pending: number;
|
|
183
|
+
rejected: number;
|
|
184
|
+
/** Links with the guardian marked primary. */
|
|
185
|
+
primary: number;
|
|
186
|
+
/** Guardians reached by SMS, and the accounts that have one - now. */
|
|
187
|
+
smsGuardians: number;
|
|
188
|
+
accountsWithSmsGuardians: number;
|
|
189
|
+
byRelationship: AccountAnalyticsCount[];
|
|
190
|
+
}
|
|
191
|
+
/** Requests to delete an account, and why. */
|
|
192
|
+
export interface AccountAnalyticsDeletions {
|
|
193
|
+
requested: number;
|
|
194
|
+
/** Every request ever made in scope. */
|
|
195
|
+
total: number;
|
|
196
|
+
/** Requesters whose account still exists now. */
|
|
197
|
+
stillPresent: number;
|
|
198
|
+
byReason: AccountAnalyticsCount[];
|
|
199
|
+
}
|
|
200
|
+
export interface AccountAnalyticsPoint {
|
|
201
|
+
/** The bucket's start, local to the range's time zone, without an offset ("2026-09-21T00:00:00"). */
|
|
202
|
+
bucket: string;
|
|
203
|
+
created: number;
|
|
204
|
+
createdMobile: number;
|
|
205
|
+
createdStaff: number;
|
|
206
|
+
/** Of those created in the bucket: verified, signed in - as they stand now. */
|
|
207
|
+
createdVerified: number;
|
|
208
|
+
createdSignedIn: number;
|
|
209
|
+
/** Accounts in existence at the end of the bucket. */
|
|
210
|
+
totalAccounts: number;
|
|
211
|
+
signIns: number;
|
|
212
|
+
failedSignIns: number;
|
|
213
|
+
/** Distinct accounts that signed in during the bucket (activity log). */
|
|
214
|
+
activeUsers: number;
|
|
215
|
+
otpSent: number;
|
|
216
|
+
otpVerified: number;
|
|
217
|
+
deletionRequests: number;
|
|
218
|
+
guardianLinks: number;
|
|
219
|
+
}
|
|
220
|
+
/** When accounts are created and used, by weekday (1 = Monday) and hour. */
|
|
221
|
+
export interface AccountAnalyticsHeatCell {
|
|
222
|
+
weekday: number;
|
|
223
|
+
hour: number;
|
|
224
|
+
signUps: number;
|
|
225
|
+
signIns: number;
|
|
226
|
+
}
|
|
227
|
+
/** The previous period of the same length, for the change on each headline figure. Absent for "forever". */
|
|
228
|
+
export interface AccountAnalyticsPrevious {
|
|
229
|
+
from: string;
|
|
230
|
+
to: string;
|
|
231
|
+
created: number;
|
|
232
|
+
activeInPeriod: number;
|
|
233
|
+
signIns: number;
|
|
234
|
+
failedSignIns: number;
|
|
235
|
+
otpSent: number;
|
|
236
|
+
otpVerified: number;
|
|
237
|
+
deletionRequests: number;
|
|
238
|
+
guardianLinks: number;
|
|
239
|
+
}
|
|
240
|
+
/** A Super-Admin's view of every organization: one row each, biggest first. */
|
|
241
|
+
export interface AccountAnalyticsOrganizationRow {
|
|
242
|
+
organizationId: number;
|
|
243
|
+
total: number;
|
|
244
|
+
created: number;
|
|
245
|
+
active: number;
|
|
246
|
+
mobile: number;
|
|
247
|
+
staff: number;
|
|
248
|
+
signIns: number;
|
|
249
|
+
failedSignIns: number;
|
|
250
|
+
}
|
|
251
|
+
export interface AccountAnalytics {
|
|
252
|
+
/** Whose figures: one organization (and one control centre in it), or null for every organization. */
|
|
253
|
+
organizationId: number | null;
|
|
254
|
+
controlCentreId: number | null;
|
|
255
|
+
range: AccountAnalyticsRange;
|
|
256
|
+
generatedAt: string;
|
|
257
|
+
/** When the activity log's first record in scope was made; null while it is empty. */
|
|
258
|
+
activitySince: string | null;
|
|
259
|
+
previous: AccountAnalyticsPrevious | null;
|
|
260
|
+
timeline: AccountAnalyticsPoint[];
|
|
261
|
+
/** All 168 hours of the week, Monday first, zeros included. */
|
|
262
|
+
heatmap: AccountAnalyticsHeatCell[];
|
|
263
|
+
accounts: AccountAnalyticsAccounts;
|
|
264
|
+
signIns: AccountAnalyticsSignIns;
|
|
265
|
+
otp: AccountAnalyticsOtp;
|
|
266
|
+
passwords: AccountAnalyticsPasswords;
|
|
267
|
+
guardians: AccountAnalyticsGuardians;
|
|
268
|
+
deletions: AccountAnalyticsDeletions;
|
|
269
|
+
/** A Super-Admin looking at every organization only. */
|
|
270
|
+
byOrganization?: AccountAnalyticsOrganizationRow[];
|
|
271
|
+
}
|
|
272
|
+
/** What a dashboard asks: the period, and - for a Super-Admin - whose figures. */
|
|
273
|
+
export interface AccountAnalyticsQuery {
|
|
274
|
+
from?: string;
|
|
275
|
+
to?: string;
|
|
276
|
+
timeZone?: string;
|
|
277
|
+
organizationId?: number;
|
|
278
|
+
}
|