跳到正文
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(原文)

安装前可以查看交给 AI 代理的指令内容。

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 的全部技能

报告此技能的问题