@parkflow/shared-types 1.9.0 → 1.11.0

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 (65) hide show
  1. package/dist/tsconfig.build.tsbuildinfo +1 -1
  2. package/dist/types/index.d.ts +1 -0
  3. package/dist/types/index.js +1 -0
  4. package/dist/types/index.js.map +1 -1
  5. package/dist/types/lot-dashboard/index.d.ts +9 -0
  6. package/dist/types/lot-dashboard/index.js +26 -0
  7. package/dist/types/lot-dashboard/index.js.map +1 -0
  8. package/dist/types/lot-dashboard/lot-camera-alert.interface.d.ts +5 -0
  9. package/dist/types/lot-dashboard/lot-camera-alert.interface.js +3 -0
  10. package/dist/types/lot-dashboard/lot-camera-alert.interface.js.map +1 -0
  11. package/dist/types/lot-dashboard/lot-dashboard-occupancy.interface.d.ts +5 -0
  12. package/dist/types/lot-dashboard/lot-dashboard-occupancy.interface.js +3 -0
  13. package/dist/types/lot-dashboard/lot-dashboard-occupancy.interface.js.map +1 -0
  14. package/dist/types/lot-dashboard/lot-dashboard-range-key.type.d.ts +1 -0
  15. package/dist/types/lot-dashboard/lot-dashboard-range-key.type.js +3 -0
  16. package/dist/types/lot-dashboard/lot-dashboard-range-key.type.js.map +1 -0
  17. package/dist/types/lot-dashboard/lot-dashboard-range.interface.d.ts +7 -0
  18. package/dist/types/lot-dashboard/lot-dashboard-range.interface.js +3 -0
  19. package/dist/types/lot-dashboard/lot-dashboard-range.interface.js.map +1 -0
  20. package/dist/types/lot-dashboard/lot-dashboard-response.interface.d.ts +19 -0
  21. package/dist/types/lot-dashboard/lot-dashboard-response.interface.js +3 -0
  22. package/dist/types/lot-dashboard/lot-dashboard-response.interface.js.map +1 -0
  23. package/dist/types/lot-dashboard/lot-dashboard-summary.interface.d.ts +10 -0
  24. package/dist/types/lot-dashboard/lot-dashboard-summary.interface.js +3 -0
  25. package/dist/types/lot-dashboard/lot-dashboard-summary.interface.js.map +1 -0
  26. package/dist/types/lot-dashboard/lot-dashboard-trend-point.interface.d.ts +5 -0
  27. package/dist/types/lot-dashboard/lot-dashboard-trend-point.interface.js +3 -0
  28. package/dist/types/lot-dashboard/lot-dashboard-trend-point.interface.js.map +1 -0
  29. package/dist/types/lot-dashboard/lot-parked-vehicle-status.enum.d.ts +7 -0
  30. package/dist/types/lot-dashboard/lot-parked-vehicle-status.enum.js +12 -0
  31. package/dist/types/lot-dashboard/lot-parked-vehicle-status.enum.js.map +1 -0
  32. package/dist/types/lot-dashboard/lot-parked-vehicle.interface.d.ts +8 -0
  33. package/dist/types/lot-dashboard/lot-parked-vehicle.interface.js +3 -0
  34. package/dist/types/lot-dashboard/lot-parked-vehicle.interface.js.map +1 -0
  35. package/dist/types/lot-health/index.d.ts +3 -0
  36. package/dist/types/lot-health/index.js +3 -0
  37. package/dist/types/lot-health/index.js.map +1 -1
  38. package/dist/types/lot-health/lot-blackout-impact-sample.interface.d.ts +8 -0
  39. package/dist/types/lot-health/lot-blackout-impact-sample.interface.js +3 -0
  40. package/dist/types/lot-health/lot-blackout-impact-sample.interface.js.map +1 -0
  41. package/dist/types/lot-health/lot-blackout-impact.interface.d.ts +6 -0
  42. package/dist/types/lot-health/lot-blackout-impact.interface.js +3 -0
  43. package/dist/types/lot-health/lot-blackout-impact.interface.js.map +1 -0
  44. package/dist/types/lot-health/lot-blackout-window.interface.d.ts +10 -0
  45. package/dist/types/lot-health/lot-blackout-window.interface.js +3 -0
  46. package/dist/types/lot-health/lot-blackout-window.interface.js.map +1 -0
  47. package/dist/types/lot-health/lot-health-response.interface.d.ts +2 -0
  48. package/package.json +1 -1
  49. package/src/types/index.ts +1 -0
  50. package/src/types/lot-dashboard/index.ts +9 -0
  51. package/src/types/lot-dashboard/lot-camera-alert.interface.ts +12 -0
  52. package/src/types/lot-dashboard/lot-dashboard-occupancy.interface.ts +9 -0
  53. package/src/types/lot-dashboard/lot-dashboard-range-key.type.ts +6 -0
  54. package/src/types/lot-dashboard/lot-dashboard-range.interface.ts +12 -0
  55. package/src/types/lot-dashboard/lot-dashboard-response.interface.ts +24 -0
  56. package/src/types/lot-dashboard/lot-dashboard-summary.interface.ts +21 -0
  57. package/src/types/lot-dashboard/lot-dashboard-trend-point.interface.ts +9 -0
  58. package/src/types/lot-dashboard/lot-parked-vehicle-status.enum.ts +13 -0
  59. package/src/types/lot-dashboard/lot-parked-vehicle.interface.ts +12 -0
  60. package/src/types/lot-health/index.ts +3 -0
  61. package/src/types/lot-health/lot-blackout-impact-sample.interface.ts +14 -0
  62. package/src/types/lot-health/lot-blackout-impact.interface.ts +15 -0
  63. package/src/types/lot-health/lot-blackout-window.interface.ts +20 -0
  64. package/src/types/lot-health/lot-health-response.interface.ts +3 -0
  65. package/.npmrc.publish +0 -1
@@ -0,0 +1,9 @@
1
+ export * from './lot-camera-alert.interface';
2
+ export * from './lot-dashboard-occupancy.interface';
3
+ export * from './lot-dashboard-range-key.type';
4
+ export * from './lot-dashboard-range.interface';
5
+ export * from './lot-dashboard-response.interface';
6
+ export * from './lot-dashboard-summary.interface';
7
+ export * from './lot-dashboard-trend-point.interface';
8
+ export * from './lot-parked-vehicle-status.enum';
9
+ export * from './lot-parked-vehicle.interface';
@@ -0,0 +1,26 @@
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
+ __exportStar(require("./lot-camera-alert.interface"), exports);
18
+ __exportStar(require("./lot-dashboard-occupancy.interface"), exports);
19
+ __exportStar(require("./lot-dashboard-range-key.type"), exports);
20
+ __exportStar(require("./lot-dashboard-range.interface"), exports);
21
+ __exportStar(require("./lot-dashboard-response.interface"), exports);
22
+ __exportStar(require("./lot-dashboard-summary.interface"), exports);
23
+ __exportStar(require("./lot-dashboard-trend-point.interface"), exports);
24
+ __exportStar(require("./lot-parked-vehicle-status.enum"), exports);
25
+ __exportStar(require("./lot-parked-vehicle.interface"), exports);
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,sEAAoD;AACpD,iEAA+C;AAC/C,kEAAgD;AAChD,qEAAmD;AACnD,oEAAkD;AAClD,wEAAsD;AACtD,mEAAiD;AACjD,iEAA+C"}
@@ -0,0 +1,5 @@
1
+ export interface LotCameraAlert {
2
+ cameraName: string;
3
+ lastSeenUtc: string | null;
4
+ silentThresholdHours: number;
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-camera-alert.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-camera-alert.interface.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/lot-camera-alert.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export interface LotDashboardOccupancy {
2
+ currentlyParked: number;
3
+ maxCapacity: number | null;
4
+ occupancyPct: number | null;
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-dashboard-occupancy.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-dashboard-occupancy.interface.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/lot-dashboard-occupancy.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export type LotDashboardRangeKey = 'today' | 'wtd' | 'mtd' | 'ytd' | 'custom';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-dashboard-range-key.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-dashboard-range-key.type.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/lot-dashboard-range-key.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { LotDashboardRangeKey } from './lot-dashboard-range-key.type';
2
+ export interface LotDashboardRange {
3
+ key: LotDashboardRangeKey;
4
+ startUtc: string;
5
+ endUtc: string;
6
+ label: string;
7
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-dashboard-range.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-dashboard-range.interface.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/lot-dashboard-range.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import { LotCameraAlert } from './lot-camera-alert.interface';
2
+ import { LotDashboardOccupancy } from './lot-dashboard-occupancy.interface';
3
+ import { LotDashboardRange } from './lot-dashboard-range.interface';
4
+ import { LotDashboardSummary } from './lot-dashboard-summary.interface';
5
+ import { LotDashboardTrendPoint } from './lot-dashboard-trend-point.interface';
6
+ import { LotParkedVehicle } from './lot-parked-vehicle.interface';
7
+ export interface LotDashboardResponse {
8
+ lotId: number;
9
+ lotCode: string;
10
+ lotName: string | null;
11
+ timeZone: string;
12
+ generatedAtUtc: string;
13
+ range: LotDashboardRange;
14
+ summary: LotDashboardSummary;
15
+ occupancy: LotDashboardOccupancy;
16
+ trend: LotDashboardTrendPoint[];
17
+ parkedVehicles: LotParkedVehicle[];
18
+ cameraAlerts: LotCameraAlert[];
19
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-dashboard-response.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-dashboard-response.interface.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/lot-dashboard-response.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ export interface LotDashboardSummary {
2
+ entriesTotal: number;
3
+ entriesIn: number;
4
+ entriesOut: number;
5
+ bookings: number;
6
+ authorizedCount: number;
7
+ unauthorizedCount: number;
8
+ ticketsIssued: number;
9
+ complianceRatePct: number | null;
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-dashboard-summary.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-dashboard-summary.interface.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/lot-dashboard-summary.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export interface LotDashboardTrendPoint {
2
+ bucketStartUtc: string;
3
+ label: string;
4
+ entries: number;
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-dashboard-trend-point.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-dashboard-trend-point.interface.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/lot-dashboard-trend-point.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export declare enum LotParkedVehicleStatus {
2
+ PaidInside = "Paid - Inside",
3
+ PermittedInside = "Permitted - Inside",
4
+ PaidExpiredInside = "Paid Expired - Inside",
5
+ GraceInside = "Grace Period - Inside",
6
+ UnpaidInside = "Unpaid - Inside"
7
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LotParkedVehicleStatus = void 0;
4
+ var LotParkedVehicleStatus;
5
+ (function (LotParkedVehicleStatus) {
6
+ LotParkedVehicleStatus["PaidInside"] = "Paid - Inside";
7
+ LotParkedVehicleStatus["PermittedInside"] = "Permitted - Inside";
8
+ LotParkedVehicleStatus["PaidExpiredInside"] = "Paid Expired - Inside";
9
+ LotParkedVehicleStatus["GraceInside"] = "Grace Period - Inside";
10
+ LotParkedVehicleStatus["UnpaidInside"] = "Unpaid - Inside";
11
+ })(LotParkedVehicleStatus || (exports.LotParkedVehicleStatus = LotParkedVehicleStatus = {}));
12
+ //# sourceMappingURL=lot-parked-vehicle-status.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-parked-vehicle-status.enum.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/lot-parked-vehicle-status.enum.ts"],"names":[],"mappings":";;;AAMA,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAC9B,sDAA4B,CAAA;IAC5B,gEAAsC,CAAA;IACtC,qEAA2C,CAAA;IAC3C,+DAAqC,CAAA;IACrC,0DAAgC,CAAA;AACpC,CAAC,EANW,sBAAsB,sCAAtB,sBAAsB,QAMjC"}
@@ -0,0 +1,8 @@
1
+ import { LotParkedVehicleStatus } from './lot-parked-vehicle-status.enum';
2
+ export interface LotParkedVehicle {
3
+ lpn: string;
4
+ state: string | null;
5
+ status: LotParkedVehicleStatus;
6
+ entryTimeUtc: string;
7
+ durationMinutes: number;
8
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-parked-vehicle.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-parked-vehicle.interface.js","sourceRoot":"","sources":["../../../src/types/lot-dashboard/lot-parked-vehicle.interface.ts"],"names":[],"mappings":""}
@@ -1,5 +1,8 @@
1
1
  export * from './lot-backlog-severity.enum';
2
2
  export * from './lot-backlog-status.interface';
3
+ export * from './lot-blackout-impact-sample.interface';
4
+ export * from './lot-blackout-impact.interface';
5
+ export * from './lot-blackout-window.interface';
3
6
  export * from './lot-daily-metrics.interface';
4
7
  export * from './lot-day-funnel.interface';
5
8
  export * from './lot-enforcement-config.interface';
@@ -16,6 +16,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./lot-backlog-severity.enum"), exports);
18
18
  __exportStar(require("./lot-backlog-status.interface"), exports);
19
+ __exportStar(require("./lot-blackout-impact-sample.interface"), exports);
20
+ __exportStar(require("./lot-blackout-impact.interface"), exports);
21
+ __exportStar(require("./lot-blackout-window.interface"), exports);
19
22
  __exportStar(require("./lot-daily-metrics.interface"), exports);
20
23
  __exportStar(require("./lot-day-funnel.interface"), exports);
21
24
  __exportStar(require("./lot-enforcement-config.interface"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/lot-health/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,iEAA+C;AAC/C,gEAA8C;AAC9C,6DAA2C;AAC3C,qEAAmD;AACnD,uEAAqD;AACrD,wEAAsD;AACtD,kEAAgD;AAChD,oEAAkD;AAClD,8EAA4D;AAC5D,uEAAqD;AACrD,6EAA2D;AAC3D,mEAAiD;AACjD,uEAAqD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/lot-health/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,iEAA+C;AAC/C,yEAAuD;AACvD,kEAAgD;AAChD,kEAAgD;AAChD,gEAA8C;AAC9C,6DAA2C;AAC3C,qEAAmD;AACnD,uEAAqD;AACrD,wEAAsD;AACtD,kEAAgD;AAChD,oEAAkD;AAClD,8EAA4D;AAC5D,uEAAqD;AACrD,6EAA2D;AAC3D,mEAAiD;AACjD,uEAAqD"}
@@ -0,0 +1,8 @@
1
+ export interface LotBlackoutImpactSample {
2
+ ticketId: string;
3
+ ticketNumber: string;
4
+ sessionId: string;
5
+ lpn: string;
6
+ sessionExitAtUtc: string;
7
+ ticketStatus: string;
8
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-blackout-impact-sample.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-blackout-impact-sample.interface.js","sourceRoot":"","sources":["../../../src/types/lot-health/lot-blackout-impact-sample.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { LotBlackoutWindow } from './lot-blackout-window.interface';
2
+ export interface LotBlackoutImpact {
3
+ lookbackSeconds: number;
4
+ gapThresholdSeconds: number;
5
+ windows: LotBlackoutWindow[];
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-blackout-impact.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-blackout-impact.interface.js","sourceRoot":"","sources":["../../../src/types/lot-health/lot-blackout-impact.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { LotBlackoutImpactSample } from './lot-blackout-impact-sample.interface';
2
+ export interface LotBlackoutWindow {
3
+ paymentIntegrationId: number;
4
+ providerName: string;
5
+ startUtc: string;
6
+ endUtc: string;
7
+ durationSeconds: number;
8
+ impactedTicketCount: number;
9
+ sample: LotBlackoutImpactSample | null;
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lot-blackout-window.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lot-blackout-window.interface.js","sourceRoot":"","sources":["../../../src/types/lot-health/lot-blackout-window.interface.ts"],"names":[],"mappings":""}
@@ -1,5 +1,6 @@
1
1
  import { LotEnforcementConfig } from './lot-enforcement-config.interface';
2
2
  import { LotBacklogStatus } from './lot-backlog-status.interface';
3
+ import { LotBlackoutImpact } from './lot-blackout-impact.interface';
3
4
  import { LotDayFunnel } from './lot-day-funnel.interface';
4
5
  import { LotDailyMetrics } from './lot-daily-metrics.interface';
5
6
  import { LotEnforcementRunInfo } from './lot-enforcement-run-info.interface';
@@ -17,4 +18,5 @@ export interface LotHealthResponse {
17
18
  lastEnforcementRun: LotEnforcementRunInfo | null;
18
19
  webhooks: LotWebhookActivity[];
19
20
  validations: LotValidationActivitySection;
21
+ blackoutImpact: LotBlackoutImpact;
20
22
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parkflow/shared-types",
3
- "version": "1.9.0",
3
+ "version": "1.11.0",
4
4
  "description": "Shared type definitions for Vanguard services",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,4 +1,5 @@
1
1
  export * from './adaptive';
2
+ export * from './lot-dashboard';
2
3
  export * from './lot-health';
3
4
  export * from './lpr';
4
5
  export * from './platesmart';
@@ -0,0 +1,9 @@
1
+ export * from './lot-camera-alert.interface';
2
+ export * from './lot-dashboard-occupancy.interface';
3
+ export * from './lot-dashboard-range-key.type';
4
+ export * from './lot-dashboard-range.interface';
5
+ export * from './lot-dashboard-response.interface';
6
+ export * from './lot-dashboard-summary.interface';
7
+ export * from './lot-dashboard-trend-point.interface';
8
+ export * from './lot-parked-vehicle-status.enum';
9
+ export * from './lot-parked-vehicle.interface';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * A camera at the lot that is marked active but has sent no inbound captures within
3
+ * the alert window — i.e. it looks offline. Surfaced on the dashboard so a dead
4
+ * entry/exit lane (which silently produces ghost "parked" cars) is visible.
5
+ */
6
+ export interface LotCameraAlert {
7
+ cameraName: string;
8
+ /** Last inbound capture, UTC ISO-8601, or null if none within the recent lookback. */
9
+ lastSeenUtc: string | null;
10
+ /** The silence threshold, in hours, that triggered the alert. */
11
+ silentThresholdHours: number;
12
+ }
@@ -0,0 +1,9 @@
1
+ /** Live occupancy snapshot, independent of the selected window. */
2
+ export interface LotDashboardOccupancy {
3
+ /** Vehicles currently inside the lot (entry recorded, no exit yet). */
4
+ currentlyParked: number;
5
+ /** Configured capacity, or null when the lot has none set. */
6
+ maxCapacity: number | null;
7
+ /** Occupied share of capacity, 0–100. Null when capacity is unknown. */
8
+ occupancyPct: number | null;
9
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Selectable reporting windows for the lot dashboard.
3
+ * - `today` / `wtd` / `mtd` / `ytd` are computed in the lot's local time zone.
4
+ * - `custom` is driven by an explicit start/end supplied by the caller.
5
+ */
6
+ export type LotDashboardRangeKey = 'today' | 'wtd' | 'mtd' | 'ytd' | 'custom';
@@ -0,0 +1,12 @@
1
+ import { LotDashboardRangeKey } from './lot-dashboard-range-key.type';
2
+
3
+ /** The resolved window the dashboard metrics were computed over. */
4
+ export interface LotDashboardRange {
5
+ key: LotDashboardRangeKey;
6
+ /** Inclusive lower bound, UTC ISO-8601. */
7
+ startUtc: string;
8
+ /** Exclusive upper bound, UTC ISO-8601. */
9
+ endUtc: string;
10
+ /** Human-readable label for the window, formatted in the lot's time zone. */
11
+ label: string;
12
+ }
@@ -0,0 +1,24 @@
1
+ import { LotCameraAlert } from './lot-camera-alert.interface';
2
+ import { LotDashboardOccupancy } from './lot-dashboard-occupancy.interface';
3
+ import { LotDashboardRange } from './lot-dashboard-range.interface';
4
+ import { LotDashboardSummary } from './lot-dashboard-summary.interface';
5
+ import { LotDashboardTrendPoint } from './lot-dashboard-trend-point.interface';
6
+ import { LotParkedVehicle } from './lot-parked-vehicle.interface';
7
+
8
+ /** Everything the lot admin dashboard tab needs, computed live from base tables. */
9
+ export interface LotDashboardResponse {
10
+ lotId: number;
11
+ lotCode: string;
12
+ lotName: string | null;
13
+ timeZone: string;
14
+ generatedAtUtc: string;
15
+ range: LotDashboardRange;
16
+ summary: LotDashboardSummary;
17
+ occupancy: LotDashboardOccupancy;
18
+ /** Ordered oldest-to-newest so charts can render left-to-right. */
19
+ trend: LotDashboardTrendPoint[];
20
+ /** Vehicles currently inside, newest entry first. */
21
+ parkedVehicles: LotParkedVehicle[];
22
+ /** Active cameras that have gone silent (no inbound data) — empty when all are healthy. */
23
+ cameraAlerts: LotCameraAlert[];
24
+ }
@@ -0,0 +1,21 @@
1
+ /** Headline counters for the selected window. */
2
+ export interface LotDashboardSummary {
3
+ /** Entry plus exit capture events recorded in the window. */
4
+ entriesTotal: number;
5
+ /** Entry capture events recorded in the window. */
6
+ entriesIn: number;
7
+ /** Exit capture events recorded in the window. */
8
+ entriesOut: number;
9
+ /** Parking sessions started in the window (a.k.a. turns). */
10
+ bookings: number;
11
+ /** Completed sessions in the window that were paid, permitted, whitelisted, or within grace. */
12
+ authorizedCount: number;
13
+ /** Completed sessions in the window that produced a violation. */
14
+ unauthorizedCount: number;
15
+ ticketsIssued: number;
16
+ /**
17
+ * Share of completed sessions that were compliant, 0–100.
18
+ * Null when there is not yet enough processed data to compute it.
19
+ */
20
+ complianceRatePct: number | null;
21
+ }
@@ -0,0 +1,9 @@
1
+ /** One bucket of the entries trend series spanning the selected window. */
2
+ export interface LotDashboardTrendPoint {
3
+ /** Bucket lower bound, UTC ISO-8601. */
4
+ bucketStartUtc: string;
5
+ /** Short label for the bucket, formatted in the lot's time zone (e.g. "2pm" or "Jun 9"). */
6
+ label: string;
7
+ /** Entry capture events that fell in the bucket. */
8
+ entries: number;
9
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Live payment/permit standing of a vehicle that is currently inside the lot
3
+ * (entry capture recorded, no later exit capture). Computed against the live
4
+ * validation/permit tables rather than the enforcement verdict, because a
5
+ * still-parked vehicle has usually not been run through enforcement yet.
6
+ */
7
+ export enum LotParkedVehicleStatus {
8
+ PaidInside = 'Paid - Inside',
9
+ PermittedInside = 'Permitted - Inside',
10
+ PaidExpiredInside = 'Paid Expired - Inside',
11
+ GraceInside = 'Grace Period - Inside',
12
+ UnpaidInside = 'Unpaid - Inside',
13
+ }
@@ -0,0 +1,12 @@
1
+ import { LotParkedVehicleStatus } from './lot-parked-vehicle-status.enum';
2
+
3
+ /** A single vehicle currently inside the lot, with its live standing. */
4
+ export interface LotParkedVehicle {
5
+ lpn: string;
6
+ state: string | null;
7
+ status: LotParkedVehicleStatus;
8
+ /** When the vehicle entered, UTC ISO-8601. */
9
+ entryTimeUtc: string;
10
+ /** Minutes elapsed since entry as of the snapshot. */
11
+ durationMinutes: number;
12
+ }
@@ -1,5 +1,8 @@
1
1
  export * from './lot-backlog-severity.enum';
2
2
  export * from './lot-backlog-status.interface';
3
+ export * from './lot-blackout-impact-sample.interface';
4
+ export * from './lot-blackout-impact.interface';
5
+ export * from './lot-blackout-window.interface';
3
6
  export * from './lot-daily-metrics.interface';
4
7
  export * from './lot-day-funnel.interface';
5
8
  export * from './lot-enforcement-config.interface';
@@ -0,0 +1,14 @@
1
+ /**
2
+ * One representative ticket whose underlying session ended during a payment-integration blackout
3
+ * and is currently in a mailing-eligible status. The oldest such ticket per blackout window is picked.
4
+ */
5
+ export interface LotBlackoutImpactSample {
6
+ ticketId: string;
7
+ ticketNumber: string;
8
+ sessionId: string;
9
+ lpn: string;
10
+ /** ISO-8601 UTC timestamp of the session's exit capture. */
11
+ sessionExitAtUtc: string;
12
+ /** Current ticket status (e.g. "Pending", "Ready", "Dispatched"). */
13
+ ticketStatus: string;
14
+ }
@@ -0,0 +1,15 @@
1
+ import { LotBlackoutWindow } from './lot-blackout-window.interface';
2
+
3
+ /**
4
+ * Summary of payment-integration blackout windows on a lot and the tickets currently at risk
5
+ * because of them. A blackout window is a gap between consecutive validation rows for a given
6
+ * (lot, payment integration) longer than a configured threshold within a recent lookback.
7
+ */
8
+ export interface LotBlackoutImpact {
9
+ /** Lookback window applied when scanning for gaps, in seconds. */
10
+ lookbackSeconds: number;
11
+ /** Minimum gap (in seconds) treated as a blackout. */
12
+ gapThresholdSeconds: number;
13
+ /** Detected blackout windows, ordered by startUtc ascending. */
14
+ windows: LotBlackoutWindow[];
15
+ }
@@ -0,0 +1,20 @@
1
+ import { LotBlackoutImpactSample } from './lot-blackout-impact-sample.interface';
2
+
3
+ /**
4
+ * A detected gap in inbound payment-integration validations for a lot, paired with the count of
5
+ * tickets currently in a mailing-eligible status whose session ended inside the gap.
6
+ */
7
+ export interface LotBlackoutWindow {
8
+ paymentIntegrationId: number;
9
+ providerName: string;
10
+ /** ISO-8601 UTC timestamp marking the start of the blackout. */
11
+ startUtc: string;
12
+ /** ISO-8601 UTC timestamp marking the end of the blackout. */
13
+ endUtc: string;
14
+ /** Length of the blackout in seconds — convenience for the UI. */
15
+ durationSeconds: number;
16
+ /** Tickets in mailing-eligible status whose session exit falls inside this window. */
17
+ impactedTicketCount: number;
18
+ /** A representative impacted ticket (oldest by session exit). Null when impactedTicketCount === 0. */
19
+ sample: LotBlackoutImpactSample | null;
20
+ }
@@ -1,5 +1,6 @@
1
1
  import { LotEnforcementConfig } from './lot-enforcement-config.interface';
2
2
  import { LotBacklogStatus } from './lot-backlog-status.interface';
3
+ import { LotBlackoutImpact } from './lot-blackout-impact.interface';
3
4
  import { LotDayFunnel } from './lot-day-funnel.interface';
4
5
  import { LotDailyMetrics } from './lot-daily-metrics.interface';
5
6
  import { LotEnforcementRunInfo } from './lot-enforcement-run-info.interface';
@@ -21,4 +22,6 @@ export interface LotHealthResponse {
21
22
  webhooks: LotWebhookActivity[];
22
23
  /** Inbound payment validations and the configured-provider health summary for the last 24h. */
23
24
  validations: LotValidationActivitySection;
25
+ /** Detected payment-integration blackout windows and tickets currently at risk because of them. */
26
+ blackoutImpact: LotBlackoutImpact;
24
27
  }
package/.npmrc.publish DELETED
@@ -1 +0,0 @@
1
- //registry.npmjs.org/:_authToken=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