Both Google Calendar and Nextcloud CalDAV now create all-day events for
shifts that have no MorningTime or AfternoonTime configured, instead of
silently skipping them. Fixes month-boundary crash on day 31 by using
DateOnly.AddDays(1) for the end date.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements a provider-agnostic calendar sync feature with Nextcloud as the
first alternative to Google Calendar.
- Add ICalendarService interface and provider-agnostic API endpoints
- Implement NextcloudCalendarService using CalDAV (Ical.Net)
- Add CalendarEventBuilder to share event/transport logic across providers
- Add Nextcloud sync button to the UI (Index page)
- Centralise TargetFramework, Nullable and ImplicitUsings in Directory.Build.props (net9.0)
- Add .worktrees to .gitignore and Docker/Nextcloud config docs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>