本文へ移動
cccskills
無料GitHub で公開

medl

Expert knowledge of MEDL (Medlemskapsregister) integration in melosys-api. Use when: (1) Debugging MEDL period creation/update failures, (2) Understanding data mapping between domain entities and MEDL API, (3) Working with saga steps that write to MEDL (LagreMedlemsperiodeMedl, LagreLovvalgsperiodeMedl), (4) Understanding MEDL enums (PeriodestatusMedl, LovvalgMedl, DekningMedl, GrunnlagMedl), (5) Troubleshooting Article 13 provisional vs final period logic.

日本語の概要は準備中です。原文の説明を表示しています。

インストール方法を見る

含まれるファイル(4)

  • SKILL.md9.1 KB
  • references/debugging.md7.2 KB
  • references/enums.md7.2 KB
  • references/mapping.md6.5 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

MEDL Integration

MEDL (Medlemskapsregister) is NAV's central registry for membership and law choice periods. Melosys writes periods to MEDL when vedtak is made.

Quick Reference

Module Structure

integrasjon/
├── medl/
│   ├── MedlService.kt              # Core service orchestrating operations
│   ├── MedlemskapClient.kt         # REST client (open class, @Retryable)
│   ├── MedlPeriodeKonverter.kt     # Domain → MEDL enum mapping (object)
│   └── api/v1/                     # Request/response DTOs
│       ├── MedlemskapsunntakForPost.kt
│       ├── MedlemskapsunntakForPut.kt
│       ├── MedlemskapsunntakForGet.kt
│       ├── MedlemskapsunntakSoekRequest.kt
│       └── Sporingsinformasjon.kt

service/medl/
├── MedlPeriodeService.java         # Business logic for period operations
└── MedlAnmodningsperiodeService.java

saksflyt/steg/medl/
├── LagreMedlemsperiodeMedl.kt      # FTRL membership periods
├── LagreLovvalgsperiodeMedl.kt     # EU/EEA law choice periods
├── LagreAnmodningsperiodeIMedl.java # Article 16 requests
├── AvsluttTidligereMedlPeriode.java
└── AvsluttTidligereMedlAnmodningsperiode.java

Key Operations

OperationMethodStatus
Create final periodopprettPeriodeEndelig()GYLD
Create provisionalopprettPeriodeForeløpig()UAVK
Create under clarificationopprettPeriodeUnderAvklaring()UAVK
Create terminatedopprettOpphørtPeriode()AVST
Update periodoppdaterPeriode*()Various
Reject/void periodavvisPeriode()AVST

MEDL Enums

PeriodestatusMedl (Period Status):

CodeMeaning
GYLDValid/approved
UAVKUnder clarification/pending
AVSTCeased/terminated

LovvalgMedl (Law Choice):

CodeMeaning
ENDLFinal (endelig)
FORLProvisional (foreløpig)
UAVKUnder clarification

StatusaarsakMedl (Status Reason):

CodeMeaning
AVVISTRejected
FEILREGISTRERTMisregistered
OPPHORTTerminated

Saga Steps

LagreMedlemsperiodeMedl

For FTRL membership periods (non-EU/EEA).

Skips when:

  • behandling.erEøsPensjonist() is true
  • fagsak.erLovvalg() is true

Behavior:

  • First-time: Creates only approved (INNVILGET) periods
  • Re-assessment: Replaces periods from original treatment

LagreLovvalgsperiodeMedl

For EU/EEA law choice periods. Most complex logic.

Skips when:

  • Registration exemption not approved
  • Tourist ship exemption + first-time treatment
  • EØS pensioner
  • Non-EU/EEA case type

Key decision: Provisional vs Final

// Provisional (FORL) when:
// - Article 13 AND no approved exemption registration
val erForeløpig = erArt13 && !erGodkjentRegistreringUnntak

// Final (ENDL) otherwise

LagreAnmodningsperiodeIMedl

For Article 16 exception request periods.

Creates: Period with status UAVK (under clarification) Inherits: medlPeriodeID from original treatment for re-assessments

Data Mapping

Domain → MEDL

Lovvalgsbestemmelse → GrunnlagMedl (see MedlPeriodeKonverter.kt / GrunnlagMedl.kt for the authoritative table):

// EU Regulation 883/2004
FO_883_2004_ART11_3A → GrunnlagMedl.FO_11_3_A   // .kode = "FO_11_3_a"
FO_883_2004_ART12_1  → GrunnlagMedl.FO_12_1
FO_883_2004_ART13_1A → GrunnlagMedl.FO_13_1_A   // .kode = "FO_13_1_a"
FO_883_2004_ART16_1  → GrunnlagMedl.FO_16       // ART16_1 and ART16_2 both map to FO_16

// Bilateral treaties (constant names are the country name, no KONV_ prefix)
Lovvalgsbestemmelser_trygdeavtale_au.AUS → GrunnlagMedl.AUSTRALIA  // .kode = "Australia"
Lovvalgsbestemmelser_trygdeavtale_us.USA → GrunnlagMedl.USA        // .kode = "USA"
// (KONV_STORBRIT_NIRLAND_* values exist only for the EFTA/Storbritannia konvensjon)

Note: GrunnlagMedl constants carry a .kode string that often differs from the constant name (e.g. FO_11_3_A.kode == "FO_11_3_a"). Production code transmits .kode, not .name.

Trygdedekninger → DekningMedl:

FULL_DEKNING → FULL
UTEN_DEKNING → UNNTATT
// FTRL-specific mappings for chapter 2 provisions

Land → ISO3 Country Code:

// Uses IsoLandkodeKonverterer
Land_iso2.SE → "SWE"
Land_iso2.DK → "DNK"

DTOs

For POST (Create) — MedlService.opprettPeriode builds the request in two stages: the constructor sets fraOgMed/tilOgMed/dekning/lovvalgsland/grunnlag, then .apply{} sets sporingsinformasjon/ident/lovvalg/status/statusaarsak. All wire values use .kode:

MedlemskapsunntakForPost(
    fraOgMed = periode.fom,
    tilOgMed = periode.tom,
    dekning = DekningMedl.FULL.kode,
    lovvalgsland = "SWE",                 // ISO3
    grunnlag = GrunnlagMedl.FO_12_1.kode  // .kode == "FO_12_1"
).apply {
    ident = fnr
    lovvalg = LovvalgMedl.ENDL.kode
    status = PeriodestatusMedl.GYLD.kode
    sporingsinformasjon = MedlemskapsunntakForPost.SporingsinformasjonForPost(
        kildedokument = KildedokumenttypeMedl.SED.kode
    )
}

For PUT (Update):

MedlemskapsunntakForPut(
    unntakId = medlPeriodeID,  // Required!
    // ... same fields as POST
    sporingsinformasjon = MedlemskapsunntakForPut.SporingsinformasjonForPut(
        kildedokument = "...",
        versjon = existingVersjon  // Required for optimistic locking!
    )
)

Common Issues

1. Null medlPeriodeID

Symptom: TekniskException: "Opprettelse av periode i MEDL feilet med retur av null medlPeriodeID"

Cause: MEDL returned null ID after creation

Investigation:

-- Check if period was actually created (table is lovvalg_periode; MEDL id col is medlperiode_id)
SELECT * FROM lovvalg_periode WHERE beh_resultat_id = :id;

2. Version Mismatch

Symptom: 409 Conflict or optimistic locking error

Cause: PUT request has stale versjon

Solution: Always fetch current period before update to get latest version

3. Unsupported Dekning/Grunnlag

Symptom: TekniskException: "Dekningstype støttes ikke" or "Lovvalgsbestemmelse støttes ikke i MEDL"

Cause: Domain value has no mapping to MEDL enum

Investigation: Check MedlPeriodeKonverter for supported mappings

4. Article 13 Provisional Logic

Symptom: Period created as provisional when should be final (or vice versa)

Key check:

// Must be Article 13 AND no approved exemption
val erForeløpig = harBestemmelse(ART_13_*) && !erGodkjentRegistreringUnntak

5. Missing Overgangsregler

Symptom: FunksjonellException: "Grunnlaget [code] og overgangsregler skal benyttes, men er tom"

Cause: Art. 87.8 or 87a requires transition rules but none provided

REST Endpoints

EndpointMethodPurpose
/rest/v1/periode/soekPOSTSearch periods
/api/v1/medlemskapsunntakPOSTCreate period
/api/v1/medlemskapsunntak/{id}GETFetch period
/api/v1/medlemskapsunntakPUTUpdate period

Debugging

Find Period in MEDL

// Via MedlService (public entry point — returns a Saksopplysning)
val saksopplysning = medlService.hentPeriodeListe(fnr, fom, tom)
// Note: hentEksisterendePeriode(medlPeriodeID) is a PRIVATE helper in MedlService;
// to fetch a single period directly, call MedlemskapClient.hentPeriode(periodeId).

Check Domain Entity

-- Lovvalgsperiode (table lovvalg_periode; FK beh_resultat_id, MEDL id medlperiode_id)
SELECT lp.id, lp.medlperiode_id, lp.fom_dato, lp.tom_dato, lp.lovvalgsland
FROM lovvalg_periode lp
WHERE lp.beh_resultat_id = :behandlingsresultatId;

-- Medlemskapsperiode (table medlemskapsperiode; FK behandlingsresultat_id, MEDL id medlperiode_id)
SELECT mp.id, mp.medlperiode_id, mp.fom_dato, mp.tom_dato
FROM medlemskapsperiode mp
WHERE mp.behandlingsresultat_id = :behandlingsresultatId;

Check Saga Step Execution

-- Columns: prosess_type (entity field `type`), sist_fullfort_steg (field `sistFullførtSteg`)
SELECT pi.uuid, pi.prosess_type, pi.status, pi.sist_fullfort_steg
FROM prosessinstans pi
WHERE pi.behandling_id = :behandlingId
AND pi.prosess_type LIKE 'IVERKSETT_VEDTAK%';

Logs

# MEDL REST calls
grep "MedlemskapClient" application.log

# Saga step execution
grep "LagreMedlemsperiodeMedl\|LagreLovvalgsperiodeMedl" application.log

Detailed Documentation

  • Enums: Complete MEDL enum reference
  • Mapping: Domain to MEDL data mapping
  • Debugging: SQL queries, log patterns, and failure-mode playbook

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

コメント

ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。

まだコメントはありません。最初のコメントを書いてみませんか。

送信するとすぐに公開されます。メールアドレスや電話番号などの個人情報は書かないでください。URL は 2 つまでです。

0 / 1000 文字

このフォームは reCAPTCHA で保護されており、Google のプライバシーポリシーと利用規約が適用されます。

同じリポジトリのスキル

Expert knowledge of Altinn A1 application processing for posted workers in melosys-api. Use when: (1) Understanding Altinn søknad/skjema processing, (2) Debugging MedlemskapArbeidEOS form mapping, (3) Understanding SoeknadMapper transformations, (4) Investigating posted worker application issues, (5) Understanding the MOTTAK_SOKNAD_ALTINN saga flow.

日本語の概要は準備中です。原文の説明を表示しています。

navikt/melosys-api22026年10月21日 更新

Expert knowledge of Employer/Employment integration (EREG/AAREG) in melosys-api. Use when: (1) Working with organization data from EREG (Enhetsregisteret), (2) Working with employment data from AAREG (Arbeidsforhold), (3) Understanding employer/organization lookup, (4) Debugging employer or employment issues, (5) Understanding the mapping between register data and domain models. Triggers: orgnummer, arbeidsforhold, EREG, AAREG, Enhetsregisteret, registeropplysninger, ansettelsesperiode, saksopplysning.

日本語の概要は準備中です。原文の説明を表示しています。

navikt/melosys-api22026年10月21日 更新

Modular monolith architecture overview for melosys-api. Use when needing to understand module structure, dependencies between modules, where to place new code, or when changes in one module might affect others. Triggers: "architecture", "module dependencies", "where should I put", "which modules", "dependency graph".

日本語の概要は準備中です。原文の説明を表示しています。

navikt/melosys-api22026年10月21日 更新

Expert knowledge of Behandling (case treatment) domain in melosys-api. Use when: (1) Understanding the behandling lifecycle and status transitions, (2) Debugging issues with behandling creation, status changes, or closure, (3) Understanding relationships between Fagsak, Behandling, and Behandlingsresultat, (4) Investigating why a behandling is stuck or has wrong status, (5) Understanding Behandlingstyper, Behandlingstema, Behandlingsstatus enums, (6) Debugging journalføring or SED-triggered behandling creation, (7) Understanding behandling creation via saksflyt sagas.

日本語の概要は準備中です。原文の説明を表示しています。

navikt/melosys-api22026年10月21日 更新

Expert knowledge of Behandlingsresultat (treatment result) domain in melosys-api. Use when: (1) Understanding result types and their meaning (FASTSATT_LOVVALGSLAND, MEDLEM_I_FOLKETRYGDEN, etc.), (2) Working with periods - Lovvalgsperiode, Medlemskapsperiode, Anmodningsperiode, Utpekingsperiode, (3) Debugging vedtak/decision metadata, criteria evaluation, or social insurance charges, (4) Understanding EU/EEA coordination logic and Article 16 exception handling, (5) Working with trygdeavgift (social insurance charge) calculations.

日本語の概要は準備中です。原文の説明を表示しています。

navikt/melosys-api22026年10月21日 更新

brev

無料

Expert knowledge of Brev (letter generation) in melosys-api. Use when: (1) Producing letters and decision documents (vedtaksbrev), (2) Understanding Dokgen templates and mapping, (3) Configuring letter recipients and distribution, (4) Debugging letter generation issues, (5) Adding new letter types or templates.

日本語の概要は準備中です。原文の説明を表示しています。

navikt/melosys-api22026年10月21日 更新

navikt のスキルをすべて見る

このスキルの問題を報告する