dabke 0.82.0 → 0.83.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +6 -3
- package/dist/cpsat/rules/index.d.ts +3 -0
- package/dist/cpsat/rules/index.d.ts.map +1 -1
- package/dist/cpsat/rules/index.js +3 -0
- package/dist/cpsat/rules/index.js.map +1 -1
- package/dist/cpsat/rules/max-days-week.d.ts +44 -0
- package/dist/cpsat/rules/max-days-week.d.ts.map +1 -0
- package/dist/cpsat/rules/max-days-week.js +95 -0
- package/dist/cpsat/rules/max-days-week.js.map +1 -0
- package/dist/cpsat/rules/min-days-week.d.ts +34 -0
- package/dist/cpsat/rules/min-days-week.d.ts.map +1 -0
- package/dist/cpsat/rules/min-days-week.js +84 -0
- package/dist/cpsat/rules/min-days-week.js.map +1 -0
- package/dist/cpsat/rules/must-assign.d.ts +49 -0
- package/dist/cpsat/rules/must-assign.d.ts.map +1 -0
- package/dist/cpsat/rules/must-assign.js +86 -0
- package/dist/cpsat/rules/must-assign.js.map +1 -0
- package/dist/cpsat/rules/registry.d.ts +4 -1
- package/dist/cpsat/rules/registry.d.ts.map +1 -1
- package/dist/cpsat/rules/registry.js +4 -1
- package/dist/cpsat/rules/registry.js.map +1 -1
- package/dist/cpsat/rules/rules.types.d.ts +3 -0
- package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
- package/dist/cpsat/rules/scope.types.d.ts +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/schedule/cost.d.ts +204 -0
- package/dist/schedule/cost.d.ts.map +1 -0
- package/dist/schedule/cost.js +187 -0
- package/dist/schedule/cost.js.map +1 -0
- package/dist/schedule/coverage.d.ts +85 -0
- package/dist/schedule/coverage.d.ts.map +1 -0
- package/dist/schedule/coverage.js +33 -0
- package/dist/schedule/coverage.js.map +1 -0
- package/dist/schedule/definition.d.ts +227 -0
- package/dist/schedule/definition.d.ts.map +1 -0
- package/dist/{schedule.js → schedule/definition.js} +9 -673
- package/dist/schedule/definition.js.map +1 -0
- package/dist/schedule/index.d.ts +67 -0
- package/dist/schedule/index.d.ts.map +1 -0
- package/dist/schedule/index.js +69 -0
- package/dist/schedule/index.js.map +1 -0
- package/dist/schedule/rules.d.ts +353 -0
- package/dist/schedule/rules.d.ts.map +1 -0
- package/dist/schedule/rules.js +352 -0
- package/dist/schedule/rules.js.map +1 -0
- package/dist/schedule/shift-patterns.d.ts +34 -0
- package/dist/schedule/shift-patterns.d.ts.map +1 -0
- package/dist/schedule/shift-patterns.js +41 -0
- package/dist/schedule/shift-patterns.js.map +1 -0
- package/dist/schedule/time-periods.d.ts +69 -0
- package/dist/schedule/time-periods.d.ts.map +1 -0
- package/dist/schedule/time-periods.js +91 -0
- package/dist/schedule/time-periods.js.map +1 -0
- package/package.json +4 -9
- package/src/cpsat/rules/index.ts +3 -0
- package/src/cpsat/rules/max-days-week.ts +143 -0
- package/src/cpsat/rules/min-days-week.ts +120 -0
- package/src/cpsat/rules/must-assign.ts +108 -0
- package/src/cpsat/rules/registry.ts +6 -0
- package/src/cpsat/rules/rules.types.ts +3 -0
- package/src/cpsat/rules/scope.types.ts +1 -1
- package/src/index.ts +8 -3
- package/src/schedule/cost.ts +242 -0
- package/src/schedule/coverage.ts +135 -0
- package/src/schedule/definition.ts +958 -0
- package/src/schedule/index.ts +112 -0
- package/src/schedule/rules.ts +529 -0
- package/src/schedule/shift-patterns.ts +46 -0
- package/src/schedule/time-periods.ts +110 -0
- package/dist/llms.d.ts +0 -2
- package/dist/llms.d.ts.map +0 -1
- package/dist/llms.js +0 -3
- package/dist/llms.js.map +0 -1
- package/dist/schedule.d.ts +0 -917
- package/dist/schedule.d.ts.map +0 -1
- package/dist/schedule.js.map +0 -1
- package/llms.txt +0 -758
- package/src/llms.ts +0 -3
- package/src/schedule.ts +0 -1960
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
This changelog was generated from the git history of the project when it was
|
|
6
6
|
named `scheduling-core`, prior to the rename to `dabke` in v0.78.0.
|
|
7
7
|
|
|
8
|
+
## 0.83.0 (2026-03-21)
|
|
9
|
+
|
|
10
|
+
### Breaking Changes
|
|
11
|
+
|
|
12
|
+
- Remove `./llms` export path and `llms.txt` from the package. The LLM reference
|
|
13
|
+
is now generated externally via `generate:reference`.
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
- Add `maxDaysPerWeek(days, opts?)` and `minDaysPerWeek(days, opts?)` rule functions
|
|
18
|
+
to constrain the number of distinct working days per member per scheduling week.
|
|
19
|
+
- Add `mustAssign(opts?)` rule for staffing obligations. Guarantees targeted members
|
|
20
|
+
appear on the schedule each week; defaults to HIGH priority so the schedule still
|
|
21
|
+
generates when a member cannot be placed.
|
|
22
|
+
|
|
23
|
+
### Improvements
|
|
24
|
+
|
|
25
|
+
- Split `schedule.ts` into focused modules under `src/schedule/` (public API unchanged).
|
|
26
|
+
- Add `NoInfer` on coverage entry types so role/skill references are checked against
|
|
27
|
+
declared roles and skills at compile time.
|
|
28
|
+
- Update devDependencies (@types/node ^25.0.0, commander ^14.0.3).
|
|
29
|
+
- Publish workflow now includes changelog text in GitHub releases.
|
|
30
|
+
|
|
8
31
|
## 0.82.0 (2026-02-23)
|
|
9
32
|
|
|
10
33
|
### Breaking Changes
|
package/README.md
CHANGED
|
@@ -178,12 +178,15 @@ const ready = venue.with([
|
|
|
178
178
|
|
|
179
179
|
## LLM Integration
|
|
180
180
|
|
|
181
|
-
|
|
181
|
+
Generate per-section API reference docs from TSDoc:
|
|
182
182
|
|
|
183
|
-
```
|
|
184
|
-
|
|
183
|
+
```bash
|
|
184
|
+
npm run generate:reference -- --outdir ./references
|
|
185
185
|
```
|
|
186
186
|
|
|
187
|
+
This produces a `README.md` index, an `api.md` API surface listing,
|
|
188
|
+
and one detail file per category (schedule, rules, coverage, etc.).
|
|
189
|
+
|
|
187
190
|
---
|
|
188
191
|
|
|
189
192
|
## Development
|
|
@@ -2,13 +2,16 @@ export { createAssignTogetherRule } from "./assign-together.js";
|
|
|
2
2
|
export { createAssignmentPriorityRule } from "./assignment-priority.js";
|
|
3
3
|
export { createLocationPreferenceRule } from "./location-preference.js";
|
|
4
4
|
export { createMaxConsecutiveDaysRule } from "./max-consecutive-days.js";
|
|
5
|
+
export { createMaxDaysWeekRule } from "./max-days-week.js";
|
|
5
6
|
export { createMaxHoursDayRule } from "./max-hours-day.js";
|
|
6
7
|
export { createMaxHoursWeekRule } from "./max-hours-week.js";
|
|
7
8
|
export { createMaxShiftsDayRule } from "./max-shifts-day.js";
|
|
8
9
|
export { createMinConsecutiveDaysRule } from "./min-consecutive-days.js";
|
|
10
|
+
export { createMinDaysWeekRule } from "./min-days-week.js";
|
|
9
11
|
export { createMinHoursDayRule } from "./min-hours-day.js";
|
|
10
12
|
export { createMinHoursWeekRule } from "./min-hours-week.js";
|
|
11
13
|
export { createMinRestBetweenShiftsRule } from "./min-rest-between-shifts.js";
|
|
14
|
+
export { createMustAssignRule } from "./must-assign.js";
|
|
12
15
|
export { createTimeOffRule } from "./time-off.js";
|
|
13
16
|
export { createMinimizeCostRule } from "./minimize-cost.js";
|
|
14
17
|
export { createDayCostMultiplierRule } from "./day-cost-multiplier.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -2,13 +2,16 @@ export { createAssignTogetherRule } from "./assign-together.js";
|
|
|
2
2
|
export { createAssignmentPriorityRule } from "./assignment-priority.js";
|
|
3
3
|
export { createLocationPreferenceRule } from "./location-preference.js";
|
|
4
4
|
export { createMaxConsecutiveDaysRule } from "./max-consecutive-days.js";
|
|
5
|
+
export { createMaxDaysWeekRule } from "./max-days-week.js";
|
|
5
6
|
export { createMaxHoursDayRule } from "./max-hours-day.js";
|
|
6
7
|
export { createMaxHoursWeekRule } from "./max-hours-week.js";
|
|
7
8
|
export { createMaxShiftsDayRule } from "./max-shifts-day.js";
|
|
8
9
|
export { createMinConsecutiveDaysRule } from "./min-consecutive-days.js";
|
|
10
|
+
export { createMinDaysWeekRule } from "./min-days-week.js";
|
|
9
11
|
export { createMinHoursDayRule } from "./min-hours-day.js";
|
|
10
12
|
export { createMinHoursWeekRule } from "./min-hours-week.js";
|
|
11
13
|
export { createMinRestBetweenShiftsRule } from "./min-rest-between-shifts.js";
|
|
14
|
+
export { createMustAssignRule } from "./must-assign.js";
|
|
12
15
|
export { createTimeOffRule } from "./time-off.js";
|
|
13
16
|
export { createMinimizeCostRule } from "./minimize-cost.js";
|
|
14
17
|
export { createDayCostMultiplierRule } from "./day-cost-multiplier.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cpsat/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cpsat/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import type { CompilationRule } from "../model-builder.js";
|
|
3
|
+
declare const MaxDaysWeekSchema: z.ZodIntersection<z.ZodIntersection<z.ZodObject<{
|
|
4
|
+
days: z.ZodNumber;
|
|
5
|
+
priority: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"LOW">, z.ZodLiteral<"MEDIUM">, z.ZodLiteral<"HIGH">, z.ZodLiteral<"MANDATORY">]>>;
|
|
6
|
+
weekStartsOn: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"monday">, z.ZodLiteral<"tuesday">, z.ZodLiteral<"wednesday">, z.ZodLiteral<"thursday">, z.ZodLiteral<"friday">, z.ZodLiteral<"saturday">, z.ZodLiteral<"sunday">]>>;
|
|
7
|
+
}, z.core.$strip>, z.ZodType<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown>>>, z.ZodType<import("./scope.types.js").OptionalTimeScopeType<"dateRange" | "dayOfWeek" | "specificDates" | "recurring">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").OptionalTimeScopeType<"dateRange" | "dayOfWeek" | "specificDates" | "recurring">, unknown>>>;
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for {@link createMaxDaysWeekRule}.
|
|
10
|
+
*
|
|
11
|
+
* - `days` (required): maximum number of days allowed per scheduling week
|
|
12
|
+
* - `priority` (required): how strictly the solver enforces this rule
|
|
13
|
+
* - `weekStartsOn` (optional): which day starts the week; defaults to {@link ModelBuilder.weekStartsOn}
|
|
14
|
+
*
|
|
15
|
+
* Entity scoping (at most one): `memberIds`, `roleIds`, `skillIds`
|
|
16
|
+
* Time scoping (at most one, optional): `dateRange`, `specificDates`, `dayOfWeek`, `recurringPeriods`
|
|
17
|
+
*/
|
|
18
|
+
export type MaxDaysWeekConfig = z.infer<typeof MaxDaysWeekSchema>;
|
|
19
|
+
/**
|
|
20
|
+
* Caps total number of days a person can work within each scheduling week.
|
|
21
|
+
*
|
|
22
|
+
* @remarks
|
|
23
|
+
* Creates a binary "works on day" variable for each member and day, then
|
|
24
|
+
* constrains the weekly sum. This counts distinct days, regardless of how
|
|
25
|
+
* many shifts are assigned on a single day.
|
|
26
|
+
*
|
|
27
|
+
* @param config - See {@link MaxDaysWeekConfig}
|
|
28
|
+
* @example Limit everyone to 5 days per week
|
|
29
|
+
* ```ts
|
|
30
|
+
* createMaxDaysWeekRule({ days: 5, priority: "MANDATORY" });
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @example Part-time staff limited to 3 days
|
|
34
|
+
* ```ts
|
|
35
|
+
* createMaxDaysWeekRule({
|
|
36
|
+
* roleIds: ["part-time"],
|
|
37
|
+
* days: 3,
|
|
38
|
+
* priority: "HIGH",
|
|
39
|
+
* });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function createMaxDaysWeekRule(config: MaxDaysWeekConfig): CompilationRule;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=max-days-week.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"max-days-week.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/max-days-week.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAoB3D,QAAA,MAAM,iBAAiB;;;;mfAEtB,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAiFhF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { DayOfWeekSchema } from "../../types.js";
|
|
3
|
+
import { priorityToPenalty, splitIntoWeeks } from "../utils.js";
|
|
4
|
+
import { PrioritySchema, entityScope, timeScope, parseEntityScope, parseTimeScope, resolveMembersFromScope, resolveActiveDaysFromScope, ruleGroup, } from "./scope.types.js";
|
|
5
|
+
const MaxDaysWeekBase = z.object({
|
|
6
|
+
days: z.number().int().min(0),
|
|
7
|
+
priority: PrioritySchema,
|
|
8
|
+
weekStartsOn: DayOfWeekSchema.optional(),
|
|
9
|
+
});
|
|
10
|
+
const MaxDaysWeekSchema = MaxDaysWeekBase.and(entityScope(["members", "roles", "skills"])).and(timeScope(["dateRange", "specificDates", "dayOfWeek", "recurring"]));
|
|
11
|
+
/**
|
|
12
|
+
* Caps total number of days a person can work within each scheduling week.
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* Creates a binary "works on day" variable for each member and day, then
|
|
16
|
+
* constrains the weekly sum. This counts distinct days, regardless of how
|
|
17
|
+
* many shifts are assigned on a single day.
|
|
18
|
+
*
|
|
19
|
+
* @param config - See {@link MaxDaysWeekConfig}
|
|
20
|
+
* @example Limit everyone to 5 days per week
|
|
21
|
+
* ```ts
|
|
22
|
+
* createMaxDaysWeekRule({ days: 5, priority: "MANDATORY" });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example Part-time staff limited to 3 days
|
|
26
|
+
* ```ts
|
|
27
|
+
* createMaxDaysWeekRule({
|
|
28
|
+
* roleIds: ["part-time"],
|
|
29
|
+
* days: 3,
|
|
30
|
+
* priority: "HIGH",
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function createMaxDaysWeekRule(config) {
|
|
35
|
+
const parsed = MaxDaysWeekSchema.parse(config);
|
|
36
|
+
const entityScopeValue = parseEntityScope(parsed);
|
|
37
|
+
const timeScopeValue = parseTimeScope(parsed);
|
|
38
|
+
const { days, priority, weekStartsOn } = parsed;
|
|
39
|
+
const group = ruleGroup(`max-days-week:${days}`, `Max ${days}d per week`, entityScopeValue, timeScopeValue);
|
|
40
|
+
return {
|
|
41
|
+
compile(b) {
|
|
42
|
+
const targetMembers = resolveMembersFromScope(entityScopeValue, b.members);
|
|
43
|
+
const activeDays = resolveActiveDaysFromScope(timeScopeValue, b.days);
|
|
44
|
+
if (targetMembers.length === 0 || activeDays.length === 0)
|
|
45
|
+
return;
|
|
46
|
+
const weeks = splitIntoWeeks(activeDays, weekStartsOn ?? b.weekStartsOn);
|
|
47
|
+
for (const emp of targetMembers) {
|
|
48
|
+
for (const weekDays of weeks) {
|
|
49
|
+
const weekWorkVars = [];
|
|
50
|
+
for (const day of weekDays) {
|
|
51
|
+
const dayAssignments = b.shiftPatterns
|
|
52
|
+
.filter((p) => b.canAssign(emp, p) && b.patternAvailableOnDay(p, day))
|
|
53
|
+
.map((p) => b.assignment(emp.id, p.id, day));
|
|
54
|
+
if (dayAssignments.length === 0)
|
|
55
|
+
continue;
|
|
56
|
+
const worksVar = b.boolVar(`works_day_${emp.id}_${day}`);
|
|
57
|
+
weekWorkVars.push(worksVar);
|
|
58
|
+
// worksVar >= each assignment (if any assignment is 1, worksVar must be 1)
|
|
59
|
+
for (const assignVar of dayAssignments) {
|
|
60
|
+
b.addLinear([
|
|
61
|
+
{ var: worksVar, coeff: 1 },
|
|
62
|
+
{ var: assignVar, coeff: -1 },
|
|
63
|
+
], ">=", 0);
|
|
64
|
+
}
|
|
65
|
+
// worksVar <= sum(assignments) (if no assignment is 1, worksVar must be 0)
|
|
66
|
+
b.addLinear([{ var: worksVar, coeff: 1 }, ...dayAssignments.map((v) => ({ var: v, coeff: -1 }))], "<=", 0);
|
|
67
|
+
}
|
|
68
|
+
if (weekWorkVars.length === 0)
|
|
69
|
+
continue;
|
|
70
|
+
const weekLabel = weekDays[0];
|
|
71
|
+
const constraintId = `max-days-week:${emp.id}:${weekLabel}`;
|
|
72
|
+
const terms = weekWorkVars.map((v) => ({ var: v, coeff: 1 }));
|
|
73
|
+
if (priority === "MANDATORY") {
|
|
74
|
+
b.addLinear(terms, "<=", days);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
b.addSoftLinear(terms, "<=", days, priorityToPenalty(priority), constraintId);
|
|
78
|
+
b.reporter.trackConstraint({
|
|
79
|
+
id: constraintId,
|
|
80
|
+
type: "rule",
|
|
81
|
+
rule: "max-days-week",
|
|
82
|
+
description: `${emp.id} max ${days}d in week starting ${weekLabel}`,
|
|
83
|
+
targetValue: days,
|
|
84
|
+
comparator: "<=",
|
|
85
|
+
day: weekLabel,
|
|
86
|
+
context: { memberIds: [emp.id], days: weekDays },
|
|
87
|
+
group,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=max-days-week.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"max-days-week.js","sourceRoot":"","sources":["../../../src/cpsat/rules/max-days-week.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import type { CompilationRule } from "../model-builder.js";
|
|
3
|
+
declare const MinDaysWeekSchema: z.ZodIntersection<z.ZodObject<{
|
|
4
|
+
days: z.ZodNumber;
|
|
5
|
+
priority: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"LOW">, z.ZodLiteral<"MEDIUM">, z.ZodLiteral<"HIGH">, z.ZodLiteral<"MANDATORY">]>>;
|
|
6
|
+
weekStartsOn: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"monday">, z.ZodLiteral<"tuesday">, z.ZodLiteral<"wednesday">, z.ZodLiteral<"thursday">, z.ZodLiteral<"friday">, z.ZodLiteral<"saturday">, z.ZodLiteral<"sunday">]>>;
|
|
7
|
+
}, z.core.$strip>, z.ZodType<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown>>>;
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for {@link createMinDaysWeekRule}.
|
|
10
|
+
*
|
|
11
|
+
* - `days` (required): minimum number of days required per scheduling week
|
|
12
|
+
* - `priority` (required): how strictly the solver enforces this rule
|
|
13
|
+
* - `weekStartsOn` (optional): which day starts the week; defaults to {@link ModelBuilder.weekStartsOn}
|
|
14
|
+
*
|
|
15
|
+
* Entity scoping (at most one): `memberIds`, `roleIds`, `skillIds`
|
|
16
|
+
*/
|
|
17
|
+
export type MinDaysWeekConfig = z.infer<typeof MinDaysWeekSchema>;
|
|
18
|
+
/**
|
|
19
|
+
* Enforces a minimum number of days a person must work per scheduling week.
|
|
20
|
+
*
|
|
21
|
+
* @remarks
|
|
22
|
+
* Creates a binary "works on day" variable for each member and day, then
|
|
23
|
+
* constrains the weekly sum. This counts distinct days, regardless of how
|
|
24
|
+
* many shifts are assigned on a single day.
|
|
25
|
+
*
|
|
26
|
+
* @param config - See {@link MinDaysWeekConfig}
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* createMinDaysWeekRule({ days: 3, priority: "HIGH" });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function createMinDaysWeekRule(config: MinDaysWeekConfig): CompilationRule;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=min-days-week.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"min-days-week.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/min-days-week.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAiB3D,QAAA,MAAM,iBAAiB;;;;iOAAmE,CAAC;AAE3F;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAyEhF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { DayOfWeekSchema } from "../../types.js";
|
|
3
|
+
import { priorityToPenalty, splitIntoWeeks } from "../utils.js";
|
|
4
|
+
import { PrioritySchema, entityScope, parseEntityScope, resolveMembersFromScope, ruleGroup, } from "./scope.types.js";
|
|
5
|
+
const MinDaysWeekBase = z.object({
|
|
6
|
+
days: z.number().int().min(0),
|
|
7
|
+
priority: PrioritySchema,
|
|
8
|
+
weekStartsOn: DayOfWeekSchema.optional(),
|
|
9
|
+
});
|
|
10
|
+
const MinDaysWeekSchema = MinDaysWeekBase.and(entityScope(["members", "roles", "skills"]));
|
|
11
|
+
/**
|
|
12
|
+
* Enforces a minimum number of days a person must work per scheduling week.
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* Creates a binary "works on day" variable for each member and day, then
|
|
16
|
+
* constrains the weekly sum. This counts distinct days, regardless of how
|
|
17
|
+
* many shifts are assigned on a single day.
|
|
18
|
+
*
|
|
19
|
+
* @param config - See {@link MinDaysWeekConfig}
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* createMinDaysWeekRule({ days: 3, priority: "HIGH" });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function createMinDaysWeekRule(config) {
|
|
26
|
+
const parsed = MinDaysWeekSchema.parse(config);
|
|
27
|
+
const scope = parseEntityScope(parsed);
|
|
28
|
+
const { days, priority, weekStartsOn } = parsed;
|
|
29
|
+
const group = ruleGroup(`min-days-week:${days}`, `Min ${days}d per week`, scope);
|
|
30
|
+
return {
|
|
31
|
+
compile(b) {
|
|
32
|
+
if (days <= 0)
|
|
33
|
+
return;
|
|
34
|
+
const members = resolveMembersFromScope(scope, b.members);
|
|
35
|
+
const weeks = splitIntoWeeks(b.days, weekStartsOn ?? b.weekStartsOn);
|
|
36
|
+
for (const emp of members) {
|
|
37
|
+
for (const weekDays of weeks) {
|
|
38
|
+
const weekWorkVars = [];
|
|
39
|
+
for (const day of weekDays) {
|
|
40
|
+
const dayAssignments = b.shiftPatterns
|
|
41
|
+
.filter((p) => b.canAssign(emp, p) && b.patternAvailableOnDay(p, day))
|
|
42
|
+
.map((p) => b.assignment(emp.id, p.id, day));
|
|
43
|
+
if (dayAssignments.length === 0)
|
|
44
|
+
continue;
|
|
45
|
+
const worksVar = b.boolVar(`works_day_${emp.id}_${day}`);
|
|
46
|
+
weekWorkVars.push(worksVar);
|
|
47
|
+
// worksVar >= each assignment (if any assignment is 1, worksVar must be 1)
|
|
48
|
+
for (const assignVar of dayAssignments) {
|
|
49
|
+
b.addLinear([
|
|
50
|
+
{ var: worksVar, coeff: 1 },
|
|
51
|
+
{ var: assignVar, coeff: -1 },
|
|
52
|
+
], ">=", 0);
|
|
53
|
+
}
|
|
54
|
+
// worksVar <= sum(assignments) (if no assignment is 1, worksVar must be 0)
|
|
55
|
+
b.addLinear([{ var: worksVar, coeff: 1 }, ...dayAssignments.map((v) => ({ var: v, coeff: -1 }))], "<=", 0);
|
|
56
|
+
}
|
|
57
|
+
if (weekWorkVars.length === 0)
|
|
58
|
+
continue;
|
|
59
|
+
const weekLabel = weekDays[0];
|
|
60
|
+
const constraintId = `min-days-week:${emp.id}:${weekLabel}`;
|
|
61
|
+
const terms = weekWorkVars.map((v) => ({ var: v, coeff: 1 }));
|
|
62
|
+
if (priority === "MANDATORY") {
|
|
63
|
+
b.addLinear(terms, ">=", days);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
b.addSoftLinear(terms, ">=", days, priorityToPenalty(priority), constraintId);
|
|
67
|
+
b.reporter.trackConstraint({
|
|
68
|
+
id: constraintId,
|
|
69
|
+
type: "rule",
|
|
70
|
+
rule: "min-days-week",
|
|
71
|
+
description: `${emp.id} min ${days}d in week starting ${weekLabel}`,
|
|
72
|
+
targetValue: days,
|
|
73
|
+
comparator: ">=",
|
|
74
|
+
day: weekLabel,
|
|
75
|
+
context: { memberIds: [emp.id], days: weekDays },
|
|
76
|
+
group,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=min-days-week.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"min-days-week.js","sourceRoot":"","sources":["../../../src/cpsat/rules/min-days-week.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import type { CompilationRule } from "../model-builder.js";
|
|
3
|
+
declare const MustAssignSchema: z.ZodIntersection<z.ZodObject<{
|
|
4
|
+
weekStartsOn: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"monday">, z.ZodLiteral<"tuesday">, z.ZodLiteral<"wednesday">, z.ZodLiteral<"thursday">, z.ZodLiteral<"friday">, z.ZodLiteral<"saturday">, z.ZodLiteral<"sunday">]>>;
|
|
5
|
+
}, z.core.$strip>, z.ZodType<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown>>>;
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for {@link createMustAssignRule}.
|
|
8
|
+
*
|
|
9
|
+
* - `weekStartsOn` (optional): which day starts the week; defaults to
|
|
10
|
+
* {@link ModelBuilder.weekStartsOn}
|
|
11
|
+
*
|
|
12
|
+
* Entity scoping (at most one): `memberIds`, `roleIds`, `skillIds`
|
|
13
|
+
*/
|
|
14
|
+
export type MustAssignConfig = z.infer<typeof MustAssignSchema>;
|
|
15
|
+
/**
|
|
16
|
+
* Guarantees that targeted members appear on the schedule.
|
|
17
|
+
*
|
|
18
|
+
* @remarks
|
|
19
|
+
* Use this for staffing obligations: salaried employees who are paid
|
|
20
|
+
* regardless of whether they work, or contracted staff who must be
|
|
21
|
+
* rostered. The solver ensures each targeted member has at least one
|
|
22
|
+
* assignment per scheduling week.
|
|
23
|
+
*
|
|
24
|
+
* Always compiles as a soft constraint (HIGH priority internally) so the
|
|
25
|
+
* schedule still generates when a member genuinely cannot be placed
|
|
26
|
+
* (e.g., full week of absences, no compatible shift patterns). Violations
|
|
27
|
+
* surface as validation warnings with distinct messaging from
|
|
28
|
+
* `min-days-week`.
|
|
29
|
+
*
|
|
30
|
+
* Unlike {@link createMinDaysWeekRule}, this rule communicates a staffing
|
|
31
|
+
* obligation rather than a scheduling preference. Validation messages
|
|
32
|
+
* reflect this: "Alice was not assigned (staffing obligation)" rather
|
|
33
|
+
* than "Alice worked 0 days, minimum was 1."
|
|
34
|
+
*
|
|
35
|
+
* @param config - See {@link MustAssignConfig}
|
|
36
|
+
*
|
|
37
|
+
* @example Ensure a salaried manager is always rostered
|
|
38
|
+
* ```ts
|
|
39
|
+
* createMustAssignRule({ memberIds: ["diana"] });
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @example Ensure all supervisors appear on the rota
|
|
43
|
+
* ```ts
|
|
44
|
+
* createMustAssignRule({ roleIds: ["supervisor"] });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function createMustAssignRule(config: MustAssignConfig): CompilationRule;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=must-assign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"must-assign.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/must-assign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAa3D,QAAA,MAAM,gBAAgB;;iOAI6B,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CA4C9E"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { DayOfWeekSchema } from "../../types.js";
|
|
3
|
+
import { priorityToPenalty, splitIntoWeeks } from "../utils.js";
|
|
4
|
+
import { entityScope, parseEntityScope, resolveMembersFromScope, ruleGroup, } from "./scope.types.js";
|
|
5
|
+
/** Internally always HIGH. Not user-configurable. */
|
|
6
|
+
const MUST_ASSIGN_PENALTY = priorityToPenalty("HIGH");
|
|
7
|
+
const MustAssignSchema = z
|
|
8
|
+
.object({
|
|
9
|
+
weekStartsOn: DayOfWeekSchema.optional(),
|
|
10
|
+
})
|
|
11
|
+
.and(entityScope(["members", "roles", "skills"]));
|
|
12
|
+
/**
|
|
13
|
+
* Guarantees that targeted members appear on the schedule.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* Use this for staffing obligations: salaried employees who are paid
|
|
17
|
+
* regardless of whether they work, or contracted staff who must be
|
|
18
|
+
* rostered. The solver ensures each targeted member has at least one
|
|
19
|
+
* assignment per scheduling week.
|
|
20
|
+
*
|
|
21
|
+
* Always compiles as a soft constraint (HIGH priority internally) so the
|
|
22
|
+
* schedule still generates when a member genuinely cannot be placed
|
|
23
|
+
* (e.g., full week of absences, no compatible shift patterns). Violations
|
|
24
|
+
* surface as validation warnings with distinct messaging from
|
|
25
|
+
* `min-days-week`.
|
|
26
|
+
*
|
|
27
|
+
* Unlike {@link createMinDaysWeekRule}, this rule communicates a staffing
|
|
28
|
+
* obligation rather than a scheduling preference. Validation messages
|
|
29
|
+
* reflect this: "Alice was not assigned (staffing obligation)" rather
|
|
30
|
+
* than "Alice worked 0 days, minimum was 1."
|
|
31
|
+
*
|
|
32
|
+
* @param config - See {@link MustAssignConfig}
|
|
33
|
+
*
|
|
34
|
+
* @example Ensure a salaried manager is always rostered
|
|
35
|
+
* ```ts
|
|
36
|
+
* createMustAssignRule({ memberIds: ["diana"] });
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example Ensure all supervisors appear on the rota
|
|
40
|
+
* ```ts
|
|
41
|
+
* createMustAssignRule({ roleIds: ["supervisor"] });
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function createMustAssignRule(config) {
|
|
45
|
+
const parsed = MustAssignSchema.parse(config);
|
|
46
|
+
const scope = parseEntityScope(parsed);
|
|
47
|
+
const { weekStartsOn } = parsed;
|
|
48
|
+
const group = ruleGroup("must-assign", "Must assign", scope);
|
|
49
|
+
return {
|
|
50
|
+
compile(b) {
|
|
51
|
+
const members = resolveMembersFromScope(scope, b.members);
|
|
52
|
+
const weeks = splitIntoWeeks(b.days, weekStartsOn ?? b.weekStartsOn);
|
|
53
|
+
for (const emp of members) {
|
|
54
|
+
for (const weekDays of weeks) {
|
|
55
|
+
const terms = [];
|
|
56
|
+
for (const day of weekDays) {
|
|
57
|
+
for (const pattern of b.shiftPatterns) {
|
|
58
|
+
if (!b.canAssign(emp, pattern))
|
|
59
|
+
continue;
|
|
60
|
+
if (!b.patternAvailableOnDay(pattern, day))
|
|
61
|
+
continue;
|
|
62
|
+
terms.push({ var: b.assignment(emp.id, pattern.id, day), coeff: 1 });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (terms.length === 0)
|
|
66
|
+
continue;
|
|
67
|
+
const weekLabel = weekDays[0];
|
|
68
|
+
const constraintId = `must-assign:${emp.id}:${weekLabel}`;
|
|
69
|
+
b.addSoftLinear(terms, ">=", 1, MUST_ASSIGN_PENALTY, constraintId);
|
|
70
|
+
b.reporter.trackConstraint({
|
|
71
|
+
id: constraintId,
|
|
72
|
+
type: "rule",
|
|
73
|
+
rule: "must-assign",
|
|
74
|
+
description: `${emp.id} not assigned in week starting ${weekLabel} (staffing obligation)`,
|
|
75
|
+
targetValue: 1,
|
|
76
|
+
comparator: ">=",
|
|
77
|
+
day: weekLabel,
|
|
78
|
+
context: { memberIds: [emp.id], days: weekDays },
|
|
79
|
+
group,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=must-assign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"must-assign.js","sourceRoot":"","sources":["../../../src/cpsat/rules/must-assign.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
import { createAssignTogetherRule, createAssignmentPriorityRule, createLocationPreferenceRule, createMaxConsecutiveDaysRule, createMaxHoursDayRule, createMaxHoursWeekRule, createMaxShiftsDayRule, createMinConsecutiveDaysRule, createMinHoursDayRule, createMinHoursWeekRule, createMinRestBetweenShiftsRule, createTimeOffRule, createMinimizeCostRule, createDayCostMultiplierRule, createDayCostSurchargeRule, createTimeCostSurchargeRule, createOvertimeWeeklyMultiplierRule, createOvertimeWeeklySurchargeRule, createOvertimeDailyMultiplierRule, createOvertimeDailySurchargeRule, createOvertimeTieredMultiplierRule } from "./index.js";
|
|
1
|
+
import { createAssignTogetherRule, createAssignmentPriorityRule, createLocationPreferenceRule, createMaxConsecutiveDaysRule, createMaxDaysWeekRule, createMaxHoursDayRule, createMaxHoursWeekRule, createMaxShiftsDayRule, createMinConsecutiveDaysRule, createMinDaysWeekRule, createMinHoursDayRule, createMinHoursWeekRule, createMinRestBetweenShiftsRule, createMustAssignRule, createTimeOffRule, createMinimizeCostRule, createDayCostMultiplierRule, createDayCostSurchargeRule, createTimeCostSurchargeRule, createOvertimeWeeklyMultiplierRule, createOvertimeWeeklySurchargeRule, createOvertimeDailyMultiplierRule, createOvertimeDailySurchargeRule, createOvertimeTieredMultiplierRule } from "./index.js";
|
|
2
2
|
import type { CpsatRuleFactories } from "./rules.types.js";
|
|
3
3
|
export declare const builtInCpsatRuleFactories: {
|
|
4
4
|
"assign-together": typeof createAssignTogetherRule;
|
|
5
5
|
"assignment-priority": typeof createAssignmentPriorityRule;
|
|
6
6
|
"location-preference": typeof createLocationPreferenceRule;
|
|
7
7
|
"max-consecutive-days": typeof createMaxConsecutiveDaysRule;
|
|
8
|
+
"max-days-week": typeof createMaxDaysWeekRule;
|
|
8
9
|
"max-hours-day": typeof createMaxHoursDayRule;
|
|
9
10
|
"max-hours-week": typeof createMaxHoursWeekRule;
|
|
10
11
|
"max-shifts-day": typeof createMaxShiftsDayRule;
|
|
11
12
|
"min-consecutive-days": typeof createMinConsecutiveDaysRule;
|
|
13
|
+
"min-days-week": typeof createMinDaysWeekRule;
|
|
12
14
|
"min-hours-day": typeof createMinHoursDayRule;
|
|
13
15
|
"min-hours-week": typeof createMinHoursWeekRule;
|
|
14
16
|
"min-rest-between-shifts": typeof createMinRestBetweenShiftsRule;
|
|
17
|
+
"must-assign": typeof createMustAssignRule;
|
|
15
18
|
"time-off": typeof createTimeOffRule;
|
|
16
19
|
"minimize-cost": typeof createMinimizeCostRule;
|
|
17
20
|
"day-cost-multiplier": typeof createDayCostMultiplierRule;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,EACnC,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,yBAAyB
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,EACnC,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;CAyBD,CAAC;AAEtC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,kBAAkB,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAUpF"}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import { createAssignTogetherRule, createAssignmentPriorityRule, createLocationPreferenceRule, createMaxConsecutiveDaysRule, createMaxHoursDayRule, createMaxHoursWeekRule, createMaxShiftsDayRule, createMinConsecutiveDaysRule, createMinHoursDayRule, createMinHoursWeekRule, createMinRestBetweenShiftsRule, createTimeOffRule, createMinimizeCostRule, createDayCostMultiplierRule, createDayCostSurchargeRule, createTimeCostSurchargeRule, createOvertimeWeeklyMultiplierRule, createOvertimeWeeklySurchargeRule, createOvertimeDailyMultiplierRule, createOvertimeDailySurchargeRule, createOvertimeTieredMultiplierRule, } from "./index.js";
|
|
1
|
+
import { createAssignTogetherRule, createAssignmentPriorityRule, createLocationPreferenceRule, createMaxConsecutiveDaysRule, createMaxDaysWeekRule, createMaxHoursDayRule, createMaxHoursWeekRule, createMaxShiftsDayRule, createMinConsecutiveDaysRule, createMinDaysWeekRule, createMinHoursDayRule, createMinHoursWeekRule, createMinRestBetweenShiftsRule, createMustAssignRule, createTimeOffRule, createMinimizeCostRule, createDayCostMultiplierRule, createDayCostSurchargeRule, createTimeCostSurchargeRule, createOvertimeWeeklyMultiplierRule, createOvertimeWeeklySurchargeRule, createOvertimeDailyMultiplierRule, createOvertimeDailySurchargeRule, createOvertimeTieredMultiplierRule, } from "./index.js";
|
|
2
2
|
export const builtInCpsatRuleFactories = {
|
|
3
3
|
"assign-together": createAssignTogetherRule,
|
|
4
4
|
"assignment-priority": createAssignmentPriorityRule,
|
|
5
5
|
"location-preference": createLocationPreferenceRule,
|
|
6
6
|
"max-consecutive-days": createMaxConsecutiveDaysRule,
|
|
7
|
+
"max-days-week": createMaxDaysWeekRule,
|
|
7
8
|
"max-hours-day": createMaxHoursDayRule,
|
|
8
9
|
"max-hours-week": createMaxHoursWeekRule,
|
|
9
10
|
"max-shifts-day": createMaxShiftsDayRule,
|
|
10
11
|
"min-consecutive-days": createMinConsecutiveDaysRule,
|
|
12
|
+
"min-days-week": createMinDaysWeekRule,
|
|
11
13
|
"min-hours-day": createMinHoursDayRule,
|
|
12
14
|
"min-hours-week": createMinHoursWeekRule,
|
|
13
15
|
"min-rest-between-shifts": createMinRestBetweenShiftsRule,
|
|
16
|
+
"must-assign": createMustAssignRule,
|
|
14
17
|
"time-off": createTimeOffRule,
|
|
15
18
|
"minimize-cost": createMinimizeCostRule,
|
|
16
19
|
"day-cost-multiplier": createDayCostMultiplierRule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cpsat/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,YAAY,CAAC;AAOpB,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,iBAAiB,EAAE,wBAAwB;IAC3C,qBAAqB,EAAE,4BAA4B;IACnD,qBAAqB,EAAE,4BAA4B;IACnD,sBAAsB,EAAE,4BAA4B;IACpD,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,sBAAsB;IACxC,gBAAgB,EAAE,sBAAsB;IACxC,sBAAsB,EAAE,4BAA4B;IACpD,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,sBAAsB;IACxC,yBAAyB,EAAE,8BAA8B;IACzD,UAAU,EAAE,iBAAiB;IAC7B,eAAe,EAAE,sBAAsB;IACvC,qBAAqB,EAAE,2BAA2B;IAClD,oBAAoB,EAAE,0BAA0B;IAChD,qBAAqB,EAAE,2BAA2B;IAClD,4BAA4B,EAAE,kCAAkC;IAChE,2BAA2B,EAAE,iCAAiC;IAC9D,2BAA2B,EAAE,iCAAiC;IAC9D,0BAA0B,EAAE,gCAAgC;IAC5D,4BAA4B,EAAE,kCAAkC;CAC7B,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAA+B,SAAY;IAC/E,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IACE,IAAI,IAAI,yBAAyB;YACjC,SAAS,CAAC,IAAI,CAAC,KAAK,yBAAyB,CAAC,IAAqB,CAAC,EACpE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,qBAAqB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cpsat/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,YAAY,CAAC;AAOpB,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,iBAAiB,EAAE,wBAAwB;IAC3C,qBAAqB,EAAE,4BAA4B;IACnD,qBAAqB,EAAE,4BAA4B;IACnD,sBAAsB,EAAE,4BAA4B;IACpD,eAAe,EAAE,qBAAqB;IACtC,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,sBAAsB;IACxC,gBAAgB,EAAE,sBAAsB;IACxC,sBAAsB,EAAE,4BAA4B;IACpD,eAAe,EAAE,qBAAqB;IACtC,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,sBAAsB;IACxC,yBAAyB,EAAE,8BAA8B;IACzD,aAAa,EAAE,oBAAoB;IACnC,UAAU,EAAE,iBAAiB;IAC7B,eAAe,EAAE,sBAAsB;IACvC,qBAAqB,EAAE,2BAA2B;IAClD,oBAAoB,EAAE,0BAA0B;IAChD,qBAAqB,EAAE,2BAA2B;IAClD,4BAA4B,EAAE,kCAAkC;IAChE,2BAA2B,EAAE,iCAAiC;IAC9D,2BAA2B,EAAE,iCAAiC;IAC9D,0BAA0B,EAAE,gCAAgC;IAC5D,4BAA4B,EAAE,kCAAkC;CAC7B,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAA+B,SAAY;IAC/E,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IACE,IAAI,IAAI,yBAAyB;YACjC,SAAS,CAAC,IAAI,CAAC,KAAK,yBAAyB,CAAC,IAAqB,CAAC,EACpE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,qBAAqB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -5,13 +5,16 @@ export interface CpsatRuleRegistry {
|
|
|
5
5
|
"assignment-priority": import("./assignment-priority.js").AssignmentPriorityConfig;
|
|
6
6
|
"location-preference": import("./location-preference.js").LocationPreferenceConfig;
|
|
7
7
|
"max-consecutive-days": import("./max-consecutive-days.js").MaxConsecutiveDaysConfig;
|
|
8
|
+
"max-days-week": import("./max-days-week.js").MaxDaysWeekConfig;
|
|
8
9
|
"max-hours-day": import("./max-hours-day.js").MaxHoursDayConfig;
|
|
9
10
|
"max-hours-week": import("./max-hours-week.js").MaxHoursWeekConfig;
|
|
10
11
|
"max-shifts-day": import("./max-shifts-day.js").MaxShiftsDayConfig;
|
|
11
12
|
"min-consecutive-days": import("./min-consecutive-days.js").MinConsecutiveDaysConfig;
|
|
13
|
+
"min-days-week": import("./min-days-week.js").MinDaysWeekConfig;
|
|
12
14
|
"min-hours-day": import("./min-hours-day.js").MinHoursDayConfig;
|
|
13
15
|
"min-hours-week": import("./min-hours-week.js").MinHoursWeekConfig;
|
|
14
16
|
"min-rest-between-shifts": import("./min-rest-between-shifts.js").MinRestBetweenShiftsConfig;
|
|
17
|
+
"must-assign": import("./must-assign.js").MustAssignConfig;
|
|
15
18
|
"time-off": import("./time-off.js").TimeOffConfig;
|
|
16
19
|
"minimize-cost": import("./minimize-cost.js").MinimizeCostConfig;
|
|
17
20
|
"day-cost-multiplier": import("./day-cost-multiplier.js").DayCostMultiplierConfig;
|