feat: agent-11 PR2 – Urlaubsanspruch (Verfall scharf, Pro-rata, Teilzeit)
Korrektheit der Urlaubskonten (Feature-Parität mit Urlaubsverwaltung):
- Verfall scharfgeschaltet: neuer effektiv verfügbarer Saldo (available_days)
schließt verfallenen, noch nicht verbrauchten Resturlaub aus; Konto-Warnung
beim Antrag nutzt jetzt available statt remaining. (Verfallsdatum bleibt in
company.settings, UI bereits vorhanden.)
- Anteilige Berechnung (Zwölftel) im Ein-/Austrittsjahr anhand neuer Felder
users.entry_date / exit_date; opt-in pro Firma (vacation_prorate_first_year).
- Teilzeit: Anspruch optional aus Arbeitstagen/Woche des WorkSchedule abgeleitet
(vacation_from_schedule), Basis vacation_default_days.
- _get_or_create_balance berechnet den Grundanspruch jetzt frisch
(_compute_entitlement); _carryover_expired/effective_available als Service-API,
Router delegiert.
Frontend: CompanySettingsPage (Jahresurlaub + Pro-rata- und Teilzeit-Toggles),
UsersPage (Ein-/Austrittsdatum im Edit-Modal), AbsencesPage ("Verfügbar" + Hinweis
bei verfallenem Resturlaub).
Migration 0036. 183/183 Tests grün. Deployed auf 137 + 164.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from datetime import datetime, date
|
||||
|
||||
from pydantic import BaseModel, EmailStr, Field, model_validator
|
||||
|
||||
@@ -27,6 +27,9 @@ class UserOut(BaseModel):
|
||||
kuerzel: str | None = None
|
||||
personnel_number: str | None = None
|
||||
can_manual_time_entry: bool = False
|
||||
work_schedule_id: uuid.UUID | None = None
|
||||
entry_date: date | None = None
|
||||
exit_date: date | None = None
|
||||
|
||||
|
||||
class UserUpdate(BaseModel):
|
||||
@@ -39,6 +42,8 @@ class UserUpdate(BaseModel):
|
||||
personnel_number: str | None = Field(None, max_length=50, pattern=PERSONNEL_NUMBER_PATTERN)
|
||||
can_manual_time_entry: bool | None = None
|
||||
is_active: bool | None = None
|
||||
entry_date: date | None = None
|
||||
exit_date: date | None = None
|
||||
|
||||
|
||||
class InviteRequest(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user