fix(absences): Feiertage über Jahreswechsel korrekt aus working_days rausrechnen
_get_holiday_dates() fragte nur PublicHoliday für data.start_date.year ab. Ein Antrag über den Jahreswechsel (z.B. 28.12.-01.01.) rechnete den Neujahrsfeiertag im Folgejahr daher nicht heraus -> Mitarbeiter verlor einen Urlaubstag, den er nicht verbraucht hat. Neuer year_to-Parameter deckt den Jahres-Range ab, beide Aufrufstellen (create_absence, update_absence) angepasst. Regressionstest ergänzt. Gefunden während Coverage-Arbeit an absence_service.py/report_service.py. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015Ahyx6D3r7G1EuAc42nezn
This commit is contained in:
@@ -456,12 +456,10 @@ async def test_datev_holiday_takes_precedence_over_vacation(
|
||||
|
||||
# Feiertage für 2027 vorab befüllen, damit absence_service._get_holiday_dates
|
||||
# (fragt PublicHoliday direkt ab, ohne Auto-Generierung) sie kennt.
|
||||
# NB: _get_holiday_dates(company_id, data.start_date.year, db) holt Feiertage
|
||||
# NUR für das Jahr von start_date -- ein Zeitraum über den Jahreswechsel (z.B.
|
||||
# 28.12.-01.01.) würde den Neujahrs-Feiertag daher NICHT rausrechnen (eigener,
|
||||
# hier entdeckter Bug, siehe Abschlussbericht). Um genau den hier zu testenden
|
||||
# Feiertag-vs-Urlaub-Vorrang isoliert zu prüfen, bleibt der Zeitraum bewusst
|
||||
# innerhalb eines einzigen Jahres (Januar 2027).
|
||||
# Jahreswechsel-Fall (Feiertag im Folgejahr) siehe separat
|
||||
# test_holiday_dates_cover_year_boundary weiter unten -- hier bewusst
|
||||
# innerhalb eines einzigen Jahres, um Feiertag-vs-Urlaub-Vorrang isoliert
|
||||
# zu prüfen.
|
||||
await db_session.execute(text("SET LOCAL app.bypass_rls = 'on'"))
|
||||
await ensure_holidays_for_year(2027, "BY", db_session)
|
||||
await db_session.commit()
|
||||
@@ -511,6 +509,40 @@ async def test_datev_holiday_takes_precedence_over_vacation(
|
||||
await client.patch("/api/v1/companies/me", json={"state": None}, headers=cov_headers)
|
||||
|
||||
|
||||
async def test_holiday_dates_cover_year_boundary(
|
||||
client: AsyncClient, db_session: AsyncSession, cov_company, cov_headers, cov_vacation_type_id,
|
||||
):
|
||||
"""Regressionstest für den in test_datev_holiday_takes_precedence_over_vacation
|
||||
dokumentierten Bug: ein Antrag über den Jahreswechsel muss den Feiertag im
|
||||
Folgejahr (Neujahr) korrekt aus working_days herausrechnen. Fix:
|
||||
_get_holiday_dates(..., year_to=end_date.year) statt nur start_date.year."""
|
||||
from app.services.holiday_service import ensure_holidays_for_year
|
||||
|
||||
r = await client.patch("/api/v1/companies/me", json={"state": "BY"}, headers=cov_headers)
|
||||
assert r.status_code == 200, r.text
|
||||
|
||||
await db_session.execute(text("SET LOCAL app.bypass_rls = 'on'"))
|
||||
await ensure_holidays_for_year(2027, "BY", db_session)
|
||||
await ensure_holidays_for_year(2028, "BY", db_session)
|
||||
await db_session.commit()
|
||||
|
||||
# Di 28.12.2027 - Sa 01.01.2028: Wochentage Di/Mi/Do/Fr (29./30./31.12., 01.01.),
|
||||
# davon Neujahr (01.01.2028) ein Feiertag -> 3 Werktage
|
||||
start = date(2027, 12, 28)
|
||||
end = date(2028, 1, 1)
|
||||
resp = await client.post("/api/v1/absences/", json={
|
||||
"type_id": str(cov_vacation_type_id), "start_date": str(start), "end_date": str(end),
|
||||
}, headers=cov_headers)
|
||||
assert resp.status_code == 201, resp.text
|
||||
data = resp.json()
|
||||
assert data["working_days"] == 3, (
|
||||
f"Neujahr (Folgejahr) muss aus working_days herausgerechnet werden, "
|
||||
f"got {data['working_days']}"
|
||||
)
|
||||
|
||||
await client.patch("/api/v1/companies/me", json={"state": None}, headers=cov_headers)
|
||||
|
||||
|
||||
# ── 6. _categorize_hours: Nacht über Mitternacht + Sonntag/Feiertag ─────────────
|
||||
|
||||
def test_categorize_hours_night_shift_over_midnight():
|
||||
|
||||
Reference in New Issue
Block a user