@tantainnovative/ndpr-toolkit 5.1.4 → 5.3.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.
@@ -27,9 +27,183 @@ declare interface BreachCategory {
27
27
  declare type BreachCompositeState = {
28
28
  reports: BreachReport[];
29
29
  assessments: RiskAssessment[];
30
- notifications: RegulatoryNotification[];
30
+ notifications: RegulatoryNotification_2[];
31
31
  };
32
32
 
33
+ export declare interface BreachNotificationAssessment {
34
+ /** Whether all applicable mandated content items are satisfied. */
35
+ complete: boolean;
36
+ /** Completeness of applicable content items, 0–100. */
37
+ completeness: number;
38
+ /** GAID 2025 Article 33(5) / NDPA S. 40(2) content of the notification to the Commission. */
39
+ notificationToCommission: BreachNotificationItem[];
40
+ /** NDPA S. 40(3) communication to data subjects — populated only when high-risk. */
41
+ dataSubjectCommunication: BreachNotificationItem[];
42
+ /** Whether a data-subject communication is owed (high risk). */
43
+ dataSubjectCommunicationRequired: boolean;
44
+ timing: BreachNotificationTiming;
45
+ /** Labels of unsatisfied applicable items. */
46
+ missing: string[];
47
+ /** Actionable next steps, including timing warnings. */
48
+ recommendations: string[];
49
+ asOf: number;
50
+ }
51
+
52
+ declare interface BreachNotificationAssessment_2 {
53
+ /** Whether all applicable mandated content items are satisfied. */
54
+ complete: boolean;
55
+ /** Completeness of applicable content items, 0–100. */
56
+ completeness: number;
57
+ /** GAID 2025 Article 33(5) / NDPA S. 40(2) content of the notification to the Commission. */
58
+ notificationToCommission: BreachNotificationItem_2[];
59
+ /** NDPA S. 40(3) communication to data subjects — populated only when high-risk. */
60
+ dataSubjectCommunication: BreachNotificationItem_2[];
61
+ /** Whether a data-subject communication is owed (high risk). */
62
+ dataSubjectCommunicationRequired: boolean;
63
+ timing: BreachNotificationTiming_2;
64
+ /** Labels of unsatisfied applicable items. */
65
+ missing: string[];
66
+ /** Actionable next steps, including timing warnings. */
67
+ recommendations: string[];
68
+ asOf: number;
69
+ }
70
+
71
+ export declare interface BreachNotificationItem {
72
+ /** Stable identifier for the requirement. */
73
+ id: string;
74
+ /** Human-readable requirement. */
75
+ label: string;
76
+ /** Authoritative citation, e.g. `GAID 2025 Art. 33(5)(a)`. */
77
+ section: string;
78
+ /** Whether the report satisfies it. */
79
+ satisfied: boolean;
80
+ }
81
+
82
+ declare interface BreachNotificationItem_2 {
83
+ /** Stable identifier for the requirement. */
84
+ id: string;
85
+ /** Human-readable requirement. */
86
+ label: string;
87
+ /** Authoritative citation, e.g. `GAID 2025 Art. 33(5)(a)`. */
88
+ section: string;
89
+ /** Whether the report satisfies it. */
90
+ satisfied: boolean;
91
+ }
92
+
93
+ /**
94
+ * Personal-data-breach notification completeness checker for NDPA 2023
95
+ * Section 40, as detailed by NDPC General Application and Implementation
96
+ * Directive (GAID) 2025 Article 33.
97
+ *
98
+ * Section 40(2) requires a data controller to notify the Commission within 72
99
+ * hours of becoming aware of a breach likely to result in a risk to data
100
+ * subjects' rights and freedoms. GAID 2025 Article 33(5)(a)–(h) enumerates the
101
+ * content that a notification to the Commission "shall include". Where the
102
+ * breach is likely to result in a *high* risk, Section 40(3) additionally
103
+ * requires the controller to communicate the breach to affected data subjects
104
+ * in plain and clear language.
105
+ *
106
+ * This assesses a `BreachReport` against those requirements: which mandated
107
+ * content items are present, whether the 72-hour window is met, and whether a
108
+ * data-subject communication is owed. It is a documentation-completeness aid,
109
+ * not legal advice — verify against current NDPC guidance.
110
+ *
111
+ * @see NDPA 2023 Section 40 (Personal data breaches)
112
+ * @see NDPC GAID 2025 Article 33 (Data Breach Notification)
113
+ */
114
+
115
+ export declare interface BreachNotificationOptions {
116
+ /** Risk assessment for the breach; drives whether data-subject communication is required. */
117
+ assessment?: RiskAssessment;
118
+ /** The regulatory notification actually sent, if any — used to judge timeliness. */
119
+ notification?: RegulatoryNotification_2;
120
+ /** Reference "now" in epoch ms. Defaults to `Date.now()`. */
121
+ asOf?: number;
122
+ /** Notification window in hours. Defaults to 72 (NDPA S. 40(2)). */
123
+ deadlineHours?: number;
124
+ /**
125
+ * Explicit high-risk flag (NDPA S. 40(3)). When omitted, derived from
126
+ * `assessment.highRisksToRightsAndFreedoms`.
127
+ */
128
+ highRisk?: boolean;
129
+ }
130
+
131
+ /**
132
+ * Personal-data-breach notification completeness checker for NDPA 2023
133
+ * Section 40, as detailed by NDPC General Application and Implementation
134
+ * Directive (GAID) 2025 Article 33.
135
+ *
136
+ * Section 40(2) requires a data controller to notify the Commission within 72
137
+ * hours of becoming aware of a breach likely to result in a risk to data
138
+ * subjects' rights and freedoms. GAID 2025 Article 33(5)(a)–(h) enumerates the
139
+ * content that a notification to the Commission "shall include". Where the
140
+ * breach is likely to result in a *high* risk, Section 40(3) additionally
141
+ * requires the controller to communicate the breach to affected data subjects
142
+ * in plain and clear language.
143
+ *
144
+ * This assesses a `BreachReport` against those requirements: which mandated
145
+ * content items are present, whether the 72-hour window is met, and whether a
146
+ * data-subject communication is owed. It is a documentation-completeness aid,
147
+ * not legal advice — verify against current NDPC guidance.
148
+ *
149
+ * @see NDPA 2023 Section 40 (Personal data breaches)
150
+ * @see NDPC GAID 2025 Article 33 (Data Breach Notification)
151
+ */
152
+
153
+ declare interface BreachNotificationOptions_2 {
154
+ /** Risk assessment for the breach; drives whether data-subject communication is required. */
155
+ assessment?: RiskAssessment_2;
156
+ /** The regulatory notification actually sent, if any — used to judge timeliness. */
157
+ notification?: RegulatoryNotification;
158
+ /** Reference "now" in epoch ms. Defaults to `Date.now()`. */
159
+ asOf?: number;
160
+ /** Notification window in hours. Defaults to 72 (NDPA S. 40(2)). */
161
+ deadlineHours?: number;
162
+ /**
163
+ * Explicit high-risk flag (NDPA S. 40(3)). When omitted, derived from
164
+ * `assessment.highRisksToRightsAndFreedoms`.
165
+ */
166
+ highRisk?: boolean;
167
+ }
168
+
169
+ export declare interface BreachNotificationTiming {
170
+ /** `discoveredAt` + the notification window. */
171
+ deadline: number;
172
+ /** Whole hours between discovery and `asOf`. */
173
+ hoursSinceDiscovery: number;
174
+ /** Whether a regulatory notification has been recorded. */
175
+ notified: boolean;
176
+ /** When the regulatory notification was sent, if any. */
177
+ notifiedAt?: number;
178
+ /** Whether the notification (or, if none, `asOf`) falls within the deadline. */
179
+ withinDeadline: boolean;
180
+ /** Whole hours from `asOf` to the deadline (negative once past). */
181
+ hoursRemaining: number;
182
+ /** Whether the deadline has been missed. */
183
+ overdue: boolean;
184
+ /** Late filings must state the reasons for the delay (NDPA S. 40(2)). */
185
+ requiresDelayJustification: boolean;
186
+ }
187
+
188
+ declare interface BreachNotificationTiming_2 {
189
+ /** `discoveredAt` + the notification window. */
190
+ deadline: number;
191
+ /** Whole hours between discovery and `asOf`. */
192
+ hoursSinceDiscovery: number;
193
+ /** Whether a regulatory notification has been recorded. */
194
+ notified: boolean;
195
+ /** When the regulatory notification was sent, if any. */
196
+ notifiedAt?: number;
197
+ /** Whether the notification (or, if none, `asOf`) falls within the deadline. */
198
+ withinDeadline: boolean;
199
+ /** Whole hours from `asOf` to the deadline (negative once past). */
200
+ hoursRemaining: number;
201
+ /** Whether the deadline has been missed. */
202
+ overdue: boolean;
203
+ /** Late filings must state the reasons for the delay (NDPA S. 40(2)). */
204
+ requiresDelayJustification: boolean;
205
+ }
206
+
33
207
  /**
34
208
  * Represents a data breach report
35
209
  */
@@ -118,6 +292,218 @@ export declare interface BreachReport {
118
292
  }>;
119
293
  }
120
294
 
295
+ /**
296
+ * Represents a data breach report
297
+ */
298
+ declare interface BreachReport_2 {
299
+ /** Unique identifier for the breach report */
300
+ id: string;
301
+ /** Title/summary of the breach */
302
+ title: string;
303
+ /** Detailed description of the breach */
304
+ description: string;
305
+ /** Category of the breach */
306
+ category: string;
307
+ /** Timestamp when the breach was discovered */
308
+ discoveredAt: number;
309
+ /** Timestamp when the breach occurred (if known) */
310
+ occurredAt?: number;
311
+ /** Timestamp when the breach was reported internally */
312
+ reportedAt: number;
313
+ /** Person who reported the breach */
314
+ reporter: {
315
+ name: string;
316
+ email: string;
317
+ department: string;
318
+ phone?: string;
319
+ };
320
+ /** Systems or data affected by the breach */
321
+ affectedSystems: string[];
322
+ /** Types of data involved in the breach */
323
+ dataTypes: string[];
324
+ /** Whether sensitive personal data is involved (NDPA Section 30) */
325
+ involvesSensitiveData?: boolean;
326
+ /** Estimated number of data subjects affected */
327
+ estimatedAffectedSubjects?: number;
328
+ /**
329
+ * Approximate number of personal data RECORDS concerned (distinct from subject count).
330
+ * Required content under NDPA Section 40(1)(a) and Section 40(2).
331
+ */
332
+ approximateRecordCount?: number;
333
+ /**
334
+ * Categories of data subjects affected (e.g. customers, employees, minors, patients).
335
+ * Required content under NDPA Section 40(1)(a) and Section 40(2).
336
+ */
337
+ dataSubjectCategories?: string[];
338
+ /**
339
+ * Likely consequences of the breach for affected data subjects (e.g. identity theft,
340
+ * financial loss, reputational damage). Reported to the NDPC and, where applicable,
341
+ * communicated to data subjects under Section 40(3).
342
+ */
343
+ likelyConsequences?: string;
344
+ /**
345
+ * Measures taken or proposed to mitigate adverse effects of the breach.
346
+ * Required content for Section 40(3) communications to data subjects.
347
+ */
348
+ mitigationMeasures?: string;
349
+ /**
350
+ * Whether this is a phased / interim report submitted before full investigation
351
+ * is complete. The NDPC permits phased reporting where complete information is
352
+ * not available within 72 hours.
353
+ */
354
+ isPhasedReport?: boolean;
355
+ /**
356
+ * ID of the prior phased report this report supplements, if any.
357
+ */
358
+ supplementsReportId?: string;
359
+ /**
360
+ * Data Protection Officer contact details. The DPO is the named contact point
361
+ * for the NDPC per NDPA Section 32(3)(c). Required content in the regulatory
362
+ * report (Section 40(2)).
363
+ */
364
+ dpoContact?: {
365
+ name: string;
366
+ email: string;
367
+ phone?: string;
368
+ };
369
+ /** Whether the breach is ongoing or contained */
370
+ status: 'ongoing' | 'contained' | 'resolved';
371
+ /** Initial actions taken to address the breach */
372
+ initialActions?: string;
373
+ /** Attachments related to the breach */
374
+ attachments?: Array<{
375
+ id: string;
376
+ name: string;
377
+ type: string;
378
+ url: string;
379
+ addedAt: number;
380
+ }>;
381
+ }
382
+
383
+ /**
384
+ * Compliance Audit Returns (CAR) scheduling under the NDPC General Application
385
+ * and Implementation Directive (GAID) 2025.
386
+ *
387
+ * A Data Controller/Processor of Major Importance (DCPMI) must conduct an
388
+ * initial compliance audit within 15 months of commencing data processing, and
389
+ * thereafter file a Compliance Audit Return with the NDPC annually (default
390
+ * deadline 31 March, filed through the NDPC Information Management Portal/NIMP).
391
+ *
392
+ * This computes the schedule (initial-audit due date, the next annual filing
393
+ * deadline relative to a reference date) and a light status. NDPC deadlines
394
+ * shift (the 2026 filing was extended to 30 May), so the annual deadline is
395
+ * configurable and per-year overrides are supported. The audit *content* itself
396
+ * is the organisation's compliance posture — pair this with `getComplianceScore`.
397
+ *
398
+ * @see NDPC General Application and Implementation Directive (GAID) 2025
399
+ */
400
+
401
+ export declare interface CARInput {
402
+ /** ISO date (YYYY-MM-DD) the organisation commenced data processing. */
403
+ commencementDate: string;
404
+ /** Reference date to evaluate against (YYYY-MM-DD). Defaults to today. */
405
+ asOf?: string;
406
+ /** DCPMI tier; CAR applies to DCPMIs only. Omit to assume applicable. */
407
+ tier?: DCPMITier_2;
408
+ }
409
+
410
+ /**
411
+ * Compliance Audit Returns (CAR) scheduling under the NDPC General Application
412
+ * and Implementation Directive (GAID) 2025.
413
+ *
414
+ * A Data Controller/Processor of Major Importance (DCPMI) must conduct an
415
+ * initial compliance audit within 15 months of commencing data processing, and
416
+ * thereafter file a Compliance Audit Return with the NDPC annually (default
417
+ * deadline 31 March, filed through the NDPC Information Management Portal/NIMP).
418
+ *
419
+ * This computes the schedule (initial-audit due date, the next annual filing
420
+ * deadline relative to a reference date) and a light status. NDPC deadlines
421
+ * shift (the 2026 filing was extended to 30 May), so the annual deadline is
422
+ * configurable and per-year overrides are supported. The audit *content* itself
423
+ * is the organisation's compliance posture — pair this with `getComplianceScore`.
424
+ *
425
+ * @see NDPC General Application and Implementation Directive (GAID) 2025
426
+ */
427
+
428
+ declare interface CARInput_2 {
429
+ /** ISO date (YYYY-MM-DD) the organisation commenced data processing. */
430
+ commencementDate: string;
431
+ /** Reference date to evaluate against (YYYY-MM-DD). Defaults to today. */
432
+ asOf?: string;
433
+ /** DCPMI tier; CAR applies to DCPMIs only. Omit to assume applicable. */
434
+ tier?: DCPMITier;
435
+ }
436
+
437
+ export declare interface CAROptions {
438
+ /** Default annual filing deadline (month is 1-12). Defaults to 31 March. */
439
+ annualDeadline?: {
440
+ month: number;
441
+ day: number;
442
+ };
443
+ /** Per-year overrides for the annual deadline, e.g. `{ 2026: '2026-05-30' }`. */
444
+ deadlineOverrides?: Record<number, string>;
445
+ /** Months after commencement the initial audit is due. Defaults to 15. */
446
+ initialAuditWithinMonths?: number;
447
+ }
448
+
449
+ declare interface CAROptions_2 {
450
+ /** Default annual filing deadline (month is 1-12). Defaults to 31 March. */
451
+ annualDeadline?: {
452
+ month: number;
453
+ day: number;
454
+ };
455
+ /** Per-year overrides for the annual deadline, e.g. `{ 2026: '2026-05-30' }`. */
456
+ deadlineOverrides?: Record<number, string>;
457
+ /** Months after commencement the initial audit is due. Defaults to 15. */
458
+ initialAuditWithinMonths?: number;
459
+ }
460
+
461
+ export declare interface ComplianceAuditReturn {
462
+ /** Whether CAR applies (false for non-DCPMI organisations). */
463
+ applicable: boolean;
464
+ schedule: {
465
+ commencementDate: string;
466
+ initialAuditWithinMonths: number;
467
+ /** Commencement date + the initial-audit window. */
468
+ initialAuditDueDate: string;
469
+ /** The next annual filing deadline on or after `asOf`. */
470
+ nextFilingDeadline: string;
471
+ /** The year the next filing deadline falls in. */
472
+ filingYear: number;
473
+ };
474
+ status: {
475
+ /** Whether the initial-audit obligation has arisen (asOf ≥ due date). */
476
+ initialAuditDue: boolean;
477
+ /** Whole days from `asOf` to the next filing deadline. */
478
+ daysUntilNextDeadline: number;
479
+ };
480
+ notes: string[];
481
+ asOf: string;
482
+ }
483
+
484
+ declare interface ComplianceAuditReturn_2 {
485
+ /** Whether CAR applies (false for non-DCPMI organisations). */
486
+ applicable: boolean;
487
+ schedule: {
488
+ commencementDate: string;
489
+ initialAuditWithinMonths: number;
490
+ /** Commencement date + the initial-audit window. */
491
+ initialAuditDueDate: string;
492
+ /** The next annual filing deadline on or after `asOf`. */
493
+ nextFilingDeadline: string;
494
+ /** The year the next filing deadline falls in. */
495
+ filingYear: number;
496
+ };
497
+ status: {
498
+ /** Whether the initial-audit obligation has arisen (asOf ≥ due date). */
499
+ initialAuditDue: boolean;
500
+ /** Whole days from `asOf` to the next filing deadline. */
501
+ daysUntilNextDeadline: number;
502
+ };
503
+ notes: string[];
504
+ asOf: string;
505
+ }
506
+
121
507
  /** A single gap found during NDPA compliance evaluation. */
122
508
  declare interface ComplianceGap {
123
509
  /** Machine-readable requirement identifier. */
@@ -519,6 +905,162 @@ declare interface DataCategory {
519
905
  selected: boolean;
520
906
  }
521
907
 
908
+ export declare interface DCPMIClassification {
909
+ /** Registration tier (or `'none'` when not a DCPMI). */
910
+ tier: DCPMITier_2;
911
+ /** Whether the organisation is a Data Controller/Processor of Major Importance. */
912
+ isDCPMI: boolean;
913
+ /** Annual registration fee in Nigerian Naira (0 when not a volume-tiered DCPMI). */
914
+ annualFeeNGN: number;
915
+ registration: {
916
+ /** Whether NDPC registration is required. */
917
+ required: boolean;
918
+ /** OHL renews registration annually; UHL/EHL register once and file CAR annually. */
919
+ renewsAnnually: boolean;
920
+ };
921
+ compliance: {
922
+ /** Whether the organisation must file annual Compliance Audit Returns (CAR). */
923
+ auditReturnsAnnual: boolean;
924
+ /** Initial compliance audit is due within this many months of commencing processing. */
925
+ initialAuditWithinMonths: number;
926
+ };
927
+ /** Human-readable caveats and next steps. */
928
+ notes: string[];
929
+ /** The count actually used for classification, after defensive normalisation. */
930
+ dataSubjectsConsidered: number;
931
+ }
932
+
933
+ declare interface DCPMIClassification_2 {
934
+ /** Registration tier (or `'none'` when not a DCPMI). */
935
+ tier: DCPMITier;
936
+ /** Whether the organisation is a Data Controller/Processor of Major Importance. */
937
+ isDCPMI: boolean;
938
+ /** Annual registration fee in Nigerian Naira (0 when not a volume-tiered DCPMI). */
939
+ annualFeeNGN: number;
940
+ registration: {
941
+ /** Whether NDPC registration is required. */
942
+ required: boolean;
943
+ /** OHL renews registration annually; UHL/EHL register once and file CAR annually. */
944
+ renewsAnnually: boolean;
945
+ };
946
+ compliance: {
947
+ /** Whether the organisation must file annual Compliance Audit Returns (CAR). */
948
+ auditReturnsAnnual: boolean;
949
+ /** Initial compliance audit is due within this many months of commencing processing. */
950
+ initialAuditWithinMonths: number;
951
+ };
952
+ /** Human-readable caveats and next steps. */
953
+ notes: string[];
954
+ /** The count actually used for classification, after defensive normalisation. */
955
+ dataSubjectsConsidered: number;
956
+ }
957
+
958
+ export declare interface DCPMIClassificationOptions {
959
+ thresholds?: Partial<DCPMIThresholds_2>;
960
+ fees?: Partial<DCPMIFees_2>;
961
+ }
962
+
963
+ declare interface DCPMIClassificationOptions_2 {
964
+ thresholds?: Partial<DCPMIThresholds>;
965
+ fees?: Partial<DCPMIFees>;
966
+ }
967
+
968
+ declare interface DCPMIFees {
969
+ UHL: number;
970
+ EHL: number;
971
+ OHL: number;
972
+ }
973
+
974
+ declare interface DCPMIFees_2 {
975
+ UHL: number;
976
+ EHL: number;
977
+ OHL: number;
978
+ }
979
+
980
+ export declare interface DCPMIInput {
981
+ /** Distinct data subjects whose data was processed in the relevant six-month window. */
982
+ dataSubjectsInSixMonths?: number;
983
+ /** True if the Commission has separately designated/listed the organisation as a DCPMI. */
984
+ isDesignated?: boolean;
985
+ }
986
+
987
+ declare interface DCPMIInput_2 {
988
+ /** Distinct data subjects whose data was processed in the relevant six-month window. */
989
+ dataSubjectsInSixMonths?: number;
990
+ /** True if the Commission has separately designated/listed the organisation as a DCPMI. */
991
+ isDesignated?: boolean;
992
+ }
993
+
994
+ declare interface DCPMIThresholds {
995
+ /** Lower bound (inclusive) for OHL. */
996
+ ohl: number;
997
+ /** Lower bound (inclusive) for EHL. */
998
+ ehl: number;
999
+ /** A count strictly greater than this is UHL. */
1000
+ uhl: number;
1001
+ }
1002
+
1003
+ declare interface DCPMIThresholds_2 {
1004
+ /** Lower bound (inclusive) for OHL. */
1005
+ ohl: number;
1006
+ /** Lower bound (inclusive) for EHL. */
1007
+ ehl: number;
1008
+ /** A count strictly greater than this is UHL. */
1009
+ uhl: number;
1010
+ }
1011
+
1012
+ /**
1013
+ * Data Controller/Processor of Major Importance (DCPMI) classification under the
1014
+ * NDPC General Application and Implementation Directive (GAID) 2025.
1015
+ *
1016
+ * Volume-based tiers — data subjects processed within a six-month window:
1017
+ * - UHL (Ultra High Level): more than 5,000 → ₦250,000 / year
1018
+ * - EHL (Extra High Level): 1,000 – 5,000 → ₦100,000 / year
1019
+ * - OHL (Ordinary High Level): 200 – 999 → ₦10,000 / year
1020
+ * - below 200: not a DCPMI by volume
1021
+ *
1022
+ * Boundaries: the 1,000 mark resolves to EHL (so OHL is 200–999); UHL is
1023
+ * strictly greater than 5,000 (so 5,000 itself is EHL). The NDPC has revised
1024
+ * classification metrics before and shifts filing deadlines, so thresholds and
1025
+ * fees are configurable — treat the defaults as the September 2025 GAID
1026
+ * baseline, not a constant.
1027
+ *
1028
+ * `isDesignated` marks an organisation the Commission has otherwise listed as a
1029
+ * DCPMI; it is then a DCPMI regardless of volume. Below the volume tiers such an
1030
+ * organisation is reported as `'listed'` with the fee left at 0 and a note to
1031
+ * confirm the applicable tier/fee with the NDPC.
1032
+ *
1033
+ * @see NDPC General Application and Implementation Directive (GAID) 2025
1034
+ * @see NDPC Guidance Notice on the Registration of Data Controllers and Processors of Major Importance
1035
+ */
1036
+ declare type DCPMITier = 'UHL' | 'EHL' | 'OHL' | 'listed' | 'none';
1037
+
1038
+ /**
1039
+ * Data Controller/Processor of Major Importance (DCPMI) classification under the
1040
+ * NDPC General Application and Implementation Directive (GAID) 2025.
1041
+ *
1042
+ * Volume-based tiers — data subjects processed within a six-month window:
1043
+ * - UHL (Ultra High Level): more than 5,000 → ₦250,000 / year
1044
+ * - EHL (Extra High Level): 1,000 – 5,000 → ₦100,000 / year
1045
+ * - OHL (Ordinary High Level): 200 – 999 → ₦10,000 / year
1046
+ * - below 200: not a DCPMI by volume
1047
+ *
1048
+ * Boundaries: the 1,000 mark resolves to EHL (so OHL is 200–999); UHL is
1049
+ * strictly greater than 5,000 (so 5,000 itself is EHL). The NDPC has revised
1050
+ * classification metrics before and shifts filing deadlines, so thresholds and
1051
+ * fees are configurable — treat the defaults as the September 2025 GAID
1052
+ * baseline, not a constant.
1053
+ *
1054
+ * `isDesignated` marks an organisation the Commission has otherwise listed as a
1055
+ * DCPMI; it is then a DCPMI regardless of volume. Below the volume tiers such an
1056
+ * organisation is reported as `'listed'` with the fee left at 0 and a note to
1057
+ * confirm the applicable tier/fee with the NDPC.
1058
+ *
1059
+ * @see NDPC General Application and Implementation Directive (GAID) 2025
1060
+ * @see NDPC Guidance Notice on the Registration of Data Controllers and Processors of Major Importance
1061
+ */
1062
+ declare type DCPMITier_2 = 'UHL' | 'EHL' | 'OHL' | 'listed' | 'none';
1063
+
522
1064
  /** Options for DOCX export of the finalised policy. */
523
1065
  declare interface DOCXExportOptions {
524
1066
  includeTOC?: boolean;
@@ -1314,6 +1856,57 @@ declare interface RegulatoryNotification {
1314
1856
  };
1315
1857
  }
1316
1858
 
1859
+ /**
1860
+ * Represents a notification sent to the NDPC (Nigeria Data Protection Commission)
1861
+ */
1862
+ declare interface RegulatoryNotification_2 {
1863
+ /** Unique identifier for the notification */
1864
+ id: string;
1865
+ /** ID of the breach this notification is for */
1866
+ breachId: string;
1867
+ /** Timestamp when the notification was sent */
1868
+ sentAt: number;
1869
+ /** Method used to send the notification */
1870
+ method: 'email' | 'portal' | 'letter' | 'other';
1871
+ /** Reference number assigned by the NDPC (if available) */
1872
+ referenceNumber?: string;
1873
+ /** Contact person at the NDPC */
1874
+ ndpcContact?: {
1875
+ name: string;
1876
+ email: string;
1877
+ phone?: string;
1878
+ };
1879
+ /** Content of the notification */
1880
+ content: string;
1881
+ /** Attachments included with the notification */
1882
+ attachments?: Array<{
1883
+ id: string;
1884
+ name: string;
1885
+ type: string;
1886
+ url: string;
1887
+ }>;
1888
+ /** Follow-up communications with the NDPC */
1889
+ followUps?: Array<{
1890
+ timestamp: number;
1891
+ direction: 'sent' | 'received';
1892
+ content: string;
1893
+ attachments?: Array<{
1894
+ id: string;
1895
+ name: string;
1896
+ type: string;
1897
+ url: string;
1898
+ }>;
1899
+ }>;
1900
+ /**
1901
+ * @deprecated Use ndpcContact instead. Kept for backward compatibility.
1902
+ */
1903
+ nitdaContact?: {
1904
+ name: string;
1905
+ email: string;
1906
+ phone?: string;
1907
+ };
1908
+ }
1909
+
1317
1910
  declare interface RegulatoryReference {
1318
1911
  section: string;
1319
1912
  title: string;
@@ -1404,6 +1997,44 @@ export declare interface RiskAssessment {
1404
1997
  justification: string;
1405
1998
  }
1406
1999
 
2000
+ /**
2001
+ * Represents a risk assessment for a data breach
2002
+ */
2003
+ declare interface RiskAssessment_2 {
2004
+ /** Unique identifier for the risk assessment */
2005
+ id: string;
2006
+ /** ID of the breach this assessment is for */
2007
+ breachId: string;
2008
+ /** Timestamp when the assessment was conducted */
2009
+ assessedAt: number;
2010
+ /** Person who conducted the assessment */
2011
+ assessor: {
2012
+ name: string;
2013
+ role: string;
2014
+ email: string;
2015
+ };
2016
+ /** Confidentiality impact (1-5) */
2017
+ confidentialityImpact: number;
2018
+ /** Integrity impact (1-5) */
2019
+ integrityImpact: number;
2020
+ /** Availability impact (1-5) */
2021
+ availabilityImpact: number;
2022
+ /** Likelihood of harm to data subjects (1-5) */
2023
+ harmLikelihood: number;
2024
+ /** Severity of potential harm to data subjects (1-5) */
2025
+ harmSeverity: number;
2026
+ /** Overall risk score */
2027
+ overallRiskScore: number;
2028
+ /** Risk level based on the overall score */
2029
+ riskLevel: 'low' | 'medium' | 'high' | 'critical';
2030
+ /** Whether the breach is likely to result in a risk to rights and freedoms */
2031
+ risksToRightsAndFreedoms: boolean;
2032
+ /** Whether the breach is likely to result in a high risk to rights and freedoms */
2033
+ highRisksToRightsAndFreedoms: boolean;
2034
+ /** Justification for the risk assessment */
2035
+ justification: string;
2036
+ }
2037
+
1407
2038
  /**
1408
2039
  * Compliance gap found in a processing record
1409
2040
  */
@@ -1625,6 +2256,14 @@ export declare interface UseAdaptivePolicyWizardReturn {
1625
2256
  */
1626
2257
  export declare function useBreach({ categories, initialReports, adapter, storageKey, useLocalStorage, onReport, onAssessment, onNotification, }: UseBreachOptions): UseBreachReturn;
1627
2258
 
2259
+ /**
2260
+ * React hook that memoises the `assessBreachNotification` utility — checks a
2261
+ * breach report's completeness against the NDPA S. 40 / GAID 2025 Article 33
2262
+ * notification requirements (mandated content, the 72-hour window, and any
2263
+ * data-subject communication owed on high risk).
2264
+ */
2265
+ export declare function useBreachNotificationAssessment(report: BreachReport_2, options?: BreachNotificationOptions_2): BreachNotificationAssessment_2;
2266
+
1628
2267
  export declare interface UseBreachOptions {
1629
2268
  /**
1630
2269
  * Available breach categories
@@ -1661,7 +2300,7 @@ export declare interface UseBreachOptions {
1661
2300
  /**
1662
2301
  * Callback function called when a notification is sent
1663
2302
  */
1664
- onNotification?: (notification: RegulatoryNotification) => void;
2303
+ onNotification?: (notification: RegulatoryNotification_2) => void;
1665
2304
  }
1666
2305
 
1667
2306
  export declare interface UseBreachReturn {
@@ -1676,7 +2315,7 @@ export declare interface UseBreachReturn {
1676
2315
  /**
1677
2316
  * All regulatory notifications
1678
2317
  */
1679
- notifications: RegulatoryNotification[];
2318
+ notifications: RegulatoryNotification_2[];
1680
2319
  /**
1681
2320
  * Submit a new breach report
1682
2321
  */
@@ -1704,11 +2343,11 @@ export declare interface UseBreachReturn {
1704
2343
  /**
1705
2344
  * Send a regulatory notification
1706
2345
  */
1707
- sendNotification: (breachId: string, notificationData: Omit<RegulatoryNotification, 'id' | 'breachId' | 'sentAt'>) => RegulatoryNotification;
2346
+ sendNotification: (breachId: string, notificationData: Omit<RegulatoryNotification_2, 'id' | 'breachId' | 'sentAt'>) => RegulatoryNotification_2;
1708
2347
  /**
1709
2348
  * Get a regulatory notification for a breach
1710
2349
  */
1711
- getNotification: (breachId: string) => RegulatoryNotification | null;
2350
+ getNotification: (breachId: string) => RegulatoryNotification_2 | null;
1712
2351
  /**
1713
2352
  * Get breaches that require notification within the next X hours
1714
2353
  */
@@ -1728,6 +2367,13 @@ export declare interface UseBreachReturn {
1728
2367
  isLoading: boolean;
1729
2368
  }
1730
2369
 
2370
+ /**
2371
+ * React hook that memoises the `generateComplianceAuditReturn` utility — derives
2372
+ * a DCPMI's Compliance Audit Returns schedule (initial-audit due date, next
2373
+ * annual filing deadline) and status under NDPC GAID 2025.
2374
+ */
2375
+ export declare function useComplianceAuditReturn(input: CARInput_2, options?: CAROptions_2): ComplianceAuditReturn_2;
2376
+
1731
2377
  /**
1732
2378
  * Computes an NDPA compliance score and returns a structured report
1733
2379
  * (score, rating, per-module breakdown, recommendations).
@@ -1945,6 +2591,13 @@ export declare interface UseCrossBorderTransferReturn {
1945
2591
  isLoading: boolean;
1946
2592
  }
1947
2593
 
2594
+ /**
2595
+ * React hook that memoises the `classifyDCPMI` utility — derives an organisation's
2596
+ * Data Controller/Processor of Major Importance tier, annual registration fee,
2597
+ * and Compliance Audit Returns obligations under NDPC GAID 2025.
2598
+ */
2599
+ export declare function useDCPMI(input: DCPMIInput_2, options?: DCPMIClassificationOptions_2): DCPMIClassification_2;
2600
+
1948
2601
  /**
1949
2602
  * Convenience wrapper around `usePrivacyPolicy`. With `orgInfo` provided
1950
2603
  * and `autoGenerate` enabled (default), `policy` is non-null on the first