@talkpilot/core-db 1.3.16 → 1.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +20 -10
  2. package/dist/index.d.ts +0 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +0 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/municipal/index.d.ts +1 -1
  7. package/dist/municipal/index.d.ts.map +1 -1
  8. package/dist/municipal/tickets/tickets.statistics.getters.d.ts.map +1 -1
  9. package/dist/municipal/tickets/tickets.statistics.getters.js +2 -6
  10. package/dist/municipal/tickets/tickets.statistics.getters.js.map +1 -1
  11. package/dist/talkpilot/calls/calls.constants.d.ts +2 -0
  12. package/dist/talkpilot/calls/calls.constants.d.ts.map +1 -1
  13. package/dist/talkpilot/calls/calls.constants.js +3 -1
  14. package/dist/talkpilot/calls/calls.constants.js.map +1 -1
  15. package/dist/talkpilot/calls/calls.getters.d.ts +2 -1
  16. package/dist/talkpilot/calls/calls.getters.d.ts.map +1 -1
  17. package/dist/talkpilot/calls/calls.getters.js +3 -1
  18. package/dist/talkpilot/calls/calls.getters.js.map +1 -1
  19. package/dist/talkpilot/calls/calls.types.d.ts +2 -1
  20. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  21. package/dist/talkpilot/calls/dashboard/calls.dashboard.d.ts.map +1 -1
  22. package/dist/talkpilot/calls/dashboard/calls.dashboard.js +16 -13
  23. package/dist/talkpilot/calls/dashboard/calls.dashboard.js.map +1 -1
  24. package/dist/talkpilot/calls/dashboard/calls.dashboard.types.d.ts +2 -2
  25. package/dist/talkpilot/calls/dashboard/calls.dashboard.types.d.ts.map +1 -1
  26. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +0 -3
  27. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
  28. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +1 -17
  29. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
  30. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +2 -1
  31. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  32. package/dist/test-utils/factories/index.d.ts +0 -1
  33. package/dist/test-utils/factories/index.d.ts.map +1 -1
  34. package/dist/test-utils/factories/index.js +0 -1
  35. package/dist/test-utils/factories/index.js.map +1 -1
  36. package/dist/test-utils/factories/websitalk/scans.d.ts.map +1 -1
  37. package/dist/test-utils/factories/websitalk/scans.js +1 -2
  38. package/dist/test-utils/factories/websitalk/scans.js.map +1 -1
  39. package/dist/websitalk/index.d.ts +0 -1
  40. package/dist/websitalk/index.d.ts.map +1 -1
  41. package/dist/websitalk/index.js +0 -1
  42. package/dist/websitalk/index.js.map +1 -1
  43. package/dist/websitalk/scans/index.d.ts +0 -2
  44. package/dist/websitalk/scans/index.d.ts.map +1 -1
  45. package/dist/websitalk/scans/index.js +0 -2
  46. package/dist/websitalk/scans/index.js.map +1 -1
  47. package/dist/websitalk/scans/scans.getters.d.ts +3 -10
  48. package/dist/websitalk/scans/scans.getters.d.ts.map +1 -1
  49. package/dist/websitalk/scans/scans.getters.js +9 -49
  50. package/dist/websitalk/scans/scans.getters.js.map +1 -1
  51. package/dist/websitalk/scans/scans.types.d.ts +8 -3
  52. package/dist/websitalk/scans/scans.types.d.ts.map +1 -1
  53. package/package.json +1 -1
  54. package/src/index.ts +0 -1
  55. package/src/municipal/index.ts +1 -1
  56. package/src/municipal/tickets/tickets.statistics.getters.ts +3 -16
  57. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +81 -1
  58. package/src/talkpilot/calls/__tests__/calls.spec.ts +13 -0
  59. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +4 -6
  60. package/src/talkpilot/calls/calls.constants.ts +3 -0
  61. package/src/talkpilot/calls/calls.getters.ts +11 -1
  62. package/src/talkpilot/calls/calls.types.ts +12 -1
  63. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +16 -13
  64. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +2 -2
  65. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +5 -57
  66. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +4 -0
  67. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +0 -24
  68. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +2 -1
  69. package/src/test-utils/factories/index.ts +0 -1
  70. package/src/test-utils/factories/websitalk/scans.ts +1 -2
  71. package/src/websitalk/index.ts +0 -1
  72. package/src/websitalk/scans/__tests__/scans.spec.ts +26 -121
  73. package/src/websitalk/scans/index.ts +0 -2
  74. package/src/websitalk/scans/scans.getters.ts +17 -64
  75. package/src/websitalk/scans/scans.types.ts +11 -3
  76. package/tsconfig.json +4 -4
  77. package/src/test-utils/factories/websitalk/websiteUrls.ts +0 -17
  78. package/src/websitalk/scans/scans.constants.ts +0 -15
  79. package/src/websitalk/scans/scans.utils.ts +0 -5
  80. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +0 -77
  81. package/src/websitalk/websiteUrls/index.ts +0 -2
  82. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +0 -65
  83. package/src/websitalk/websiteUrls/websiteUrls.types.ts +0 -13
@@ -17,7 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.ObjectId = exports.getDb = exports.setDb = exports.websitalkMongodbClient = void 0;
18
18
  const mongodb_1 = require("mongodb");
19
19
  __exportStar(require("./scans"), exports);
20
- __exportStar(require("./websiteUrls"), exports);
21
20
  var mongodb_client_1 = require("./mongodb-client");
22
21
  Object.defineProperty(exports, "websitalkMongodbClient", { enumerable: true, get: function () { return mongodb_client_1.websitalkMongodbClient; } });
23
22
  let db;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/websitalk/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAAwD;AAExD,0CAAwB;AACxB,gDAA8B;AAC9B,mDAA0D;AAAjD,wHAAA,sBAAsB,OAAA;AAE/B,IAAI,EAAM,CAAC;AACJ,MAAM,KAAK,GAAG,CAAC,CAAK,EAAE,EAAE;IAC7B,EAAE,GAAG,CAAC,CAAC;AACT,CAAC,CAAC;AAFW,QAAA,KAAK,SAEhB;AAEK,MAAM,KAAK,GAAG,GAAO,EAAE;IAC5B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAHW,QAAA,KAAK,SAGhB;AACW,QAAA,QAAQ,GAAG,kBAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/websitalk/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAAwD;AAExD,0CAAwB;AACxB,mDAA0D;AAAjD,wHAAA,sBAAsB,OAAA;AAE/B,IAAI,EAAM,CAAC;AACJ,MAAM,KAAK,GAAG,CAAC,CAAK,EAAE,EAAE;IAC7B,EAAE,GAAG,CAAC,CAAC;AACT,CAAC,CAAC;AAFW,QAAA,KAAK,SAEhB;AAEK,MAAM,KAAK,GAAG,GAAO,EAAE;IAC5B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAHW,QAAA,KAAK,SAGhB;AACW,QAAA,QAAQ,GAAG,kBAAa,CAAC"}
@@ -1,5 +1,3 @@
1
- export * from "./scans.constants";
2
1
  export * from "./scans.getters";
3
2
  export * from "./scans.types";
4
- export * from "./scans.utils";
5
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
@@ -14,8 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./scans.constants"), exports);
18
17
  __exportStar(require("./scans.getters"), exports);
19
18
  __exportStar(require("./scans.types"), exports);
20
- __exportStar(require("./scans.utils"), exports);
21
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/websitalk/scans/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,kDAAgC;AAChC,gDAA8B;AAC9B,gDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/websitalk/scans/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,gDAA8B"}
@@ -1,19 +1,12 @@
1
1
  import { Collection, Filter, ObjectId } from "mongodb";
2
2
  import { QueryOptions } from "../../talkpilot/utils/query.utils";
3
- import type { Scan, ScanDoc } from "./scans.types";
3
+ import type { ActiveScanStatus, Scan, ScanDoc } from "./scans.types";
4
4
  export declare const getScansCollection: () => Collection<Scan>;
5
5
  export declare const getScansByClientAndDateRange: (clientId: string, startDate: Date, endDate: Date) => Promise<ScanDoc[]>;
6
6
  export declare const getScanFieldsByClientAndDateRange: <K extends keyof Scan>(clientId: string, startDate: Date, endDate: Date, fields: K[]) => Promise<Pick<ScanDoc, "_id" | K>[]>;
7
- export declare const createScanDoc: (scan: Pick<Scan, "clientId" | "websiteUrlId"> & Partial<Pick<Scan, "notifyPhoneNumber">>) => Promise<import("mongodb").InsertOneResult<Scan>>;
8
- export declare const getScanById: (id: string) => Promise<ScanDoc | null>;
9
- export declare const getScansByWebsiteUrl: (websiteUrlId: string) => Promise<ScanDoc[]>;
10
- export declare const getLatestScanByWebsiteUrl: (websiteUrlId: string) => Promise<ScanDoc | null>;
11
- export declare const getInProgressScanByWebsiteUrl: (websiteUrlId: string) => Promise<ScanDoc | null>;
12
- export declare const findInProgressScansByClient: (clientId: string) => Promise<ScanDoc[]>;
7
+ export declare const createScanDoc: (scan: Pick<Scan, "clientId" | "baseUrl" | "notifyPhoneNumber">) => Promise<import("mongodb").InsertOneResult<Scan>>;
8
+ export declare const getActiveScanStatus: (clientId: string) => Promise<ActiveScanStatus>;
13
9
  export declare const updateScanDoc: (scanId: ObjectId, updates: Partial<Omit<Scan, "clientId" | "createdAt">>) => Promise<ScanDoc | null>;
14
10
  export declare const findScansByQuery: (query: Filter<Scan>, options?: QueryOptions) => Promise<ScanDoc[]>;
15
11
  export declare const countScans: (query: Filter<Scan>) => Promise<number>;
16
- export declare const hasScansForWebsiteUrl: (websiteUrlId: string) => Promise<boolean>;
17
- export declare const getLatestCompletedScanByWebsiteUrl: (websiteUrlId: string) => Promise<ScanDoc | null>;
18
- export declare const deleteScansByWebsiteUrl: (websiteUrlId: string) => Promise<number>;
19
12
  //# sourceMappingURL=scans.getters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scans.getters.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EAEL,YAAY,EACb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAInD,eAAO,MAAM,kBAAkB,QAAO,UAAU,CAAC,IAAI,CAEpD,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,UAAU,MAAM,EAChB,WAAW,IAAI,EACf,SAAS,IAAI,KACZ,OAAO,CAAC,OAAO,EAAE,CAUnB,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAAI,CAAC,SAAS,MAAM,IAAI,EACpE,UAAU,MAAM,EAChB,WAAW,IAAI,EACf,SAAS,IAAI,EACb,QAAQ,CAAC,EAAE,KACV,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAkBpC,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,MAAM,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,qDAa3C,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,IAAI,MAAM,KAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAEpE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,EAAE,CAKnB,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,GAAG,IAAI,CAKxB,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,GAAG,IAAI,CAMxB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,KACf,OAAO,CAAC,OAAO,EAAE,CAQnB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,QAAQ,QAAQ,EAChB,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,KACrD,OAAO,CAAC,OAAO,GAAG,IAAI,CAMxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,EACnB,UAAU,YAAY,KACrB,OAAO,CAAC,OAAO,EAAE,CAGnB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,OAAO,MAAM,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,MAAM,CAEpE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,CAEjB,CAAC;AAEF,eAAO,MAAM,kCAAkC,GAC7C,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,GAAG,IAAI,CAKxB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,cAAc,MAAM,KACnB,OAAO,CAAC,MAAM,CAGhB,CAAC"}
1
+ {"version":3,"file":"scans.getters.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EAEL,YAAY,EACb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,gBAAgB,EAChB,IAAI,EACJ,OAAO,EAER,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,kBAAkB,QAAO,UAAU,CAAC,IAAI,CAEpD,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,UAAU,MAAM,EAChB,WAAW,IAAI,EACf,SAAS,IAAI,KACZ,OAAO,CAAC,OAAO,EAAE,CAUnB,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAAI,CAAC,SAAS,MAAM,IAAI,EACpE,UAAU,MAAM,EAChB,WAAW,IAAI,EACf,SAAS,IAAI,EACb,QAAQ,CAAC,EAAE,KACV,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAkBpC,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,MAAM,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,mBAAmB,CAAC,qDAa/D,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAC9B,UAAU,MAAM,KACf,OAAO,CAAC,gBAAgB,CAW1B,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,QAAQ,QAAQ,EAChB,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,KACrD,OAAO,CAAC,OAAO,GAAG,IAAI,CAMxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,EACnB,UAAU,YAAY,KACrB,OAAO,CAAC,OAAO,EAAE,CAGnB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,OAAO,MAAM,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,MAAM,CAEpE,CAAC"}
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.deleteScansByWebsiteUrl = exports.getLatestCompletedScanByWebsiteUrl = exports.hasScansForWebsiteUrl = exports.countScans = exports.findScansByQuery = exports.updateScanDoc = exports.findInProgressScansByClient = exports.getInProgressScanByWebsiteUrl = exports.getLatestScanByWebsiteUrl = exports.getScansByWebsiteUrl = exports.getScanById = exports.createScanDoc = exports.getScanFieldsByClientAndDateRange = exports.getScansByClientAndDateRange = exports.getScansCollection = void 0;
4
- const mongodb_1 = require("mongodb");
3
+ exports.countScans = exports.findScansByQuery = exports.updateScanDoc = exports.getActiveScanStatus = exports.createScanDoc = exports.getScanFieldsByClientAndDateRange = exports.getScansByClientAndDateRange = exports.getScansCollection = void 0;
5
4
  const index_1 = require("../index");
6
5
  const query_utils_1 = require("../../talkpilot/utils/query.utils");
7
- const scans_constants_1 = require("./scans.constants");
8
- const scans_utils_1 = require("./scans.utils");
9
6
  const getScansCollection = () => {
10
7
  return (0, index_1.getDb)().collection("scans");
11
8
  };
@@ -41,7 +38,7 @@ exports.getScanFieldsByClientAndDateRange = getScanFieldsByClientAndDateRange;
41
38
  const createScanDoc = (scan) => {
42
39
  return (0, exports.getScansCollection)().insertOne({
43
40
  ...scan,
44
- status: scans_constants_1.SCAN_STATUSES.CHECKING,
41
+ status: "CHECKING",
45
42
  activeTasksCount: 0,
46
43
  pagesScanned: 0,
47
44
  pagesSkipped: 0,
@@ -52,39 +49,15 @@ const createScanDoc = (scan) => {
52
49
  });
53
50
  };
54
51
  exports.createScanDoc = createScanDoc;
55
- const getScanById = async (id) => {
56
- return (0, exports.getScansCollection)().findOne({ _id: new mongodb_1.ObjectId(id) });
57
- };
58
- exports.getScanById = getScanById;
59
- const getScansByWebsiteUrl = async (websiteUrlId) => {
60
- return (0, exports.getScansCollection)()
61
- .find({ websiteUrlId })
62
- .sort({ createdAt: -1 })
63
- .toArray();
64
- };
65
- exports.getScansByWebsiteUrl = getScansByWebsiteUrl;
66
- const getLatestScanByWebsiteUrl = async (websiteUrlId) => {
67
- return (0, exports.getScansCollection)().findOne({ websiteUrlId }, { sort: { createdAt: -1 } });
68
- };
69
- exports.getLatestScanByWebsiteUrl = getLatestScanByWebsiteUrl;
70
- const getInProgressScanByWebsiteUrl = async (websiteUrlId) => {
71
- const latestScan = await (0, exports.getLatestScanByWebsiteUrl)(websiteUrlId);
72
- if (!latestScan || !(0, scans_utils_1.isInProgressScan)(latestScan)) {
73
- return null;
52
+ const FINISHED_SCAN_STATUSES = ["COMPLETED", "FAILED"];
53
+ const getActiveScanStatus = async (clientId) => {
54
+ const latestScan = await (0, exports.getScansCollection)().findOne({ clientId }, { sort: { createdAt: -1 } });
55
+ if (!latestScan || FINISHED_SCAN_STATUSES.includes(latestScan.status)) {
56
+ return { isActive: false };
74
57
  }
75
- return latestScan;
76
- };
77
- exports.getInProgressScanByWebsiteUrl = getInProgressScanByWebsiteUrl;
78
- const findInProgressScansByClient = async (clientId) => {
79
- return (0, exports.getScansCollection)()
80
- .find({
81
- clientId,
82
- status: { $nin: scans_constants_1.FINISHED_SCAN_STATUSES },
83
- })
84
- .sort({ createdAt: -1 })
85
- .toArray();
58
+ return { isActive: true, status: latestScan.status };
86
59
  };
87
- exports.findInProgressScansByClient = findInProgressScansByClient;
60
+ exports.getActiveScanStatus = getActiveScanStatus;
88
61
  const updateScanDoc = async (scanId, updates) => {
89
62
  return await (0, exports.getScansCollection)().findOneAndUpdate({ _id: scanId }, { $set: { ...updates, updatedAt: new Date() } }, { returnDocument: "after" });
90
63
  };
@@ -98,17 +71,4 @@ const countScans = async (query) => {
98
71
  return (0, exports.getScansCollection)().countDocuments(query);
99
72
  };
100
73
  exports.countScans = countScans;
101
- const hasScansForWebsiteUrl = async (websiteUrlId) => {
102
- return (await (0, exports.countScans)({ websiteUrlId })) > 0;
103
- };
104
- exports.hasScansForWebsiteUrl = hasScansForWebsiteUrl;
105
- const getLatestCompletedScanByWebsiteUrl = async (websiteUrlId) => {
106
- return (0, exports.getScansCollection)().findOne({ websiteUrlId, status: scans_constants_1.SCAN_STATUSES.COMPLETED }, { sort: { createdAt: -1 } });
107
- };
108
- exports.getLatestCompletedScanByWebsiteUrl = getLatestCompletedScanByWebsiteUrl;
109
- const deleteScansByWebsiteUrl = async (websiteUrlId) => {
110
- const result = await (0, exports.getScansCollection)().deleteMany({ websiteUrlId });
111
- return result.deletedCount;
112
- };
113
- exports.deleteScansByWebsiteUrl = deleteScansByWebsiteUrl;
114
74
  //# sourceMappingURL=scans.getters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scans.getters.js","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.getters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scans.getters.js","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.getters.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
1
  import { WithId } from "mongodb";
2
- import type { SCAN_STATUSES } from "./scans.constants";
3
- export type ScanStatus = (typeof SCAN_STATUSES)[keyof typeof SCAN_STATUSES];
2
+ export type ScanStatus = "CHECKING" | "PREPARING" | "SCANNING" | "PROCESSING" | "COMPLETED" | "FAILED";
3
+ export type ActiveScanStatus = {
4
+ isActive: true;
5
+ status: ScanStatus;
6
+ } | {
7
+ isActive: false;
8
+ };
4
9
  export type SiteChromeEntry = {
5
10
  url: string;
6
11
  urlCanonical?: string | null;
@@ -25,7 +30,7 @@ export type SkippedEntry = {
25
30
  };
26
31
  export type Scan = {
27
32
  clientId: string;
28
- websiteUrlId: string;
33
+ baseUrl: string;
29
34
  notifyPhoneNumber?: string | null;
30
35
  status: ScanStatus;
31
36
  activeTasksCount: number;
@@ -1 +1 @@
1
- {"version":3,"file":"scans.types.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE5E,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,UAAU,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;IAC5B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"scans.types.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,WAAW,GACX,UAAU,GACV,YAAY,GACZ,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACtC;IAAE,QAAQ,EAAE,KAAK,CAAA;CAAE,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,UAAU,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;IAC5B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talkpilot/core-db",
3
- "version": "1.3.16",
3
+ "version": "1.3.17",
4
4
  "description": "Core database package for centralized connections and ORM integration.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -24,4 +24,3 @@ export {
24
24
  } from "./websitalk";
25
25
  export * from "./websitalk/scans/scans.getters";
26
26
  export type * from "./websitalk/scans/scans.types";
27
- export * from "./websitalk/websiteUrls";
@@ -7,7 +7,7 @@ export * from "./tickets";
7
7
  export * from "./systemInstructions";
8
8
  export * from "./muniIssues";
9
9
  export * from "./utils/types";
10
- export type { CityName } from "./utils/types";
10
+ export { CityName } from "./utils/types";
11
11
  export { municipalDataMongodbClient } from "./mongodb-client";
12
12
 
13
13
  let db: Db;
@@ -83,12 +83,7 @@ export const findCallSidsWithDraftTicketsByCity = async (
83
83
  dateScope?: TicketStatsDateScope,
84
84
  ): Promise<string[]> => {
85
85
  const rows = await runTicketStatsAggregate<{ _id: unknown }>([
86
- {
87
- $match: ticketsWithCallSidMatch(
88
- cityName,
89
- resolveTicketStatsDateRange(dateScope),
90
- ),
91
- },
86
+ { $match: ticketsWithCallSidMatch(cityName, resolveTicketStatsDateRange(dateScope)) },
92
87
  { $match: { $expr: isDraftTicketExpr } },
93
88
  { $group: { _id: "$callSid" } },
94
89
  ]);
@@ -101,16 +96,8 @@ export const findCallSidDraftTicketCountsByCity = async (
101
96
  cityName: CityName,
102
97
  dateScope?: TicketStatsDateScope,
103
98
  ): Promise<Map<string, number>> => {
104
- const rows = await runTicketStatsAggregate<{
105
- _id: unknown;
106
- ticketCount: number;
107
- }>([
108
- {
109
- $match: ticketsWithCallSidMatch(
110
- cityName,
111
- resolveTicketStatsDateRange(dateScope),
112
- ),
113
- },
99
+ const rows = await runTicketStatsAggregate<{ _id: unknown; ticketCount: number }>([
100
+ { $match: ticketsWithCallSidMatch(cityName, resolveTicketStatsDateRange(dateScope)) },
114
101
  { $match: { $expr: isDraftTicketExpr } },
115
102
  { $group: { _id: "$callSid", ticketCount: { $sum: 1 } } },
116
103
  ]);
@@ -35,7 +35,7 @@ describe("getDashboardStats", () => {
35
35
  expect(result.kpis.totalCalls).toBe(0);
36
36
  expect(result.kpis.completedCount).toBe(0);
37
37
  expect(result.kpis.avgDurationSeconds).toBe(0);
38
- expect(result.kpis.busyCount).toBe(0);
38
+ expect(result.kpis.inCallCount).toBe(0);
39
39
  expect(result.kpis.timeSavedMinutes).toBe(0);
40
40
  // ~30 day range -> daily buckets, gap-filled with zeros across the whole range
41
41
  expect(result.charts.volumeGranularity).toBe("day");
@@ -146,4 +146,84 @@ describe("getDashboardStats", () => {
146
146
  const empty = result.charts.volumeData.filter((d) => d.completed === 0);
147
147
  expect(empty).toHaveLength(22);
148
148
  });
149
+
150
+ it("should count in-progress and answered as inCallCount, not completed", async () => {
151
+ const clientId = "client-dash-in-call";
152
+
153
+ await getClientsConfigCollection().insertOne({
154
+ clientId,
155
+ timezone: "UTC",
156
+ products: {},
157
+ } as any);
158
+
159
+ await getCallsCollection().insertMany([
160
+ {
161
+ clientId,
162
+ status: "in-progress",
163
+ callLength: 30,
164
+ createdAt: new Date("2026-05-10T10:00:00Z"),
165
+ },
166
+ {
167
+ clientId,
168
+ status: "answered",
169
+ callLength: 45,
170
+ createdAt: new Date("2026-05-10T11:00:00Z"),
171
+ },
172
+ {
173
+ clientId,
174
+ status: "completed",
175
+ callLength: 120,
176
+ createdAt: new Date("2026-05-10T12:00:00Z"),
177
+ },
178
+ ] as any);
179
+
180
+ const result = await getDashboardStats({
181
+ clientId,
182
+ startDate: "2026-05-01T00:00:00.000Z",
183
+ endDate: "2026-05-31T23:59:59.999Z",
184
+ });
185
+
186
+ expect(result.kpis.inCallCount).toBe(2);
187
+ expect(result.kpis.completedCount).toBe(1);
188
+ expect(result.kpis.totalCalls).toBe(3);
189
+ expect(result.kpis.avgDurationSeconds).toBe(120);
190
+ expect(result.kpis.timeSavedMinutes).toBe(2);
191
+ });
192
+
193
+ it("should not count physical busy status as inCall or answered duration", async () => {
194
+ const clientId = "client-dash-busy";
195
+
196
+ await getClientsConfigCollection().insertOne({
197
+ clientId,
198
+ timezone: "UTC",
199
+ products: {},
200
+ } as any);
201
+
202
+ await getCallsCollection().insertMany([
203
+ {
204
+ clientId,
205
+ status: "busy",
206
+ callLength: 60,
207
+ createdAt: new Date("2026-05-10T10:00:00Z"),
208
+ },
209
+ {
210
+ clientId,
211
+ status: "completed",
212
+ callLength: 90,
213
+ createdAt: new Date("2026-05-10T11:00:00Z"),
214
+ },
215
+ ] as any);
216
+
217
+ const result = await getDashboardStats({
218
+ clientId,
219
+ startDate: "2026-05-01T00:00:00.000Z",
220
+ endDate: "2026-05-31T23:59:59.999Z",
221
+ });
222
+
223
+ expect(result.kpis.inCallCount).toBe(0);
224
+ expect(result.kpis.completedCount).toBe(1);
225
+ expect(result.kpis.totalCalls).toBe(1);
226
+ expect(result.kpis.avgDurationSeconds).toBe(90);
227
+ expect(result.kpis.timeSavedMinutes).toBe(2);
228
+ });
149
229
  });
@@ -9,6 +9,7 @@ import {
9
9
  getCallsByClientAndDateRange,
10
10
  getCallsCollection,
11
11
  pushToolExecution,
12
+ updateCallStatusByCallSid,
12
13
  } from "../calls.getters";
13
14
  import type { ToolExecution } from "../calls.types";
14
15
  import { ObjectId } from "mongodb";
@@ -60,6 +61,18 @@ describe("db.calls", () => {
60
61
  expect(result.some((c) => c.callSid === call.callSid)).toBe(true);
61
62
  });
62
63
 
64
+ it("should set current status only via updateCallStatusByCallSid", async () => {
65
+ const call = createOutGoingCallDoc({ status: "ringing" });
66
+ await createCallDoc(call);
67
+
68
+ const updated = await updateCallStatusByCallSid(call.callSid, "in-progress");
69
+
70
+ expect(updated?.status).toBe("in-progress");
71
+ expect(await getCallByCallSid(call.callSid)).toMatchObject({
72
+ status: "in-progress",
73
+ });
74
+ });
75
+
63
76
  describe("findCallsByQuery()", () => {
64
77
  it("should find calls by status with limit and sort", async () => {
65
78
  const clientId = "client123";
@@ -317,9 +317,9 @@ describe("calls statistics getters", () => {
317
317
 
318
318
  it("should respect wrap-around hour window boundaries on both the first and last day", async () => {
319
319
  await incoming("CA-jun8-morning", "2026-06-08T07:00:00.000Z"); // Jun 8 10:00 local — excluded (first-day guard)
320
- await incoming("CA-jun8-night", "2026-06-08T20:30:00.000Z"); // Jun 8 23:30 local — included
320
+ await incoming("CA-jun8-night", "2026-06-08T20:30:00.000Z"); // Jun 8 23:30 local — included
321
321
  await incoming("CA-jun9-morning", "2026-06-09T05:00:00.000Z"); // Jun 9 08:00 local — included
322
- await incoming("CA-jun9-noon", "2026-06-09T10:30:00.000Z"); // Jun 9 13:30 local — excluded (>= hourTo)
322
+ await incoming("CA-jun9-noon", "2026-06-09T10:30:00.000Z"); // Jun 9 13:30 local — excluded (>= hourTo)
323
323
  await incoming("CA-jun9-evening", "2026-06-09T20:30:00.000Z"); // Jun 9 23:30 local — excluded (last-day guard)
324
324
 
325
325
  const twoDay = { startStr: "2026-06-08", endStr: "2026-06-09" } as const;
@@ -333,11 +333,9 @@ describe("calls statistics getters", () => {
333
333
 
334
334
  // Hourly: hours [23, 0, ..., 12] — only the 2 included calls appear.
335
335
  const hourly = await aggregateCallsHourlyByRange(f);
336
- expect(hourly.map((b) => b.hour)).toEqual([
337
- 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
338
- ]);
336
+ expect(hourly.map((b) => b.hour)).toEqual([23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
339
337
  expect(hourly.find((b) => b.hour === 23)?.totalCalls).toBe(1); // Jun 8 23:30
340
- expect(hourly.find((b) => b.hour === 8)?.totalCalls).toBe(1); // Jun 9 08:00
338
+ expect(hourly.find((b) => b.hour === 8)?.totalCalls).toBe(1); // Jun 9 08:00
341
339
  expect(hourly.reduce((sum, b) => sum + b.totalCalls, 0)).toBe(2);
342
340
  });
343
341
 
@@ -4,6 +4,9 @@ export const CONFERENCE_ROLE_CUSTOMER = "customer" as const;
4
4
  /** Supervisor role within a conference call. */
5
5
  export const CONFERENCE_ROLE_SUPERVISOR = "supervisor" as const;
6
6
 
7
+ /** Live call — «בשיחה». Excludes Twilio `busy` (line busy / «תפוס»). */
8
+ export const IN_CALL_STATUSES = ["in-progress", "answered"] as const;
9
+
7
10
  /** Hours in a single day. */
8
11
  export const HOURS_PER_DAY = 24;
9
12
 
@@ -5,7 +5,7 @@ import {
5
5
  CallUpdateParams,
6
6
  getDb,
7
7
  } from "../index";
8
- import type { CountOpts, DateRange, ToolExecution } from "./calls.types";
8
+ import type { CountOpts, DateRange, ToolExecution, CallStatus } from "./calls.types";
9
9
  import { Filter, ObjectId } from "mongodb";
10
10
  import * as process from "node:process";
11
11
  import { applyQueryOptions } from "../utils/query.utils";
@@ -60,6 +60,16 @@ export const updateCallByCallSid = async (
60
60
  );
61
61
  };
62
62
 
63
+ export const updateCallStatusByCallSid = async (
64
+ callSid: string,
65
+ status: CallStatus,
66
+ ): Promise<CallDoc | null> =>
67
+ getCallsCollection().findOneAndUpdate(
68
+ { callSid },
69
+ { $set: { status, updatedAt: new Date() } },
70
+ { returnDocument: "after" },
71
+ );
72
+
63
73
  export const pushToolExecution = async (
64
74
  callSid: string,
65
75
  execution: ToolExecution,
@@ -12,6 +12,17 @@ export type ConferenceRole =
12
12
  | typeof CONFERENCE_ROLE_SUPERVISOR
13
13
  | null;
14
14
 
15
+ export type CallStatus =
16
+ | "initiated"
17
+ | "ringing"
18
+ | "in-progress"
19
+ | "answered"
20
+ | "completed"
21
+ | "busy"
22
+ | "no-answer"
23
+ | "failed"
24
+ | "canceled";
25
+
15
26
  export type Call = {
16
27
  callSid: string;
17
28
  flowId: ObjectId;
@@ -25,7 +36,7 @@ export type Call = {
25
36
  isOutgoingCall: boolean;
26
37
  callLength: number;
27
38
  transcription?: TranscriptionSegment[];
28
- status?: string;
39
+ status?: CallStatus;
29
40
  leads?: LeadProperty[];
30
41
  summary?: string;
31
42
  recordingUrl?: string;
@@ -1,5 +1,6 @@
1
1
  import dayjs from "dayjs";
2
2
  import { getCallsCollection } from "../calls.getters";
3
+ import { IN_CALL_STATUSES } from "../calls.constants";
3
4
  import { getClientConfig } from "../../clientsConfig";
4
5
  import utc from "dayjs/plugin/utc";
5
6
  import timezonePlugin from "dayjs/plugin/timezone";
@@ -22,7 +23,7 @@ export type {
22
23
 
23
24
  const DEFAULT_KPI_DATA = {
24
25
  completedCount: 0,
25
- busyCount: 0,
26
+ inCallCount: 0,
26
27
  answeredDuration: 0,
27
28
  };
28
29
 
@@ -183,16 +184,14 @@ function buildKpisPipeline() {
183
184
  completedCount: {
184
185
  $sum: { $cond: [{ $eq: ["$status", "completed"] }, 1, 0] },
185
186
  },
186
- busyCount: {
187
- $sum: { $cond: [{ $eq: ["$status", "busy"] }, 1, 0] },
187
+ inCallCount: {
188
+ $sum: {
189
+ $cond: [{ $in: ["$status", [...IN_CALL_STATUSES]] }, 1, 0],
190
+ },
188
191
  },
189
192
  answeredDuration: {
190
193
  $sum: {
191
- $cond: [
192
- { $in: ["$status", ["completed", "busy"]] },
193
- "$callLength",
194
- 0,
195
- ],
194
+ $cond: [{ $eq: ["$status", "completed"] }, "$callLength", 0],
196
195
  },
197
196
  },
198
197
  },
@@ -258,16 +257,20 @@ export async function getDashboardStats(
258
257
  const kpiData = aggregatedResult?.kpis?.[0] ?? DEFAULT_KPI_DATA;
259
258
  const volumeDataRaw = aggregatedResult?.volumeData ?? [];
260
259
 
261
- const answeredCount = kpiData.completedCount + kpiData.busyCount;
260
+ const completedCount = kpiData.completedCount;
261
+ const inCallCount = kpiData.inCallCount;
262
+ const totalCalls = completedCount + inCallCount;
262
263
  const answeredDuration = kpiData.answeredDuration ?? 0;
263
264
 
264
265
  const kpis: DashboardSummaryMetrics = {
265
- totalCalls: answeredCount,
266
+ totalCalls,
266
267
  avgDurationSeconds:
267
- answeredCount > 0 ? Math.round(answeredDuration / answeredCount) : 0,
268
+ completedCount > 0
269
+ ? Math.round(answeredDuration / completedCount)
270
+ : 0,
268
271
  timeSavedMinutes: Math.round(answeredDuration / 60),
269
- completedCount: kpiData.completedCount,
270
- busyCount: kpiData.busyCount,
272
+ completedCount,
273
+ inCallCount,
271
274
  };
272
275
 
273
276
  const bucketKeys = generateBucketKeys(
@@ -21,7 +21,7 @@ export type DashboardSummaryMetrics = {
21
21
  avgDurationSeconds: number;
22
22
  timeSavedMinutes: number;
23
23
  completedCount: number;
24
- busyCount: number;
24
+ inCallCount: number;
25
25
  };
26
26
 
27
27
  export type DashboardVisualData = {
@@ -42,7 +42,7 @@ export type DashboardReportResponse = {
42
42
  };
43
43
  type RawKpiResult = {
44
44
  completedCount: number;
45
- busyCount: number;
45
+ inCallCount: number;
46
46
  answeredDuration: number | null;
47
47
  };
48
48