@talkpilot/core-db 1.3.1 → 1.3.4
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/.claude/settings.local.json +7 -0
- package/README.md +30 -0
- package/dist/municipal/tickets/index.d.ts +2 -1
- package/dist/municipal/tickets/index.d.ts.map +1 -1
- package/dist/municipal/tickets/index.js +1 -0
- package/dist/municipal/tickets/index.js.map +1 -1
- package/dist/municipal/tickets/tickets.constants.d.ts +7 -0
- package/dist/municipal/tickets/tickets.constants.d.ts.map +1 -0
- package/dist/municipal/tickets/tickets.constants.js +10 -0
- package/dist/municipal/tickets/tickets.constants.js.map +1 -0
- package/dist/municipal/tickets/tickets.deprecated.getters.d.ts +12 -0
- package/dist/municipal/tickets/tickets.deprecated.getters.d.ts.map +1 -0
- package/dist/municipal/tickets/tickets.deprecated.getters.js +131 -0
- package/dist/municipal/tickets/tickets.deprecated.getters.js.map +1 -0
- package/dist/municipal/tickets/tickets.getters.d.ts +0 -11
- package/dist/municipal/tickets/tickets.getters.d.ts.map +1 -1
- package/dist/municipal/tickets/tickets.getters.js +0 -128
- package/dist/municipal/tickets/tickets.getters.js.map +1 -1
- package/dist/municipal/tickets/tickets.statistics.aggregation.d.ts +35 -0
- package/dist/municipal/tickets/tickets.statistics.aggregation.d.ts.map +1 -0
- package/dist/municipal/tickets/tickets.statistics.aggregation.js +86 -0
- package/dist/municipal/tickets/tickets.statistics.aggregation.js.map +1 -0
- package/dist/municipal/tickets/tickets.statistics.dates.d.ts +7 -0
- package/dist/municipal/tickets/tickets.statistics.dates.d.ts.map +1 -0
- package/dist/municipal/tickets/tickets.statistics.dates.js +40 -0
- package/dist/municipal/tickets/tickets.statistics.dates.js.map +1 -0
- package/dist/municipal/tickets/tickets.statistics.getters.d.ts +8 -0
- package/dist/municipal/tickets/tickets.statistics.getters.d.ts.map +1 -0
- package/dist/municipal/tickets/tickets.statistics.getters.js +44 -0
- package/dist/municipal/tickets/tickets.statistics.getters.js.map +1 -0
- package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts +53 -0
- package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts.map +1 -0
- package/dist/municipal/tickets/tickets.statistics.pipeline.js +112 -0
- package/dist/municipal/tickets/tickets.statistics.pipeline.js.map +1 -0
- package/dist/municipal/tickets/tickets.statistics.utils.d.ts +7 -0
- package/dist/municipal/tickets/tickets.statistics.utils.d.ts.map +1 -0
- package/dist/municipal/tickets/tickets.statistics.utils.js +40 -0
- package/dist/municipal/tickets/tickets.statistics.utils.js.map +1 -0
- package/dist/municipal/tickets/tickets.types.d.ts +14 -5
- package/dist/municipal/tickets/tickets.types.d.ts.map +1 -1
- package/dist/talkpilot/calls/calls.constants.d.ts +17 -0
- package/dist/talkpilot/calls/calls.constants.d.ts.map +1 -0
- package/dist/talkpilot/calls/calls.constants.js +20 -0
- package/dist/talkpilot/calls/calls.constants.js.map +1 -0
- package/dist/talkpilot/calls/calls.statistics.getters.d.ts +28 -0
- package/dist/talkpilot/calls/calls.statistics.getters.d.ts.map +1 -0
- package/dist/talkpilot/calls/calls.statistics.getters.js +424 -0
- package/dist/talkpilot/calls/calls.statistics.getters.js.map +1 -0
- package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts +12 -0
- package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts.map +1 -0
- package/dist/talkpilot/calls/calls.statistics.ticketScope.js +37 -0
- package/dist/talkpilot/calls/calls.statistics.ticketScope.js.map +1 -0
- package/dist/talkpilot/calls/calls.statistics.tickets.d.ts +17 -0
- package/dist/talkpilot/calls/calls.statistics.tickets.d.ts.map +1 -0
- package/dist/talkpilot/calls/calls.statistics.tickets.js +33 -0
- package/dist/talkpilot/calls/calls.statistics.tickets.js.map +1 -0
- package/dist/talkpilot/calls/calls.statistics.types.d.ts +39 -0
- package/dist/talkpilot/calls/calls.statistics.types.d.ts.map +1 -0
- package/dist/talkpilot/calls/calls.statistics.types.js +3 -0
- package/dist/talkpilot/calls/calls.statistics.types.js.map +1 -0
- package/dist/talkpilot/calls/calls.types.d.ts +1 -2
- package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
- package/dist/talkpilot/calls/calls.types.js +0 -3
- package/dist/talkpilot/calls/calls.types.js.map +1 -1
- package/dist/talkpilot/calls/dashboard/calls.dashboard.d.ts +33 -1
- package/dist/talkpilot/calls/dashboard/calls.dashboard.d.ts.map +1 -1
- package/dist/talkpilot/calls/dashboard/calls.dashboard.js +131 -146
- package/dist/talkpilot/calls/dashboard/calls.dashboard.js.map +1 -1
- package/dist/talkpilot/calls/dashboard/calls.dashboard.types.d.ts +27 -6
- package/dist/talkpilot/calls/dashboard/calls.dashboard.types.d.ts.map +1 -1
- package/dist/talkpilot/calls/index.d.ts +3 -0
- package/dist/talkpilot/calls/index.d.ts.map +1 -1
- package/dist/talkpilot/calls/index.js +3 -0
- package/dist/talkpilot/calls/index.js.map +1 -1
- package/dist/utils/date.utils.d.ts +49 -0
- package/dist/utils/date.utils.d.ts.map +1 -0
- package/dist/utils/date.utils.js +103 -0
- package/dist/utils/date.utils.js.map +1 -0
- package/dist/utils/statistics.aggregation.d.ts +20 -0
- package/dist/utils/statistics.aggregation.d.ts.map +1 -0
- package/dist/utils/statistics.aggregation.js +43 -0
- package/dist/utils/statistics.aggregation.js.map +1 -0
- package/package.json +1 -1
- package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +1 -37
- package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +51 -0
- package/src/municipal/tickets/index.ts +2 -1
- package/src/municipal/tickets/tickets.constants.ts +8 -0
- package/src/municipal/tickets/tickets.getters.ts +0 -140
- package/src/municipal/tickets/tickets.statistics.aggregation.ts +96 -0
- package/src/municipal/tickets/tickets.statistics.getters.ts +71 -0
- package/src/municipal/tickets/tickets.types.ts +19 -9
- package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +8 -111
- package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +344 -0
- package/src/talkpilot/calls/calls.constants.ts +20 -0
- package/src/talkpilot/calls/calls.statistics.getters.ts +587 -0
- package/src/talkpilot/calls/calls.statistics.types.ts +44 -0
- package/src/talkpilot/calls/calls.types.ts +4 -2
- package/src/talkpilot/calls/dashboard/calls.dashboard.ts +148 -197
- package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +25 -12
- package/src/talkpilot/calls/index.ts +3 -0
- package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +7 -0
- package/src/utils/date.utils.ts +116 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.statistics.dates.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.dates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CityName } from "../utils/types";
|
|
2
|
+
import type { TicketStatsDateRange, TicketStatsDateScope, TicketSubjectRow } from "./tickets.types";
|
|
3
|
+
export declare const resolveTicketStatsDateRange: (dateScope?: TicketStatsDateScope) => TicketStatsDateRange;
|
|
4
|
+
export declare const ticketStatsDateScopeFromYmd: (startStr: string, endStr: string, timezone: string) => TicketStatsDateScope;
|
|
5
|
+
export declare const findCallSidsWithTicketsByCity: (cityName: CityName, dateScope?: TicketStatsDateScope) => Promise<string[]>;
|
|
6
|
+
export declare const findCallSidsWithDraftTicketsByCity: (cityName: CityName, dateScope?: TicketStatsDateScope) => Promise<string[]>;
|
|
7
|
+
export declare const findTicketSubjectRows: (cityName: CityName, dateScope?: TicketStatsDateScope) => Promise<TicketSubjectRow[]>;
|
|
8
|
+
//# sourceMappingURL=tickets.statistics.getters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.statistics.getters.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAa1C,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,2BAA2B,GACtC,YAAY,oBAAoB,KAC/B,oBAKF,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,UAAU,MAAM,KACf,oBAGD,CAAC;AAEH,eAAO,MAAM,6BAA6B,GACxC,UAAU,QAAQ,EAClB,YAAY,oBAAoB,KAC/B,OAAO,CAAC,MAAM,EAAE,CAMlB,CAAC;AAEF,eAAO,MAAM,kCAAkC,GAC7C,UAAU,QAAQ,EAClB,YAAY,oBAAoB,KAC/B,OAAO,CAAC,MAAM,EAAE,CAOlB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,UAAU,QAAQ,EAClB,YAAY,oBAAoB,KAC/B,OAAO,CAAC,gBAAgB,EAAE,CAO5B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findTicketSubjectRows = exports.findCallSidsWithDraftTicketsByCity = exports.findCallSidsWithTicketsByCity = exports.ticketStatsDateScopeFromYmd = exports.resolveTicketStatsDateRange = void 0;
|
|
4
|
+
const date_utils_1 = require("../../utils/date.utils");
|
|
5
|
+
const tickets_constants_1 = require("./tickets.constants");
|
|
6
|
+
const tickets_statistics_aggregation_1 = require("./tickets.statistics.aggregation");
|
|
7
|
+
const resolveTicketStatsDateRange = (dateScope) => {
|
|
8
|
+
const to = dateScope?.to ?? new Date();
|
|
9
|
+
const from = dateScope?.from ?? new Date(to.getTime() - tickets_constants_1.DEFAULT_LOOKBACK_DAYS * date_utils_1.DAY_MS);
|
|
10
|
+
return { from, to };
|
|
11
|
+
};
|
|
12
|
+
exports.resolveTicketStatsDateRange = resolveTicketStatsDateRange;
|
|
13
|
+
const ticketStatsDateScopeFromYmd = (startStr, endStr, timezone) => ({
|
|
14
|
+
from: (0, date_utils_1.startOfCalendarDayInTz)(startStr, timezone),
|
|
15
|
+
to: (0, date_utils_1.endOfCalendarDayInTz)(endStr, timezone),
|
|
16
|
+
});
|
|
17
|
+
exports.ticketStatsDateScopeFromYmd = ticketStatsDateScopeFromYmd;
|
|
18
|
+
const findCallSidsWithTicketsByCity = async (cityName, dateScope) => {
|
|
19
|
+
const rows = await (0, tickets_statistics_aggregation_1.runTicketStatsAggregate)([
|
|
20
|
+
{ $match: (0, tickets_statistics_aggregation_1.ticketsWithCallSidMatch)(cityName, (0, exports.resolveTicketStatsDateRange)(dateScope)) },
|
|
21
|
+
{ $group: { _id: "$callSid" } },
|
|
22
|
+
]);
|
|
23
|
+
return rows.map((r) => String(r._id)).filter(Boolean);
|
|
24
|
+
};
|
|
25
|
+
exports.findCallSidsWithTicketsByCity = findCallSidsWithTicketsByCity;
|
|
26
|
+
const findCallSidsWithDraftTicketsByCity = async (cityName, dateScope) => {
|
|
27
|
+
const rows = await (0, tickets_statistics_aggregation_1.runTicketStatsAggregate)([
|
|
28
|
+
{ $match: (0, tickets_statistics_aggregation_1.ticketsWithCallSidMatch)(cityName, (0, exports.resolveTicketStatsDateRange)(dateScope)) },
|
|
29
|
+
{ $match: { $expr: tickets_statistics_aggregation_1.isDraftSubjectIdExpr } },
|
|
30
|
+
{ $group: { _id: "$callSid" } },
|
|
31
|
+
]);
|
|
32
|
+
return rows.map((r) => String(r._id)).filter(Boolean);
|
|
33
|
+
};
|
|
34
|
+
exports.findCallSidsWithDraftTicketsByCity = findCallSidsWithDraftTicketsByCity;
|
|
35
|
+
const findTicketSubjectRows = async (cityName, dateScope) => {
|
|
36
|
+
const rows = await (0, tickets_statistics_aggregation_1.runTicketStatsAggregate)([
|
|
37
|
+
{ $match: (0, tickets_statistics_aggregation_1.ticketsWithCallSidMatch)(cityName, (0, exports.resolveTicketStatsDateRange)(dateScope)) },
|
|
38
|
+
...(0, tickets_statistics_aggregation_1.subjectResolutionStages)(cityName),
|
|
39
|
+
{ $project: { _id: 0, callSid: 1, subject: 1 } },
|
|
40
|
+
]);
|
|
41
|
+
return rows.map((r) => ({ callSid: String(r.callSid), subject: String(r.subject) }));
|
|
42
|
+
};
|
|
43
|
+
exports.findTicketSubjectRows = findTicketSubjectRows;
|
|
44
|
+
//# sourceMappingURL=tickets.statistics.getters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.statistics.getters.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.getters.ts"],"names":[],"mappings":";;;AACA,uDAIgC;AAChC,2DAA4D;AAC5D,qFAK0C;AAOnC,MAAM,2BAA2B,GAAG,CACzC,SAAgC,EACV,EAAE;IACxB,MAAM,EAAE,GAAG,SAAS,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;IACvC,MAAM,IAAI,GACR,SAAS,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,yCAAqB,GAAG,mBAAM,CAAC,CAAC;IAC7E,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC,CAAC;AAPW,QAAA,2BAA2B,+BAOtC;AAEK,MAAM,2BAA2B,GAAG,CACzC,QAAgB,EAChB,MAAc,EACd,QAAgB,EACM,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,IAAA,mCAAsB,EAAC,QAAQ,EAAE,QAAQ,CAAC;IAChD,EAAE,EAAE,IAAA,iCAAoB,EAAC,MAAM,EAAE,QAAQ,CAAC;CAC3C,CAAC,CAAC;AAPU,QAAA,2BAA2B,+BAOrC;AAEI,MAAM,6BAA6B,GAAG,KAAK,EAChD,QAAkB,EAClB,SAAgC,EACb,EAAE;IACrB,MAAM,IAAI,GAAG,MAAM,IAAA,wDAAuB,EAAmB;QAC3D,EAAE,MAAM,EAAE,IAAA,wDAAuB,EAAC,QAAQ,EAAE,IAAA,mCAA2B,EAAC,SAAS,CAAC,CAAC,EAAE;QACrF,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;KAChC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC,CAAC;AATW,QAAA,6BAA6B,iCASxC;AAEK,MAAM,kCAAkC,GAAG,KAAK,EACrD,QAAkB,EAClB,SAAgC,EACb,EAAE;IACrB,MAAM,IAAI,GAAG,MAAM,IAAA,wDAAuB,EAAmB;QAC3D,EAAE,MAAM,EAAE,IAAA,wDAAuB,EAAC,QAAQ,EAAE,IAAA,mCAA2B,EAAC,SAAS,CAAC,CAAC,EAAE;QACrF,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,qDAAoB,EAAE,EAAE;QAC3C,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;KAChC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC,CAAC;AAVW,QAAA,kCAAkC,sCAU7C;AAEK,MAAM,qBAAqB,GAAG,KAAK,EACxC,QAAkB,EAClB,SAAgC,EACH,EAAE;IAC/B,MAAM,IAAI,GAAG,MAAM,IAAA,wDAAuB,EAAyC;QACjF,EAAE,MAAM,EAAE,IAAA,wDAAuB,EAAC,QAAQ,EAAE,IAAA,mCAA2B,EAAC,SAAS,CAAC,CAAC,EAAE;QACrF,GAAG,IAAA,wDAAuB,EAAC,QAAQ,CAAC;QACpC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;KACjD,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACvF,CAAC,CAAC;AAVW,QAAA,qBAAqB,yBAUhC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CityName } from "../utils/types";
|
|
2
|
+
import type { SubjectItem, TicketStatsDateScope } from "./tickets.types";
|
|
3
|
+
export declare const isDraftSubjectIdExpr: {
|
|
4
|
+
$or: ({
|
|
5
|
+
$eq: (string | {
|
|
6
|
+
$type: string;
|
|
7
|
+
})[];
|
|
8
|
+
$regexMatch?: undefined;
|
|
9
|
+
} | {
|
|
10
|
+
$eq: (string | null)[];
|
|
11
|
+
$regexMatch?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
$regexMatch: {
|
|
14
|
+
input: {
|
|
15
|
+
$ifNull: string[];
|
|
16
|
+
};
|
|
17
|
+
regex: RegExp;
|
|
18
|
+
};
|
|
19
|
+
$eq?: undefined;
|
|
20
|
+
})[];
|
|
21
|
+
};
|
|
22
|
+
export declare const ticketsWithCallSidMatch: (cityName: CityName, dateScope?: TicketStatsDateScope) => {
|
|
23
|
+
createdAt: {
|
|
24
|
+
$gte: Date;
|
|
25
|
+
$lte: Date;
|
|
26
|
+
};
|
|
27
|
+
cityName: string;
|
|
28
|
+
callSid: {
|
|
29
|
+
$exists: boolean;
|
|
30
|
+
$nin: (string | null)[];
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export declare const ticketsByCallSidsMatch: (cityName: CityName, callSids: string[], dateScope?: TicketStatsDateScope) => {
|
|
34
|
+
createdAt?: {
|
|
35
|
+
$gte: Date;
|
|
36
|
+
$lte: Date;
|
|
37
|
+
} | undefined;
|
|
38
|
+
cityName: string;
|
|
39
|
+
callSid: {
|
|
40
|
+
$in: string[];
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export declare const callSidGroupStages: () => Record<string, unknown>[];
|
|
44
|
+
export declare const subjectGroupStages: (cityName: CityName, limit?: number) => Record<string, unknown>[];
|
|
45
|
+
export declare const runTicketStatsAggregate: <T>(pipeline: Record<string, unknown>[]) => Promise<T[]>;
|
|
46
|
+
export declare const mapCallSidRows: (rows: {
|
|
47
|
+
_id: unknown;
|
|
48
|
+
}[]) => string[];
|
|
49
|
+
export declare const mapSubjectRows: (rows: {
|
|
50
|
+
_id: unknown;
|
|
51
|
+
count: number;
|
|
52
|
+
}[]) => SubjectItem[];
|
|
53
|
+
//# sourceMappingURL=tickets.statistics.pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.statistics.pipeline.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAiBzE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;CAWhC,CAAC;AA4CF,eAAO,MAAM,uBAAuB,GAClC,UAAU,QAAQ,EAClB,YAAY,oBAAoB;;;;;;;;;;CAKhC,CAAC;AAEH,eAAO,MAAM,sBAAsB,GACjC,UAAU,QAAQ,EAClB,UAAU,MAAM,EAAE,EAClB,YAAY,oBAAoB;;;;;;;;;CAKhC,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE5D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAU,QAAQ,EAClB,QAAQ,MAAM,KACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAUzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,CAAC,EAC7C,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAClC,OAAO,CAAC,CAAC,EAAE,CAKb,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,KAAG,MAAM,EAChB,CAAC;AAEjD,eAAO,MAAM,cAAc,GAAI,MAAM;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,KAAG,WAAW,EAMjF,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapSubjectRows = exports.mapCallSidRows = exports.runTicketStatsAggregate = exports.subjectGroupStages = exports.callSidGroupStages = exports.ticketsByCallSidsMatch = exports.ticketsWithCallSidMatch = exports.isDraftSubjectIdExpr = void 0;
|
|
4
|
+
const tickets_getters_1 = require("./tickets.getters");
|
|
5
|
+
const tickets_statistics_utils_1 = require("./tickets.statistics.utils");
|
|
6
|
+
const UNCLASSIFIED = "ללא מחלקה";
|
|
7
|
+
const STATS_MAX_TIME_MS = 30_000;
|
|
8
|
+
const effectiveSubjectIdExpr = {
|
|
9
|
+
$ifNull: [
|
|
10
|
+
"$externalCallFields.event_subject_id",
|
|
11
|
+
{
|
|
12
|
+
$ifNull: [
|
|
13
|
+
"$externalCallFields.event_sub_subject_id",
|
|
14
|
+
"$externalCallFields.event_sub_subject_id2",
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
exports.isDraftSubjectIdExpr = {
|
|
20
|
+
$or: [
|
|
21
|
+
{ $eq: [{ $type: "$externalCallFields.event_subject_id" }, "missing"] },
|
|
22
|
+
{ $eq: ["$externalCallFields.event_subject_id", null] },
|
|
23
|
+
{
|
|
24
|
+
$regexMatch: {
|
|
25
|
+
input: { $ifNull: ["$externalCallFields.event_subject_id", ""] },
|
|
26
|
+
regex: /^\s*$/,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
const departmentsSubjectsLookup = (cityName) => ({
|
|
32
|
+
$lookup: {
|
|
33
|
+
from: "departmentsSubjects",
|
|
34
|
+
let: { sid: "$effectiveSubjectId", c: cityName },
|
|
35
|
+
pipeline: [
|
|
36
|
+
{
|
|
37
|
+
$match: {
|
|
38
|
+
$expr: {
|
|
39
|
+
$and: [
|
|
40
|
+
{ $eq: ["$cityName", "$$c"] },
|
|
41
|
+
{
|
|
42
|
+
$or: [
|
|
43
|
+
{ $eq: ["$subject_id", { $ifNull: ["$$sid", ""] }] },
|
|
44
|
+
{ $eq: ["$sub_subject_id", { $ifNull: ["$$sid", ""] }] },
|
|
45
|
+
{ $eq: ["$sub_subject_id2", { $ifNull: ["$$sid", ""] }] },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{ $limit: 1 },
|
|
53
|
+
],
|
|
54
|
+
as: "subj",
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
const subjectLabelExpr = {
|
|
58
|
+
$cond: {
|
|
59
|
+
if: { $gt: [{ $size: "$subj" }, 0] },
|
|
60
|
+
then: {
|
|
61
|
+
$ifNull: [{ $arrayElemAt: ["$subj.subjectName", 0] }, UNCLASSIFIED],
|
|
62
|
+
},
|
|
63
|
+
else: UNCLASSIFIED,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
const ticketDateMatchStage = (dateScope) => {
|
|
67
|
+
const { from, to } = (0, tickets_statistics_utils_1.resolveTicketStatsDateRange)(dateScope);
|
|
68
|
+
return { createdAt: { $gte: from, $lte: to } };
|
|
69
|
+
};
|
|
70
|
+
const ticketsWithCallSidMatch = (cityName, dateScope) => ({
|
|
71
|
+
cityName,
|
|
72
|
+
callSid: { $exists: true, $nin: [null, ""] },
|
|
73
|
+
...ticketDateMatchStage(dateScope),
|
|
74
|
+
});
|
|
75
|
+
exports.ticketsWithCallSidMatch = ticketsWithCallSidMatch;
|
|
76
|
+
const ticketsByCallSidsMatch = (cityName, callSids, dateScope) => ({
|
|
77
|
+
cityName,
|
|
78
|
+
callSid: { $in: callSids },
|
|
79
|
+
...(dateScope ? ticketDateMatchStage(dateScope) : {}),
|
|
80
|
+
});
|
|
81
|
+
exports.ticketsByCallSidsMatch = ticketsByCallSidsMatch;
|
|
82
|
+
const callSidGroupStages = () => [
|
|
83
|
+
{ $group: { _id: "$callSid" } },
|
|
84
|
+
];
|
|
85
|
+
exports.callSidGroupStages = callSidGroupStages;
|
|
86
|
+
const subjectGroupStages = (cityName, limit) => {
|
|
87
|
+
const shouldLimit = typeof limit === "number" && limit > 0;
|
|
88
|
+
return [
|
|
89
|
+
{ $addFields: { effectiveSubjectId: effectiveSubjectIdExpr } },
|
|
90
|
+
departmentsSubjectsLookup(cityName),
|
|
91
|
+
{ $addFields: { subject: subjectLabelExpr } },
|
|
92
|
+
{ $group: { _id: "$subject", count: { $sum: 1 } } },
|
|
93
|
+
{ $sort: { count: -1 } },
|
|
94
|
+
...(shouldLimit ? [{ $limit: limit }] : []),
|
|
95
|
+
];
|
|
96
|
+
};
|
|
97
|
+
exports.subjectGroupStages = subjectGroupStages;
|
|
98
|
+
const runTicketStatsAggregate = async (pipeline) => {
|
|
99
|
+
const rows = await (0, tickets_getters_1.getTicketsCollection)()
|
|
100
|
+
.aggregate(pipeline, { maxTimeMS: STATS_MAX_TIME_MS })
|
|
101
|
+
.toArray();
|
|
102
|
+
return rows;
|
|
103
|
+
};
|
|
104
|
+
exports.runTicketStatsAggregate = runTicketStatsAggregate;
|
|
105
|
+
const mapCallSidRows = (rows) => rows.map((r) => String(r._id)).filter(Boolean);
|
|
106
|
+
exports.mapCallSidRows = mapCallSidRows;
|
|
107
|
+
const mapSubjectRows = (rows) => rows.map((r) => ({
|
|
108
|
+
subject: String(r._id),
|
|
109
|
+
count: r.count,
|
|
110
|
+
}));
|
|
111
|
+
exports.mapSubjectRows = mapSubjectRows;
|
|
112
|
+
//# sourceMappingURL=tickets.statistics.pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.statistics.pipeline.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TicketStatsDateScope } from "./tickets.types";
|
|
2
|
+
export declare const resolveTicketStatsDateRange: (dateScope?: TicketStatsDateScope) => {
|
|
3
|
+
from: Date;
|
|
4
|
+
to: Date;
|
|
5
|
+
};
|
|
6
|
+
export declare const ticketStatsDateScopeFromYmd: (startStr: string, endStr: string, timezone: string) => TicketStatsDateScope;
|
|
7
|
+
//# sourceMappingURL=tickets.statistics.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.statistics.utils.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAiC5D,eAAO,MAAM,2BAA2B,GACtC,YAAY,oBAAoB,KAC/B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAKxB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,UAAU,MAAM,KACf,oBAGD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ticketStatsDateScopeFromYmd = exports.resolveTicketStatsDateRange = void 0;
|
|
4
|
+
const DEFAULT_LOOKBACK_DAYS = 30;
|
|
5
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
6
|
+
const formatYmdInTz = (date, timezone) => new Intl.DateTimeFormat("en-CA", { timeZone: timezone }).format(date);
|
|
7
|
+
const dateAtNoonUtc = (dateStr) => {
|
|
8
|
+
const [y, m, d] = dateStr.split("-").map(Number);
|
|
9
|
+
return new Date(Date.UTC(y, m - 1, d, 12, 0, 0));
|
|
10
|
+
};
|
|
11
|
+
const startOfCalendarDayInTz = (dateStr, timezone) => {
|
|
12
|
+
const anchor = dateAtNoonUtc(dateStr).getTime();
|
|
13
|
+
let low = anchor - 2 * DAY_MS;
|
|
14
|
+
let high = anchor + DAY_MS;
|
|
15
|
+
while (high - low > 1) {
|
|
16
|
+
const mid = Math.floor((low + high) / 2);
|
|
17
|
+
if (formatYmdInTz(new Date(mid), timezone) >= dateStr)
|
|
18
|
+
high = mid;
|
|
19
|
+
else
|
|
20
|
+
low = mid;
|
|
21
|
+
}
|
|
22
|
+
return new Date(high);
|
|
23
|
+
};
|
|
24
|
+
const endOfCalendarDayInTz = (dateStr, timezone) => {
|
|
25
|
+
const [y, m, d] = dateStr.split("-").map(Number);
|
|
26
|
+
const nextDay = new Date(Date.UTC(y, m - 1, d + 1)).toISOString().slice(0, 10);
|
|
27
|
+
return new Date(startOfCalendarDayInTz(nextDay, timezone).getTime() - 1);
|
|
28
|
+
};
|
|
29
|
+
const resolveTicketStatsDateRange = (dateScope) => {
|
|
30
|
+
const to = dateScope?.to ?? new Date();
|
|
31
|
+
const from = dateScope?.from ?? new Date(to.getTime() - DEFAULT_LOOKBACK_DAYS * DAY_MS);
|
|
32
|
+
return { from, to };
|
|
33
|
+
};
|
|
34
|
+
exports.resolveTicketStatsDateRange = resolveTicketStatsDateRange;
|
|
35
|
+
const ticketStatsDateScopeFromYmd = (startStr, endStr, timezone) => ({
|
|
36
|
+
from: startOfCalendarDayInTz(startStr, timezone),
|
|
37
|
+
to: endOfCalendarDayInTz(endStr, timezone),
|
|
38
|
+
});
|
|
39
|
+
exports.ticketStatsDateScopeFromYmd = ticketStatsDateScopeFromYmd;
|
|
40
|
+
//# sourceMappingURL=tickets.statistics.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.statistics.utils.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,11 +28,20 @@ export type Ticket = {
|
|
|
28
28
|
guestJwt?: string;
|
|
29
29
|
};
|
|
30
30
|
export type TicketDoc = WithId<Ticket>;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
subject_name: string;
|
|
34
|
-
subject_id: string;
|
|
31
|
+
export type SubjectItem = {
|
|
32
|
+
subject: string;
|
|
35
33
|
count: number;
|
|
36
|
-
|
|
34
|
+
};
|
|
35
|
+
export type TicketSubjectRow = {
|
|
36
|
+
callSid: string;
|
|
37
|
+
subject: string;
|
|
38
|
+
};
|
|
39
|
+
export type TicketStatsDateScope = {
|
|
40
|
+
from?: Date;
|
|
41
|
+
to?: Date;
|
|
42
|
+
};
|
|
43
|
+
export type TicketStatsDateRange = {
|
|
44
|
+
from: Date;
|
|
45
|
+
to: Date;
|
|
37
46
|
};
|
|
38
47
|
//# sourceMappingURL=tickets.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tickets.types.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE;
|
|
1
|
+
{"version":3,"file":"tickets.types.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAEvC,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,EAAE,CAAC,EAAE,IAAI,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,IAAI,CAAC;CACV,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Customer role within a conference call. */
|
|
2
|
+
export declare const CONFERENCE_ROLE_CUSTOMER: "customer";
|
|
3
|
+
/** Supervisor role within a conference call. */
|
|
4
|
+
export declare const CONFERENCE_ROLE_SUPERVISOR: "supervisor";
|
|
5
|
+
/** Hours in a single day. */
|
|
6
|
+
export declare const HOURS_PER_DAY = 24;
|
|
7
|
+
/** Max execution time (ms) for calls statistics aggregations. */
|
|
8
|
+
export declare const STATS_MAX_TIME_MS = 30000;
|
|
9
|
+
/**
|
|
10
|
+
* When the client calls bar chart should group by week or month instead of day:
|
|
11
|
+
* > MONTH threshold -> one bar per month
|
|
12
|
+
* > WEEK threshold -> one bar per week
|
|
13
|
+
* otherwise -> one bar per day
|
|
14
|
+
*/
|
|
15
|
+
export declare const TREND_MONTH_BUCKET_MIN_MONTHS = 6;
|
|
16
|
+
export declare const TREND_WEEK_BUCKET_MIN_MONTHS = 3;
|
|
17
|
+
//# sourceMappingURL=calls.constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calls.constants.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.constants.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,eAAO,MAAM,wBAAwB,EAAG,UAAmB,CAAC;AAE5D,gDAAgD;AAChD,eAAO,MAAM,0BAA0B,EAAG,YAAqB,CAAC;AAEhE,6BAA6B;AAC7B,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,4BAA4B,IAAI,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TREND_WEEK_BUCKET_MIN_MONTHS = exports.TREND_MONTH_BUCKET_MIN_MONTHS = exports.STATS_MAX_TIME_MS = exports.HOURS_PER_DAY = exports.CONFERENCE_ROLE_SUPERVISOR = exports.CONFERENCE_ROLE_CUSTOMER = void 0;
|
|
4
|
+
/** Customer role within a conference call. */
|
|
5
|
+
exports.CONFERENCE_ROLE_CUSTOMER = "customer";
|
|
6
|
+
/** Supervisor role within a conference call. */
|
|
7
|
+
exports.CONFERENCE_ROLE_SUPERVISOR = "supervisor";
|
|
8
|
+
/** Hours in a single day. */
|
|
9
|
+
exports.HOURS_PER_DAY = 24;
|
|
10
|
+
/** Max execution time (ms) for calls statistics aggregations. */
|
|
11
|
+
exports.STATS_MAX_TIME_MS = 30_000;
|
|
12
|
+
/**
|
|
13
|
+
* When the client calls bar chart should group by week or month instead of day:
|
|
14
|
+
* > MONTH threshold -> one bar per month
|
|
15
|
+
* > WEEK threshold -> one bar per week
|
|
16
|
+
* otherwise -> one bar per day
|
|
17
|
+
*/
|
|
18
|
+
exports.TREND_MONTH_BUCKET_MIN_MONTHS = 6;
|
|
19
|
+
exports.TREND_WEEK_BUCKET_MIN_MONTHS = 3;
|
|
20
|
+
//# sourceMappingURL=calls.constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calls.constants.js","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.constants.ts"],"names":[],"mappings":";;;AAAA,8CAA8C;AACjC,QAAA,wBAAwB,GAAG,UAAmB,CAAC;AAE5D,gDAAgD;AACnC,QAAA,0BAA0B,GAAG,YAAqB,CAAC;AAEhE,6BAA6B;AAChB,QAAA,aAAa,GAAG,EAAE,CAAC;AAEhC,iEAAiE;AACpD,QAAA,iBAAiB,GAAG,MAAM,CAAC;AAExC;;;;;GAKG;AACU,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,4BAA4B,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CityName } from "../../municipal/utils/types";
|
|
2
|
+
import type { SubjectItem, TicketStatsDateScope } from "../../municipal/tickets/tickets.types";
|
|
3
|
+
import type { CallsHourlyBucket, CallsRoutingAggregation, CallsStatsFilter, CallsSummaryAggregation, CallsTrendBucket, ResolvedTimeBucket } from "./calls.statistics.types";
|
|
4
|
+
export declare const rangeDurationDays: (startStr: string, endStr: string) => number;
|
|
5
|
+
/**
|
|
6
|
+
* Number of distinct calendar months the [startStr, endStr] range spans, inclusive.
|
|
7
|
+
* Counts month boundaries rather than 30-day periods: e.g. Jan 31 -> Feb 1 returns 2.
|
|
8
|
+
*/
|
|
9
|
+
export declare const rangeDurationMonths: (startStr: string, endStr: string) => number;
|
|
10
|
+
/**
|
|
11
|
+
* Chooses how the client calls-over-time bar chart groups each column:
|
|
12
|
+
* one bar per day, week, or calendar month. Short ranges stay daily; longer
|
|
13
|
+
* ones switch to weekly or monthly so the chart does not show hundreds of bars.
|
|
14
|
+
*/
|
|
15
|
+
export declare const resolveTimeBucketFromRange: (startStr: string, endStr: string) => ResolvedTimeBucket;
|
|
16
|
+
export declare const aggregateCallsSummary: (filter: CallsStatsFilter) => Promise<CallsSummaryAggregation>;
|
|
17
|
+
export declare const aggregateCallsTrend: (filter: CallsStatsFilter, bucket: ResolvedTimeBucket) => Promise<CallsTrendBucket[]>;
|
|
18
|
+
export declare const aggregateCallsHourlyByRange: (filter: CallsStatsFilter) => Promise<CallsHourlyBucket[]>;
|
|
19
|
+
export declare const aggregateCallsRouting: (filter: CallsStatsFilter) => Promise<CallsRoutingAggregation>;
|
|
20
|
+
export declare const findFilteredCallSids: (filter: CallsStatsFilter) => Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* "Subjects" panel: ticket count per subject, for calls passing the filters.
|
|
23
|
+
* Calls and tickets are in separate DBs, so we join in code — filtered call IDs
|
|
24
|
+
* from calls, subjects from tickets. Returns the full list sorted most-common
|
|
25
|
+
* first; callers slice if they want a top-N.
|
|
26
|
+
*/
|
|
27
|
+
export declare const findSubjectsByCityAndDateRange: (cityName: CityName, filter: CallsStatsFilter, dateScope: TicketStatsDateScope) => Promise<SubjectItem[]>;
|
|
28
|
+
//# sourceMappingURL=calls.statistics.getters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calls.statistics.getters.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.statistics.getters.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAEV,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAqKlC,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,KAAG,MAIpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,KAAG,MAItE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GACrC,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb,kBAKF,CAAC;AA8JF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,gBAAgB,KACvB,OAAO,CAAC,uBAAuB,CAqDjC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,gBAAgB,EACxB,QAAQ,kBAAkB,KACzB,OAAO,CAAC,gBAAgB,EAAE,CAwD5B,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,QAAQ,gBAAgB,KACvB,OAAO,CAAC,iBAAiB,EAAE,CAY7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,gBAAgB,KACvB,OAAO,CAAC,uBAAuB,CA2BjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,QAAQ,gBAAgB,KAAG,OAAO,CAAC,MAAM,EAAE,CAMrF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,GACzC,UAAU,QAAQ,EAClB,QAAQ,gBAAgB,EACxB,WAAW,oBAAoB,KAC9B,OAAO,CAAC,WAAW,EAAE,CAevB,CAAC"}
|