Lön

Så beräknas lönen — varje krona förklaras

Den här guiden förklarar exakt hur varje belopp på en lönebatch (PayrollBatch) räknas fram. Syftet är enkeltransparens — du som arbetsgivare eller chef ska kunna spåra varje krona tillbaka till dess källa utan blindfläck.

Läs den fullständiga tekniska referensen i docs/payroll-calculation.md om du vill se formlerna med kodreferenser.

1. Arbetade timmar — alltid faktisk clockad tid

Endast faktiskt clockad tid ligger till grund för lönen — aldrig schemalagd tid. Källan är TimeEntry (clocked_in_at → clocked_out_at) från godkända tidrapporter i perioden.

arbetade timmar = clockad tid − rasttid

Raster dras av från arbetade timmar. OB-rättighet baseras på hela den clockade perioden (när du var incheckad), så rasten kortar inte OB:n — det är svensk standard.

2. Timlön

Timlönen hämtas från den anställdas CompensationProfile, som versionshanteras via effective_from/effective_to. Profilen som gällde på batchens period_start används för hela körningen.

Saknas avtal eller profil blir timlönen 0 — då är det en datainställning att fixa i den anställdas avtal, inte ett beräkningsfel.

3. OB-tillägg (obekväm arbetstid)

Beräkningen går minut för minut genom den clockade perioden i den anställdas tidszon och lägger varje minut i den mest prioriterade OB-klass som matchar.

Standardmall: kommunal_2024 från config/cba.php. Företag kan konfigurera egna regler via cba_rate_rules.

Klass När den gäller Tillägg (SEK/tim, på toppen av timlönen)
OB1 Mån–Fre 18:00–22:00, Lör 07:00–21:00 46,00
OB2 Alla dagar 22:00–00:00 73,00
OB3 Alla dagar 00:00–07:00 + Söndag hela dygnet 152,00
OB4 Svenska helgdagar (röda dagar), hela dygnet 203,00

När klasser överlappar vinner den med högst prioritet (OB4 > OB3 > OB2 > OB1) för varje minut.

4. Semesterlön

semesterlön = (bruttolön + OB) × semesterprocent / 100

Semesterprocenten hämtas från avtalet (vacation_pay_percent, standard 12%). Semesterlönen beräknas på bruttolön + OB — inte på sjuklön eller milersättning. Semesterlönen är skattepliktig.

5. Sjuklön (enligt Sjuklönelagen)

Period Betalas av arbetsgivare? Ersättningsnivå
Dag 1 (karens) Nej — obetald 0%
Dag 2–14 Ja 80% av normal daglig lön
Dag 15+ Nej — till Försäkringskassan 0% från arbetsgivare
normal daglig lön = timlön × genomsnittliga dagliga timmar
sjuklön           = sjuklönedagar × normal daglig lön × 80%

De genomsnittliga dagliga timmarna hämtas från den anställdas verkliga TimeEntry-historik de senaste 4 veckorna (28 dagar). Saknas historik används 8,0 timmar som standard.

VAB och föräldraledighet ger ingen sjuklön från arbetsgivaren — hanteras direkt av Försäkringskassan.

6. Skatt (progressiv Skatteverketstabell)

Skatten beräknas med verkliga Skatteverketstabeller — inte en fast procentsats. Tabell 110–399 och kolumn 1–6 väljs från den anställdas EmployeeProfile.

Kolumn Gäller
1 Lön, ålder 18–65 (standard)
2 Sjuk-/föräldrapenning
3 Pension
4 Lön, fyllt 66 år
5 Lön till skolungdom
6 Engångsbelopp

Grundavdrag och jobbskatteavdrag är redan inbakade i Skatteverkets publicerade tabeller — de adderas inte separat.

Manuellt skatteavdrag (override) kan läggas in av en chef på utkast — se Fas 114.

7. Arbetsgivaravgift

Arbetsgivaravgiften är åldersbaserad och är en arbetsgivarkostnad (dras inte av den anställdas lön).

Ålder Sats
Födda 1938 eller tidigare 0%
Pensionärer (fyllt 66 år vid årets ingång) 10,21%
Standard (övriga) 31,42%
arbetsgivaravgift = skattepliktig bruttolön × sats

8. Pension och försäkring

Pension beräknas på bruttolön (inte OB, inte sjuklön) enligt CompensationProfile:

  • Procent av bruttolön: pension = bruttolön × procent / 100
  • Fast belopp: pension = fast SEK-belopp per körning

Försäkring beräknas metodmedvetet per profil (månatlig, årlig, per pass eller per timme).

9. Milersättning

antal km     = Shift.reported_km om godkänd (mileage_approved_at satt)
             = Shift.estimated_km annars
milersättning = antal km × mileage_rate_sek_per_km

Milersättning är skattefri (om den håller sig inom Skatteverkets schablon) och läggs till efter skatt i nettolönen.

10. Nettolön

skattepliktig bruttolön = bruttolön + OB + semesterlön + sjuklön
effektiv skatt          = manuellt skatteavdrag ?? uppskattad skatt
nettolön                = skattepliktig bruttolön − effektiv skatt + milersättning

Milersättning är den enda skattefria komponenten och läggs därför till efter skatt.

11. Manuella justeringar, frysning och färskhet

Manuell justering på utkast

En chef kan redigera alla fält på ett utkast innan godkännande. Varje justering:

  • stämplar när och vem (manually_adjusted_at / manually_adjusted_by),
  • bumpar version med 1,
  • omberäknar effektiv skatt och nettolön,
  • sparar föregående värden som revisionsspår.

Detta finns för att verkliga människor glömmer att stämpla in — chefen rättar och spåret bevisar vad som ändrades.

Frysning vid godkännande

När en batch lämnar utkast-status (skickas för godkännande, godkänns eller exporteras) blir entries oföränderliga. Endast sätt att räkna om är att avvisa batchen tillbaka till utkast.

Färskhetsvarning

Om en underliggande tidrapport eller tidsregistrering ändras efter att entries beräknades visar systemet en färskhetsvarning. Det betyder att visade belopp kanske inte speglar de senaste ändringarna — använd Uppdatera-knappen för att räkna om.


Har du frågor om en specifik siffra? Varje belopp på en PayrollEntry går att spåra tillbaka till raderna ovan. Den fullständiga tekniska referensen finns i docs/payroll-calculation.md.