Melosys Database Schema
Oracle database schema for melosys-api. Connection: jdbc:oracle:thin:@//localhost:1521/FREEPDB1 (user: melosys).
Entity-Relationship Overview
FAGSAK (Case)
├── AKTOER (1:N) - Actors (citizen, employer, authorities)
├── KONTAKTOPPLYSNING (1:N) - Contact information
├── FULLMAKT (via AKTOER) - Power of attorney
├── SKJEMA_SAK_MAPPING (1:N) - Bridge to melosys-skjema-api (V152)
└── BEHANDLING (1:N) - Treatments/processing instances
├── MOTTATTEOPPLYSNINGER (1:N) - Received documents/info
├── SAKSOPPLYSNING (1:N) - Case data (JSON CLOBs)
├── BEHANDLINGSNOTAT (1:N) - Notes
├── BEHANDLINGSAARSAK (1:N) - Processing reasons
├── TIDLIGERE_MEDLEMSPERIODE (1:N) - Previous membership periods
├── PROSESSINSTANS (1:N) - Saga/workflow instances
└── BEHANDLINGSRESULTAT (1:1) - Result
├── LOVVALG_PERIODE (1:N) - Applicable legislation periods
├── MEDLEMSKAPSPERIODE (1:N) - Membership periods
├── ANMODNINGSPERIODE (1:N) - Exception request periods
├── UTPEKINGSPERIODE (1:N) - Designation periods (Art. 13)
├── TRYGDEAVGIFTSPERIODE (1:N) - Social security charge periods
├── AARSAVREGNING (1:1) - Annual reconciliation (årsavregning)
├── VEDTAK_METADATA (1:1) - Decision metadata
├── VILKAARSRESULTAT (1:N) - Condition results
├── AVKLARTEFAKTA (1:N) - Clarified facts
└── KONTROLLRESULTAT (1:N) - Control results
Recent changes (V144–V154, Jan–Apr 2026): New skjema_sak_mapping table
(bridge to melosys-skjema-api). kilde column added to lovvalg_periode,
medlemskapsperiode, helseutgift_dekkes_periode. aarsavregning columns
renamed: *_fra_avgiftssystemet → *innbetalt_trygdeavgift. New PROSESS_TYPE
for digital søknad-mottak. See Recent Migrations below.
Core Tables
FAGSAK (Case)
Primary case entity. PK: SAKSNUMMER (format: MEL-{sequence}).
| Column | Type | Description |
|---|
| SAKSNUMMER | VARCHAR2(99) | Primary key, e.g., "MEL-12345" |
| GSAK_SAKSNUMMER | NUMBER | Archive case ID (Joark/GSAK) |
| FAGSAK_TYPE | VARCHAR2(99) | FK to FAGSAK_TYPE (EU_EOS, TRYGDEAVTALE, FTRL) |
| TEMA | VARCHAR2(20) | FK to FAGSAK_TEMA (MEDLEMSKAP_LOVVALG, UNNTAK, TRYGDEAVGIFT) |
| STATUS | VARCHAR2(99) | FK to FAGSAK_STATUS |
| BETALINGSVALG | VARCHAR2(99) | Payment choice |
BEHANDLING (Treatment)
Processing instance within a case. PK: ID.
| Column | Type | Description |
|---|
| ID | NUMBER | Primary key (sequence) |
| SAKSNUMMER | VARCHAR2(99) | FK to FAGSAK |
| STATUS | VARCHAR2(99) | FK to BEHANDLING_STATUS |
| BEH_TYPE | VARCHAR2(99) | FK to BEHANDLING_TYPE |
| BEH_TEMA | VARCHAR2(99) | FK to BEHANDLING_TEMA |
| BEHANDLINGSFRIST | DATE | Processing deadline |
| OPPGAVE_ID | VARCHAR2(10) | External task ID |
| INITIERENDE_JOURNALPOST_ID | VARCHAR2(99) | Initiating document ID |
| OPPRINNELIG_BEHANDLING_ID | NUMBER | FK to parent BEHANDLING (self-ref) |
AKTOER (Actor)
Parties involved in a case. PK: ID.
| Column | Type | Description |
|---|
| ID | NUMBER | Primary key |
| SAKSNUMMER | VARCHAR2(99) | FK to FAGSAK |
| ROLLE | VARCHAR2(99) | FK to ROLLE_TYPE (BRUKER, ARBEIDSGIVER, etc.) |
| AKTOER_ID | VARCHAR2(99) | NAV actor ID (for BRUKER) |
| PERSON_IDENT | VARCHAR2(11) | Norwegian ID number |
| ORGNR | VARCHAR2(99) | Organization number |
| EU_EOS_INSTITUSJON_ID | VARCHAR2(99) | EU/EEA institution ID |
| TRYGDEMYNDIGHET_LAND | VARCHAR2(2) | Country code for authority |
BEHANDLINGSRESULTAT (Result)
Outcome of a treatment. PK: BEHANDLING_ID (1:1 with BEHANDLING).
| Column | Type | Description |
|---|
| BEHANDLING_ID | NUMBER | PK + FK to BEHANDLING |
| RESULTAT_TYPE | VARCHAR2(99) | FK to BEHANDLINGSRESULTAT_TYPE |
| BEHANDLINGSMAATE | VARCHAR2(99) | Processing method |
| FASTSATT_AV_LAND | VARCHAR2(99) | Country that determined result |
| BEGRUNNELSE_FRITEKST | VARCHAR2(4000) | Justification text |
| FAKTURASERIE_REFERANSE | VARCHAR2(40) | Billing series reference |
| TRYGDEAVGIFT_TYPE | VARCHAR2(99) | Social security charge type |
Period Tables
All periods belong to BEHANDLINGSRESULTAT via BEH_RESULTAT_ID — except
MEDLEMSKAPSPERIODE, whose FK column is BEHANDLINGSRESULTAT_ID (renamed in
V109). Both FK columns reference BEHANDLINGSRESULTAT(BEHANDLING_ID).
LOVVALG_PERIODE (Applicable Legislation Period)
| Column | Type | Description |
|---|
| FOM_DATO / TOM_DATO | DATE | Period start/end |
| LOVVALGSLAND | VARCHAR2(99) | Country code |
| LOVVALG_BESTEMMELSE | VARCHAR2(99) | Legal provision |
| INNVILGELSE_RESULTAT | VARCHAR2(99) | Grant/denial result |
| MEDLEMSKAPSTYPE | VARCHAR2(99) | Membership type |
| TRYGDE_DEKNING | VARCHAR2(99) | Coverage type |
MEDLEMSKAPSPERIODE (Membership Period)
| Column | Type | Description |
|---|
| FOM_DATO / TOM_DATO | DATE | Period start/end |
| INNVILGELSE_RESULTAT | VARCHAR2(99) | Grant/denial |
| MEDLEMSKAPSTYPE | VARCHAR2(99) | Membership type |
| TRYGDE_DEKNING | VARCHAR2(99) | Coverage |
| BESTEMMELSE | VARCHAR2(99) | Legal basis |
| MEDLPERIODE_ID | NUMBER | MEDL external ID |
Common Queries
Find case with all actors
SELECT f.*, a.rolle, a.aktoer_id, a.orgnr, a.person_ident
FROM fagsak f
JOIN aktoer a ON a.saksnummer = f.saksnummer
WHERE f.saksnummer = 'MEL-12345';
Find active treatments for person
SELECT b.*, f.saksnummer
FROM behandling b
JOIN fagsak f ON b.saksnummer = f.saksnummer
JOIN aktoer a ON a.saksnummer = f.saksnummer
WHERE a.rolle = 'BRUKER' AND a.person_ident = '12345678901'
AND b.status NOT IN ('AVSLUTTET');
Find membership periods for case
SELECT mp.*
FROM medlemskapsperiode mp
JOIN behandlingsresultat br ON mp.behandlingsresultat_id = br.behandling_id
JOIN behandling b ON br.behandling_id = b.id
WHERE b.saksnummer = 'MEL-12345';
Check prosessinstans status
SELECT p.*, b.saksnummer, b.status as beh_status
FROM prosessinstans p
JOIN behandling b ON p.behandling_id = b.id
WHERE b.id = :behandlingId
ORDER BY p.registrert_dato DESC;
Find stuck treatments
SELECT b.id, b.status, b.endret_dato, f.saksnummer
FROM behandling b
JOIN fagsak f ON b.saksnummer = f.saksnummer
WHERE b.status = 'IVERKSETTER_VEDTAK'
AND b.endret_dato < SYSDATE - INTERVAL '2' HOUR;
Recent Migrations
Latest migration is V155 (tekstblokker). Changes since V143:
| V | Date | What |
|---|
| V144 | 2026-01-07 | New PROSESS_STEG LAGRE_PERSONOPPLYSNINGER |
| V145 | 2026-01-15 | New PROSESS_STEG OPPRETTE_AARSAVREGNING_ENDRING (auto-opprett årsavregning tilbake i tid) |
| V146 | 2026-01-19 | saksopplysning_kilde adds versjon NUMBER(19) DEFAULT 0 — optimistic locking fix for orphanRemoval race condition |
| V147 | 2026-02-16 | New PROSESS_TYPE MELOSYS_MOTTAK_DIGITAL_SØKNAD + 4 nye steg (HENT_SØKNADSDATA, OPPRETT_SAK_OG_BEHANDLING_SØKNAD, OPPRETT_OG_FERDIGSTILL_JOURNALPOST_SØKNAD, LAGRE_SAKSOPPLYSNINGER_SØKNAD) |
| V148 | 2026-02-16 | kontaktopplysning.kontakt_telefon utvidet til VARCHAR2(255) |
| V149 | 2026-02-27 | Fjerner steg LAGRE_SAKSOPPLYSNINGER_SØKNAD (lagring nå i OPPRETT_SAK_OG_BEHANDLING_SØKNAD) |
| V150 | 2026-03-16 | New PROSESS_STEG AVSLUTT_AARSAVREGNINGER (lukker åpne årsavregninger ved annullering) |
| V151 | 2026-04-16 | helseutgift_dekkes_periode adds kilde VARCHAR2(30) DEFAULT 'MELOSYS' NOT NULL |
| V152 | 2026-04-20 | NEW TABLE skjema_sak_mapping (RAW(16) skjema_id ↔ saksnummer). New PROSESS_TYPE MELOSYS_MOTTAK_EKSISTERENDE_DIGITAL_SØKNAD. Steg fra V147 omdøpt til *_DIGITAL_SØKNAD-varianter (HENT_DIGITAL_SØKNADSDATA, OPPRETT_SAK_OG_BEHANDLING_DIGITAL_SØKNAD, OPPRETT_OG_FERDIGSTILL_JOURNALPOST_DIGITAL_SØKNAD) + nye HÅNDTER_EKSISTERENDE_SAK_DIGITAL_SØKNAD, SEND_SAKSNUMMER_TIL_MELOSYS_SKJEMA_API |
| V153 | 2026-04-23 | aarsavregning columns renamed: har_trygdeavgift_fra_avgiftssystemet → har_innbetalt_trygdeavgift, trygdeavgift_fra_avgiftssystemet → innbetalt_trygdeavgift |
| V154 | 2026-04-30 | medlemskapsperiode.kilde + lovvalg_periode.kilde added (VARCHAR2(30), nullable) |
| V155 | — | NEW TABLE tekstblokker (TEKSTBLOKK + TEKSTBLOKK_TAG, reusable text blocks with tags) |
Note on PROSESS_STEG renames (V152): Oracle doesn't support ON UPDATE CASCADE, so the pattern is INSERT new code → UPDATE child rows (PROSESSINSTANS.SIST_FULLFORT_STEG, PROSESSINSTANS_HENDELSER.STEG) → DELETE old code. Use this same pattern for any future PROSESS_STEG rename.
Detailed Documentation