Microsoft To Do-integrasjon¶
TodoSyncAdapter synker personlige ePortal-oppgaver (oppgaver tildelt en bruker) til hver brukers Microsoft To Do-liste — slik at brukeren kan jobbe med ePortal-oppgavene i mobil-To-Do-appen. Adapteren bruker app-only-autentisering (Client Credentials) og kaller Microsoft Graph på vegne av hver enkelt bruker (/users/{upn}/todo/lists).
Type: Microsoft Graph API-sync, bidirectional med delta query Modul i ePortal: Konfigureres i Konti Connect, bruker Prosjekt-modulen og Microsoft 365-integrasjonen Karakteristisk: App-only med
Tasks.ReadWrite.All; per-bruker viawv_User.TodoSyncEnabled; delta query for inkrementell pull tilbake
Hva integrasjonen synker¶
| Retning | Entitet | Frekvens |
|---|---|---|
| ePortal → Microsoft To Do | Personlige oppgaver tildelt bruker → Microsoft To Do tasks (title, body, status, dueDate, priority) | Per scheduler |
| Microsoft To Do → ePortal | Endringer på sync'ede tasks (status, due date) tilbake til ePortal | Per scheduler (delta query) |
Implementasjon: TodoSyncAdapter.cs (basert på BaseGraphAdapter.cs)
Tilgang¶
| Hvem | Hva trengs |
|---|---|
| Hos kunden | Microsoft 365-lisens med Microsoft To Do tilgjengelig (Business Basic eller høyere) |
| Hos Konti | Administrator-tilgang til Konti Connect; app-registrering i Entra ID med Tasks.ReadWrite.All Application permission (admin consent) |
| Per bruker | TodoSyncEnabled = true på wv_User-raden; userName må matche Azure AD UPN (e-post) |
Forutsetninger¶
- M365 Graph-integrasjon er aktivert (
M365Graph.Enabled = true) - App-registrering har:
- Application permission:
Tasks.ReadWrite.All(med admin consent) - Application permission:
User.Read.All(for å resolvere UPN → AAD-bruker) - ePortal-brukerne har
userNamesatt til Azure AD UPN (typisk arbeids-e-post) - Brukerne har skrudd på "Synk til Microsoft To Do" i sin brukerprofil (
wv_User.TodoSyncEnabled = 1)
Konfigurasjon — feltforklaring¶
| Felt | Sted | Type | Påkrevd | Hva det betyr |
|---|---|---|---|---|
M365Graph.Enabled |
Innstillinger (sentralt) | Boolean | Ja | Master-switch for M365 Graph |
M365Graph.TenantId |
Innstillinger (sentralt) | String (GUID) | Ja | Azure AD-tenant |
M365Graph.ClientId |
Innstillinger (sentralt) | String (GUID) | Ja | App-registreringens client_id |
M365Graph.ClientSecret |
Innstillinger (sentralt) | String (hemmelighet) | Ja | App-registreringens client_secret. Krypteres |
TodoListName |
ConfigurationJson | String | Nei (default "ePortal Oppgaver") |
Navn på To Do-listen som opprettes for hver bruker |
DebugLogging |
ConfigurationJson | Boolean | Nei (default false) |
Detaljert logging av Graph-kall og user resolution |
DeltaLink_<userId> |
ConfigurationJson | String | Auto-administrert | Delta link for inkrementell pull-back per bruker. Lagres automatisk av adapteren |
Eksempel ConfigurationJson:
{
"TodoListName": "ePortal Oppgaver",
"DebugLogging": false,
"_comment": "Per-bruker styres synken av wv_User.TodoSyncEnabled. Adapteren oppretter en To Do-liste med navnet TodoListName hos hver påslått bruker."
}
Hemmelig håndtering:
ClientSecretlagres kryptert sentralt. Tokenet caches iIMicrosoftGraphAuthServiceper kundemiljø — mellomlageret deles ikke på tvers av kunder, og et on-behalf-of-token deles ikke mellom brukere (se Microsoft 365-integrasjon). Cachen invalideres ved 401/403, og kun for kundemiljøet som fikk feilen.
Slik gjør du — oppsett¶
1. Registrer Azure AD-applikasjon¶
Følg trinnene i Microsoft 365-integrasjon. Aktiver i tillegg:
- Application permissions:
Tasks.ReadWrite.AllUser.Read.All(for UPN-resolution)- Klikk Grant admin consent
Uten admin consent får adapteren 403 selv om tokenet returneres.
2. Lagre M365 Graph-innstillinger¶
Innstillinger → Konti Connect → Microsoft Graph-innstillinger:
TenantId,ClientId,ClientSecret- Aktiver
M365Graph.Enabled = true
3. Opprett integrasjon i Konti Connect¶
- Innstillinger → Konti Connect → Ny integrasjon
- Type: M365Todo
- Sett
TodoListName(eller la default"ePortal Oppgaver"stå) - Sett scheduler — typisk hvert 15.–30. minutt
- Lagre
4. Per-bruker aktivering¶
Hver bruker som vil synke må:
- Ha
userNamesatt til sin Azure AD UPN (typisk arbeids-e-post) - Sette
TodoSyncEnabled = 1på sin profil (kan eksponeres via brukerinnstillinger eller settes administrativt)
5. Test første kjøring¶
- Bruk Kjør nå
- Følg kjøringsloggen:
- "To Do sync completed: N/M users synced, X tasks processed"
- Per-bruker: opprettet liste / lagt til oppgaver / pull-back-resultat
- Verifiser i Microsoft To Do eller mobilappen at listen "ePortal Oppgaver" finnes og inneholder tildelte oppgaver
Mapping-detaljer¶
| ePortal-oppgave | Microsoft To Do task | Forklaring |
|---|---|---|
Task.TaskTitle |
title |
Oppgavetittel |
Task.TaskDescription |
— | Ikke synket — BuildTodoTaskPayload sender kun title, status, importance og dueDateTime; beskrivelse overføres ikke |
Task.TaskStatus |
status |
Mapping: ePortal-status → notStarted/inProgress/completed |
Task.DueDate |
dueDateTime |
Frist (UTC) |
Task.TaskPriority |
importance |
Mapping: høy/middels/lav → high/normal/low |
| (intern sync-mapping) | id |
Lagres i TaskExternalSync-tabellen for å matche tilbake ved pull |
Pull-back (To Do → ePortal)¶
- Adapteren bruker Microsoft Graph delta query for å hente endringer siden forrige kjøring
DeltaLink_<userId>lagres iConfigurationJson(per-bruker delta)- Ved første kjøring: full liste; deretter inkrementell
- Endringer som hentes tilbake:
- Status (fullført/ikke-fullført)
- Due date
- Endringer i beskrivelse fra To Do ignoreres — ePortal er master for fritekst-innhold. Tittel, status og frist synkes derimot tilbake til ePortal (
UpdateTaskStatusFromSyncAsyncoppdatererTaskTitle, status ogDueDate)
__UPDATE_CONFIG__-signal¶
Etter en kjøring der delta-link ble oppdatert, sender adapteren et internt info-signal __UPDATE_CONFIG__ til IntegrationService som persisterer ny ConfigurationJson til DB. Uten dette mister adapteren delta-state mellom kjøringer.
Frekvens og volum¶
- Anbefalt scheduler: hvert 15.–30. minutt
- Ingen Microsoft-grenser på antall oppgaver per liste (i praksis 1000+ uten problemer)
- Rate limiting (429):
Retry-Afterrespekteres (3 retries) - 503/504: eksponentiell backoff
- Per-bruker AAD-resolution: hvis 403 → token cache invalideres og ett retry med fersk token
Sikkerhet¶
ClientSecretkrypteres sentralt- Adapteren kaller Graph på vegne av brukeren via
/users/{upn}/todo/lists(app-only, ikke delegert OBO) - Krever admin consent på
Tasks.ReadWrite.All— diskuter med kunden om dette er akseptabelt (gir applikasjonen tilgang til alle brukeres To Do-data) - Conditional Access-policyer på "App-only-tilgang" kan blokkere — sjekk i Entra ID
Vanlige problemer¶
Brukeren får ikke oppgaver i Microsoft To Do¶
Sjekk i rekkefølge:
TodoSyncEnabled = 1påwv_User?userNamematcher Azure AD UPN (typisk arbeids-e-post)?- Brukeren har Microsoft 365-lisens med To Do?
- Kjøringsloggen: står det "User X not found in Azure AD"?
403 Forbidden på To Do-API¶
Manglende admin consent på Tasks.ReadWrite.All. Gå til Entra ID → App registrations → API permissions → "Grant admin consent". Adapteren prøver én gang med fersk token automatisk ved 403.
"User not found in Azure AD" warning¶
wv_User.userName matcher ingen UPN i Entra ID. Adapteren prøver først users/{upn} (direkte oppslag), så fallback til $filter=mail eq '<upn>' or proxyAddresses/any(...). Fiks: oppdater userName til riktig UPN.
Delta query feiler / oppgaver dukker opp dobbelt¶
Delta link er korrupt eller utløpt. Fjern DeltaLink_<userId> fra ConfigurationJson — adapteren faller tilbake til full pull ved neste kjøring.
Tittel/beskrivelse endres ikke fra To Do tilbake til ePortal¶
By design. Adapteren synker status, tittel og due date fra To Do tilbake (ikke beskrivelse) — ePortal er master for fritekst-innhold for å unngå konflikter.
Resource not found in Microsoft To Do for user X¶
Brukeren har ikke aktivert Microsoft To Do (eller ikke fått lisens). Adapteren hopper over brukeren og fortsetter med neste.
Oppgaver merket fullført i To Do reaktiveres ved neste sync¶
Mappingen mellom ePortal-status og status i Graph håndterer dette korrekt, men hvis ePortal-oppgaven er gjenåpnet vil pull-back fra To Do "miste" fullført-status. Sjekk om noen har endret status i ePortal mellom kjøringene.