Define domain models for duplicate activity detection
epic-multi-chapter-membership-handling-core-services-task-002 — Define the domain types required by the Duplicate Activity Detection Service: DuplicateActivityWarning (with matching activity reference, date delta, and activity_type), PendingActivity value object, and the abstract service interface with checkForDuplicates method signature returning Future<DuplicateActivityWarning?>.
Acceptance Criteria
Technical Requirements
Implementation Notes
The duplicate detection use case originates from NHF's requirement to prevent two coordinators from registering the same activity for the same contact. The warning is non-blocking — it informs the user but does not prevent saving. Design the interface to return Future
Reuse the existing activityType enumeration from the core activity domain — do not introduce a parallel enum. Place all files under lib/domain/duplicate_detection/.
Testing Requirements
Unit tests (flutter_test) for: (1) PendingActivity equality by field values; (2) DuplicateActivityWarning correctly computes or stores dateDelta; (3) null return from a stub implementation of checkForDuplicates represents no-duplicate correctly. All tests run without network or database dependencies. Target 100% line coverage on domain files introduced in this task.
The ±1 day duplicate detection tolerance is specified in the acceptance criteria but timezone handling is not defined. A coordinator in UTC+2 submitting at 23:00 and another in UTC+0 submitting at 01:00 the next calendar day could trigger or miss a duplicate depending on which timezone the comparison uses.
Mitigation & Contingency
Mitigation: Define and document the authoritative timezone for all date comparisons (UTC stored in Supabase, all comparisons performed in UTC). Add timezone boundary unit tests covering the ambiguous ±1 day edges.
Contingency: If false positives or false negatives are reported in production, provide a coordinator-visible audit trail of duplicate detections so erroneous flags can be investigated and cleared manually.
The Duplicate Activity Detection Service performs a cross-chapter join query synchronously during the activity submission flow. On slow mobile connections this could cause a perceptible stall on the submission confirmation step, degrading user experience.
Mitigation & Contingency
Mitigation: Pre-fetch the cross-chapter activity dataset for the selected contact immediately when the contact is selected in the activity wizard (not only at submit time), storing the result in the state manager for instant comparison at submission.
Contingency: If latency is still unacceptable, implement a loading indicator on the submit action and add a configurable server-side timeout with graceful degradation: if the check times out, allow submission with a logged 'check skipped' audit entry rather than blocking the user.