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)
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.