b76fb7417e
Warnings such as "vacation days at risk of being lost" kept showing after the planner had already resolved them. The planner itself was firing correctly -- PlanSyncProvider syncs on every plan-input change -- so the fault was in the warnings, in two independent places. The vacation-expiry warning was computed before allocation. It read `vacation_forfeiting`, which the loader derives from already-committed usage, while `_assign_tier3` deliberately spends at-risk vacation days first precisely to avoid that forfeiture. The figure therefore counted days the plan was in the middle of saving. `_vacation_expiry_warnings` now subtracts the vacation days this run actually placed for that parent and year, clamped at zero -- sound because the bank is FIFO, so a day spent in year Y retires one expiring day one-for-one. The full carry-forward simulation is still not duplicated inside the ledger. The Dashboard then never refreshed them. Its proposal came from a one-shot effect guarded by `proposal === null`, with no planVersion dependency, so the card kept rendering the pre-replan warning until remount -- while `syncPlan` was already returning a fresh proposal that both call sites discarded. PlanSyncProvider now exposes that proposal behind a monotonic counter, and usePlanProposal prefers it once any sync has completed, keeping `propose()` for the first load. Also adds a manual recompute button to Settings, which only bumps planVersion and reports what the resulting sync did, and fixes partner add/remove never bumping planVersion at all -- that gap meant gaining or losing a parent never re-ran the allocator, though it changes who days can be assigned to. Rename stays cosmetic. Verified in the browser: a 2031 warning of 15 days dropped to 12 after three vacation days were planned, without a reload. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014jPFUcCJ5AKXmPVC1anhXe
136 lines
9.2 KiB
TypeScript
136 lines
9.2 KiB
TypeScript
export const settings = {
|
||
'childBirthdayInput.birthDateLabel': 'Födelsedatum',
|
||
'childBirthdayInput.defaultLabel': 'Barnets födelsedatum',
|
||
'childBirthdayInput.preschoolStartLabel': 'Förskolestart (valfritt)',
|
||
'dayOverridesInput.addButton': 'Lägg till undantag',
|
||
'dayOverridesInput.addSectionTitle': 'Lägg till undantag',
|
||
'dayOverridesInput.addingButton': 'Lägger till...',
|
||
'dayOverridesInput.charCount': '{count}/280',
|
||
'dayOverridesInput.dateLabel': 'Datum',
|
||
'dayOverridesInput.noteFieldLabel': 'Anteckning (valfritt)',
|
||
'dayOverridesInput.noteLabel': 'Anteckning: {note}',
|
||
'dayOverridesInput.notePlaceholder': 'T.ex. Jobbade på juldagen',
|
||
'dayOverridesInput.offStatus': 'Jag är ledig den här dagen',
|
||
'dayOverridesInput.statusLegend': 'Status',
|
||
'dayOverridesInput.workingStatus': 'Jag jobbar den här dagen',
|
||
'parentBalance.advancedToggle': 'Avancerat',
|
||
'parentBalance.cancelButton': 'Avbryt',
|
||
'parentBalance.closeAria': 'Stäng',
|
||
'parentBalance.description': 'Siffrorna finns på Mina sidor hos Försäkringskassan under Föräldrapenning.',
|
||
'parentBalance.dubbeldagarHelper': 'Gäller båda föräldrarna tillsammans, de första 15 månaderna.',
|
||
'parentBalance.dubbeldagarLeftLabel': 'Dubbeldagar kvar (0–60)',
|
||
'parentBalance.invalid': 'Summan (sjukpenningnivå + lägstanivå) kan inte överstiga {total} dagar.',
|
||
'parentBalance.lagstaLeftLabel': 'Lägstanivå kvar (0–90)',
|
||
'parentBalance.presetButton': 'Inga dagar uttagna',
|
||
'parentBalance.rangeError': 'Ange ett tal mellan {min} och {max}.',
|
||
'parentBalance.reservedExceedsError': 'Reserverade dagar kan inte överstiga sjukpenningnivå + lägstanivå kvar.',
|
||
'parentBalance.reservedLeftHelper': 'Lämna tomt så räknar vi ut det.',
|
||
'parentBalance.reservedLeftLabel': 'Reserverade dagar kvar (0–90)',
|
||
'parentBalance.saveButton': 'Spara',
|
||
'parentBalance.saveError': 'Det gick inte att spara dagarna kvar',
|
||
'parentBalance.savingButton': 'Sparar…',
|
||
'parentBalance.sjukpenningLeftLabel': 'Sjukpenningnivå kvar (0–390)',
|
||
'parentBalance.summary': '= {left} av {total} dagar kvar',
|
||
'parentBalance.summaryDubbeldagar': '{count} dubbeldagar kvar',
|
||
'parentBalance.title': '{name}s dagar kvar',
|
||
'parentBalance.titleSelf': 'Dina dagar kvar',
|
||
'parentProfileInput.employed': 'Anställd',
|
||
'parentProfileInput.employmentStatusLabel': 'Sysselsättning',
|
||
'parentProfileInput.hourly': 'Timlön',
|
||
'parentProfileInput.jobseeking': 'Arbetssökande',
|
||
'parentProfileInput.monthly': 'Månadslön',
|
||
'parentProfileInput.none': 'Ingen',
|
||
'parentProfileInput.salaryTypeLabel': 'Lönetyp',
|
||
'parentProfileInput.selectEmploymentStatus': 'Välj sysselsättning',
|
||
'parentProfileInput.selectSalaryType': 'Välj lönetyp',
|
||
'qrModal.authenticating': 'Autentiserar…',
|
||
'qrModal.cancelButton': 'Avbryt',
|
||
'qrModal.cancelled': 'Sessionen avbröts.',
|
||
'qrModal.closeAria': 'Stäng dialogruta',
|
||
'qrModal.closeButton': 'Stäng',
|
||
'qrModal.errorLabel': 'Fel:',
|
||
'qrModal.fetching': 'Hämtar data från FK…',
|
||
'qrModal.qrAlt': 'BankID QR-kod',
|
||
'qrModal.qrInstruction': 'Öppna BankID-appen och skanna QR-koden:',
|
||
'qrModal.statusLabel': 'Status:',
|
||
'qrModal.success': 'Klar! Data hämtad från Försäkringskassan.',
|
||
'qrModal.title': 'Hämta från Försäkringskassan',
|
||
'settings.addPartnerButton': 'Lägg till partner',
|
||
'settings.addPartnerError': 'Kunde inte lägga till partner',
|
||
'settings.addPartnerSuccess': 'Partner tillagd!',
|
||
'settings.addingPartner': 'Lägger till...',
|
||
'settings.balanceSectionTitle': 'Saldon',
|
||
'settings.calendarLanguageSectionTitle': 'Kalender & språk',
|
||
'settings.cancelButton': 'Avbryt',
|
||
'settings.childBirthDateLabel': 'Barnets födelsedatum',
|
||
'settings.dayOverridesHelp': 'Planeraren utgår från den svenska kalendern (röda dagar, klämdagar, julafton, midsommarafton och pingstafton är normalt lediga). Här kan du ange undantag för din arbetsplats — om du måste jobba juldagen eller är ledig på annars arbetande dagar.',
|
||
'settings.exceptionsSectionTitle': 'Undantag & röda dagar',
|
||
'settings.familySectionTitle': 'Barn & familj',
|
||
'settings.languageAutoOption': 'Automatisk (webbläsarens språk)',
|
||
'settings.languageEnglishOption': 'English',
|
||
'settings.languageLabel': 'Välj språk / Select language',
|
||
'settings.languageSwedishOption': 'Svenska',
|
||
'settings.membersLoading': 'Laddar medlemmar…',
|
||
'settings.noChildSelected': 'Inget barn valt ännu.',
|
||
'settings.partnerActionErrorNotFound': 'Kunde inte hitta partnern. Ladda om sidan och försök igen.',
|
||
'settings.partnerIntro': 'Lägg till en partner för att planera föräldraledigheten tillsammans.',
|
||
'settings.partnerLinkedIntro': 'Din partner är kopplad till detta arbetsutrymme.',
|
||
'settings.partnerNameInvalid': 'Partnerns namn är ogiltigt.',
|
||
'settings.partnerNamePlaceholder': 'Partnerns namn',
|
||
'settings.partnerNameRequired': 'Ange ett namn för partnern',
|
||
'settings.partnerSectionTitle': 'Partner',
|
||
'settings.preschoolHelp': 'Förskolor stänger oftast ca 6 dagar per år för planering. Ange hur många dagar din förskola har, så reserveras de i planeringen.',
|
||
'settings.preschoolPlanningDaysLabel': 'Förskolans planeringsdagar per år',
|
||
'settings.profileHelp': 'Din lönetyp och sysselsättning används för att uppskatta din SGI och planera din ledighet.',
|
||
'settings.profileSectionTitle': 'Din profil',
|
||
'settings.recomputeButton': 'Räkna om planen',
|
||
'settings.recomputeEvicted': 'Omräkningen skulle ta bort redan inplanerade dagar för att få plats — inget sparades. Justera saldon eller önskemål och försök igen.',
|
||
'settings.recomputeHelp': 'Planen räknas normalt om automatiskt när du ändrar något. Använd den här knappen för att räkna om den direkt, utan att vänta.',
|
||
'settings.recomputeSuccess': 'Planen räknades om.',
|
||
'settings.recomputeTimeout': 'Det tog för lång tid att räkna om planen. Försök igen om en stund.',
|
||
'settings.recomputing': 'Räknar om…',
|
||
'settings.redDaysHelp': 'En lista över röda dagar enligt den svenska kalendern, tillsammans med dina egna undantag — fyra år i taget.',
|
||
'settings.removeBlockerLeaveWishes': 'önskemål om ledighet',
|
||
'settings.removeBlockerParentalLeave': 'registrerad föräldrapenning',
|
||
'settings.removeBlockerPlannedLeave': 'planerade lediga dagar',
|
||
'settings.removeBlockerVacationDays': 'registrerade semesterdagar',
|
||
'settings.removeConfirmButton': 'Ja, ta bort',
|
||
'settings.removeConfirmPrompt': 'Ta bort {name} från arbetsutrymmet?',
|
||
'settings.removePartnerButton': 'Ta bort',
|
||
'settings.removePartnerError': 'Kunde inte ta bort partnern',
|
||
'settings.removePartnerErrorHasDependentData': 'Går inte att ta bort — det finns registrerat: {blockers}. Ta bort eller flytta detta först.',
|
||
'settings.removePartnerErrorHasLogin': 'Går inte att ta bort — den här personen har ett eget konto och egen inloggning.',
|
||
'settings.removePartnerErrorSelf': 'Du kan inte ta bort dig själv från arbetsutrymmet.',
|
||
'settings.renameButton': 'Byt namn',
|
||
'settings.renamePartnerError': 'Kunde inte byta namn',
|
||
'settings.saveFamilyButton': 'Spara',
|
||
'settings.saveFamilyError': 'Kunde inte spara uppgifterna',
|
||
'settings.saveFamilySuccess': 'Uppgifterna sparades!',
|
||
'settings.saveRenameButton': 'Spara namn',
|
||
'settings.saveVacationError': 'Kunde inte spara semesterdagar',
|
||
'settings.saveVacationSuccess': 'Semesterdagar för {year} sparade!',
|
||
'settings.selectedChildLabel': 'Valt barn:',
|
||
'settings.showWeekNumbers': 'Visa veckonummer',
|
||
'settings.takePlOnRedDays': 'Ta ut föräldrapenning på röda dagar',
|
||
'settings.takePlOnRedDaysError': 'Kunde inte spara inställningen',
|
||
'settings.takePlOnRedDaysHelp': 'Du får betalt för lördagar, söndagar och röda dagar i planeringen — men du förbrukar dagar du annars hade sparat, eftersom semester inte kan tas ut på dessa dagar.',
|
||
'settings.title': 'Inställningar',
|
||
'settings.vacationHelp': 'Ange semesterdagar per år. Det första året är du oftast hemma mer och har färre dagar att lägga på semester, medan kommande år har din fulla årliga tilldelning. Detta styr hur mycket tid planeraren har att arbeta med.',
|
||
'settings.youBadge': '(Du)',
|
||
'vacationDaysTable.assumedBadge': 'Antaget',
|
||
'vacationDaysTable.assumedPrompt': 'Inget värde är registrerat för detta år — 25 dagar (lagstadgat) har antagits. Bekräfta eller ändra nedan.',
|
||
'vacationDaysTable.atRiskAgeDetail': '{days} dagar har passerat 5-årsgränsen för att spara semester',
|
||
'vacationDaysTable.atRiskHeader': 'Riskerar',
|
||
'vacationDaysTable.atRiskOverCapDetail': '{days} dagar överstiger hur mycket som får sparas till nästa år',
|
||
'vacationDaysTable.empty': 'Inga år att visa ännu.',
|
||
'vacationDaysTable.savedDaysHeader': 'Sparade dagar in',
|
||
'vacationDaysTable.savedStatus': 'Sparat',
|
||
'vacationDaysTable.saveErrorStatus': 'Det gick inte att spara',
|
||
'vacationDaysTable.savingStatus': 'Sparar…',
|
||
'vacationDaysTable.vacationDaysHeader': 'Semesterdagar',
|
||
'settings.preschoolPerYearHelp': 'Ange hur många planeringsdagar som faktiskt togs ut ett visst år — det kan skilja sig från det uppskattade antalet ovan.',
|
||
'settings.preschoolPerYearTitle': 'Planeringsdagar per år',
|
||
'settings.preschoolPlannedLabel': 'Planerade dagar',
|
||
'settings.preschoolTakenLabel': 'Uttagna dagar',
|
||
'settings.preschoolTakenPlaceholder': 'Ej angivet',
|
||
} as const |