import { STRUCTURAL, growthPathParams, wageChangePct, type ScenarioParams } from "./engine"; /** * Fyra AI-scenarier. De är villkorade antaganden, inte prognoser och inte * sannolikhetsbedömningar. Alla förvalda värden är redaktionellt valda * exempelvärden som är synliga och ändringsbara. Både negativa och positiva * utfall kan undersökas. * * Jobbantagandena gäller privat sektor. Offentlig personalminskning styrs bara * av reglaget för offentlig effektivisering. */ export type ScenarioId = "productivity" | "transition" | "capital" | "growth"; /** * Gemensamma förval. Tillväxtantagandena används bara av scenariot "Tillväxt utan * motsvarande nya jobb", men finns i alla scenarier så att en delad länk alltid * kan återskapa exakt samma uppsättning antaganden. */ const COMMON = { extraSupportCost: 0, growthHorizonYears: 5, growthEmploymentHiringPct: 20, growthEmploymentAiPct: 5, growthWageHiringPct: 5, growthWageAiPct: 5, growthProductionHiringPct: 8, growthProductionAiPct: 12, growthAiImportCostHiring: 0, }; export const SCENARIOS: { id: ScenarioId; label: string; summary: string; why: string; params: ScenarioParams; }[] = [ { id: "productivity", label: "AI stärker människors produktivitet", summary: "AI används mest som stöd i arbetet. Få jobb försvinner, nästan alla ersätts, och de som blir kvar producerar mer.", why: "Exempelvärdena speglar en utveckling där effektiviseringen syns i priser och löner snarare än i minskad sysselsättning.", params: { ...COMMON, inputMode: "jobs", jobsLostPct: 6, jobsReplacedPct: 90, retainedJobWagePct: 3, newJobWagePct: 105, lostJobWagePct: 100, productionGainPct: 1.5, wageChangePct: 3, aiImportCost: 40, savingToProfitsPct: 30, savingToPricesPct: 50, publicEfficiencyPct: 1.5, publicImplementationPct: 30, transferSupportPct: 0, consumptionPassthroughPct: 90, dividendToHouseholdsPct: 40, }, }, { id: "transition", label: "Omfattande omställning", summary: "Många jobb försvinner samtidigt som nya växer fram, men inte lika många och delvis till lägre lön. Omställningen kostar.", why: "Exempelvärdena visar ett läge där bortfall och nya inkomster delvis tar ut varandra, men där offentliga stöd behövs under omställningen.", params: { ...COMMON, inputMode: "jobs", jobsLostPct: 12, jobsReplacedPct: 60, retainedJobWagePct: 0, newJobWagePct: 90, lostJobWagePct: 95, productionGainPct: 1, wageChangePct: -5.5, aiImportCost: 90, savingToProfitsPct: 40, savingToPricesPct: 35, publicEfficiencyPct: 3, publicImplementationPct: 35, transferSupportPct: 35, consumptionPassthroughPct: 90, dividendToHouseholdsPct: 35, }, }, { id: "growth", label: "Tillväxt utan motsvarande nya jobb", summary: "Företagen växer med hjälp av AI utan att anställa lika många. Jobben blir fler, samtidigt som en mindre del av tillväxten blir löneinkomster.", why: "Scenariot jämför två framtida utvecklingsvägar från samma historiska utgångsläge. Båda vägarna bygger på antaganden, och skillnaden mellan dem visas uttryckligt.", params: { ...COMMON, inputMode: "direct", jobsLostPct: 0, jobsReplacedPct: 0, retainedJobWagePct: 0, newJobWagePct: 100, lostJobWagePct: 100, productionGainPct: 0, wageChangePct: 0, aiImportCost: 120, savingToProfitsPct: 45, savingToPricesPct: 25, publicEfficiencyPct: 0, publicImplementationPct: 30, transferSupportPct: 0, consumptionPassthroughPct: 90, dividendToHouseholdsPct: 35, }, }, { id: "capital", label: "AI ersätter mycket arbete", summary: "En stor del av arbetet ersätts, färre nya jobb tillkommer och en större del av inkomsterna hamnar hos ägare av kapital.", why: "Exempelvärdena speglar att vinsten av automatiseringen i hög grad tillfaller ägare, och att en del av den inte beskattas i Sverige.", params: { ...COMMON, inputMode: "jobs", jobsLostPct: 20, jobsReplacedPct: 35, retainedJobWagePct: 0, newJobWagePct: 85, lostJobWagePct: 90, productionGainPct: 0.5, wageChangePct: -14, aiImportCost: 160, savingToProfitsPct: 45, savingToPricesPct: 15, publicEfficiencyPct: 4, publicImplementationPct: 40, transferSupportPct: 45, consumptionPassthroughPct: 90, dividendToHouseholdsPct: 25, }, }, ]; export const GROWTH_SCENARIO_ID: ScenarioId = "growth"; export function isGrowthScenario(id: string): boolean { return id === GROWTH_SCENARIO_ID; } export function scenarioById(id: string) { return SCENARIOS.find((s) => s.id === id) ?? SCENARIOS[0]!; } const n = (v: number, d = 0) => v.toLocaleString("sv-SE", { minimumFractionDigits: d, maximumFractionDigits: d }); /** Sysselsättningsindex i utgångsläget. Jobben mäts som index, inte som personer. */ export const EMPLOYMENT_INDEX_BASE = 100; /** * Beskrivning av de två utvecklingsvägarna i tillväxtscenariot, genererad ur * exakt samma parametrar som beräkningen använder. */ export function describeGrowth(p: ScenarioParams): string[] { const hiring = growthPathParams(p, "hiring"); const ai = growthPathParams(p, "ai"); return [ `Jobben ökar med ${n(p.growthEmploymentAiPct, 0)} procent i AI-alternativet, men blir färre än i jämförelsealternativet där de ökar med ${n(p.growthEmploymentHiringPct, 0)} procent.`, `Tidshorisont ${n(p.growthHorizonYears)} år. Sysselsättningsindex ${EMPLOYMENT_INDEX_BASE} i utgångsläget, ${n(EMPLOYMENT_INDEX_BASE * (1 + p.growthEmploymentHiringPct / 100), 0)} i jämförelsealternativet och ${n(EMPLOYMENT_INDEX_BASE * (1 + p.growthEmploymentAiPct / 100), 0)} i AI-alternativet vid periodens slut.`, `Alla värden avser total förändring till periodens slut, inte per år. Resultaten gäller ett års intäkter och utgifter vid periodens slut, i basårets penningvärde – inte summan under hela perioden.`, `Löneutveckling per jobb: ${n(p.growthWageHiringPct, 1)} procent i jämförelsealternativet och ${n(p.growthWageAiPct, 1)} procent i AI-alternativet.`, `Samlade löneinkomster i privat sektor blir därmed ${n(hiring.wageChangePct, 1)} procent högre i jämförelsealternativet och ${n(ai.wageChangePct, 1)} procent högre i AI-alternativet.`, `Produktionsökning: ${n(p.growthProductionHiringPct, 1)} procent av förädlingsvärdet i jämförelsealternativet och ${n(p.growthProductionAiPct, 1)} procent i AI-alternativet.`, `Utländska AI-tjänster: ${n(p.growthAiImportCostHiring)} miljarder kronor per år i jämförelsealternativet och ${n(p.aiImportCost)} miljarder i AI-alternativet.`, `Uteblivna nyanställningar räknas inte som uppsägningar och ger därför inget omställningsstöd. Extra stöd kräver ett uttryckligt antagande, nu ${n(p.extraSupportCost)} miljarder kronor per år.`, `Jobbantagandena gäller privat sektor sammantaget. Modellen avgör inte om människor får arbete i andra sektorer.`, ]; } /** * Genererar scenariobeskrivningen ur exakt samma parametrar som beräkningen * använder, så att text och resultat aldrig kan säga olika saker. */ export function describeScenario(p: ScenarioParams, id?: string): string[] { if (id && isGrowthScenario(id)) return describeGrowth(p); const out: string[] = []; const pct = wageChangePct(p); if (p.inputMode === "jobs") { const lost = p.jobsLostPct; const added = (lost * p.jobsReplacedPct) / 100; const retained = 100 - lost; out.push( `Av 100 jobb i privat sektor försvinner ${n(lost, 1)}, ${n(retained, 1)} finns kvar och ${n(added, 1)} nya tillkommer.`, ); out.push( p.retainedJobWagePct === 0 ? "De kvarvarande jobben har oförändrad genomsnittlig löneinkomst." : `De kvarvarande jobben får ${n(Math.abs(p.retainedJobWagePct), 1)} procent ${p.retainedJobWagePct > 0 ? "högre" : "lägre"} genomsnittlig löneinkomst.`, ); out.push( p.lostJobWagePct === 100 ? "De jobb som försvinner hade genomsnittlig löneinkomst." : `De jobb som försvinner hade ${n(p.lostJobWagePct)} procent av genomsnittlig löneinkomst. Övriga jobbs snittlön justeras så att den ursprungliga lönesumman bevaras.`, ); out.push( p.newJobWagePct === 100 ? "De nya jobben har samma genomsnittliga löneinkomst som de jobb som försvann." : `De nya jobben har ${n(p.newJobWagePct)} procent av de försvunna jobbens genomsnittliga löneinkomst.`, ); out.push( `Samlade löneinkomster i privat sektor förändras därmed med ${n(pct, 1)} procent. Privat sektor antas svara för ${n(STRUCTURAL.privateShareOfWages * 100)} procent av lönesumman.`, ); } else { out.push( `Löneinkomsterna i privat sektor förändras netto med ${n(pct, 1)} procent. Det är en direkt angiven nettoförändring efter förlorade jobb, nya jobb och löneförändringar.`, ); } out.push( p.productionGainPct === 0 ? "Ingen ökad produktion antas. Modellen räknar då bara med förändrade kostnader." : `Produktionen i privat sektor antas öka med ${n(p.productionGainPct, 1)} procent av förädlingsvärdet. Det är ett eget antagande, skilt från kostnadsbesparingen, och fördelas med samma andelar som besparingen.`, ); out.push( `Företag och offentlig sektor köper utländska AI-tjänster för ${n(p.aiImportCost)} miljarder kronor per år.`, ); const other = Math.max(0, 100 - p.savingToProfitsPct - p.savingToPricesPct); out.push( `Av det som återstår efter AI-kostnaden – kostnadsbesparing plus eventuell produktionsökning – blir ${n(p.savingToProfitsPct)} procent svensk beskattningsbar vinst, ${n(p.savingToPricesPct)} procent lägre priser och ${n(other)} procent annan användning som inte beskattas i Sverige.`, ); out.push( `Offentlig sektor effektiviserar ${n(p.publicEfficiencyPct, 1)} procent av sin konsumtion, med ${n(p.publicImplementationPct)} procent av bruttobesparingen i införandekostnad.`, ); out.push( `Omställningsstöd motsvarande ${n(p.transferSupportPct)} procent av bortfallen löneinkomst före skatt för dem som förlorar jobbet, alltså ersättningsgrad gånger täckningsgrad, under ett helt år. Stödet beskattas som transferering. ${n(p.consumptionPassthroughPct)} procent av förändrad disponibel inkomst syns i konsumtionen och ${n(p.dividendToHouseholdsPct)} procent av ökade vinster delas ut till svenska hushåll.`, ); if (p.extraSupportCost > 0) out.push( `Utöver det antas extra offentligt stöd på ${n(p.extraSupportCost)} miljarder kronor per år, som ett uttryckligt eget antagande.`, ); return out; } export const SCENARIO_CAVEAT = "Automatiserade arbetsuppgifter, förlorade jobb och förändrade löneinkomster är tre olika saker. Att en uppgift kan automatiseras betyder inte att jobbet försvinner, och ett borttaget jobb betyder inte att hela löneinkomsten försvinner ur ekonomin.";