feat(overtime): Auszahlungs-Anträge durch Mitarbeiter (opt-in pro Firma)
Mitarbeiter beantragt Überstunden-Auszahlung, HR genehmigt/lehnt ab.
Firmen-Opt-in payout_request_enabled (Default aus - nur HR-Direktbuchung).
Saldo-Abzug erst bei Genehmigung; Reject/Cancel bucht nichts.
- Migration 0042: hours_payouts.status/decided_by/decided_at/rejection_reason
+ companies.payout_request_enabled (nur Spalten, RLS unveraendert)
- Router: POST /hr/payouts/request|{id}/approve|reject|cancel; list status-Filter;
HR-Direktbuchung bleibt (status approved)
- Frontend: PayoutRequestCard (Selbstbedienung in AbsencesPage), HR-Page
Status-Spalte + Genehmigen/Ablehnen, CompanySettings-Toggle
- 4 pytest-Cases
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -43,6 +43,7 @@ class CompanyOut(BaseModel):
|
||||
overtime_expiry_month: int = 3
|
||||
overtime_expiry_day: int = 31
|
||||
overtime_max_carryover_hours: int | None = None
|
||||
payout_request_enabled: bool = False
|
||||
kiosk_require_approval: bool = True
|
||||
kiosk_track_current_user: bool = True
|
||||
kiosk_heartbeat_interval_sec: int = 30
|
||||
@@ -83,6 +84,7 @@ class CompanyUpdate(BaseModel):
|
||||
overtime_expiry_month: int | None = Field(None, ge=1, le=12)
|
||||
overtime_expiry_day: int | None = Field(None, ge=1, le=31)
|
||||
overtime_max_carryover_hours: int | None = Field(None, ge=0, le=9999)
|
||||
payout_request_enabled: bool | None = None
|
||||
kiosk_require_approval: bool | None = None
|
||||
kiosk_track_current_user: bool | None = None
|
||||
kiosk_heartbeat_interval_sec: int | None = Field(None, ge=10, le=120)
|
||||
|
||||
Reference in New Issue
Block a user