Journaler

Læs de patientjournaler en behandler har frigivet

Server-exports. Kaldes fra server_script.

Exportene her er skrevet til Politi Tablet, så en betjent kan se en frigiven journal i sit borgeropslag. Men enhver server-side ressource kan bruge de samme tre.

Fortrolighedsreglerne

Journaler i EMS Tabletten er lukkede som udgangspunkt. Fem regler gælder for alt på denne side, og de håndhæves server-side i va_emsmdt:

  1. Kun frigivne journaler

    En behandler skal aktivt frigive den enkelte journal med en begrundelse. Er den ikke frigivet, findes den ikke set udefra — du får ikke at vide, at der er noget du ikke må se.

  2. Kun indsendte journaler

    En kladde kan ikke frigives.

  3. Kun journaler om patienten

    Stod borgeren som pårørende, vidne eller anmelder, handler journalen ikke om dem, og den følger ikke med.

  4. Frigivelsen tjekkes ved hvert opslag

    Tilbagekalder ambulancetjenesten en frigivelse, holder GetReleasedJournal op med at svare med det samme — også hvis du stadig har sagsnummeret i hånden. Cache derfor ikke journaler i dit eget script.

  5. Underskriften følger ikke med

    Behandlerens signatur er et stort data-URL uden værdi for tredjeparter og udelades.

Både frigivelse og tilbagekaldelse skrives i tabellen ems_journal_release_log med hvem, hvornår og hvorfor.

IsPoliceSharingEnabled

Er journaldeling slået til på denne server?

returnsboolean

false når Config.policeSharing.enabled er slået fra, eller når ingen af ressourcerne i Config.policeSharing.resource kører.

server.lua
if not exports.va_emsmdt:IsPoliceSharingEnabled() then
    return -- vis slet ikke din journal-sektion
end

Brug den til at afgøre, om din integration skal vise sig overhovedet. Et tomt faneblad er værre end intet faneblad.

Config.policeSharing.resource

Feltet må være én streng eller en liste af navne — den første der kører, tæller.

lua
resource = { 'va_policemdt', 'va_policemdt_dev' }

Det gør, at samme config kan følge både en udviklingsserver og en produktionsserver.

En tom liste springer tjekket over, så delingen står åben. Brug det kun til test, eller hvis du læser exportene fra din egen integration frem for fra Politi Tabletten.

GetReleasedJournals

Alle frigivne journaler om én borger, nyeste først.

Rækkerne er slanke og bevidst uden journalindhold, så et opslag på en borgerprofil er billigt. Indholdet hentes per journal med GetReleasedJournal, når nogen åbner den.

citizenIdentifierstringpåkrævet

Borgerens ESX-identifier, fx char1:abc….

returnstable[]

Slanke rækker, nyeste først.

række
caseNumberstring

Journalens nummer, fx JNL-2026-04791. Brug den til GetReleasedJournal.

titlestring

Fx Traume, Legion Square.

categorystring

Fx Traume.

prioritystring

Triage: lav · mellem · hoej

locationstring

Stedbetegnelse, fx Legion Square.

medictable

Den journalansvarlige behandler: { name, rank, callsign }.

createdAtnumber

Unix-tidsstempel.

releasetable

Frigivelsen: { at = number, by = string, reason = string }.

server.lua
local journals = exports.va_emsmdt:GetReleasedJournals('char1:abc…')

for _, j in ipairs(journals) do
    print(j.caseNumber, j.title, j.release.reason)
end

En række ser sådan ud:

lua
{
    caseNumber = 'JNL-2026-04791',
    title      = 'Traume, Legion Square',
    category   = 'Traume',
    priority   = 'hoej',              -- triage: 'lav' | 'mellem' | 'hoej'
    location   = 'Legion Square',
    medic      = { name = 'M. Sørensen', rank = 'Para.', callsign = 'Alpha-12' },
    createdAt  = 1766000000,          -- unix
    release    = {
        at     = 1766003600,          -- unix
        by     = 'L. Vestergaard',
        reason = 'Anmodning i sag S-2043',
    },
}

Du får en tom tabel når borgeren ikke har frigivne journaler, når identifieren er ukendt, og når delingen er slået fra. De tre kan ikke skelnes fra hinanden — og det er meningen. Skriv aldrig "ingen journaler fundet" på en måde, der afslører forskellen.

GetReleasedJournal

Hele journalen.

caseNumberstringpåkrævet

Journalens nummer, fx JNL-2026-04791.

returnstable | nil

nil dækker "findes ikke", "er ikke indsendt" og "frigivelsen er tilbagekaldt" under ét.

felter
officertable

Den journalansvarlige behandler: { name, initials, rank, callsign }.

colleaguestable[]

Medvirkende behandlere, samme form.

releasetable

{ at = number, by = string, reason = string }.

statetable

Selve journalindholdet.

state
datestring

Fx 2026-07-26.

timestring

Fx 14:12.

narrativestring

Behandlingsforløbet som rich-text HTML, fx <p>…</p>. Rens det, hvis du sender det til en NUI.

vitalstable

{ bpSystolic, bpDiastolic, pulse, spo2, respRate, temperature, gcs, bloodSugar } — alle tal, og alle nil når de ikke er målt.

chargestable[]

Diagnoser: { paragraf, title, penalty, maxMonths, fine }. Se navnene nedenfor.

medicationstable[]

{ code, name, strength, dose, quantity }

involvedtable[]

{ id, name, role } — patient, pårørende, vidner, anmeldere.

itemstable[]

Registrerede effekter.

vehiclestable[]

Køretøjer knyttet til journalen.

photostable[]

Vedhæftede billeder.

signaturenil

Altid nil. Udelades bevidst.

server.lua
local journal = exports.va_emsmdt:GetReleasedJournal('JNL-2026-04791')
if not journal then return end

print(journal.state.narrative)

for _, d in ipairs(journal.state.charges) do
    print(d.paragraf, d.title, d.penalty)   -- diagnosekode, diagnose, behandling
end

Ud over felterne fra listen indeholder den:

lua
{
    officer     = { name = …, initials = …, rank = …, callsign = … },
    colleagues  = { --[[ samme form ]] },
    state = {
        date = '2026-07-26', time = '14:12',
        narrative = '<p>…</p>',            -- rich-text HTML
        vitals = {
            bpSystolic = 96, bpDiastolic = 58, pulse = 122, spo2 = 94,
            respRate = nil, temperature = nil, gcs = 14, bloodSugar = nil,
        },
        charges     = { { paragraf = 'TR-03', title = 'Skudlæsion',
                          penalty = 'Blødningskontrol og hastetransport' } },
        medications = { { code = 'MOR-01', name = 'Morfin',
                          strength = '10 mg/ml', dose = '5 mg i.v.', quantity = 1 } },
        involved    = { { id = 'char1:abc…', name = 'Kasper Holm', role = 'patient' } },
        items = { … }, vehicles = { … }, photos = { … },
        signature = nil,                   -- udelades bevidst
    },
    release = { at = …, by = …, reason = … },
}

Behandleren hedder medic i listen fra GetReleasedJournals, men officer her. Det er to forskellige felter om samme person — byg mod formen på hvert export, ikke mod en fælles antagelse.

Feltnavnene i charges

charges er arvet fra politi-versionen, som denne tablet er bygget videre på. Navnene er juridiske, men betydningen er klinisk:

FeltBetyder her
paragrafDiagnosekoden, fx TR-03
titleDiagnosen, fx Skudlæsion
penaltyStandardbehandlingen
maxMonthsAnbefalet observationstid i minutter
fineEgenbetalingen i kr

maxMonths er minutter, ikke måneder. Skriver du feltet ud til en spiller uden at oversætte enheden, kommer der til at stå måneder, hvor der skulle stå minutter.

Et komplet eksempel

En journal-sektion i et andet script — med din egen gate foran.

server.lua
local EMS = 'va_emsmdt'

local function emsAvailable()
    return GetResourceState(EMS) == 'started'
        and exports[EMS]:IsPoliceSharingEnabled()
end

RegisterNetEvent('myscript:openCitizen', function(citizenIdentifier)
    local src = source

    -- Gate det selv: exportet spørger ikke hvem du er.
    if not exports.va_policemdt:HasMdtPermission(src, 'strafferegister') then
        return
    end

    if not emsAvailable() then return end

    -- pcall: exportet tilhører et andet produkt og kan mangle i ældre
    -- versioner. Din feature må ikke dø på det.
    local ok, journals = pcall(function()
        return exports[EMS]:GetReleasedJournals(citizenIdentifier)
    end)

    TriggerClientEvent('myscript:emsJournals', src, ok and journals or {})
end)

Send listen til klienten, men hent indholdet først når betjenten åbner en enkelt journal. Så er opslaget billigt, og frigivelsen bliver tjekket på det tidspunkt hvor journalen faktisk læses.