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.