Duplicate Activity Detection
Feature Detail
Description
Identifies and surfaces likely duplicate activity registrations - the same activity logged twice by overlapping coordinators, or by both a peer mentor and a coordinator doing proxy reporting for the same event. The system computes similarity on key axes (date, duration, contact, mentor, organization) and presents candidate pairs in a review page where the admin confirms or dismisses the duplicate verdict. Confirmed duplicates collapse into a single canonical activity record; dismissed pairs are remembered so they do not resurface.
Sources & reasoning
Explicitly requested by NHF in §3.2 unique needs and codified in §8 canonical area taxonomy. Not in MVP admin scope (§5); fits naturally with the rest of Activity Oversight in Core Product per source roadmap structure.
-
docs/source/likeperson.md · line 67Duplikatvarsling: Fange opp nÄr samme aktivitet registreres av flere koordinatorer.
-
docs/source/likeperson.md · line 375admin-activity-oversight | Activity Oversight | Activity Review & Approval, Activity Flagging, Duplicate Activity Detection
Analysis
NHF explicitly raised duplicate registrations as a real-world problem when activities are logged across multiple coordinators or lokallag, and the same risk grows with bulk and proxy registration. Without detection, duplicates inflate Bufdir-reported volumes (a compliance risk that could jeopardise funding) and distort coordinator dashboards. Automated detection plus a human confirmation step gives the organization an honest activity count without forcing admins to comb through hundreds of records manually, which is exactly the kind of administrative burden the platform is meant to eliminate.
Run a Duplicate Detection Service as a backend job that scans new and updated activities, scoring candidate pairs on date proximity (±1 day), duration overlap, shared contact, and same organization. Candidates above threshold are written to a duplicate_candidates table with status pending; admins review through a dedicated Duplicate Review Page that surfaces side-by-side comparison and merge controls. Implementation lives in the Next.js API on Vercel against the shared relational database. Confirmed-duplicate decisions are idempotent and audit-logged. The detection is heuristic (no ML) for v1 - thresholds tunable per organization via configuration, not code.
Quality Assurance
Organization Administrator (reviewer + resolver)Organization Administrator
Quick UAT
- Logg inn i Admin-portalen som Organisasjonsadministrator og Ă„pne Aktiviteter â Duplikatkontroll.
- Bekreft at listen viser foreslÄtte duplikatpar rangert etter likhetsscore, med kontakt, dato, tidsvindu, aktivitetstype og likeperson synlig per par.
- Velg det Ăžverste paret og sammenlign de to aktivitetene side ved side i detaljvisningen.
- Trykk SlÄ sammen for Ä beholde én aktivitet og fjerne duplikatet.
- Bekreft sammenslÄing i bekreftelsesdialogen og vent pÄ statusmelding.
- Bekreft at paret forsvinner fra Duplikatkontroll-listen og at telleren for ventende duplikater reduseres med én.
- Ă pne neste par, trykk Marker som ulike, og bekreft at paret fjernes fra listen uten Ă„ slette noen aktivitet.
Quick UAT â Accessibility
-
Logg inn i Admin-portalen som Organisasjonsadministrator og Ă„pne Aktiviteter â Duplikatkontroll.
- Screen reader Sideoverskrift 'Duplikatkontroll' annonseres; tab-rekkefĂžlge: hovedmeny â undermeny â sideoverskrift â tabell.
- Keyboard / focus Hele navigasjonen nÄs med Tab; Enter aktiverer menypunkt.
- Focus visibility Synlig fokusring pÄ menypunkt og sideoverskrift.
-
Bekreft at listen viser foreslÄtte duplikatpar rangert etter likhetsscore, med kontakt, dato, tidsvindu, aktivitetstype og likeperson synlig per par.
- Screen reader Tabellen annonseres med antall rader; kolonneoverskrifter leses opp ved navigering.
- Keyboard / focus Piltaster navigerer mellom rader og celler; Home/End hopper til start/slutt.
- Contrast Likhetsscore vises som tall pluss farge, ikke kun farge; 4.5:1 kontrast pÄ tekst.
-
Velg det Ăžverste paret og sammenlign de to aktivitetene side ved side i detaljvisningen.
- Screen reader Detaljvisning annonseres som dialog/region; felter med avvik merkes 'avvik'.
- Focus visibility Fokus flyttes inn i detaljvisningen ved Äpning og tilbake til raden ved lukking.
- Zoom Sammenligningen er brukbar ved 200% zoom; kolonner stables vertikalt om nĂždvendig.
-
Trykk SlÄ sammen for Ä beholde én aktivitet og fjerne duplikatet.
- Focus visibility Synlig fokusring pÄ SlÄ sammen-knapp; knappen har tilgjengelig navn 'SlÄ sammen duplikat'.
- Touch target Knappen er minst 24Ă24 CSS-piksler.
-
Bekreft sammenslÄing i bekreftelsesdialogen og vent pÄ statusmelding.
- Screen reader Dialog annonseres som modal; primÊrknapp 'Bekreft sammenslÄing' og 'Avbryt' leses opp.
- Keyboard / focus Tab sirkulerer kun inne i dialogen; Esc avbryter.
- Focus visibility Fokus settes pÄ fÞrste knapp i dialogen ved Äpning.
-
Bekreft at paret forsvinner fra Duplikatkontroll-listen og at telleren for ventende duplikater reduseres med én.
- Screen reader Oppdatert antall ventende duplikater annonseres hĂžflig via aria-live.
- Live region 'Duplikat slÄtt sammen. Ett element fjernet fra listen.'
-
Ă pne neste par, trykk Marker som ulike, og bekreft at paret fjernes fra listen uten Ă„ slette noen aktivitet.
- Focus visibility Fokus returnerer til neste rad i listen etter handling.
- Live region 'Markert som ulike. Begge aktiviteter beholdt.'
Role Boundaries
4 role(s) must NOT access this feature-
Peer Mentor (Likeperson)
Duplikatkontroll finnes ikke i mobilappens navigasjon; likepersoner har ikke tilgang til Admin-portalen. Direkte API-kall returnerer 403.
-
Coordinator (Koordinator)
Koordinatorer logger ikke inn i Admin-portalen og ser ikke Duplikatkontroll i mobilappen. Deep-link til admin-siden returnerer 403.
-
Global Administrator
Uten tidsbegrenset support-tilgang gitt av organisasjonen er Duplikatkontroll utilgjengelig; forsĂžk returnerer 403 og hendelsen logges i organisasjonens audit-logg.
-
Prospective Buyer
Ingen pÄlogging pÄ Admin-portalen; Duplikatkontroll er ikke nÄdd fra sales-website.
Expected End State
Det utvalgte duplikatparet er enten slÄtt sammen til én aktivitet (redundant aktivitet fjernet) eller markert som ulike (begge aktiviteter beholdt). Paret er fjernet fra Duplikatkontroll-kÞen, telleren er oppdatert, og handlingen er sporet i audit-loggen slik at Bufdir-rapporter ikke dobbelteller arbeidet.
Components (9)
Shared Components
These components are reused across multiple features
User Stories
No user stories have been generated for this feature yet.