import { EMPTY_POLICY, STRUCTURAL, growthPathDerived, simulate, wageChangePct, type Calibration, 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. */ /** * Förval för tillväxtscenariot (m3.2.0), alla redaktionella framtidsantaganden: * * Sysselsättning, jämförelsealternativet +3 procent på fem år (cirka 0,6 procent * per år). Motivering: SCB:s befolkningsframskrivning visar att befolkningen i * arbetsför ålder (20–64 år) växer långsamt, i storleksordningen några tiondels * procent per år. Därtill antas en måttligt stigande sysselsättningsgrad. Fler * nyanställningar än så kräver en arbetskraft som inte finns. * Sysselsättning, AI-alternativet +1 procent: färre nyanställningar än * arbetskraftens tillväxt medger. * Arbetstid per jobb: oförändrad i båda alternativen (hålls konstant). * Produktion per arbetad timme: +7,5 procent på fem år i jämförelsealternativet * (cirka 1,5 procent per år, i nivå med svensk arbetsproduktivitet i näringslivet * över längre perioder), +13 procent i AI-alternativet (cirka 1 procentenhet * snabbare per år). * Löneandel av produktivitetsökningen: 100 procent i jämförelsealternativet, det * vill säga oförändrad löneandel. 50 procent i AI-alternativet, eftersom en del av * ökningen antas bero på köpta AI-tjänster och tillfalla kapitalet. */ const COMMON = { extraSupportCost: 0, growthHorizonYears: 5, growthEmploymentHiringPct: 3, growthEmploymentAiPct: 1, growthHoursHiringPct: 0, growthHoursAiPct: 0, growthProductivityHiringPct: 7.5, growthProductivityAiPct: 13, growthWagePassHiringPct: 100, growthWagePassAiPct: 50, 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 få jobb försvinner och lönerna i de kvarvarande jobben stiger. Om kostnadsökningen blir större än produktionsökningen minskar vinsterna, även när löner och produktivitet ökar. Utfallet för vinster och priser redovisas ovan.", 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: 100, 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: 100, 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; const pct1 = (v: number) => `${v >= 0 ? "+" : "−"}${n(Math.abs(v), 1)} procent`; /** * Beskrivning av de två utvecklingsvägarna i tillväxtscenariot, genererad ur * exakt samma parametrar och härledda storheter som beräkningen använder. */ export function describeGrowth(p: ScenarioParams): string[] { const h = growthPathDerived(p, "hiring"); const a = growthPathDerived(p, "ai"); return [ `Tidshorisont ${n(p.growthHorizonYears)} år. Jobben ökar med ${pct1(h.employmentPct)} i jämförelsealternativet och ${pct1(a.employmentPct)} i AI-alternativet (sysselsättningsindex ${EMPLOYMENT_INDEX_BASE} → ${n(EMPLOYMENT_INDEX_BASE * (1 + h.employmentPct / 100), 0)} respektive ${n(EMPLOYMENT_INDEX_BASE * (1 + a.employmentPct / 100), 0)}).`, `Produktion = jobb × arbetstid per jobb × produktion per timme. Arbetstid per jobb: ${pct1(h.hoursPct)} respektive ${pct1(a.hoursPct)}${h.hoursPct === 0 && a.hoursPct === 0 ? " (hålls konstant)" : ""}. Produktion per timme: ${pct1(h.productivityPerHourPct)} respektive ${pct1(a.productivityPerHourPct)}.`, `Härlett: produktionen ökar ${pct1(h.productionPct)} i jämförelsealternativet och ${pct1(a.productionPct)} i AI-alternativet. Lön per jobb ${pct1(h.wagePerJobPct)} respektive ${pct1(a.wagePerJobPct)}, lönesumman ${pct1(h.wageBillPct)} respektive ${pct1(a.wageBillPct)}.`, `Av produktivitetsökningen per timme antas ${n(p.growthWagePassHiringPct)} procent bli högre timlön i jämförelsealternativet och ${n(p.growthWagePassAiPct)} procent i AI-alternativet.`, `Privata företags köp av utländska AI-tjänster: ${n(h.aiImportCost)} miljarder kronor per år i jämförelsealternativet och ${n(a.aiImportCost)} miljarder i AI-alternativet. Kostnaden minskar privata företags vinster.`, `Resultaten gäller ett års intäkter och utgifter vid periodens slut, i basårets penningvärde – inte summan under hela perioden.`, `Färre nyanställningar är inte uppsägningar, så modellen lägger inte in något omställningsstöd automatiskt. Uteblivna jobb kan ändå påverka offentliga stöd, till exempel om arbetslösheten blir högre; det kan läggas in som extra stöd, nu ${n(p.extraSupportCost)} miljarder kronor per år.`, ]; } /** * 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, cal?: Calibration, ): 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( `Privata företag köper utländska AI-tjänster för ${n(p.aiImportCost)} miljarder kronor per år. Kostnaden minskar deras svenska vinster. Offentlig sektors AI-kostnader ingår i stället i den offentliga införandekostnaden.`, ); 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, i privat eller offentlig sektor. Talet är ersättningsgrad × täckningsgrad × andel av året med stöd, och avser ett helt år i periodens sluttillstånd. 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 (cal) { const r = simulate(cal, p, EMPTY_POLICY).detail; const profitText = r.toProfits >= 0 ? `ökar med ${n(r.toProfits, 1)} miljarder kronor` : `minskar med ${n(-r.toProfits, 1)} miljarder kronor`; out.push( `Utfall i modellen: företagens arbetskraftskostnad ${r.dLabourCost >= 0 ? "ökar" : "minskar"} med ${n(Math.abs(r.dLabourCost), 1)} miljarder och produktionen ökar med ${n(r.productionGain, 1)} miljarder. Svenska beskattningsbara vinster ${profitText}${r.toPrices > 0 ? ` och priserna sänks med ${n(r.toPrices, 1)} miljarder` : ", och ingen prissänkning uppstår"}.`, ); } 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.";