| name | medlemskap |
| description | Expert knowledge of membership (medlemskap) domain in melosys-api.
Use when: (1) Understanding pliktig vs frivillig membership determination,
(2) Debugging medlemskapsperiode creation and updates,
(3) Understanding trygdedekning combinations and rules,
(4) Investigating MEDL synchronization issues,
(5) Understanding membership status transitions and innvilgelsesresultat,
(6) Working with UtledMedlemskapsperioder for proposal generation,
(7) Understanding the relationship between bestemmelse, medlemskapstype, and trygdedekning.
Triggers: medlemskapsperiode, pliktig, frivillig, trygdedekning, MEDL, innvilgelsesresultat, medlPeriodeID, bestemmelse.
|
Medlemskap Domain
Medlemskap (membership) determines whether a person is covered by the Norwegian National Insurance
Scheme (folketrygden). The domain handles membership period creation, type determination (pliktig/frivillig),
coverage levels (trygdedekning), and synchronization with the central MEDL registry.
Quick Reference
Domain Model Hierarchy
Behandlingsresultat
└── medlemskapsperioder: Set<Medlemskapsperiode>
Medlemskapsperiode
├── id: Long
├── fom: LocalDate # Period start date
├── tom: LocalDate? # Period end date (nullable for open-ended)
├── innvilgelsesresultat: InnvilgelsesResultat # INNVILGET, DELVIS_INNVILGET, AVSLAATT, OPPHØRT
├── medlemskapstype: Medlemskapstyper # PLIKTIG, FRIVILLIG, UNNTATT, ...
├── trygdedekning: Trygdedekninger # FULL_DEKNING_FTRL, FTRL_2_9_*, etc.
├── bestemmelse: Bestemmelse # FTRL paragraph
├── medlPeriodeID: Long? # Reference to MEDL registry
└── trygdeavgiftsperioder: Set<Trygdeavgiftsperiode>
Key Enums
| Enum | Values | Description |
|---|
| InnvilgelsesResultat | INNVILGET, DELVIS_INNVILGET, AVSLAATT, OPPHØRT | Period outcome |
| Medlemskapstyper | PLIKTIG, FRIVILLIG, UNNTATT, DELVIS_UNNTATT, IKKE_MEDLEM | Membership type (mandatory/voluntary/exempt) |
| Trygdedekninger | FULL_DEKNING, FULL_DEKNING_FTRL, FULL_DEKNING_EOSFO, UTEN_DEKNING, the FTRL_2_9_* family, FTRL_2_7_/FTRL_2_7A_, treaty values (TILLEGGSAVTALE_NATO_HELSEDEL, UNNTATT_USA_5_2_G, UNNTATT_CAN_7_5_B) | Coverage type (stored in column trygde_dekning). See kodeverk enum Trygdedekninger for the full set. |
Trygdedekninger vs Avgiftsdekning — the HELSEDEL_MED_SYKEPENGER /
HELSEDEL_UTEN_SYKEPENGER / PENSJONSDEL_MED_YRKESSKADETRYGD /
PENSJONSDEL_UTEN_YRKESSKADETRYGD constants are NOT Trygdedekninger; they are the
Avgiftsdekning enum, derived from a Trygdedekninger value via
AvgiftsdekningerFraTrygdedekning for trygdeavgift. Don't confuse the two.
Medlemskapstype Determination
Determined by bestemmelse via UtledMedlemskapstype:
PLIKTIG (Mandatory) - Based on FTRL §2-1, §2-2, §2-5:
- FTRL_KAP2_2_1
- FTRL_KAP2_2_2
- FTRL_KAP2_2_3_ANDRE_LEDD
- FTRL_KAP2_2_5_FØRSTE_LEDD_A through H
- FTRL_KAP2_2_5_ANDRE_LEDD
- Vertslandsavtale_bestemmelser (NATO, etc.)
FRIVILLIG (Voluntary) - FTRL §2-8 and special cases:
- FTRL_KAP2_2_15_ANDRE_LEDD
- All other bestemmelser not in PLIKTIG list
Trygdedekning Options
Valid trygdedekninger per behandlingstema are defined in GyldigeTrygdedekningerService
(then intersected with the bestemmelse via LovligeKombinasjonerTrygdedekningBestemmelse):
| Behandlingstema | Available Trygdedekninger |
|---|
| YRKESAKTIV | FULL_DEKNING_FTRL, the full FTRL_2_9_* family, FTRL_2_7_TREDJE_LEDD_B_, FTRL_2_7A_ANDRE_LEDD_B_, TILLEGGSAVTALE_NATO_HELSEDEL |
| IKKE_YRKESAKTIV | FULL_DEKNING_FTRL, the FTRL_2_9_* family, FTRL_2_7_TREDJE_LEDD_B_*, TILLEGGSAVTALE_NATO_HELSEDEL |
| PENSJONIST | FULL_DEKNING_FTRL, FTRL_2_9_* (helse/pensjon variants), FTRL_2_7_TREDJE_LEDD_B_* |
Service Layer
MedlemskapsperiodeService
Location: service/src/main/kotlin/.../ftrl/medlemskapsperiode/MedlemskapsperiodeService.kt
Key operations:
hentMedlemskapsperioder(behandlingsresultatID) - Get all periods for treatment
opprettMedlemskapsperiode(...) - Create new period with validation
oppdaterMedlemskapsperiode(...) - Update existing period
slettMedlemskapsperiode(behandlingsresultatID, periodeID) - Delete period
erstattMedlemskapsperioder(...) - Replace periods on re-assessment
opprettEllerOppdaterMedlPeriode(...) - Sync to MEDL registry
OpprettForslagMedlemskapsperiodeService
Location: service/src/main/kotlin/.../ftrl/medlemskapsperiode/OpprettForslagMedlemskapsperiodeService.kt
Key operations:
opprettForslagPåMedlemskapsperioder(behandlingID, bestemmelse) - Generate period proposals
Validation checks:
- Sakstype must be FTRL (
validerSakstype)
- Bestemmelse-trygdedekning combination must be valid (
validerBestemmelse)
- Required vilkår must be fulfilled (
validerVilkår)
UtledMedlemskapsperioder
Location: service/src/main/kotlin/.../ftrl/medlemskapsperiode/UtledMedlemskapsperioder.kt
Key operations:
lagMedlemskapsperioder(grunnlag) - Create periods for first-time treatment
lagMedlemskapsperioderForAndregangsbehandling(...) - Create periods for re-assessment
Logic overview:
- For YRKESAKTIV/IKKE_YRKESAKTIV: Creates periods based on søknadsperiode and mottaksdato
- For PENSJONIST: Creates helsedel periods only
- Handles avslag (rejection) periods before mottaksdato
Period Lifecycle
Creation Flow
Søknad received → Journalføring → Behandling created
│
▼
OpprettForslagMedlemskapsperiodeService
(generates period proposals)
│
▼
Saksbehandler review/adjust
│
▼
fattVedtak() → IVERKSETT_VEDTAK_FTRL
│
▼
LAGRE_MEDLEMSKAPSPERIODE_MEDL (saksflyt steg)
(writes to MEDL registry)
InnvilgelsesResultat Transitions
| From | To | Trigger |
|---|
| (new) | INNVILGET | Positive vedtak |
| (new) | AVSLAATT | Rejection vedtak |
| INNVILGET | OPPHØRT | Termination (opphør) |
Re-assessment (Ny vurdering)
When creating new behandling for existing fagsak:
- Original periods are copied/referenced via
opprinneligBehandling
- New periods can modify or extend original periods
erstattMedlemskapsperioder() handles:
- Opphør (terminate) original INNVILGET periods not carried forward
- Feilregistrer (void) original OPPHØRT periods not carried forward
- Create/update new periods
Validation Rules
Period Field Validation
- fom: LocalDate
- innvilgelsesResultat
- bestemmelse
- trygdedekning
- Land is only Norway (NOR) AND
- Bestemmelse is FTRL_KAP2_2_1 (bosatt i Norge)
- tom cannot be before fom (PeriodeRegler.feilIPeriode)
Bestemmelse-Trygdedekning Validation
erBestemmelseGyldigForTrygdedekning(bestemmelse, trygdedekning)
Vilkår Validation
Before creating period proposals, required vilkår must be fulfilled:
behandlingsresultat.oppfyllerVilkår(vilkårForBestemmelse)
MEDL Integration
Synchronization Points
| Saga Step | When |
|---|
LAGRE_MEDLEMSKAPSPERIODE_MEDL | After vedtak, writes INNVILGET periods to MEDL |
| Re-assessment | Updates/terminates existing MEDL periods |
| Opphør | Changes period status to AVST (terminated) |
medlPeriodeID
- Created when period is first synced to MEDL
- Used for subsequent updates
- NULL means period not yet in MEDL (or MEDL write failed)
See Also
Refer to medl skill for detailed MEDL integration patterns.
Debugging Queries
Find Medlemskapsperioder for Behandling
SELECT mp.*, br.behandling_id
FROM medlemskapsperiode mp
JOIN behandlingsresultat br ON mp.behandlingsresultat_id = br.behandling_id
WHERE br.behandling_id = :behandlingId
ORDER BY mp.fom_dato;
Find Periods by Person
SELECT mp.*, b.id as behandling_id, f.saksnummer
FROM medlemskapsperiode mp
JOIN behandlingsresultat br ON mp.behandlingsresultat_id = br.behandling_id
JOIN behandling b ON br.behandling_id = b.id
JOIN fagsak f ON b.saksnummer = f.saksnummer
JOIN aktoer a ON a.saksnummer = f.saksnummer AND a.rolle = 'BRUKER'
WHERE a.aktoer_id = :aktorId
ORDER BY mp.fom_dato DESC;
Check MEDL Sync Status
SELECT mp.id, mp.fom_dato, mp.tom_dato, mp.innvilgelse_resultat,
mp.medlemskapstype, mp.medlperiode_id
FROM medlemskapsperiode mp
JOIN behandlingsresultat br ON mp.behandlingsresultat_id = br.behandling_id
WHERE br.behandling_id = :behandlingId
AND mp.medlperiode_id IS NULL;
Find Periods with Trygdeavgift
SELECT mp.*, tp.id as avgift_id, tp.trygdeavgift_beloep_mnd_verdi, tp.trygdeavgift_beloep_mnd_valuta
FROM medlemskapsperiode mp
JOIN trygdeavgiftsperiode tp ON tp.medlemskapsperiode_id = mp.id
WHERE mp.behandlingsresultat_id = :behandlingsresultatId;
Check Period Validation Issues
SELECT mp.*, b.beh_tema, f.fagsak_type as sakstype
FROM medlemskapsperiode mp
JOIN behandlingsresultat br ON mp.behandlingsresultat_id = br.behandling_id
JOIN behandling b ON br.behandling_id = b.id
JOIN fagsak f ON b.saksnummer = f.saksnummer
WHERE mp.tom_dato IS NULL
AND mp.bestemmelse != 'FTRL_KAP2_2_1';
Common Issues
| Issue | Symptoms | Investigation |
|---|
| Wrong medlemskapstype | PLIKTIG shown as FRIVILLIG | Check bestemmelse vs PliktigeMedlemskapsbestemmelser |
| Missing period proposals | No periods generated | Check vilkår fulfillment, bestemmelse-dekning combo |
| Invalid trygdedekning | FunksjonellException | Check LovligeKombinasjonerTrygdedekningBestemmelse |
| tom-dato required error | Can't save open-ended period | Only allowed for FTRL_KAP2_2_1 with land=NO |
| MEDL sync failed | medlPeriodeID is NULL | Check prosessinstans status, MEDL API logs |
| Period overlap | Kontroll warning | Check existing periods in MEDL via MedlemskapDokument |
Detailed Documentation