Skip to content

Include subscribed (external ICS) calendars in appointment conflict detection #60312

@Koe-Greg

Description

@Koe-Greg

Tip

Help move this idea forward

  • Use the 👍 reaction to show support for this feature.
  • Avoid commenting unless you have relevant information to add; unnecessary comments create noise for subscribers.
  • Subscribe to receive notifications about status changes and new comments.

Is your feature request related to a problem? Please describe.
When configuring an appointment schedule, subscribed calendars (external ICS feeds such as public holiday calendars) can be selected under "Additional calendars to check for conflicts". However, they are silently ignored by the conflict detection engine — slots remain available on days that should be blocked.
This was tested on Nextcloud 32.0.8 with a French public holiday calendar subscribed from data.gouv.fr. Despite the subscription being explicitly selected in the appointment configuration, slots on public holidays were freely bookable.

Describe the solution you'd like
Events cached from external ICS feeds are treated as blocking when they are selected in "Additional calendars to check for conflicts" in appointment schedules.

Describe alternatives you've considered
Import locally and Pre-process the ICS if necessayr before importing it as native events into nextcloud calendar.
See additional context for Pre-processing reasons.

Additional context
Nextcloud version: 32.0.8
Calendar app version: 6.2.2
The conflict detection engine is implemented in CalendarProvider.php. This class only calls CalDavBackend::getCalendarsForUser() to retrieve calendars for conflict checking. It never calls CalDavBackend::getSubscriptionsForUser(), which is the separate method that handles external ICS subscriptions (calendartype = 1 in oc_calendarobjects).
This can be confirmed in the database: subscribed calendar events are stored with calendartype = 1, while native calendar events use calendartype = 0. The conflict engine only queries calendartype = 0.
PR #48621 extended conflict detection to include shared calendars (calendars shared between Nextcloud users), but subscribed calendars were not included in its scope.

While working around this limitation by importing the ICS feed as native calendar events, two additional issues were discovered that also prevent conflict blocking, even for native events:

  1. Missing STATUS field — the conflict engine appears to require STATUS:CONFIRMED to treat an event as blocking. The RFC 5545 spec defines STATUS as optional, with absence implying confirmed. The engine should treat missing STATUS as CONFIRMED by default.
  2. Zero-duration all-day events — the data.gouv.fr public holiday feed (and likely others) produce events where DTEND = DTSTART, which is technically an RFC 5545 violation (spec requires DTEND strictly after DTSTART for VALUE=DATE events). The engine silently ignores these events instead of either blocking the slot or warning the user.

These two issues are independent of the subscribed calendar problem but compound it when using the import workaround.

Metadata

Metadata

Assignees

No one assigned

    Labels

    0. Needs triagePending check for reproducibility or if it fits our roadmapenhancement
    No fields configured for Enhancement.

    Projects

    Status

    To triage

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions