Premium

Split shifts & rotating schedules

Model split working days, overnight shifts, and repeating rotations from a time-zone-aware anchor. The planner expands shift definitions into occurrences that can be used in availability and capacity analysis.

Split shifts & rotating schedules — Screenshot of actual package API results with sample data. The read-only result table is application-owned; this feature does not provide this screen as built-in UI. Preview build: @wts-calendar/core@1.1.0 (unpublished).
Screenshot of actual package API results with sample data. The read-only result table is application-owned; this feature does not provide this screen as built-in UI. Preview build: @wts-calendar/core@1.1.0 (unpublished).

What you configure

profiles.shifts
Describe shift IDs, weekdays, start/end times, and effective boundaries.
rotation
Set an anchor date, cycleDays, and activeDays within the cycle.
getShiftOccurrences
Expand a resource's shifts over a requested interval.

Integration code example

  1. Choose the resource time zone and define each working segment separately.
  2. Add rotations only where the schedule follows an anchored cycle.
  3. Inspect generated occurrences around overnight boundaries and daylight-saving changes.

Copy this TypeScript into your application, not the browser console. Replace YOUR_WTS_LICENSE_KEY with an entitlement issued for your deployment origin. A WTS license is not a Google, Microsoft or CalDAV credential. These examples are documentation only and never execute on this page.

Install command
npm install @wts-calendar/core
TypeScript integration
import { verifyCalendarLicense } from '@wts-calendar/core';
import { AdvancedResourcePlanner } from '@wts-calendar/core/advanced-resource-planning';

const license = await verifyCalendarLicense('YOUR_WTS_LICENSE_KEY');
const planner = new AdvancedResourcePlanner({
  license,
  timeZone: 'UTC',
  resources: [
    { id: 'design', title: 'Design studio', capacity: 2 },
    { id: 'engineering', title: 'Engineering', capacity: 4 },
  ],
  events: [
    {
      id: 'review',
      title: 'Design review',
      resourceId: 'design',
      start: '2026-09-07T09:00:00Z',
      end: '2026-09-07T10:30:00Z',
    },
  ],
  profiles: [
    {
      resourceId: 'design',
      shifts: [
        {
          id: 'morning',
          startTime: '08:00',
          endTime: '12:00',
          rotation: { anchor: '2026-09-07', cycleDays: 4, activeDays: [0, 1] },
        },
        {
          id: 'evening',
          startTime: '16:00',
          endTime: '20:00',
          rotation: { anchor: '2026-09-07', cycleDays: 4, activeDays: [0, 1] },
        },
      ],
    },
  ],
});

export const shifts = planner.getShiftOccurrences('design', '2026-09-07', '2026-09-15');
console.table(shifts);

Application responsibilities

The engine returns data, not a built-in chart. Render results in your application and call planner.setData() after resources, events or profiles change.

This sample runs two days on, two days off, with two shifts per active day. Set timeZone to your scheduling zone before expanding shifts.

Behavior and lifecycle

  • An end time earlier than the start denotes an overnight shift; 24:00 is supported.
  • Shift expansion uses the calendar's named-zone and effective-boundary policies.

Limits and responsibilities

  • You provide the rotation pattern; the planner does not automatically generate a staffing roster.
  • Employment rules and organization-specific shift requirements must be modeled and validated by your application.
Premium

Enable this capability

Optional module
@wts-calendar/core/advanced-resource-planning
Signed entitlement
advanced-resource-planning

Request the required features and deployment origins by email. Pricing and terms are confirmed privately. A WTS license is separate from provider credentials; do not send passwords or production access tokens.

Email for a license key →

This public guide does not execute Premium modules or collect license tokens.