clarion-shared-types 1.0.117 → 1.0.119

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 (51) hide show
  1. package/dist/cjs/index.js +1 -0
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/modules/incident-sla/enums/incident-sla-enums.js +17 -1
  4. package/dist/cjs/modules/incident-sla/enums/incident-sla-enums.js.map +1 -1
  5. package/dist/cjs/modules/incident-sla/interfaces/incident-sla.dto.js +29 -0
  6. package/dist/cjs/modules/incident-sla/interfaces/incident-sla.dto.js.map +1 -1
  7. package/dist/cjs/modules/incident-sla/utils/incident-sla-display.util.js +88 -1
  8. package/dist/cjs/modules/incident-sla/utils/incident-sla-display.util.js.map +1 -1
  9. package/dist/cjs/modules/permission/enums/permission-actions.enum.js +8 -0
  10. package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
  11. package/dist/cjs/modules/permission/enums/permissions-moudule.enum.js +1 -0
  12. package/dist/cjs/modules/permission/enums/permissions-moudule.enum.js.map +1 -1
  13. package/dist/cjs/modules/responder/enums/responder-enums.js +83 -0
  14. package/dist/cjs/modules/responder/enums/responder-enums.js.map +1 -0
  15. package/dist/cjs/modules/responder/index.js +23 -0
  16. package/dist/cjs/modules/responder/index.js.map +1 -0
  17. package/dist/cjs/modules/responder/interfaces/responder.dto.js +3 -0
  18. package/dist/cjs/modules/responder/interfaces/responder.dto.js.map +1 -0
  19. package/dist/cjs/modules/responder/utils/responder-display.util.js +102 -0
  20. package/dist/cjs/modules/responder/utils/responder-display.util.js.map +1 -0
  21. package/dist/esm/index.js +1 -0
  22. package/dist/esm/index.js.map +1 -1
  23. package/dist/esm/modules/incident-sla/enums/incident-sla-enums.js +16 -0
  24. package/dist/esm/modules/incident-sla/enums/incident-sla-enums.js.map +1 -1
  25. package/dist/esm/modules/incident-sla/interfaces/incident-sla.dto.js +28 -1
  26. package/dist/esm/modules/incident-sla/interfaces/incident-sla.dto.js.map +1 -1
  27. package/dist/esm/modules/incident-sla/utils/incident-sla-display.util.js +88 -1
  28. package/dist/esm/modules/incident-sla/utils/incident-sla-display.util.js.map +1 -1
  29. package/dist/esm/modules/permission/enums/permission-actions.enum.js +8 -0
  30. package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
  31. package/dist/esm/modules/permission/enums/permissions-moudule.enum.js +1 -0
  32. package/dist/esm/modules/permission/enums/permissions-moudule.enum.js.map +1 -1
  33. package/dist/esm/modules/responder/enums/responder-enums.js +80 -0
  34. package/dist/esm/modules/responder/enums/responder-enums.js.map +1 -0
  35. package/dist/esm/modules/responder/index.js +7 -0
  36. package/dist/esm/modules/responder/index.js.map +1 -0
  37. package/dist/esm/modules/responder/interfaces/responder.dto.js +2 -0
  38. package/dist/esm/modules/responder/interfaces/responder.dto.js.map +1 -0
  39. package/dist/esm/modules/responder/utils/responder-display.util.js +92 -0
  40. package/dist/esm/modules/responder/utils/responder-display.util.js.map +1 -0
  41. package/dist/types/index.d.ts +1 -0
  42. package/dist/types/modules/incident-sla/enums/incident-sla-enums.d.ts +14 -0
  43. package/dist/types/modules/incident-sla/interfaces/incident-sla.dto.d.ts +374 -4
  44. package/dist/types/modules/incident-sla/utils/incident-sla-display.util.d.ts +18 -1
  45. package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +3 -0
  46. package/dist/types/modules/permission/enums/permissions-moudule.enum.d.ts +2 -1
  47. package/dist/types/modules/responder/enums/responder-enums.d.ts +75 -0
  48. package/dist/types/modules/responder/index.d.ts +3 -0
  49. package/dist/types/modules/responder/interfaces/responder.dto.d.ts +87 -0
  50. package/dist/types/modules/responder/utils/responder-display.util.d.ts +26 -0
  51. package/package.json +1 -1
@@ -255,6 +255,22 @@ export interface IncidentSlaPolicyDto {
255
255
  createdAt: string;
256
256
  updatedAt: string;
257
257
  }
258
+ export type IncidentSlaAnalyticsBucket = 'hour' | 'day' | 'week' | 'month';
259
+ export interface IncidentSlaAnalyticsRangeDto {
260
+ from: string;
261
+ to: string;
262
+ bucket: IncidentSlaAnalyticsBucket;
263
+ timeZone: string;
264
+ }
265
+ export interface IncidentSlaAnalyticsCountDto {
266
+ key: string;
267
+ count: number;
268
+ }
269
+ export interface IncidentSlaDurationSummaryDto {
270
+ median: number | null;
271
+ p90: number | null;
272
+ count: number;
273
+ }
258
274
  export interface IncidentSlaDurationPercentilesDto {
259
275
  p50: number | null;
260
276
  p75: number | null;
@@ -262,6 +278,34 @@ export interface IncidentSlaDurationPercentilesDto {
262
278
  p95: number | null;
263
279
  p99: number | null;
264
280
  average: number | null;
281
+ count: number;
282
+ }
283
+ export interface IncidentSlaAnalyticsSummaryDto {
284
+ emergencies: number;
285
+ openNow: number;
286
+ breachedEmergencies: number;
287
+ breachedEmergencyPercent: number | null;
288
+ decided: number;
289
+ met: number;
290
+ breached: number;
291
+ breachedWithApprovedException: number;
292
+ compliancePercent: number | null;
293
+ complianceWithExceptionsPercent: number | null;
294
+ acknowledged: number;
295
+ dispatched: number;
296
+ arrived: number;
297
+ resolved: number;
298
+ closed: number;
299
+ autoClosed: number;
300
+ timeToAcknowledge: IncidentSlaDurationSummaryDto;
301
+ timeToDispatch: IncidentSlaDurationSummaryDto;
302
+ timeToArrival: IncidentSlaDurationSummaryDto;
303
+ travelTime: IncidentSlaDurationSummaryDto;
304
+ timeToResolve: IncidentSlaDurationSummaryDto;
305
+ escalations: number;
306
+ alternativesRecommended: number;
307
+ reassignments: number;
308
+ notificationsFailed: number;
265
309
  }
266
310
  export interface IncidentSlaStageAnalyticsDto {
267
311
  stage: IncidentSlaStage;
@@ -269,18 +313,344 @@ export interface IncidentSlaStageAnalyticsDto {
269
313
  met: number;
270
314
  breached: number;
271
315
  breachedWithApprovedException: number;
316
+ open: number;
317
+ waived: number;
318
+ expired: number;
319
+ cancelled: number;
320
+ warned: number;
321
+ atRisk: number;
272
322
  compliancePercent: number | null;
273
323
  complianceWithExceptionsPercent: number | null;
324
+ targetSeconds: number | null;
274
325
  duration: IncidentSlaDurationPercentilesDto;
326
+ overrun: IncidentSlaDurationSummaryDto;
327
+ }
328
+ export interface IncidentSlaStageCellDto {
329
+ stage: IncidentSlaStage;
330
+ met: number;
331
+ breached: number;
332
+ compliancePercent: number | null;
333
+ medianSeconds: number | null;
334
+ }
335
+ export interface IncidentSlaPriorityRowDto {
336
+ priority: IncidentPriority;
337
+ level: SlaPriorityLevel;
338
+ emergencies: number;
339
+ breachedEmergencies: number;
340
+ met: number;
341
+ breached: number;
342
+ compliancePercent: number | null;
343
+ medianSecondsToAcknowledge: number | null;
344
+ medianSecondsToArrival: number | null;
345
+ stages: IncidentSlaStageCellDto[];
346
+ }
347
+ export interface IncidentSlaTimelinePointDto {
348
+ bucket: string;
349
+ emergencies: number;
350
+ breachedEmergencies: number;
351
+ met: number;
352
+ breached: number;
353
+ compliancePercent: number | null;
354
+ medianSecondsToAcknowledge: number | null;
355
+ medianSecondsToArrival: number | null;
356
+ escalations: number;
357
+ }
358
+ export interface IncidentSlaControlCentreRowDto {
359
+ controlCentreId: number | null;
360
+ emergencies: number;
361
+ breachedEmergencies: number;
362
+ met: number;
363
+ breached: number;
364
+ compliancePercent: number | null;
365
+ medianSecondsToAcknowledge: number | null;
366
+ medianSecondsToDispatch: number | null;
367
+ medianSecondsToArrival: number | null;
368
+ escalations: number;
369
+ }
370
+ export interface IncidentSlaTypeRowDto {
371
+ typeId: number | null;
372
+ typeName: string | null;
373
+ categoryId: number | null;
374
+ categoryName: string | null;
375
+ emergencies: number;
376
+ breachedEmergencies: number;
377
+ met: number;
378
+ breached: number;
379
+ compliancePercent: number | null;
380
+ medianSecondsToArrival: number | null;
381
+ }
382
+ export interface IncidentSlaResponseUnitRowDto {
383
+ responseUnitId: number;
384
+ responseUnitName: string;
385
+ dispatches: number;
386
+ accepted: number;
387
+ declined: number;
388
+ stoodDown: number;
389
+ arrived: number;
390
+ arrivalsInferred: number;
391
+ acceptanceMet: number;
392
+ acceptanceBreached: number;
393
+ acceptanceCompliancePercent: number | null;
394
+ medianSecondsToAccept: number | null;
395
+ medianSecondsToMobilize: number | null;
396
+ medianSecondsToArrive: number | null;
397
+ }
398
+ export interface IncidentSlaArrivalAnalyticsDto {
399
+ arrivals: number;
400
+ bySource: IncidentSlaAnalyticsCountDto[];
401
+ inferredPercent: number | null;
402
+ etaAtRisk: number;
403
+ etaLikelyLate: number;
404
+ etaUncertain: number;
405
+ predictedLate: number;
406
+ predictedLateAndBreached: number;
407
+ latePredictionPrecisionPercent: number | null;
408
+ firstEtaError: IncidentSlaDurationSummaryDto;
409
+ distanceAtDispatch: IncidentSlaDurationSummaryDto;
410
+ }
411
+ export interface IncidentSlaEscalationAnalyticsDto {
412
+ total: number;
413
+ byTrigger: IncidentSlaAnalyticsCountDto[];
414
+ byLevel: IncidentSlaAnalyticsCountDto[];
415
+ byStage: IncidentSlaAnalyticsCountDto[];
416
+ byRule: IncidentSlaAnalyticsCountDto[];
417
+ alternativesRecommended: number;
418
+ reassignments: number;
419
+ escalatedEmergencies: number;
420
+ }
421
+ export interface IncidentSlaPauseAnalyticsDto {
422
+ requested: number;
423
+ approved: number;
424
+ rejected: number;
425
+ pending: number;
426
+ withdrawn: number;
427
+ totalPausedSeconds: number;
428
+ pausedTime: IncidentSlaDurationSummaryDto;
429
+ byReason: IncidentSlaAnalyticsCountDto[];
430
+ }
431
+ export interface IncidentSlaExceptionAnalyticsDto {
432
+ requested: number;
433
+ approved: number;
434
+ rejected: number;
435
+ pending: number;
436
+ byReason: IncidentSlaAnalyticsCountDto[];
437
+ }
438
+ export interface IncidentSlaNotificationEventRowDto {
439
+ event: string;
440
+ requests: number;
441
+ failed: number;
442
+ }
443
+ export interface IncidentSlaNotificationChannelRowDto {
444
+ channel: string;
445
+ recipients: number;
446
+ sent: number;
447
+ failed: number;
448
+ successPercent: number | null;
449
+ }
450
+ export interface IncidentSlaNotificationAnalyticsDto {
451
+ requests: number;
452
+ byStatus: IncidentSlaAnalyticsCountDto[];
453
+ byEvent: IncidentSlaNotificationEventRowDto[];
454
+ byChannel: IncidentSlaNotificationChannelRowDto[];
455
+ byAudience: IncidentSlaAnalyticsCountDto[];
456
+ }
457
+ export interface IncidentSlaClosureAnalyticsDto {
458
+ resolved: number;
459
+ closed: number;
460
+ manual: number;
461
+ automatic: number;
462
+ awaitingClosure: number;
463
+ autoCloseDeferred: number;
464
+ resolvedToClosed: IncidentSlaDurationSummaryDto;
465
+ }
466
+ export interface IncidentSlaHeatmapCellDto {
467
+ weekday: number;
468
+ hour: number;
469
+ emergencies: number;
470
+ breachedEmergencies: number;
471
+ }
472
+ export interface IncidentSlaWorstIncidentDto {
473
+ incidentId: number;
474
+ reference: string;
475
+ priority: IncidentPriority;
476
+ typeName: string | null;
477
+ controlCentreId: number | null;
478
+ createdAt: string;
479
+ breachedStages: number;
480
+ worstStage: IncidentSlaStage | null;
481
+ maxOverrunSeconds: number;
482
+ totalOverrunSeconds: number;
483
+ timeToArrivalSeconds: number | null;
484
+ }
485
+ export interface IncidentSlaOrganizationRowDto {
486
+ organizationId: number;
487
+ emergencies: number;
488
+ breachedEmergencies: number;
489
+ met: number;
490
+ breached: number;
491
+ compliancePercent: number | null;
492
+ medianSecondsToAcknowledge: number | null;
493
+ medianSecondsToArrival: number | null;
275
494
  }
276
495
  /** `GET /api/incident-sla/analytics`. */
277
496
  export interface IncidentSlaAnalyticsDto {
278
- from: string;
279
- to: string;
497
+ range: IncidentSlaAnalyticsRangeDto;
280
498
  organizationId: number | null;
281
499
  controlCentreId: number | null;
282
- incidents: number;
283
- breachedIncidents: number;
500
+ platform: boolean;
501
+ summary: IncidentSlaAnalyticsSummaryDto;
502
+ previous: IncidentSlaAnalyticsSummaryDto | null;
284
503
  stages: IncidentSlaStageAnalyticsDto[];
504
+ byPriority: IncidentSlaPriorityRowDto[];
505
+ timeline: IncidentSlaTimelinePointDto[];
506
+ byControlCentre: IncidentSlaControlCentreRowDto[];
507
+ byType: IncidentSlaTypeRowDto[];
508
+ byResponseUnit: IncidentSlaResponseUnitRowDto[];
509
+ arrival: IncidentSlaArrivalAnalyticsDto;
510
+ escalations: IncidentSlaEscalationAnalyticsDto;
511
+ pauses: IncidentSlaPauseAnalyticsDto;
512
+ exceptions: IncidentSlaExceptionAnalyticsDto;
513
+ notifications: IncidentSlaNotificationAnalyticsDto;
514
+ closure: IncidentSlaClosureAnalyticsDto;
515
+ emergencyTypes: IncidentSlaAnalyticsCountDto[];
516
+ heatmap: IncidentSlaHeatmapCellDto[];
517
+ worstIncidents: IncidentSlaWorstIncidentDto[];
518
+ byOrganization: IncidentSlaOrganizationRowDto[];
285
519
  generatedAt: string;
286
520
  }
521
+ /** The query of `GET /api/incident-sla/analytics`. */
522
+ export interface IncidentSlaAnalyticsQuery {
523
+ from?: string;
524
+ to?: string;
525
+ timeZone?: string;
526
+ organizationId?: number;
527
+ controlCentreId?: number;
528
+ priority?: IncidentPriority;
529
+ stage?: IncidentSlaStage;
530
+ typeId?: number;
531
+ categoryId?: number;
532
+ responseUnitId?: number;
533
+ }
534
+ /** Policy settings beside the targets. On a stored policy every field is optional (absent = inherit). */
535
+ export interface IncidentSlaPolicySettingsDto {
536
+ warningThresholdPercent: number;
537
+ atRiskThresholdPercent: number;
538
+ arrivalRadiusMetres: number;
539
+ arrivalExitRadiusMetres: number;
540
+ arrivalDwellSeconds: number;
541
+ arrivalMinObservations: number;
542
+ maxLocationAccuracyMetres: number;
543
+ trackingStaleSeconds: number;
544
+ etaAtRiskMarginPercent: number;
545
+ etaAssumedSpeedKph: number;
546
+ etaRoadFactor: number;
547
+ autoCloseEnabled: boolean;
548
+ autoCloseAfterSeconds: number;
549
+ allowAutomaticReassignment: boolean;
550
+ pauseRequiresApproval: boolean;
551
+ notifyReporter: boolean;
552
+ }
553
+ export interface IncidentSlaEscalationContactRequest {
554
+ name?: string;
555
+ phoneNumber?: string;
556
+ email?: string;
557
+ }
558
+ export interface IncidentSlaEscalationRuleRequest {
559
+ key: string;
560
+ trigger: SlaEscalationTrigger;
561
+ stages: IncidentSlaStage[];
562
+ priorities: IncidentPriority[];
563
+ level: SlaEscalationLevel;
564
+ channels: string[];
565
+ actions: string[];
566
+ delaySeconds: number;
567
+ recipientRoles: string[];
568
+ contacts: IncidentSlaEscalationContactRequest[];
569
+ }
570
+ /** The body of a new policy version (and, with a scope, of a new policy). */
571
+ export interface IncidentSlaPolicyContentRequest {
572
+ name: string;
573
+ description?: string;
574
+ effectiveFrom?: string;
575
+ effectiveTo?: string;
576
+ settings?: Partial<IncidentSlaPolicySettingsDto>;
577
+ targets?: {
578
+ stage: IncidentSlaStage;
579
+ priority: IncidentPriority;
580
+ targetSeconds: number | null;
581
+ }[];
582
+ priorityFloors?: {
583
+ emergencyType: IncidentEmergencyType;
584
+ priority: IncidentPriority;
585
+ }[];
586
+ /** Absent: inherit the less specific policy's rules. [] : no escalation at all. */
587
+ escalationRules?: IncidentSlaEscalationRuleRequest[];
588
+ }
589
+ export interface CreateIncidentSlaPolicyRequest extends IncidentSlaPolicyContentRequest {
590
+ organizationId?: number;
591
+ controlCentreId?: number;
592
+ categoryId?: number;
593
+ typeId?: number;
594
+ priority?: IncidentPriority;
595
+ zoneId?: number;
596
+ }
597
+ /** The policy an incident like the one described would run under (`GET /api/incident-sla/policies/effective`). */
598
+ export interface ResolvedIncidentSlaPolicyDto {
599
+ schemaVersion: 1;
600
+ policyId: number | null;
601
+ policyKey: string | null;
602
+ policyVersion: number | null;
603
+ policyName: string;
604
+ scope: SlaPolicyScope;
605
+ contributingPolicies: IncidentSlaContributingPolicyDto[];
606
+ effectiveAt: string;
607
+ resolvedAt: string;
608
+ targets: Record<IncidentPriority, Record<IncidentSlaStage, number | null>>;
609
+ startAnchors: Record<IncidentSlaStage, EmergencyIncidentStage>;
610
+ settings: IncidentSlaPolicySettingsDto;
611
+ priorityFloors: Partial<Record<IncidentEmergencyType, IncidentPriority>>;
612
+ escalationRules: IncidentSlaEscalationRuleRequest[];
613
+ }
614
+ export interface EffectiveIncidentSlaPolicyQuery {
615
+ organizationId: number;
616
+ controlCentreId?: number;
617
+ categoryId?: number;
618
+ typeId?: number;
619
+ priority?: IncidentPriority;
620
+ emergencyType?: IncidentEmergencyType;
621
+ zoneId?: number;
622
+ at?: string;
623
+ }
624
+ export interface IncidentSlaPolicyListQuery {
625
+ organizationId?: number;
626
+ activeOnly?: boolean;
627
+ includePlatform?: boolean;
628
+ }
629
+ /** The bounds the API enforces on a policy (grm-shared-library INCIDENT_SLA_LIMITS), for the admin's form. */
630
+ export declare const INCIDENT_SLA_POLICY_LIMITS: {
631
+ readonly minTargetSeconds: 5;
632
+ readonly maxTargetSeconds: number;
633
+ readonly minThresholdPercent: 10;
634
+ readonly maxThresholdPercent: 99;
635
+ readonly minRadiusMetres: 10;
636
+ readonly maxRadiusMetres: 5000;
637
+ readonly maxDwellSeconds: number;
638
+ readonly maxObservations: 20;
639
+ readonly minAccuracyMetres: 5;
640
+ readonly maxAccuracyMetres: 5000;
641
+ readonly minStaleSeconds: 15;
642
+ readonly maxStaleSeconds: number;
643
+ readonly maxEtaMarginPercent: 90;
644
+ readonly minSpeedKph: 5;
645
+ readonly maxSpeedKph: 150;
646
+ readonly minRoadFactor: 1;
647
+ readonly maxRoadFactor: 3;
648
+ readonly minAutoCloseSeconds: number;
649
+ readonly maxAutoCloseSeconds: number;
650
+ readonly maxEscalationDelaySeconds: number;
651
+ readonly maxEscalationRules: 50;
652
+ readonly maxEscalationContacts: 10;
653
+ readonly policyNameMaxLength: 120;
654
+ readonly policyDescriptionMaxLength: 1000;
655
+ readonly ruleKeyMaxLength: 60;
656
+ };
@@ -1,4 +1,4 @@
1
- import { EmergencyIncidentStage, EtaStatus, IncidentActorType, IncidentArrivalSource, IncidentSlaEventType, IncidentSlaStage, IncidentSlaStatus, SlaExceptionReason, SlaExceptionStatus, SlaOverallState, SlaPauseReason } from '../enums/incident-sla-enums';
1
+ import { EmergencyIncidentStage, EtaStatus, IncidentActorType, IncidentArrivalSource, IncidentSlaEventType, IncidentSlaStage, IncidentSlaStatus, SlaExceptionReason, SlaExceptionStatus, SlaOverallState, SlaEscalationAction, SlaEscalationLevel, SlaEscalationTrigger, SlaNotificationChannel, SlaPauseReason, SlaPolicyScope, SlaPriorityLevel } from '../enums/incident-sla-enums';
2
2
  import { IncidentSlaInstanceDto } from '../interfaces/incident-sla.dto';
3
3
  /** A Clarion colour family: bg-light-{tone} text-{tone}. */
4
4
  export type SlaTone = 'success' | 'info' | 'warning' | 'error' | 'grey' | 'primary' | 'accent';
@@ -36,3 +36,20 @@ export declare function liveRemainingSeconds(instance: Pick<IncidentSlaInstanceD
36
36
  export declare function liveIncidentSlaStatus(instance: Pick<IncidentSlaInstanceDto, 'status' | 'warningAt' | 'atRiskAt' | 'deadlineAt' | 'completedAt'>, nowMs: number, skewMs?: number): IncidentSlaStatus;
37
37
  /** Statuses whose clock is running (or paused). */
38
38
  export declare function isOpenIncidentSlaStatus(status: IncidentSlaStatus | string | null | undefined): boolean;
39
+ /** Stages in the order an emergency goes through them. */
40
+ export declare const INCIDENT_SLA_STAGE_ORDER: readonly IncidentSlaStage[];
41
+ export declare const SLA_ESCALATION_TRIGGER_LABELS: Readonly<Record<SlaEscalationTrigger, string>>;
42
+ export declare const SLA_ESCALATION_LEVEL_LABELS: Readonly<Record<SlaEscalationLevel, string>>;
43
+ export declare const SLA_NOTIFICATION_CHANNEL_LABELS: Readonly<Record<SlaNotificationChannel, string>>;
44
+ export declare const SLA_ESCALATION_ACTION_LABELS: Readonly<Record<SlaEscalationAction, string>>;
45
+ export declare const SLA_POLICY_SCOPE_LABELS: Readonly<Record<SlaPolicyScope, string>>;
46
+ /** The emergency notifications, as clarion-incident asks for them. */
47
+ export declare const EMERGENCY_NOTIFICATION_EVENT_LABELS: Readonly<Record<string, string>>;
48
+ /** The SLA level of each priority (P1 = Critical ... P4 = Low). */
49
+ export declare const INCIDENT_PRIORITY_SLA_LEVEL: Readonly<Record<string, SlaPriorityLevel>>;
50
+ /** What each policy setting means, for the policy editor. */
51
+ export declare const INCIDENT_SLA_SETTING_LABELS: Readonly<Record<string, {
52
+ label: string;
53
+ unit: string;
54
+ help: string;
55
+ }>>;
@@ -199,6 +199,9 @@ export declare enum PermissionActions {
199
199
  READ_INCIDENT_SLA_POLICY = "read:incident-sla-policy",
200
200
  MANAGE_INCIDENT_SLA_POLICY = "manage:incident-sla-policy",
201
201
  READ_INCIDENT_SLA_ANALYTICS = "read:incident-sla-analytics",
202
+ USE_RESPONDER_APP = "use:responder-app",
203
+ RESPOND_RESPONSE_UNIT_DISPATCH = "respond:response-unit-dispatch",
204
+ REPORT_RESPONDER_POSITION = "report:responder-position",
202
205
  /** @deprecated Retiring: split into the connection / message / screened-message / analytics actions. */
203
206
  READ_ALERT_INTAKE = "read:alert-intake",
204
207
  /** @deprecated Retiring: split into the connection / message / screened-message / analytics actions. */
@@ -16,5 +16,6 @@ export declare enum PermissionsModule {
16
16
  ALERT_INTAKE = "Alert Intake",
17
17
  SAFETY = "Safety",
18
18
  PLACES = "Places",
19
- INCIDENT_SLA = "Incident SLA"
19
+ INCIDENT_SLA = "Incident SLA",
20
+ RESPONDER = "Responder"
20
21
  }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * The responder app, as the control room sees it: field personnel (role
3
+ * `Responder`) linked to the response units they may staff, going on duty with
4
+ * one of them and reporting how each dispatch ended.
5
+ *
6
+ * The admin's mirror of grm-shared-library `src/modules/responder` - the string
7
+ * values MUST stay identical to the backend's (pinned by responder-display.spec.ts).
8
+ */
9
+ /** A duty session's own lifecycle. One session is ACTIVE per responder at most. */
10
+ export declare enum ResponderDutySessionStatus {
11
+ ACTIVE = "ACTIVE",
12
+ ENDED = "ENDED"
13
+ }
14
+ /** Why a duty session ended. */
15
+ export declare enum ResponderDutyEndReason {
16
+ /** The responder went off duty in the app. */
17
+ RESPONDER = "RESPONDER",
18
+ /** The control room ended it (update:response-unit). */
19
+ CONTROL_CENTRE = "CONTROL_CENTRE",
20
+ /** The responder was removed from the unit while on duty with it. */
21
+ MEMBERSHIP_REMOVED = "MEMBERSHIP_REMOVED",
22
+ /** The unit was deactivated or deleted while the responder was on duty with it. */
23
+ UNIT_DEACTIVATED = "UNIT_DEACTIVATED"
24
+ }
25
+ /** How a response ended, as the responder reports it. */
26
+ export declare enum ResponderReportOutcome {
27
+ RESOLVED_ON_SCENE = "RESOLVED_ON_SCENE",
28
+ HANDED_OVER = "HANDED_OVER",
29
+ REFERRED = "REFERRED",
30
+ NO_ACTION_REQUIRED = "NO_ACTION_REQUIRED",
31
+ FALSE_ALARM = "FALSE_ALARM",
32
+ UNABLE_TO_LOCATE = "UNABLE_TO_LOCATE",
33
+ OTHER = "OTHER"
34
+ }
35
+ /**
36
+ * Machine-readable refusals of the responder endpoints, in the error body's
37
+ * `code` (or `details.code` behind the gateway) - the same
38
+ * `{statusCode, code, message, ...details}` envelope the dispatch endpoints use.
39
+ */
40
+ export declare enum ResponderErrorCode {
41
+ /** The caller does not hold the Responder role. */
42
+ NOT_A_RESPONDER = "RESPONDER_NOT_A_RESPONDER",
43
+ /** The responder account has no control centre, so nothing can be scoped. */
44
+ NO_CONTROL_CENTRE = "RESPONDER_NO_CONTROL_CENTRE",
45
+ UNIT_NOT_FOUND = "RESPONDER_UNIT_NOT_FOUND",
46
+ /** The caller is not a member of that unit. */
47
+ NOT_A_UNIT_MEMBER = "RESPONDER_NOT_A_UNIT_MEMBER",
48
+ UNIT_INACTIVE = "RESPONDER_UNIT_INACTIVE",
49
+ /** Already on duty with ANOTHER unit; end that duty first. `details.activeDuty` names it. */
50
+ ALREADY_ON_DUTY = "RESPONDER_ALREADY_ON_DUTY",
51
+ NOT_ON_DUTY = "RESPONDER_NOT_ON_DUTY",
52
+ /** Membership: the user is not a Responder of the unit's organization and control centre. */
53
+ USER_NOT_ELIGIBLE = "RESPONDER_USER_NOT_ELIGIBLE",
54
+ ALREADY_A_MEMBER = "RESPONDER_ALREADY_A_MEMBER",
55
+ MEMBERSHIP_NOT_FOUND = "RESPONDER_MEMBERSHIP_NOT_FOUND",
56
+ /** The dispatch does not exist or is not for one of the caller's units (never says which). */
57
+ DISPATCH_NOT_FOUND = "RESPONDER_DISPATCH_NOT_FOUND",
58
+ /** The move is not one a responder may make from the current status. `details.currentStatus`. */
59
+ INVALID_STATUS_TRANSITION = "RESPONDER_INVALID_STATUS_TRANSITION",
60
+ REASON_REQUIRED = "RESPONDER_REASON_REQUIRED",
61
+ DECLINE_NOT_ALLOWED = "RESPONDER_DECLINE_NOT_ALLOWED",
62
+ MANUAL_ARRIVAL_NOT_ALLOWED = "RESPONDER_MANUAL_ARRIVAL_NOT_ALLOWED",
63
+ /** Completing needs the response report first (organization policy). */
64
+ REPORT_REQUIRED = "RESPONDER_REPORT_REQUIRED",
65
+ /** A report can only be written once the unit reached the scene. */
66
+ REPORT_NOT_ALLOWED = "RESPONDER_REPORT_NOT_ALLOWED",
67
+ /** The report changed since the version the client edited. `details.currentVersion`. */
68
+ REPORT_VERSION_CONFLICT = "RESPONDER_REPORT_VERSION_CONFLICT",
69
+ /** The incident is closed or archived, so its reports can no longer be amended. */
70
+ REPORT_LOCKED = "RESPONDER_REPORT_LOCKED",
71
+ /** A required report field or checklist item is missing. `details.missing`. */
72
+ REPORT_INCOMPLETE = "RESPONDER_REPORT_INCOMPLETE",
73
+ /** An attachment id is not a file the caller may link. */
74
+ ATTACHMENT_NOT_READABLE = "RESPONDER_ATTACHMENT_NOT_READABLE"
75
+ }
@@ -0,0 +1,3 @@
1
+ export * from './enums/responder-enums';
2
+ export * from './interfaces/responder.dto';
3
+ export * from './utils/responder-display.util';
@@ -0,0 +1,87 @@
1
+ import { ResponderDutyEndReason, ResponderDutySessionStatus, ResponderReportOutcome } from '../enums/responder-enums';
2
+ /**
3
+ * A responder linked to a unit, as the unit screen lists them.
4
+ * `GET|POST /api/response-units/:id/responders`.
5
+ */
6
+ export interface ResponseUnitResponder {
7
+ id: number;
8
+ responseUnitId: number;
9
+ userId: number;
10
+ organizationId: number;
11
+ controlCentreId: number | null;
12
+ createdByUserId: number | null;
13
+ createdAt: string;
14
+ /** The account, when clarion-authentication could be read; null otherwise. */
15
+ user: {
16
+ id: number;
17
+ name: string;
18
+ email: string | null;
19
+ phoneNumber: string | null;
20
+ } | null;
21
+ /** Set while this responder is on duty with THIS unit. */
22
+ activeDuty: {
23
+ sessionId: number;
24
+ startedAt: string;
25
+ } | null;
26
+ }
27
+ /** `POST /api/response-units/:id/responders` - link a Responder account to a unit. */
28
+ export interface AddResponseUnitResponderRequest {
29
+ userId: number;
30
+ }
31
+ /** `POST /api/response-units/:id/responders/:userId/end-duty` - the control room ends someone's duty. */
32
+ export interface EndResponderDutyRequest {
33
+ /** At most RESPONDER_DUTY_END_REASON_MAX_LENGTH characters. */
34
+ reason?: string;
35
+ }
36
+ /** One stretch of duty: a responder staffing one unit. */
37
+ export interface ResponderDutySession {
38
+ id: number;
39
+ userId: number;
40
+ responseUnitId: number;
41
+ /** Copied at start so the record reads right after a rename. */
42
+ responseUnitName: string;
43
+ organizationId: number;
44
+ controlCentreId: number | null;
45
+ status: ResponderDutySessionStatus;
46
+ startedAt: string;
47
+ endedAt: string | null;
48
+ endReason: ResponderDutyEndReason | null;
49
+ endReasonText: string | null;
50
+ /** Who ended it - the responder, or the control-room user. */
51
+ endedByUserId: number | null;
52
+ }
53
+ /** One answer on a responder report's closure checklist. */
54
+ export interface ResponderReportChecklistAnswer {
55
+ /** The organization policy's stable item id (the label lives in the policy). */
56
+ itemId: string;
57
+ checked: boolean;
58
+ }
59
+ /**
60
+ * What the responder reported about one dispatch. One per dispatch, amended in
61
+ * versions. `GET /api/incidents/:id/responder-reports` lists an incident's.
62
+ */
63
+ export interface ResponderDispatchReport {
64
+ id: number;
65
+ reference: string;
66
+ dispatchId: number;
67
+ incidentId: number;
68
+ responseUnitId: number;
69
+ submittedByUserId: number;
70
+ /** Starts at 1; every amendment adds one. */
71
+ version: number;
72
+ summary: string;
73
+ actionsTaken: string | null;
74
+ outcome: ResponderReportOutcome;
75
+ personsContacted: string | null;
76
+ handoverTo: string | null;
77
+ followUpRequired: boolean;
78
+ followUpNotes: string | null;
79
+ remarks: string | null;
80
+ checklist: ResponderReportChecklistAnswer[];
81
+ /** dms file ids; the files are also appended to the incident's attachments. */
82
+ attachmentIds: number[];
83
+ submittedAt: string;
84
+ updatedAt: string;
85
+ /** Whether the CALLER may still amend it (submitter, incident not closed) - always false for the control room. */
86
+ amendable: boolean;
87
+ }
@@ -0,0 +1,26 @@
1
+ import { ResponderDutyEndReason, ResponderDutySessionStatus, ResponderReportOutcome } from '../enums/responder-enums';
2
+ import { ResponderReportChecklistAnswer, ResponseUnitResponder } from '../interfaces/responder.dto';
3
+ /** The backend's limit on a duty-end reason (grm-shared-library RESPONDER_FIELD_LIMITS.dutyEndReason). */
4
+ export declare const RESPONDER_DUTY_END_REASON_MAX_LENGTH = 300;
5
+ export declare const RESPONDER_REPORT_OUTCOME_LABELS: Readonly<Record<ResponderReportOutcome, string>>;
6
+ export declare const RESPONDER_DUTY_END_REASON_LABELS: Readonly<Record<ResponderDutyEndReason, string>>;
7
+ export declare const RESPONDER_DUTY_SESSION_STATUS_LABELS: Readonly<Record<ResponderDutySessionStatus, string>>;
8
+ /** The colour an outcome is shown in: settled is green, passed on is blue, not found is amber, the rest neutral. */
9
+ export type ResponderReportOutcomeTone = 'success' | 'info' | 'warning' | 'grey';
10
+ export declare function responderReportOutcomeTone(outcome: ResponderReportOutcome | string | null | undefined): ResponderReportOutcomeTone;
11
+ /** The outcome's label, or the raw value when this package does not know it yet. */
12
+ export declare function responderReportOutcomeLabel(outcome: ResponderReportOutcome | string | null | undefined): string;
13
+ /** The end reason's label, or the raw value when this package does not know it yet. */
14
+ export declare function responderDutyEndReasonLabel(reason: ResponderDutyEndReason | string | null | undefined): string;
15
+ /**
16
+ * A checklist item id as words, for a screen that has the answers but not the
17
+ * organization's policy (where the labels live): "scene-made-safe",
18
+ * "scene_made_safe" and "sceneMadeSafe" all read "Scene made safe".
19
+ */
20
+ export declare function humanizeResponderChecklistItem(itemId: string | null | undefined): string;
21
+ /** "3 of 4 confirmed"; '' for an empty checklist. */
22
+ export declare function describeResponderChecklist(checklist: readonly ResponderReportChecklistAnswer[] | null | undefined): string;
23
+ /** The responder's name - or, when their account could not be read, its number. */
24
+ export declare function responderDisplayName(responder: Pick<ResponseUnitResponder, 'userId' | 'user'>): string;
25
+ /** "jane@example.com · +254 712 345678", whichever of the two the account has. */
26
+ export declare function responderContactLine(responder: Pick<ResponseUnitResponder, 'user'>): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clarion-shared-types",
3
- "version": "1.0.117",
3
+ "version": "1.0.119",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "types": "dist/types/index.d.ts",