본문으로 건너뛰기
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 / 1,000자

이 양식은 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의 스킬 모두 보기

이 스킬의 문제 신고