clarion-shared-types 1.0.107 → 1.0.109
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/modules/billing/index.js +19 -0
- package/dist/cjs/modules/billing/index.js.map +1 -0
- package/dist/cjs/modules/billing/interfaces/billing-analytics.js +17 -0
- package/dist/cjs/modules/billing/interfaces/billing-analytics.js.map +1 -0
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js +4 -0
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/cjs/modules/safety/index.js +1 -0
- package/dist/cjs/modules/safety/index.js.map +1 -1
- package/dist/cjs/modules/safety/interfaces/safety-analytics.js +12 -0
- package/dist/cjs/modules/safety/interfaces/safety-analytics.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/modules/billing/index.js +3 -0
- package/dist/esm/modules/billing/index.js.map +1 -0
- package/dist/esm/modules/billing/interfaces/billing-analytics.js +16 -0
- package/dist/esm/modules/billing/interfaces/billing-analytics.js.map +1 -0
- package/dist/esm/modules/permission/enums/permission-actions.enum.js +4 -0
- package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/esm/modules/safety/index.js +1 -0
- package/dist/esm/modules/safety/index.js.map +1 -1
- package/dist/esm/modules/safety/interfaces/safety-analytics.js +11 -0
- package/dist/esm/modules/safety/interfaces/safety-analytics.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/modules/billing/index.d.ts +1 -0
- package/dist/types/modules/billing/interfaces/billing-analytics.d.ts +432 -0
- package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +2 -0
- package/dist/types/modules/safety/index.d.ts +1 -0
- package/dist/types/modules/safety/interfaces/safety-analytics.d.ts +360 -0
- package/package.json +45 -45
package/dist/cjs/index.js
CHANGED
|
@@ -40,6 +40,7 @@ __exportStar(require("./modules/alert-intake/index"), exports);
|
|
|
40
40
|
__exportStar(require("./modules/partner/index"), exports);
|
|
41
41
|
__exportStar(require("./modules/support/index"), exports);
|
|
42
42
|
__exportStar(require("./modules/safety/index"), exports);
|
|
43
|
+
__exportStar(require("./modules/billing/index"), exports);
|
|
43
44
|
// Interfaces
|
|
44
45
|
__exportStar(require("./modules/common/interfaces/server-message"), exports);
|
|
45
46
|
__exportStar(require("./modules/common/interfaces/pagination"), exports);
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,UAAU;AACV,uDAAqC;AACrC,+DAA6C;AAC7C,yDAAuC;AACvC,6DAA2C;AAC3C,uDAAqC;AACrC,uDAAqC;AACrC,iEAA+C;AAC/C,gEAA8C;AAC9C,2DAAyC;AACzC,2DAAyC;AACzC,sDAAoC;AACpC,sDAAoC;AACpC,sDAAoC;AACpC,yDAAuC;AACvC,mEAAiD;AACjD,+DAA6C;AAC7C,uDAAqC;AACrC,0DAAwC;AACxC,2DAAyC;AACzC,8DAA4C;AAC5C,iEAA+C;AAC/C,+DAA6C;AAC7C,0DAAwC;AACxC,0DAAwC;AACxC,yDAAuC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,UAAU;AACV,uDAAqC;AACrC,+DAA6C;AAC7C,yDAAuC;AACvC,6DAA2C;AAC3C,uDAAqC;AACrC,uDAAqC;AACrC,iEAA+C;AAC/C,gEAA8C;AAC9C,2DAAyC;AACzC,2DAAyC;AACzC,sDAAoC;AACpC,sDAAoC;AACpC,sDAAoC;AACpC,yDAAuC;AACvC,mEAAiD;AACjD,+DAA6C;AAC7C,uDAAqC;AACrC,0DAAwC;AACxC,2DAAyC;AACzC,8DAA4C;AAC5C,iEAA+C;AAC/C,+DAA6C;AAC7C,0DAAwC;AACxC,0DAAwC;AACxC,yDAAuC;AACvC,0DAAwC;AAExC,aAAa;AACb,6EAA2D;AAC3D,yEAAuD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
// Interfaces
|
|
18
|
+
__exportStar(require("./interfaces/billing-analytics"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/billing/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,aAAa;AACb,iEAA+C"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Billing analytics: what came in over a period and what it was for, what was invoiced
|
|
4
|
+
* and is still owed, how checkouts went, how subscriptions and the people they cover
|
|
5
|
+
* moved, how trials turned into paying customers, and what is owed to the platform.
|
|
6
|
+
*
|
|
7
|
+
* One read, computed by clarion-billing from one consistent snapshot, so every number
|
|
8
|
+
* on a dashboard agrees with every other. Money is in minor units of ONE currency (the
|
|
9
|
+
* answer's `currency`): an organization that sells in two currencies is read one
|
|
10
|
+
* currency at a time, never added up across them.
|
|
11
|
+
*
|
|
12
|
+
* Totals and counts only: never a person's name, phone number or e-mail. A corporate
|
|
13
|
+
* client and a package appear by name - they are the organization's own customers and
|
|
14
|
+
* products, already on its billing screens.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
//# sourceMappingURL=billing-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/billing/interfaces/billing-analytics.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -191,6 +191,8 @@ var PermissionActions;
|
|
|
191
191
|
PermissionActions["CREATE_SETTLEMENT_BATCH"] = "create:settlement-batch";
|
|
192
192
|
PermissionActions["RECONCILE_SETTLEMENT_BATCH"] = "reconcile:settlement-batch";
|
|
193
193
|
PermissionActions["READ_BILLING_OPERATIONS"] = "read:billing-operations";
|
|
194
|
+
// Billing Analytics - the organization's billing over a period, totals and counts only.
|
|
195
|
+
PermissionActions["READ_BILLING_ANALYTICS"] = "read:billing-analytics";
|
|
194
196
|
PermissionActions["READ_PREMIUM_TRIAL"] = "read:premium-trial";
|
|
195
197
|
PermissionActions["GRANT_PREMIUM_TRIAL"] = "grant:premium-trial";
|
|
196
198
|
PermissionActions["REVOKE_PREMIUM_TRIAL"] = "revoke:premium-trial";
|
|
@@ -229,6 +231,8 @@ var PermissionActions;
|
|
|
229
231
|
PermissionActions["USE_SAFETY_CHECK"] = "use:safety-check";
|
|
230
232
|
PermissionActions["READ_SAFETY_CHECK"] = "read:safety-check";
|
|
231
233
|
PermissionActions["MANAGE_SAFETY_CHECK_REASON"] = "manage:safety-check-reason";
|
|
234
|
+
// Safety Analytics: how Safety Check and Follow Me are used - counts only.
|
|
235
|
+
PermissionActions["READ_SAFETY_ANALYTICS"] = "read:safety-analytics";
|
|
232
236
|
// Follow Me: use = run and follow journeys in the app; read = staff see sessions
|
|
233
237
|
// (no location); track = staff see WHERE, only for sessions shared with the
|
|
234
238
|
// provider or turned SOS (clarion-safety enforces that condition).
|
|
@@ -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":"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"}
|
|
@@ -25,6 +25,7 @@ __exportStar(require("./constants/follow-me.const"), exports);
|
|
|
25
25
|
__exportStar(require("./interfaces/safety-check.dto"), exports);
|
|
26
26
|
__exportStar(require("./interfaces/safety-alert-context"), exports);
|
|
27
27
|
__exportStar(require("./interfaces/follow-me.dto"), exports);
|
|
28
|
+
__exportStar(require("./interfaces/safety-analytics"), exports);
|
|
28
29
|
// Utilities
|
|
29
30
|
__exportStar(require("./utils/safety-display.util"), exports);
|
|
30
31
|
__exportStar(require("./utils/follow-me-display.util"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/safety/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,uDAAqC;AACrC,0DAAwC;AAExC,YAAY;AACZ,wEAAsD;AACtD,oEAAkD;AAClD,8DAA4C;AAE5C,oBAAoB;AACpB,gEAA8C;AAC9C,oEAAkD;AAClD,6DAA2C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/safety/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,uDAAqC;AACrC,0DAAwC;AAExC,YAAY;AACZ,wEAAsD;AACtD,oEAAkD;AAClD,8DAA4C;AAE5C,oBAAoB;AACpB,gEAA8C;AAC9C,oEAAkD;AAClD,6DAA2C;AAC3C,gEAA8C;AAE9C,YAAY;AACZ,8DAA4C;AAC5C,iEAA+C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Safety analytics: how Safety Check and Follow Me were used over a period, by whom
|
|
4
|
+
* and how often, how they ended, what the monitoring caught and how the guardians
|
|
5
|
+
* followed. One read, computed by clarion-safety from one consistent snapshot, so
|
|
6
|
+
* every number on a dashboard agrees with every other.
|
|
7
|
+
*
|
|
8
|
+
* Counts only: never a location, a destination, a phone number, a name or a reason a
|
|
9
|
+
* user typed. A check or journey is counted by when it started, as it stands now.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
//# sourceMappingURL=safety-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/safety/interfaces/safety-analytics.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
|
package/dist/esm/index.js
CHANGED
|
@@ -24,6 +24,7 @@ export * from './modules/alert-intake/index';
|
|
|
24
24
|
export * from './modules/partner/index';
|
|
25
25
|
export * from './modules/support/index';
|
|
26
26
|
export * from './modules/safety/index';
|
|
27
|
+
export * from './modules/billing/index';
|
|
27
28
|
// Interfaces
|
|
28
29
|
export * from './modules/common/interfaces/server-message';
|
|
29
30
|
export * from './modules/common/interfaces/pagination';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AAExC,aAAa;AACb,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/billing/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,cAAc,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Billing analytics: what came in over a period and what it was for, what was invoiced
|
|
3
|
+
* and is still owed, how checkouts went, how subscriptions and the people they cover
|
|
4
|
+
* moved, how trials turned into paying customers, and what is owed to the platform.
|
|
5
|
+
*
|
|
6
|
+
* One read, computed by clarion-billing from one consistent snapshot, so every number
|
|
7
|
+
* on a dashboard agrees with every other. Money is in minor units of ONE currency (the
|
|
8
|
+
* answer's `currency`): an organization that sells in two currencies is read one
|
|
9
|
+
* currency at a time, never added up across them.
|
|
10
|
+
*
|
|
11
|
+
* Totals and counts only: never a person's name, phone number or e-mail. A corporate
|
|
12
|
+
* client and a package appear by name - they are the organization's own customers and
|
|
13
|
+
* products, already on its billing screens.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=billing-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/billing/interfaces/billing-analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -188,6 +188,8 @@ export var PermissionActions;
|
|
|
188
188
|
PermissionActions["CREATE_SETTLEMENT_BATCH"] = "create:settlement-batch";
|
|
189
189
|
PermissionActions["RECONCILE_SETTLEMENT_BATCH"] = "reconcile:settlement-batch";
|
|
190
190
|
PermissionActions["READ_BILLING_OPERATIONS"] = "read:billing-operations";
|
|
191
|
+
// Billing Analytics - the organization's billing over a period, totals and counts only.
|
|
192
|
+
PermissionActions["READ_BILLING_ANALYTICS"] = "read:billing-analytics";
|
|
191
193
|
PermissionActions["READ_PREMIUM_TRIAL"] = "read:premium-trial";
|
|
192
194
|
PermissionActions["GRANT_PREMIUM_TRIAL"] = "grant:premium-trial";
|
|
193
195
|
PermissionActions["REVOKE_PREMIUM_TRIAL"] = "revoke:premium-trial";
|
|
@@ -226,6 +228,8 @@ export var PermissionActions;
|
|
|
226
228
|
PermissionActions["USE_SAFETY_CHECK"] = "use:safety-check";
|
|
227
229
|
PermissionActions["READ_SAFETY_CHECK"] = "read:safety-check";
|
|
228
230
|
PermissionActions["MANAGE_SAFETY_CHECK_REASON"] = "manage:safety-check-reason";
|
|
231
|
+
// Safety Analytics: how Safety Check and Follow Me are used - counts only.
|
|
232
|
+
PermissionActions["READ_SAFETY_ANALYTICS"] = "read:safety-analytics";
|
|
229
233
|
// Follow Me: use = run and follow journeys in the app; read = staff see sessions
|
|
230
234
|
// (no location); track = staff see WHERE, only for sessions shared with the
|
|
231
235
|
// provider or turned SOS (clarion-safety enforces that condition).
|
|
@@ -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,iBAkRX;AAlRD,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;IAEvD,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;IAE3B,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,EAlRW,iBAAiB,KAAjB,iBAAiB,QAkR5B"}
|
|
@@ -9,6 +9,7 @@ export * from './constants/follow-me.const';
|
|
|
9
9
|
export * from './interfaces/safety-check.dto';
|
|
10
10
|
export * from './interfaces/safety-alert-context';
|
|
11
11
|
export * from './interfaces/follow-me.dto';
|
|
12
|
+
export * from './interfaces/safety-analytics';
|
|
12
13
|
// Utilities
|
|
13
14
|
export * from './utils/safety-display.util';
|
|
14
15
|
export * from './utils/follow-me-display.util';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/safety/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AAExC,YAAY;AACZ,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAE5C,oBAAoB;AACpB,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/safety/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AAExC,YAAY;AACZ,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAE5C,oBAAoB;AACpB,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAE9C,YAAY;AACZ,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safety analytics: how Safety Check and Follow Me were used over a period, by whom
|
|
3
|
+
* and how often, how they ended, what the monitoring caught and how the guardians
|
|
4
|
+
* followed. One read, computed by clarion-safety from one consistent snapshot, so
|
|
5
|
+
* every number on a dashboard agrees with every other.
|
|
6
|
+
*
|
|
7
|
+
* Counts only: never a location, a destination, a phone number, a name or a reason a
|
|
8
|
+
* user typed. A check or journey is counted by when it started, as it stands now.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=safety-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety-analytics.js","sourceRoot":"","sources":["../../../../../src/modules/safety/interfaces/safety-analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -23,5 +23,6 @@ export * from './modules/alert-intake/index';
|
|
|
23
23
|
export * from './modules/partner/index';
|
|
24
24
|
export * from './modules/support/index';
|
|
25
25
|
export * from './modules/safety/index';
|
|
26
|
+
export * from './modules/billing/index';
|
|
26
27
|
export * from './modules/common/interfaces/server-message';
|
|
27
28
|
export * from './modules/common/interfaces/pagination';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './interfaces/billing-analytics';
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Billing analytics: what came in over a period and what it was for, what was invoiced
|
|
3
|
+
* and is still owed, how checkouts went, how subscriptions and the people they cover
|
|
4
|
+
* moved, how trials turned into paying customers, and what is owed to the platform.
|
|
5
|
+
*
|
|
6
|
+
* One read, computed by clarion-billing from one consistent snapshot, so every number
|
|
7
|
+
* on a dashboard agrees with every other. Money is in minor units of ONE currency (the
|
|
8
|
+
* answer's `currency`): an organization that sells in two currencies is read one
|
|
9
|
+
* currency at a time, never added up across them.
|
|
10
|
+
*
|
|
11
|
+
* Totals and counts only: never a person's name, phone number or e-mail. A corporate
|
|
12
|
+
* client and a package appear by name - they are the organization's own customers and
|
|
13
|
+
* products, already on its billing screens.
|
|
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 BillingAnalyticsBucket = 'hour' | 'day' | 'week' | 'month';
|
|
17
|
+
export interface BillingAnalyticsRange {
|
|
18
|
+
/** Inclusive, ISO 8601. The first billing record when the period asked for was "forever". */
|
|
19
|
+
from: string;
|
|
20
|
+
/** Exclusive, ISO 8601. */
|
|
21
|
+
to: string;
|
|
22
|
+
bucket: BillingAnalyticsBucket;
|
|
23
|
+
/** IANA time zone the buckets are cut in. */
|
|
24
|
+
timeZone: string;
|
|
25
|
+
}
|
|
26
|
+
/** A count by a key (a status, a band, a provider), largest first unless the section says otherwise. */
|
|
27
|
+
export interface BillingAnalyticsCount<K extends string = string> {
|
|
28
|
+
key: K;
|
|
29
|
+
count: number;
|
|
30
|
+
}
|
|
31
|
+
/** A count by a key, and the money in it. */
|
|
32
|
+
export interface BillingAnalyticsAmount<K extends string = string> {
|
|
33
|
+
key: K;
|
|
34
|
+
count: number;
|
|
35
|
+
amountMinor: number;
|
|
36
|
+
}
|
|
37
|
+
/** A currency the scope has done business in, so a dashboard can offer to switch to it. */
|
|
38
|
+
export interface BillingAnalyticsCurrency {
|
|
39
|
+
currency: string;
|
|
40
|
+
/** Money received in the period, in this currency. */
|
|
41
|
+
collectedMinor: number;
|
|
42
|
+
/** Subscriptions ever started in this currency. */
|
|
43
|
+
subscriptions: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* What a payment was for:
|
|
47
|
+
* - NEW the first period of a subscription;
|
|
48
|
+
* - RENEWAL a later period;
|
|
49
|
+
* - SEATS people added to a running subscription, for what was left of its period;
|
|
50
|
+
* - ORDER a corporate order;
|
|
51
|
+
* - OTHER anything else (a payment from before payments named their invoice).
|
|
52
|
+
*/
|
|
53
|
+
export type BillingRevenueKind = 'NEW' | 'RENEWAL' | 'SEATS' | 'ORDER' | 'OTHER';
|
|
54
|
+
/**
|
|
55
|
+
* Money received from customers in the period, by when it was paid. A payment made to
|
|
56
|
+
* the PLATFORM (an organization settling its fees) is not revenue here; it is in
|
|
57
|
+
* `settlements`.
|
|
58
|
+
*/
|
|
59
|
+
export interface BillingAnalyticsRevenue {
|
|
60
|
+
/** Every successful customer payment, VAT included. */
|
|
61
|
+
collectedMinor: number;
|
|
62
|
+
payments: number;
|
|
63
|
+
/** Distinct customers who paid: an individual, or a corporate client. */
|
|
64
|
+
payers: number;
|
|
65
|
+
/** The VAT in what was collected (from the invoices the payments settled). */
|
|
66
|
+
taxMinor: number;
|
|
67
|
+
/** Collected less VAT. */
|
|
68
|
+
netMinor: number;
|
|
69
|
+
/** Paid through Paystack or Flutterwave. */
|
|
70
|
+
gatewayMinor: number;
|
|
71
|
+
/** Recorded by a person: bank transfer, cheque, LPO, cash... */
|
|
72
|
+
manualMinor: number;
|
|
73
|
+
/** Received and not used - the invoice was already paid, void, or for another amount. Included in `collectedMinor`. */
|
|
74
|
+
unappliedMinor: number;
|
|
75
|
+
unappliedPayments: number;
|
|
76
|
+
averagePaymentMinor: number | null;
|
|
77
|
+
/** Credits and refunds recorded in the period (as positive amounts). */
|
|
78
|
+
creditsMinor: number;
|
|
79
|
+
refundsMinor: number;
|
|
80
|
+
/** Every kind, in a fixed order, zeros included. */
|
|
81
|
+
byKind: BillingAnalyticsAmount<BillingRevenueKind>[];
|
|
82
|
+
/** INDIVIDUAL and CORPORATE customers, zeros included. */
|
|
83
|
+
byProfile: BillingAnalyticsAmount[];
|
|
84
|
+
/** PAYSTACK, FLUTTERWAVE, MANUAL. */
|
|
85
|
+
byProvider: BillingAnalyticsAmount[];
|
|
86
|
+
/** CARD, MOBILE_MONEY, BANK_TRANSFER, UNKNOWN for a gateway; MANUAL_<method> for one recorded by a person. */
|
|
87
|
+
byMethod: BillingAnalyticsAmount[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Recurring revenue at the end of the period: the price of every paid, covered seat on
|
|
91
|
+
* a recurring plan, as a monthly figure (an annual seat counts a twelfth).
|
|
92
|
+
*/
|
|
93
|
+
export interface BillingAnalyticsRecurring {
|
|
94
|
+
mrrMinor: number;
|
|
95
|
+
/** MRR × 12. */
|
|
96
|
+
arrMinor: number;
|
|
97
|
+
/** Subscriptions with at least one paid, covered seat. */
|
|
98
|
+
payingSubscriptions: number;
|
|
99
|
+
billableSeats: number;
|
|
100
|
+
averagePerSubscriptionMinor: number | null;
|
|
101
|
+
}
|
|
102
|
+
/** How long an invoice still owed at the end of the period has been due. */
|
|
103
|
+
export type BillingAgingBand = 'NOT_DUE' | 'NO_DUE_DATE' | '1-30' | '31-60' | '61-90' | '90+';
|
|
104
|
+
/**
|
|
105
|
+
* Customer invoices. A checkout's own invoice that was never paid (DRAFT) is not
|
|
106
|
+
* counted as issued: nobody was asked to pay it but the person who walked away.
|
|
107
|
+
*/
|
|
108
|
+
export interface BillingAnalyticsInvoices {
|
|
109
|
+
/** Issued in the period. */
|
|
110
|
+
issued: number;
|
|
111
|
+
issuedMinor: number;
|
|
112
|
+
/** Of those, paid by the end of the period. */
|
|
113
|
+
paid: number;
|
|
114
|
+
paidMinor: number;
|
|
115
|
+
voided: number;
|
|
116
|
+
voidedMinor: number;
|
|
117
|
+
/** paidMinor as a share of issuedMinor (voided ones left out); null with nothing issued. */
|
|
118
|
+
collectionRate: number | null;
|
|
119
|
+
/** Any invoice paid in the period, whenever it was issued. */
|
|
120
|
+
paidInPeriod: number;
|
|
121
|
+
paidInPeriodMinor: number;
|
|
122
|
+
/** From issued to paid, for the invoices paid in the period. */
|
|
123
|
+
medianDaysToPay: number | null;
|
|
124
|
+
averageDaysToPay: number | null;
|
|
125
|
+
/** Still owed at the end of the period, and the part of it past its due date. */
|
|
126
|
+
outstanding: number;
|
|
127
|
+
outstandingMinor: number;
|
|
128
|
+
overdue: number;
|
|
129
|
+
overdueMinor: number;
|
|
130
|
+
/** The period's invoices as they stand now: PAID, ISSUED, OVERDUE, VOID. */
|
|
131
|
+
byStatus: BillingAnalyticsAmount[];
|
|
132
|
+
/** What is owed at the end of the period, by how long it has been due. Fixed order, zeros included. */
|
|
133
|
+
aging: BillingAnalyticsAmount<BillingAgingBand>[];
|
|
134
|
+
/** The period's invoices by what they were for: SUBSCRIPTION_PERIOD, SEAT_ADJUSTMENT, CORPORATE_ORDER, OTHER. */
|
|
135
|
+
byPurpose: BillingAnalyticsAmount[];
|
|
136
|
+
}
|
|
137
|
+
/** Gateway checkouts opened in the period, as they stand now. */
|
|
138
|
+
export interface BillingAnalyticsCheckoutProvider {
|
|
139
|
+
provider: string;
|
|
140
|
+
attempts: number;
|
|
141
|
+
succeeded: number;
|
|
142
|
+
failed: number;
|
|
143
|
+
abandoned: number;
|
|
144
|
+
pending: number;
|
|
145
|
+
successRate: number | null;
|
|
146
|
+
}
|
|
147
|
+
export interface BillingAnalyticsCheckouts {
|
|
148
|
+
attempts: number;
|
|
149
|
+
succeeded: number;
|
|
150
|
+
failed: number;
|
|
151
|
+
/** Closed without a payment: never completed, or the customer walked away. */
|
|
152
|
+
abandoned: number;
|
|
153
|
+
/** Still waiting for the customer or the provider. */
|
|
154
|
+
pending: number;
|
|
155
|
+
cancelled: number;
|
|
156
|
+
/** succeeded / (succeeded + failed + abandoned + cancelled); null when none has finished. */
|
|
157
|
+
successRate: number | null;
|
|
158
|
+
/** From opening the checkout to the money arriving, for the ones that succeeded. */
|
|
159
|
+
medianSecondsToPay: number | null;
|
|
160
|
+
byProvider: BillingAnalyticsCheckoutProvider[];
|
|
161
|
+
/** Why the failed ones failed, as the provider (or reconciliation) put it - top 8. */
|
|
162
|
+
failureReasons: BillingAnalyticsCount[];
|
|
163
|
+
/** Payments recorded by a person in the period. */
|
|
164
|
+
manualRecorded: number;
|
|
165
|
+
manualRecordedMinor: number;
|
|
166
|
+
}
|
|
167
|
+
/** Size of a subscription by the people covered on it at the end of the period. */
|
|
168
|
+
export type BillingPlanSizeBand = '1' | '2-3' | '4-9' | '10-49' | '50+';
|
|
169
|
+
/** What is coming up, counted from NOW - whatever period is being looked at. */
|
|
170
|
+
export interface BillingAnalyticsRenewalsAhead {
|
|
171
|
+
dueIn7Days: number;
|
|
172
|
+
dueIn30Days: number;
|
|
173
|
+
/** What the subscriptions due in the next 30 days cost per period. */
|
|
174
|
+
dueIn30DaysMinor: number;
|
|
175
|
+
/** Of those due in 30 days: renew on their own (a saved card), or need somebody to pay. */
|
|
176
|
+
autoRenewing: number;
|
|
177
|
+
manualRenewing: number;
|
|
178
|
+
/** Cancelled for the end of their period: they will not renew. */
|
|
179
|
+
endingAtPeriodEnd: number;
|
|
180
|
+
/** A renewal charge failed; still covered until the end of the period. */
|
|
181
|
+
pastDue: number;
|
|
182
|
+
/** Waiting for the customer to pay the renewal themselves (mobile money). */
|
|
183
|
+
manualRenewalRequired: number;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* A subscription is LIVE from its first activation to the end of what was paid for (or
|
|
187
|
+
* to its cancellation or suspension) - so "live at the start" and "live at the end" can
|
|
188
|
+
* be read for any date in the past.
|
|
189
|
+
*/
|
|
190
|
+
export interface BillingAnalyticsSubscriptions {
|
|
191
|
+
/** Null for "forever". */
|
|
192
|
+
liveAtStart: number | null;
|
|
193
|
+
liveAtEnd: number;
|
|
194
|
+
/** First activated in the period. */
|
|
195
|
+
started: number;
|
|
196
|
+
/** A second or later period that started in the period. */
|
|
197
|
+
renewed: number;
|
|
198
|
+
/** Cover ended in the period because it was cancelled... */
|
|
199
|
+
cancelled: number;
|
|
200
|
+
/** ...or because it ran out and was not renewed. */
|
|
201
|
+
expired: number;
|
|
202
|
+
/** (cancelled + expired) / liveAtStart; null for "forever" or with nothing live at the start. */
|
|
203
|
+
churnRate: number | null;
|
|
204
|
+
/** renewed / (renewed + expired); null when none came up. */
|
|
205
|
+
renewalRate: number | null;
|
|
206
|
+
/** Created, never paid, and still waiting now. */
|
|
207
|
+
awaitingFirstPayment: number;
|
|
208
|
+
/** Every subscription in scope, as it stands now - every status, zeros included. */
|
|
209
|
+
byStatus: BillingAnalyticsCount[];
|
|
210
|
+
/** The subscriptions live at the end of the period, split four ways. */
|
|
211
|
+
byProfile: BillingAnalyticsCount[];
|
|
212
|
+
byCycle: BillingAnalyticsCount[];
|
|
213
|
+
byRenewalMode: BillingAnalyticsCount[];
|
|
214
|
+
byCollection: BillingAnalyticsCount[];
|
|
215
|
+
/** Fixed order, zeros included. */
|
|
216
|
+
sizes: BillingAnalyticsCount<BillingPlanSizeBand>[];
|
|
217
|
+
ahead: BillingAnalyticsRenewalsAhead;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Who holds the cover:
|
|
221
|
+
* - SUBSCRIBER an individual on their own plan;
|
|
222
|
+
* - BENEFICIARY somebody covered under a subscriber or a corporate member;
|
|
223
|
+
* - MEMBER a corporate client's member;
|
|
224
|
+
* - MANUAL cover granted by hand.
|
|
225
|
+
*/
|
|
226
|
+
export type BillingCoverKind = 'SUBSCRIBER' | 'BENEFICIARY' | 'MEMBER' | 'MANUAL';
|
|
227
|
+
export interface BillingAnalyticsSeatType {
|
|
228
|
+
/** PRIMARY, BENEFICIARY, CORPORATE_MEMBER, CORPORATE_MEMBER_BENEFICIARY. */
|
|
229
|
+
type: string;
|
|
230
|
+
/** Covered at the end of the period, charged for. */
|
|
231
|
+
paid: number;
|
|
232
|
+
/** Covered at no charge (a zero-priced package, or beneficiaries not charged for). */
|
|
233
|
+
included: number;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* The people covered: from their cover itself (what the incident service is told), so
|
|
237
|
+
* a person on two plans is one person. Seats are the places on plans that are paid for
|
|
238
|
+
* - a corporate member without an app account holds a seat but no cover yet.
|
|
239
|
+
*/
|
|
240
|
+
export interface BillingAnalyticsCover {
|
|
241
|
+
/** Null for "forever". */
|
|
242
|
+
peopleAtStart: number | null;
|
|
243
|
+
peopleAtEnd: number;
|
|
244
|
+
/** People whose first-ever cover started in the period. */
|
|
245
|
+
newlyCovered: number;
|
|
246
|
+
/** At the end of the period, every kind in a fixed order. */
|
|
247
|
+
byKind: BillingAnalyticsCount<BillingCoverKind>[];
|
|
248
|
+
seats: {
|
|
249
|
+
/** Covered at the end of the period. */
|
|
250
|
+
paid: number;
|
|
251
|
+
included: number;
|
|
252
|
+
/** Waiting for their charge to be paid now: nobody is covered on them yet. */
|
|
253
|
+
pending: number;
|
|
254
|
+
/** Added to a running plan in the period. */
|
|
255
|
+
addedMidPeriod: number;
|
|
256
|
+
/** What those additions were charged, for what was left of their period. */
|
|
257
|
+
addedMidPeriodMinor: number;
|
|
258
|
+
/** Taken off a plan in the period. */
|
|
259
|
+
removed: number;
|
|
260
|
+
};
|
|
261
|
+
seatsByType: BillingAnalyticsSeatType[];
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Premium trials (a few alerts with full cover, free): started in the period, and
|
|
265
|
+
* whether the person went on to pay for a plan of their own. Trials carry no currency;
|
|
266
|
+
* these figures are the same whichever currency is being read.
|
|
267
|
+
*/
|
|
268
|
+
export interface BillingAnalyticsTrials {
|
|
269
|
+
started: number;
|
|
270
|
+
/** Started a paid subscription of their own after the trial began. */
|
|
271
|
+
converted: number;
|
|
272
|
+
conversionRate: number | null;
|
|
273
|
+
medianDaysToConvert: number | null;
|
|
274
|
+
/** Alerts raised on a trial. */
|
|
275
|
+
alertsUsed: number;
|
|
276
|
+
/** Of the period's trials: ACTIVE, EXHAUSTED, EXPIRED, REVOKED - now. */
|
|
277
|
+
byStatus: BillingAnalyticsCount[];
|
|
278
|
+
/** AUTO_ENROLL (on first use) or MANUAL_GRANT. */
|
|
279
|
+
bySource: BillingAnalyticsCount[];
|
|
280
|
+
}
|
|
281
|
+
/** One month an organization was charged by the platform. */
|
|
282
|
+
export interface BillingAnalyticsSettlementRow {
|
|
283
|
+
id: number;
|
|
284
|
+
organizationId: number;
|
|
285
|
+
/** ISO 8601. */
|
|
286
|
+
periodStart: string;
|
|
287
|
+
periodEnd: string;
|
|
288
|
+
/** DRAFT, INVOICED, PAID, OVERDUE. */
|
|
289
|
+
status: string;
|
|
290
|
+
/** CALCULATED, or MINIMUM when the minimum monthly charge applied. */
|
|
291
|
+
feeBasis: string;
|
|
292
|
+
grossRevenueMinor: number;
|
|
293
|
+
netRevenueMinor: number;
|
|
294
|
+
feeMinor: number;
|
|
295
|
+
platformTaxMinor: number;
|
|
296
|
+
totalDueMinor: number;
|
|
297
|
+
organizationNetMinor: number;
|
|
298
|
+
paidAt: string | null;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* What the organization owes the platform for the months the period touches. For a
|
|
302
|
+
* Super-Admin looking at every organization, what the platform has earned.
|
|
303
|
+
*/
|
|
304
|
+
export interface BillingAnalyticsSettlements {
|
|
305
|
+
months: number;
|
|
306
|
+
grossRevenueMinor: number;
|
|
307
|
+
feesMinor: number;
|
|
308
|
+
platformTaxMinor: number;
|
|
309
|
+
totalDueMinor: number;
|
|
310
|
+
paidMinor: number;
|
|
311
|
+
/** Invoiced or overdue, not yet paid. */
|
|
312
|
+
outstandingMinor: number;
|
|
313
|
+
organizationNetMinor: number;
|
|
314
|
+
/** Months on which the minimum monthly charge applied. */
|
|
315
|
+
onMinimum: number;
|
|
316
|
+
/** Newest first, at most 36. */
|
|
317
|
+
rows: BillingAnalyticsSettlementRow[];
|
|
318
|
+
}
|
|
319
|
+
export interface BillingAnalyticsTimelinePoint {
|
|
320
|
+
/** The bucket's start, local to the range's time zone, without an offset ("2026-09-21T00:00:00"). */
|
|
321
|
+
bucket: string;
|
|
322
|
+
collectedMinor: number;
|
|
323
|
+
newMinor: number;
|
|
324
|
+
renewalMinor: number;
|
|
325
|
+
seatsMinor: number;
|
|
326
|
+
orderMinor: number;
|
|
327
|
+
otherMinor: number;
|
|
328
|
+
payments: number;
|
|
329
|
+
invoices: number;
|
|
330
|
+
invoicedMinor: number;
|
|
331
|
+
/** Invoices paid in the bucket, and their value. */
|
|
332
|
+
invoicesPaidMinor: number;
|
|
333
|
+
attempts: number;
|
|
334
|
+
succeeded: number;
|
|
335
|
+
failed: number;
|
|
336
|
+
abandoned: number;
|
|
337
|
+
started: number;
|
|
338
|
+
renewed: number;
|
|
339
|
+
ended: number;
|
|
340
|
+
/** Live at the end of the bucket. */
|
|
341
|
+
liveSubscriptions: number;
|
|
342
|
+
/** Covered at the end of the bucket. */
|
|
343
|
+
peopleCovered: number;
|
|
344
|
+
trialsStarted: number;
|
|
345
|
+
trialsConverted: number;
|
|
346
|
+
}
|
|
347
|
+
/** The previous period of the same length, for the change on each headline figure. Absent for "forever". */
|
|
348
|
+
export interface BillingAnalyticsPrevious {
|
|
349
|
+
from: string;
|
|
350
|
+
to: string;
|
|
351
|
+
collectedMinor: number;
|
|
352
|
+
netMinor: number;
|
|
353
|
+
payments: number;
|
|
354
|
+
invoices: number;
|
|
355
|
+
invoicedMinor: number;
|
|
356
|
+
attempts: number;
|
|
357
|
+
succeeded: number;
|
|
358
|
+
started: number;
|
|
359
|
+
renewed: number;
|
|
360
|
+
ended: number;
|
|
361
|
+
seatsAdded: number;
|
|
362
|
+
trialsStarted: number;
|
|
363
|
+
trialsConverted: number;
|
|
364
|
+
}
|
|
365
|
+
export interface BillingAnalyticsPackageRow {
|
|
366
|
+
packageId: number;
|
|
367
|
+
organizationId: number;
|
|
368
|
+
name: string;
|
|
369
|
+
profileType: string;
|
|
370
|
+
billingCycle: string;
|
|
371
|
+
liveSubscriptions: number;
|
|
372
|
+
coveredSeats: number;
|
|
373
|
+
started: number;
|
|
374
|
+
collectedMinor: number;
|
|
375
|
+
mrrMinor: number;
|
|
376
|
+
}
|
|
377
|
+
export interface BillingAnalyticsClientRow {
|
|
378
|
+
corporateClientId: number;
|
|
379
|
+
organizationId: number;
|
|
380
|
+
name: string;
|
|
381
|
+
liveSubscriptions: number;
|
|
382
|
+
coveredSeats: number;
|
|
383
|
+
collectedMinor: number;
|
|
384
|
+
invoicedMinor: number;
|
|
385
|
+
outstandingMinor: number;
|
|
386
|
+
overdueMinor: number;
|
|
387
|
+
}
|
|
388
|
+
/** A Super-Admin's view of every organization: one row each, busiest first. */
|
|
389
|
+
export interface BillingAnalyticsOrganizationRow {
|
|
390
|
+
organizationId: number;
|
|
391
|
+
collectedMinor: number;
|
|
392
|
+
invoicedMinor: number;
|
|
393
|
+
outstandingMinor: number;
|
|
394
|
+
mrrMinor: number;
|
|
395
|
+
liveSubscriptions: number;
|
|
396
|
+
peopleCovered: number;
|
|
397
|
+
feesMinor: number;
|
|
398
|
+
}
|
|
399
|
+
export interface BillingAnalytics {
|
|
400
|
+
/** Whose figures: one organization, or null for every organization (a Super-Admin's view). */
|
|
401
|
+
organizationId: number | null;
|
|
402
|
+
range: BillingAnalyticsRange;
|
|
403
|
+
generatedAt: string;
|
|
404
|
+
/** The currency every money figure is in. */
|
|
405
|
+
currency: string;
|
|
406
|
+
/** Every currency the scope has business in, busiest first. */
|
|
407
|
+
currencies: BillingAnalyticsCurrency[];
|
|
408
|
+
previous: BillingAnalyticsPrevious | null;
|
|
409
|
+
timeline: BillingAnalyticsTimelinePoint[];
|
|
410
|
+
revenue: BillingAnalyticsRevenue;
|
|
411
|
+
recurring: BillingAnalyticsRecurring;
|
|
412
|
+
invoices: BillingAnalyticsInvoices;
|
|
413
|
+
checkouts: BillingAnalyticsCheckouts;
|
|
414
|
+
subscriptions: BillingAnalyticsSubscriptions;
|
|
415
|
+
cover: BillingAnalyticsCover;
|
|
416
|
+
trials: BillingAnalyticsTrials;
|
|
417
|
+
settlements: BillingAnalyticsSettlements;
|
|
418
|
+
/** Packages with anything live or any money in the period, most money first - at most 25. */
|
|
419
|
+
packages: BillingAnalyticsPackageRow[];
|
|
420
|
+
/** Corporate clients with anything live, owed or paid, most money first - at most 25. */
|
|
421
|
+
clients: BillingAnalyticsClientRow[];
|
|
422
|
+
/** A Super-Admin looking at every organization only. */
|
|
423
|
+
byOrganization?: BillingAnalyticsOrganizationRow[];
|
|
424
|
+
}
|
|
425
|
+
/** What a dashboard asks: the period, and - for a Super-Admin - whose figures. */
|
|
426
|
+
export interface BillingAnalyticsQuery {
|
|
427
|
+
from?: string;
|
|
428
|
+
to?: string;
|
|
429
|
+
timeZone?: string;
|
|
430
|
+
currency?: string;
|
|
431
|
+
organizationId?: number;
|
|
432
|
+
}
|
|
@@ -152,6 +152,7 @@ export declare enum PermissionActions {
|
|
|
152
152
|
CREATE_SETTLEMENT_BATCH = "create:settlement-batch",
|
|
153
153
|
RECONCILE_SETTLEMENT_BATCH = "reconcile:settlement-batch",
|
|
154
154
|
READ_BILLING_OPERATIONS = "read:billing-operations",
|
|
155
|
+
READ_BILLING_ANALYTICS = "read:billing-analytics",
|
|
155
156
|
READ_PREMIUM_TRIAL = "read:premium-trial",
|
|
156
157
|
GRANT_PREMIUM_TRIAL = "grant:premium-trial",
|
|
157
158
|
REVOKE_PREMIUM_TRIAL = "revoke:premium-trial",
|
|
@@ -178,6 +179,7 @@ export declare enum PermissionActions {
|
|
|
178
179
|
USE_SAFETY_CHECK = "use:safety-check",
|
|
179
180
|
READ_SAFETY_CHECK = "read:safety-check",
|
|
180
181
|
MANAGE_SAFETY_CHECK_REASON = "manage:safety-check-reason",
|
|
182
|
+
READ_SAFETY_ANALYTICS = "read:safety-analytics",
|
|
181
183
|
USE_FOLLOW_ME = "use:follow-me",
|
|
182
184
|
READ_FOLLOW_ME = "read:follow-me",
|
|
183
185
|
TRACK_FOLLOW_ME = "track:follow-me",
|
|
@@ -6,5 +6,6 @@ export * from './constants/follow-me.const';
|
|
|
6
6
|
export * from './interfaces/safety-check.dto';
|
|
7
7
|
export * from './interfaces/safety-alert-context';
|
|
8
8
|
export * from './interfaces/follow-me.dto';
|
|
9
|
+
export * from './interfaces/safety-analytics';
|
|
9
10
|
export * from './utils/safety-display.util';
|
|
10
11
|
export * from './utils/follow-me-display.util';
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safety analytics: how Safety Check and Follow Me were used over a period, by whom
|
|
3
|
+
* and how often, how they ended, what the monitoring caught and how the guardians
|
|
4
|
+
* followed. One read, computed by clarion-safety from one consistent snapshot, so
|
|
5
|
+
* every number on a dashboard agrees with every other.
|
|
6
|
+
*
|
|
7
|
+
* Counts only: never a location, a destination, a phone number, a name or a reason a
|
|
8
|
+
* user typed. A check or journey is counted by when it started, as it stands now.
|
|
9
|
+
*/
|
|
10
|
+
/** How the period is cut into points for the charts. Chosen by the service from the length of the period. */
|
|
11
|
+
export type SafetyAnalyticsBucket = 'hour' | 'day' | 'week' | 'month';
|
|
12
|
+
export interface SafetyAnalyticsRange {
|
|
13
|
+
/** Inclusive, ISO 8601. The first check or journey when the period asked for was "forever". */
|
|
14
|
+
from: string;
|
|
15
|
+
/** Exclusive, ISO 8601. */
|
|
16
|
+
to: string;
|
|
17
|
+
bucket: SafetyAnalyticsBucket;
|
|
18
|
+
/** IANA time zone the buckets, the days and the hour-of-week grid are cut in. */
|
|
19
|
+
timeZone: string;
|
|
20
|
+
}
|
|
21
|
+
/** A count by a key (a status, a trigger, a band), largest first unless the section says otherwise. */
|
|
22
|
+
export interface SafetyAnalyticsCount<K extends string = string> {
|
|
23
|
+
key: K;
|
|
24
|
+
count: number;
|
|
25
|
+
}
|
|
26
|
+
/** How many sessions a user started in the period, banded. */
|
|
27
|
+
export type SafetyAnalyticsFrequencyBand = '1' | '2-3' | '4-9' | '10+';
|
|
28
|
+
export interface SafetyAnalyticsFrequencyRow {
|
|
29
|
+
band: SafetyAnalyticsFrequencyBand;
|
|
30
|
+
/** Users who started that many Safety Checks. */
|
|
31
|
+
safetyCheck: number;
|
|
32
|
+
/** Users who started that many Follow Me journeys. */
|
|
33
|
+
followMe: number;
|
|
34
|
+
/** Users who started that many of either, together. */
|
|
35
|
+
any: number;
|
|
36
|
+
}
|
|
37
|
+
export interface SafetyAnalyticsUsagePoint {
|
|
38
|
+
/** The bucket's start, local to the range's time zone, without an offset ("2026-09-21T14:00:00"). */
|
|
39
|
+
bucket: string;
|
|
40
|
+
/** Distinct users who started either feature in the bucket. */
|
|
41
|
+
activeUsers: number;
|
|
42
|
+
safetyCheckUsers: number;
|
|
43
|
+
followMeUsers: number;
|
|
44
|
+
/** Users whose very first check or journey started in the bucket. */
|
|
45
|
+
newUsers: number;
|
|
46
|
+
safetyChecks: number;
|
|
47
|
+
followMeJourneys: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Who uses the safety features, and how often. A user is "active" in a period when
|
|
51
|
+
* they started a Safety Check or a Follow Me journey in it.
|
|
52
|
+
*/
|
|
53
|
+
export interface SafetyAnalyticsUsage {
|
|
54
|
+
activeUsers: number;
|
|
55
|
+
safetyCheckUsers: number;
|
|
56
|
+
followMeUsers: number;
|
|
57
|
+
/** Used both features in the period. */
|
|
58
|
+
bothFeatures: number;
|
|
59
|
+
/** Active users whose first-ever check or journey (in this scope) started in the period. */
|
|
60
|
+
newUsers: number;
|
|
61
|
+
/** Active users who had used a safety feature before the period. */
|
|
62
|
+
returningUsers: number;
|
|
63
|
+
/** Active in the previous period of the same length AND in this one; null for "forever". */
|
|
64
|
+
retainedUsers: number | null;
|
|
65
|
+
/** Safety Checks + Follow Me journeys started. */
|
|
66
|
+
sessions: number;
|
|
67
|
+
/** Sessions per active user; null with no active user. */
|
|
68
|
+
sessionsPerUser: number | null;
|
|
69
|
+
/** Active users who started two or more sessions. */
|
|
70
|
+
repeatUsers: number;
|
|
71
|
+
/** Average number of distinct local days an active user used a feature on. */
|
|
72
|
+
averageActiveDays: number | null;
|
|
73
|
+
/** Distinct users per local day, averaged over every day of the period. */
|
|
74
|
+
averageDailyActiveUsers: number;
|
|
75
|
+
peakDailyActiveUsers: number;
|
|
76
|
+
/** The local day (YYYY-MM-DD) of the peak; null when nobody was active. */
|
|
77
|
+
peakDay: string | null;
|
|
78
|
+
frequency: SafetyAnalyticsFrequencyRow[];
|
|
79
|
+
timeline: SafetyAnalyticsUsagePoint[];
|
|
80
|
+
}
|
|
81
|
+
/** The headline figures of the previous period of the same length, for the change on each. */
|
|
82
|
+
export interface SafetyAnalyticsPrevious {
|
|
83
|
+
from: string;
|
|
84
|
+
to: string;
|
|
85
|
+
activeUsers: number;
|
|
86
|
+
safetyCheckUsers: number;
|
|
87
|
+
followMeUsers: number;
|
|
88
|
+
safetyChecks: number;
|
|
89
|
+
followMeJourneys: number;
|
|
90
|
+
safetyCheckSos: number;
|
|
91
|
+
followMeSos: number;
|
|
92
|
+
checkedIn: number;
|
|
93
|
+
arrived: number;
|
|
94
|
+
prompts: number;
|
|
95
|
+
promptsConfirmedOk: number;
|
|
96
|
+
}
|
|
97
|
+
/** When sessions start, by ISO weekday (1 = Monday) and local hour. All 168 cells are present. */
|
|
98
|
+
export interface SafetyAnalyticsHeatCell {
|
|
99
|
+
weekday: number;
|
|
100
|
+
hour: number;
|
|
101
|
+
safetyChecks: number;
|
|
102
|
+
followMe: number;
|
|
103
|
+
}
|
|
104
|
+
/** A reason the user chose, by its code (or its label for a reason with none); the user's own words are only counted. */
|
|
105
|
+
export interface SafetyAnalyticsReasonRow {
|
|
106
|
+
code: string | null;
|
|
107
|
+
/** The label most recently used for it. "Own reason" for a reason the user typed. */
|
|
108
|
+
label: string;
|
|
109
|
+
count: number;
|
|
110
|
+
/** Ended well: checked in (Safety Check) or arrived (Follow Me). */
|
|
111
|
+
completed: number;
|
|
112
|
+
sos: number;
|
|
113
|
+
}
|
|
114
|
+
export interface SafetyCheckAnalyticsTotals {
|
|
115
|
+
started: number;
|
|
116
|
+
/** Distinct users who started one. */
|
|
117
|
+
users: number;
|
|
118
|
+
checkedIn: number;
|
|
119
|
+
sosTriggered: number;
|
|
120
|
+
stopped: number;
|
|
121
|
+
expired: number;
|
|
122
|
+
cancelled: number;
|
|
123
|
+
failed: number;
|
|
124
|
+
/** Still running: created, active or prompting. */
|
|
125
|
+
open: number;
|
|
126
|
+
/** Checked in only after the check-in prompt appeared. */
|
|
127
|
+
checkedInAfterPrompt: number;
|
|
128
|
+
/** Checks extended at least once, and how many extensions in all. */
|
|
129
|
+
extended: number;
|
|
130
|
+
extensions: number;
|
|
131
|
+
/** Recorded at least one location point. */
|
|
132
|
+
withLocation: number;
|
|
133
|
+
trackPoints: number;
|
|
134
|
+
/** Asked for the service provider to be alerted, and whether their plan allowed it. */
|
|
135
|
+
providerRequested: number;
|
|
136
|
+
providerAllowed: number;
|
|
137
|
+
notifyGuardiansOnStartEnd: number;
|
|
138
|
+
/** Chose at least one guardian who does not use the app (reached by SMS). */
|
|
139
|
+
withExternalGuardians: number;
|
|
140
|
+
averageGuardians: number | null;
|
|
141
|
+
/** Typed their own reason instead of choosing one. */
|
|
142
|
+
customReasons: number;
|
|
143
|
+
/** An SOS that became an incident, one that has not (yet), and one it took more than one attempt to raise. */
|
|
144
|
+
sosIncidents: number;
|
|
145
|
+
sosUndelivered: number;
|
|
146
|
+
sosRetried: number;
|
|
147
|
+
/** Planned length, start to check-in time (extensions included). */
|
|
148
|
+
medianPlannedMinutes: number | null;
|
|
149
|
+
/** Start to the end, for the checks that ended. */
|
|
150
|
+
medianActualMinutes: number | null;
|
|
151
|
+
/** Prompt to check-in, for checks confirmed at the prompt. */
|
|
152
|
+
medianPromptResponseSeconds: number | null;
|
|
153
|
+
/** How long before the check-in time a user confirmed they were safe, for those who did before being prompted. */
|
|
154
|
+
medianMinutesToSpare: number | null;
|
|
155
|
+
}
|
|
156
|
+
export interface SafetyCheckAnalyticsPoint {
|
|
157
|
+
bucket: string;
|
|
158
|
+
started: number;
|
|
159
|
+
checkedIn: number;
|
|
160
|
+
sos: number;
|
|
161
|
+
stopped: number;
|
|
162
|
+
/** Expired, cancelled or failed. */
|
|
163
|
+
other: number;
|
|
164
|
+
open: number;
|
|
165
|
+
}
|
|
166
|
+
export interface SafetyCheckAnalytics {
|
|
167
|
+
totals: SafetyCheckAnalyticsTotals;
|
|
168
|
+
/** Every status a check can end in (or be in), zeros included. */
|
|
169
|
+
byStatus: SafetyAnalyticsCount[];
|
|
170
|
+
timeline: SafetyCheckAnalyticsPoint[];
|
|
171
|
+
/** What raised the SOS: a missed check-in, or the user asking for help. */
|
|
172
|
+
sosByTrigger: SafetyAnalyticsCount[];
|
|
173
|
+
reasons: SafetyAnalyticsReasonRow[];
|
|
174
|
+
/** Planned length, banded ('<=15m', '15-30m', '30-60m', '1-2h', '2-4h', '4-8h', '8-24h'), in that order. */
|
|
175
|
+
plannedDuration: SafetyAnalyticsCount[];
|
|
176
|
+
/** Extensions per check: '0', '1', '2', '3+'. */
|
|
177
|
+
extensions: SafetyAnalyticsCount[];
|
|
178
|
+
/** Guardians chosen per check: '1', '2', '3', '4+' (and '0' if a check had none). */
|
|
179
|
+
guardians: SafetyAnalyticsCount[];
|
|
180
|
+
/** The user's plan when the check started (FREE, TRIAL, PREMIUM; UNKNOWN when billing could not say). */
|
|
181
|
+
tiers: SafetyAnalyticsCount[];
|
|
182
|
+
countries: SafetyAnalyticsCount[];
|
|
183
|
+
}
|
|
184
|
+
export interface FollowMeAnalyticsTotals {
|
|
185
|
+
started: number;
|
|
186
|
+
users: number;
|
|
187
|
+
arrived: number;
|
|
188
|
+
sosTriggered: number;
|
|
189
|
+
stopped: number;
|
|
190
|
+
expired: number;
|
|
191
|
+
cancelled: number;
|
|
192
|
+
failed: number;
|
|
193
|
+
/** Still under way: created, active or prompting. */
|
|
194
|
+
active: number;
|
|
195
|
+
/** Started with a planned route, and how many of those were re-planned along the way. */
|
|
196
|
+
withRoute: number;
|
|
197
|
+
rerouted: number;
|
|
198
|
+
recalculations: number;
|
|
199
|
+
/** Journeys with stops on the way, and how many stops in all. */
|
|
200
|
+
withStops: number;
|
|
201
|
+
stops: number;
|
|
202
|
+
crashDetection: number;
|
|
203
|
+
/** Started without "allow all the time" location: sharing may stop when the app is closed. */
|
|
204
|
+
backgroundLocationDenied: number;
|
|
205
|
+
providerRequested: number;
|
|
206
|
+
providerAllowed: number;
|
|
207
|
+
notifyGuardiansOnStartEnd: number;
|
|
208
|
+
trackPoints: number;
|
|
209
|
+
medianPlannedMinutes: number | null;
|
|
210
|
+
/** Start to end, for journeys that ended. */
|
|
211
|
+
medianActualMinutes: number | null;
|
|
212
|
+
/** The planned route's length, for journeys with one. */
|
|
213
|
+
medianPlannedDistanceMeters: number | null;
|
|
214
|
+
/** The planned distance of every journey that arrived. */
|
|
215
|
+
arrivedDistanceMeters: number;
|
|
216
|
+
/** Arrived no later than the arrival the plan promised, or after it - of the journeys that had one. */
|
|
217
|
+
arrivedOnTime: number;
|
|
218
|
+
arrivedLate: number;
|
|
219
|
+
/** Arrival against the promised arrival (negative = early), median. */
|
|
220
|
+
medianArrivalDelaySeconds: number | null;
|
|
221
|
+
sosIncidents: number;
|
|
222
|
+
sosUndelivered: number;
|
|
223
|
+
}
|
|
224
|
+
export interface FollowMeAnalyticsPoint {
|
|
225
|
+
bucket: string;
|
|
226
|
+
started: number;
|
|
227
|
+
arrived: number;
|
|
228
|
+
sos: number;
|
|
229
|
+
stopped: number;
|
|
230
|
+
other: number;
|
|
231
|
+
active: number;
|
|
232
|
+
}
|
|
233
|
+
export interface FollowMeTransportRow {
|
|
234
|
+
/** A FollowMeTransportMode, or null for a journey without one. */
|
|
235
|
+
mode: string | null;
|
|
236
|
+
journeys: number;
|
|
237
|
+
arrived: number;
|
|
238
|
+
sos: number;
|
|
239
|
+
prompts: number;
|
|
240
|
+
}
|
|
241
|
+
export interface FollowMePromptTriggerRow {
|
|
242
|
+
/** A FollowMeSafetyTrigger. */
|
|
243
|
+
trigger: string;
|
|
244
|
+
prompts: number;
|
|
245
|
+
confirmedOk: number;
|
|
246
|
+
expired: number;
|
|
247
|
+
cancelled: number;
|
|
248
|
+
active: number;
|
|
249
|
+
medianResponseSeconds: number | null;
|
|
250
|
+
}
|
|
251
|
+
/** "Are you OK?" prompts the monitoring raised on the period's journeys. */
|
|
252
|
+
export interface FollowMePromptAnalytics {
|
|
253
|
+
total: number;
|
|
254
|
+
confirmedOk: number;
|
|
255
|
+
/** Not answered in time: each raised an SOS. */
|
|
256
|
+
expired: number;
|
|
257
|
+
/** Withdrawn because the journey ended or an SOS was raised first. */
|
|
258
|
+
cancelled: number;
|
|
259
|
+
active: number;
|
|
260
|
+
journeysPrompted: number;
|
|
261
|
+
medianResponseSeconds: number | null;
|
|
262
|
+
byTrigger: FollowMePromptTriggerRow[];
|
|
263
|
+
}
|
|
264
|
+
export interface FollowMeFollowerKindRow {
|
|
265
|
+
/** A FollowMeParticipantKind. */
|
|
266
|
+
kind: string;
|
|
267
|
+
invited: number;
|
|
268
|
+
accepted: number;
|
|
269
|
+
declined: number;
|
|
270
|
+
pending: number;
|
|
271
|
+
unanswered: number;
|
|
272
|
+
stoppedFollowing: number;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* The guardians asked to follow the period's journeys. Counts only - never who.
|
|
276
|
+
*
|
|
277
|
+
* Each guardian is in exactly one of accepted, declined, pending and unanswered, so
|
|
278
|
+
* those add up to `invited`. A guardian's answer is read from the audit trail: when a
|
|
279
|
+
* journey ends every participation is closed, whatever the answer was.
|
|
280
|
+
*/
|
|
281
|
+
export interface FollowMeFollowerAnalytics {
|
|
282
|
+
invited: number;
|
|
283
|
+
/** Followed the journey at some point. */
|
|
284
|
+
accepted: number;
|
|
285
|
+
/** Answered no, and never followed. */
|
|
286
|
+
declined: number;
|
|
287
|
+
/** Not answered yet, on a journey still under way. */
|
|
288
|
+
pending: number;
|
|
289
|
+
/** Never answered before the journey ended. */
|
|
290
|
+
unanswered: number;
|
|
291
|
+
/** Followed, then stopped following before the end - a part of `accepted`. */
|
|
292
|
+
stoppedFollowing: number;
|
|
293
|
+
/** Journeys at least one guardian followed. */
|
|
294
|
+
journeysFollowed: number;
|
|
295
|
+
averageInvited: number | null;
|
|
296
|
+
/** From the request to the guardian first accepting it. */
|
|
297
|
+
medianSecondsToAccept: number | null;
|
|
298
|
+
byKind: FollowMeFollowerKindRow[];
|
|
299
|
+
/** External guardians who opened their web link at least once. */
|
|
300
|
+
externalLinksOpened: number;
|
|
301
|
+
/** Visits to those links, counted at most once every 10 minutes per guardian. */
|
|
302
|
+
externalVisits: number;
|
|
303
|
+
}
|
|
304
|
+
export interface FollowMeAnalytics {
|
|
305
|
+
totals: FollowMeAnalyticsTotals;
|
|
306
|
+
byStatus: SafetyAnalyticsCount[];
|
|
307
|
+
timeline: FollowMeAnalyticsPoint[];
|
|
308
|
+
transportModes: FollowMeTransportRow[];
|
|
309
|
+
/** Where the planned route came from: GOOGLE, ESTIMATE, or NONE (no route). */
|
|
310
|
+
routeProviders: SafetyAnalyticsCount[];
|
|
311
|
+
/** Planned distance, banded ('<2km', '2-5km', '5-10km', '10-25km', '25-50km', '50km+', 'none'), in that order. */
|
|
312
|
+
distance: SafetyAnalyticsCount[];
|
|
313
|
+
plannedDuration: SafetyAnalyticsCount[];
|
|
314
|
+
prompts: FollowMePromptAnalytics;
|
|
315
|
+
/** What the SOS was about (a FollowMeSafetyTrigger), or MANUAL when the user raised it. */
|
|
316
|
+
sosByCause: SafetyAnalyticsCount[];
|
|
317
|
+
sosByTrigger: SafetyAnalyticsCount[];
|
|
318
|
+
followers: FollowMeFollowerAnalytics;
|
|
319
|
+
/** What the monitoring noticed (FollowMeSafetyEventType), whether or not it prompted. */
|
|
320
|
+
safetyEvents: SafetyAnalyticsCount[];
|
|
321
|
+
reasons: SafetyAnalyticsReasonRow[];
|
|
322
|
+
tiers: SafetyAnalyticsCount[];
|
|
323
|
+
countries: SafetyAnalyticsCount[];
|
|
324
|
+
}
|
|
325
|
+
/** Platform view across organizations only. The organization is named by the caller. */
|
|
326
|
+
export interface SafetyAnalyticsOrganizationRow {
|
|
327
|
+
organizationId: number;
|
|
328
|
+
activeUsers: number;
|
|
329
|
+
safetyChecks: number;
|
|
330
|
+
followMeJourneys: number;
|
|
331
|
+
safetyCheckSos: number;
|
|
332
|
+
followMeSos: number;
|
|
333
|
+
}
|
|
334
|
+
export interface SafetyAnalytics {
|
|
335
|
+
/** Null for every organization (a Super-Admin's platform view). */
|
|
336
|
+
organizationId: number | null;
|
|
337
|
+
/** Set when the figures are one control centre's (a control-centre admin's). */
|
|
338
|
+
controlCentreId: number | null;
|
|
339
|
+
range: SafetyAnalyticsRange;
|
|
340
|
+
generatedAt: string;
|
|
341
|
+
usage: SafetyAnalyticsUsage;
|
|
342
|
+
/** Null for "forever": there is nothing before it to compare with. */
|
|
343
|
+
previous: SafetyAnalyticsPrevious | null;
|
|
344
|
+
heatmap: SafetyAnalyticsHeatCell[];
|
|
345
|
+
safetyCheck: SafetyCheckAnalytics;
|
|
346
|
+
followMe: FollowMeAnalytics;
|
|
347
|
+
/** Super-Admin's view of every organization only. */
|
|
348
|
+
byOrganization?: SafetyAnalyticsOrganizationRow[];
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* The period a safety analytics read covers (query string). Both ends optional: no
|
|
352
|
+
* `from` is "forever", no `to` is now. ISO 8601 instants; `timeZone` is an IANA name.
|
|
353
|
+
* `organizationId` is honoured for a Super-Admin only.
|
|
354
|
+
*/
|
|
355
|
+
export interface SafetyAnalyticsQuery {
|
|
356
|
+
from?: string;
|
|
357
|
+
to?: string;
|
|
358
|
+
timeZone?: string;
|
|
359
|
+
organizationId?: number;
|
|
360
|
+
}
|
package/package.json
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "clarion-shared-types",
|
|
3
|
-
"version": "1.0.
|
|
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.109",
|
|
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
|
+
}
|