# Onboarding og offboarding på kontaktkortet Kontaktkortets oversigt viser separate forløb. En dato kan gemmes uden automatik. Automatik bruger kalenderdage og kl. 08 i Europe/Copenhagen, kontrolleres ved API-start og hvert femte minut og indhenter forfaldne forløb efter nedetid. Sagens deadline sættes til kl. 17 på datoen, gemt som UTC efter sagsmodulets konvention. Åbne hovedsager matches på kunde, direkte kontaktrelation og eksplicit type/tag. En kandidat giver en undersag; flere kræver valg på kontaktkortet. En oprettet sags reference bevares ved datoændring. Afsluttede sager kræver manuel behandling. Annullering stopper automatikken og sletter ingen sager. ## Installation Anvend kun `migrations/1076_contact_lifecycle.sql` i det ønskede miljø og genstart API'et. Migrationen tilføjer en tabel og indeks uden at ændre eksisterende data. Uden migration svarer de nye endpoints med 503; eksisterende kontakt-API bevares. Ingen forløb eller sager oprettes af migrationen. API: GET/POST `/api/v1/contacts/{id}/lifecycle`, GET `/preview`, PATCH `/{event_id}` og POST `/{event_id}/cancel` under samme base. Læsning kræver cases.view/tickets.view; redigering cases.edit/tickets.edit. Automatik kræver desuden sagsoprettelse og skabeloner templates.run. Automatikkens seneste godkender skal fortsat være aktiv og have rettighederne. ## Kontrol og drift Kør `pytest tests/test_contact_lifecycle_api.py tests/test_contact_lifecycle_worker.py tests/test_contacts_router_simple.py` med projektets venv og `node tests/js/contact-lifecycle.test.cjs`. Kontrollér i browseren: gem dato uden automatik, planlæg automatisk forløb, vælg mellem flere hovedsager, åbn oprettet sag, ændr dato og annuller. Kortet viser fejl og behov for manuel behandling. Tekniske fejl logges af jobbet `check_contact_lifecycles`; forløb i fejl genforsøges ved næste kørsel. Ved tilbagerulning deaktiveres jobbet/kodeændringen; behold tabellen for at bevare historik og referencer. Sammenlægning af kontakter flytter forløbene med.