Feature ID: PF-84 Status: ✅ Complete (Phase 1) Spec Reference: PF-84-business-calendar-service.md Last Updated: 2026-03-18Documentation Index
Fetch the complete documentation index at: https://docs.encoreos.io/llms.txt
Use this file to discover all available pages before exploring further.
Overview
PF-84 introduces a Platform Integration Layer wrapper at@/platform/calendar so any core can use business-day-aware calendar logic without direct FW imports. It also defines a shared Edge Function utility for server-side business day calculations, plus holiday template and CSV import support layered on top of FW-35 calendar tables.
Integration Points (from Spec)
| Dependency | Type | Purpose |
|---|---|---|
| PF-01 (Organizations) | Platform | Organization context for tenant-scoped calendar access |
| PF-02 (RBAC) | Platform | Permission checks for calendar and holiday management operations |
| PF-10 (Notifications) | Platform | Notification support when FW-16 deadlines fire |
| FW-35 (SLA & Deadline Management) | Core dependency via platform layer | Owns fw_business_calendars and fw_calendar_holidays source tables |
| FW-16 (Date-Relative Triggers) | Core dependency via platform layer | Adds use_business_days and optional calendar_id behavior |
API / Edge Function Contracts
- Client integration layer:
@/platform/calendarexports:- Read hooks:
useBusinessCalendars(),useBusinessCalendar(calendarId),useDefaultCalendar(),useHolidays(calendarId, year?) - Utility hook:
useBusinessDays(calendarId)→ returnsBusinessDayUtilswithaddBusinessDays,subtractBusinessDays,isBusinessDay,isHoliday,nextBusinessDay - Template hooks:
useHolidayTemplates(year?),useApplyHolidayTemplate(calendarId, orgId) - CSV import:
useImportHolidaysFromCsv(calendarId, orgId),parseHolidayCsv(csvText) - UI components:
CalendarPicker,HolidayTemplateSelector,HolidayImportDialog,HolidayPreviewTable - Pure utilities:
addBusinessDays,subtractBusinessDays,isBusinessDay,isHoliday,nextBusinessDay,createDefaultBusinessHours
- Read hooks:
- Server shared utility:
supabase/functions/_shared/business-calendar.tsprovides:addBusinessDays(date, days, calendarId, supabaseClient)subtractBusinessDays(date, days, calendarId, supabaseClient)isBusinessDay(date, calendarId, supabaseClient)isBusinessHour(timestamp, calendarId, supabaseClient)nextBusinessDay(date, calendarId, supabaseClient)getBusinessHoursBetween(start, end, calendarId, supabaseClient)isHoliday(date, holidays)(pure, no async)
- Caching contract: Edge utility uses in-memory cache with 5-minute TTL to reduce repeated reads of calendar/holiday data.
- Permission keys:
fw.business_calendars.view,fw.business_calendars.manage,fw.calendar_holidays.manage
Security and Tenant Isolation
- Reads and writes are organization-scoped via
organization_id; no cross-tenant access. - Existing FW-35 RLS policies remain authoritative for
fw_business_calendarsandfw_calendar_holidays. - No PHI/PII is introduced by PF-84 data payloads (calendar config only).
- CSV import remains client-side parsed; validated rows only are sent to Supabase.