dabke 0.82.0 → 0.84.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.
Files changed (341) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +22 -24
  3. package/dist/client.d.ts +39 -3
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js.map +1 -1
  6. package/dist/client.schemas.d.ts +118 -18
  7. package/dist/client.schemas.d.ts.map +1 -1
  8. package/dist/client.schemas.js +110 -6
  9. package/dist/client.schemas.js.map +1 -1
  10. package/dist/client.types.d.ts +63 -7
  11. package/dist/client.types.d.ts.map +1 -1
  12. package/dist/client.types.js.map +1 -1
  13. package/dist/cpsat/cost.d.ts +5 -2
  14. package/dist/cpsat/cost.d.ts.map +1 -1
  15. package/dist/cpsat/cost.js +13 -6
  16. package/dist/cpsat/cost.js.map +1 -1
  17. package/dist/cpsat/model-builder.d.ts +42 -61
  18. package/dist/cpsat/model-builder.d.ts.map +1 -1
  19. package/dist/cpsat/model-builder.js +451 -56
  20. package/dist/cpsat/model-builder.js.map +1 -1
  21. package/dist/cpsat/response.d.ts +19 -7
  22. package/dist/cpsat/response.d.ts.map +1 -1
  23. package/dist/cpsat/response.js +48 -9
  24. package/dist/cpsat/response.js.map +1 -1
  25. package/dist/cpsat/rule-descriptor.d.ts +250 -0
  26. package/dist/cpsat/rule-descriptor.d.ts.map +1 -0
  27. package/dist/cpsat/rule-descriptor.js +51 -0
  28. package/dist/cpsat/rule-descriptor.js.map +1 -0
  29. package/dist/cpsat/rules/artifacts.d.ts +9 -0
  30. package/dist/cpsat/rules/artifacts.d.ts.map +1 -0
  31. package/dist/cpsat/rules/artifacts.js +31 -0
  32. package/dist/cpsat/rules/artifacts.js.map +1 -0
  33. package/dist/cpsat/rules/assign-together.d.ts +18 -20
  34. package/dist/cpsat/rules/assign-together.d.ts.map +1 -1
  35. package/dist/cpsat/rules/assign-together.js +90 -54
  36. package/dist/cpsat/rules/assign-together.js.map +1 -1
  37. package/dist/cpsat/rules/assigned-day.d.ts +12 -0
  38. package/dist/cpsat/rules/assigned-day.d.ts.map +1 -0
  39. package/dist/cpsat/rules/assigned-day.js +43 -0
  40. package/dist/cpsat/rules/assigned-day.js.map +1 -0
  41. package/dist/cpsat/rules/assignment-priority.d.ts +15 -29
  42. package/dist/cpsat/rules/assignment-priority.d.ts.map +1 -1
  43. package/dist/cpsat/rules/assignment-priority.js +47 -50
  44. package/dist/cpsat/rules/assignment-priority.js.map +1 -1
  45. package/dist/cpsat/rules/assignment-terms.d.ts +6 -0
  46. package/dist/cpsat/rules/assignment-terms.d.ts.map +1 -0
  47. package/dist/cpsat/rules/assignment-terms.js +19 -0
  48. package/dist/cpsat/rules/assignment-terms.js.map +1 -0
  49. package/dist/cpsat/rules/concurrent-intervals.d.ts +19 -0
  50. package/dist/cpsat/rules/concurrent-intervals.d.ts.map +1 -0
  51. package/dist/cpsat/rules/concurrent-intervals.js +57 -0
  52. package/dist/cpsat/rules/concurrent-intervals.js.map +1 -0
  53. package/dist/cpsat/rules/cost-utils.d.ts +1 -3
  54. package/dist/cpsat/rules/cost-utils.d.ts.map +1 -1
  55. package/dist/cpsat/rules/cost-utils.js +0 -7
  56. package/dist/cpsat/rules/cost-utils.js.map +1 -1
  57. package/dist/cpsat/rules/day-cost-multiplier.d.ts +10 -10
  58. package/dist/cpsat/rules/day-cost-multiplier.d.ts.map +1 -1
  59. package/dist/cpsat/rules/day-cost-multiplier.js +88 -77
  60. package/dist/cpsat/rules/day-cost-multiplier.js.map +1 -1
  61. package/dist/cpsat/rules/day-cost-surcharge.d.ts +10 -10
  62. package/dist/cpsat/rules/day-cost-surcharge.d.ts.map +1 -1
  63. package/dist/cpsat/rules/day-cost-surcharge.js +76 -65
  64. package/dist/cpsat/rules/day-cost-surcharge.js.map +1 -1
  65. package/dist/cpsat/rules/index.d.ts +30 -21
  66. package/dist/cpsat/rules/index.d.ts.map +1 -1
  67. package/dist/cpsat/rules/index.js +30 -21
  68. package/dist/cpsat/rules/index.js.map +1 -1
  69. package/dist/cpsat/rules/location-preference.d.ts +14 -21
  70. package/dist/cpsat/rules/location-preference.d.ts.map +1 -1
  71. package/dist/cpsat/rules/location-preference.js +45 -45
  72. package/dist/cpsat/rules/location-preference.js.map +1 -1
  73. package/dist/cpsat/rules/max-concurrent-assignments.d.ts +46 -0
  74. package/dist/cpsat/rules/max-concurrent-assignments.d.ts.map +1 -0
  75. package/dist/cpsat/rules/max-concurrent-assignments.js +121 -0
  76. package/dist/cpsat/rules/max-concurrent-assignments.js.map +1 -0
  77. package/dist/cpsat/rules/max-consecutive-days.d.ts +18 -17
  78. package/dist/cpsat/rules/max-consecutive-days.d.ts.map +1 -1
  79. package/dist/cpsat/rules/max-consecutive-days.js +67 -66
  80. package/dist/cpsat/rules/max-consecutive-days.js.map +1 -1
  81. package/dist/cpsat/rules/max-days-of-week-per-period.d.ts +45 -0
  82. package/dist/cpsat/rules/max-days-of-week-per-period.d.ts.map +1 -0
  83. package/dist/cpsat/rules/max-days-of-week-per-period.js +95 -0
  84. package/dist/cpsat/rules/max-days-of-week-per-period.js.map +1 -0
  85. package/dist/cpsat/rules/max-days-week.d.ts +30 -0
  86. package/dist/cpsat/rules/max-days-week.d.ts.map +1 -0
  87. package/dist/cpsat/rules/max-days-week.js +83 -0
  88. package/dist/cpsat/rules/max-days-week.js.map +1 -0
  89. package/dist/cpsat/rules/max-hours-day.d.ts +14 -31
  90. package/dist/cpsat/rules/max-hours-day.d.ts.map +1 -1
  91. package/dist/cpsat/rules/max-hours-day.js +56 -72
  92. package/dist/cpsat/rules/max-hours-day.js.map +1 -1
  93. package/dist/cpsat/rules/max-hours-week.d.ts +15 -31
  94. package/dist/cpsat/rules/max-hours-week.d.ts.map +1 -1
  95. package/dist/cpsat/rules/max-hours-week.js +60 -75
  96. package/dist/cpsat/rules/max-hours-week.js.map +1 -1
  97. package/dist/cpsat/rules/max-shifts-day.d.ts +17 -33
  98. package/dist/cpsat/rules/max-shifts-day.d.ts.map +1 -1
  99. package/dist/cpsat/rules/max-shifts-day.js +57 -73
  100. package/dist/cpsat/rules/max-shifts-day.js.map +1 -1
  101. package/dist/cpsat/rules/min-consecutive-days.d.ts +18 -18
  102. package/dist/cpsat/rules/min-consecutive-days.d.ts.map +1 -1
  103. package/dist/cpsat/rules/min-consecutive-days.js +123 -94
  104. package/dist/cpsat/rules/min-consecutive-days.js.map +1 -1
  105. package/dist/cpsat/rules/min-days-of-week-per-period.d.ts +35 -0
  106. package/dist/cpsat/rules/min-days-of-week-per-period.d.ts.map +1 -0
  107. package/dist/cpsat/rules/min-days-of-week-per-period.js +108 -0
  108. package/dist/cpsat/rules/min-days-of-week-per-period.js.map +1 -0
  109. package/dist/cpsat/rules/min-days-week.d.ts +21 -0
  110. package/dist/cpsat/rules/min-days-week.d.ts.map +1 -0
  111. package/dist/cpsat/rules/min-days-week.js +95 -0
  112. package/dist/cpsat/rules/min-days-week.js.map +1 -0
  113. package/dist/cpsat/rules/min-hours-day.d.ts +14 -17
  114. package/dist/cpsat/rules/min-hours-day.d.ts.map +1 -1
  115. package/dist/cpsat/rules/min-hours-day.js +72 -54
  116. package/dist/cpsat/rules/min-hours-day.js.map +1 -1
  117. package/dist/cpsat/rules/min-hours-week.d.ts +15 -18
  118. package/dist/cpsat/rules/min-hours-week.d.ts.map +1 -1
  119. package/dist/cpsat/rules/min-hours-week.js +75 -57
  120. package/dist/cpsat/rules/min-hours-week.js.map +1 -1
  121. package/dist/cpsat/rules/min-rest-between-shifts.d.ts +14 -17
  122. package/dist/cpsat/rules/min-rest-between-shifts.d.ts.map +1 -1
  123. package/dist/cpsat/rules/min-rest-between-shifts.js +148 -138
  124. package/dist/cpsat/rules/min-rest-between-shifts.js.map +1 -1
  125. package/dist/cpsat/rules/minimize-cost.d.ts +2 -18
  126. package/dist/cpsat/rules/minimize-cost.d.ts.map +1 -1
  127. package/dist/cpsat/rules/minimize-cost.js +151 -163
  128. package/dist/cpsat/rules/minimize-cost.js.map +1 -1
  129. package/dist/cpsat/rules/must-assign.d.ts +12 -0
  130. package/dist/cpsat/rules/must-assign.d.ts.map +1 -0
  131. package/dist/cpsat/rules/must-assign.js +54 -0
  132. package/dist/cpsat/rules/must-assign.js.map +1 -0
  133. package/dist/cpsat/rules/overtime-daily-multiplier.d.ts +6 -10
  134. package/dist/cpsat/rules/overtime-daily-multiplier.d.ts.map +1 -1
  135. package/dist/cpsat/rules/overtime-daily-multiplier.js +118 -112
  136. package/dist/cpsat/rules/overtime-daily-multiplier.js.map +1 -1
  137. package/dist/cpsat/rules/overtime-daily-surcharge.d.ts +6 -11
  138. package/dist/cpsat/rules/overtime-daily-surcharge.d.ts.map +1 -1
  139. package/dist/cpsat/rules/overtime-daily-surcharge.js +104 -99
  140. package/dist/cpsat/rules/overtime-daily-surcharge.js.map +1 -1
  141. package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts +9 -21
  142. package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts.map +1 -1
  143. package/dist/cpsat/rules/overtime-tiered-multiplier.js +181 -199
  144. package/dist/cpsat/rules/overtime-tiered-multiplier.js.map +1 -1
  145. package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts +13 -12
  146. package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts.map +1 -1
  147. package/dist/cpsat/rules/overtime-weekly-multiplier.js +143 -143
  148. package/dist/cpsat/rules/overtime-weekly-multiplier.js.map +1 -1
  149. package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts +7 -11
  150. package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts.map +1 -1
  151. package/dist/cpsat/rules/overtime-weekly-surcharge.js +124 -119
  152. package/dist/cpsat/rules/overtime-weekly-surcharge.js.map +1 -1
  153. package/dist/cpsat/rules/pattern-eligibility.d.ts +6 -0
  154. package/dist/cpsat/rules/pattern-eligibility.d.ts.map +1 -0
  155. package/dist/cpsat/rules/pattern-eligibility.js +16 -0
  156. package/dist/cpsat/rules/pattern-eligibility.js.map +1 -0
  157. package/dist/cpsat/rules/pattern-time.d.ts +5 -0
  158. package/dist/cpsat/rules/pattern-time.d.ts.map +1 -0
  159. package/dist/cpsat/rules/pattern-time.js +20 -0
  160. package/dist/cpsat/rules/pattern-time.js.map +1 -0
  161. package/dist/cpsat/rules/registry.d.ts +217 -27
  162. package/dist/cpsat/rules/registry.d.ts.map +1 -1
  163. package/dist/cpsat/rules/registry.js +98 -31
  164. package/dist/cpsat/rules/registry.js.map +1 -1
  165. package/dist/cpsat/rules/resolver.d.ts +9 -7
  166. package/dist/cpsat/rules/resolver.d.ts.map +1 -1
  167. package/dist/cpsat/rules/resolver.js +19 -18
  168. package/dist/cpsat/rules/resolver.js.map +1 -1
  169. package/dist/cpsat/rules/role-preference.d.ts +24 -0
  170. package/dist/cpsat/rules/role-preference.d.ts.map +1 -0
  171. package/dist/cpsat/rules/role-preference.js +72 -0
  172. package/dist/cpsat/rules/role-preference.js.map +1 -0
  173. package/dist/cpsat/rules/rules.types.d.ts +93 -17
  174. package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
  175. package/dist/cpsat/rules/scope.types.d.ts +25 -12
  176. package/dist/cpsat/rules/scope.types.d.ts.map +1 -1
  177. package/dist/cpsat/rules/scope.types.js +14 -19
  178. package/dist/cpsat/rules/scope.types.js.map +1 -1
  179. package/dist/cpsat/rules/target-days-week.d.ts +31 -0
  180. package/dist/cpsat/rules/target-days-week.d.ts.map +1 -0
  181. package/dist/cpsat/rules/target-days-week.js +80 -0
  182. package/dist/cpsat/rules/target-days-week.js.map +1 -0
  183. package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts +33 -0
  184. package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts.map +1 -0
  185. package/dist/cpsat/rules/target-peak-concurrent-assignments.js +146 -0
  186. package/dist/cpsat/rules/target-peak-concurrent-assignments.js.map +1 -0
  187. package/dist/cpsat/rules/time-cost-surcharge.d.ts +15 -14
  188. package/dist/cpsat/rules/time-cost-surcharge.d.ts.map +1 -1
  189. package/dist/cpsat/rules/time-cost-surcharge.js +82 -96
  190. package/dist/cpsat/rules/time-cost-surcharge.js.map +1 -1
  191. package/dist/cpsat/rules/time-off.d.ts +21 -57
  192. package/dist/cpsat/rules/time-off.d.ts.map +1 -1
  193. package/dist/cpsat/rules/time-off.js +114 -127
  194. package/dist/cpsat/rules/time-off.js.map +1 -1
  195. package/dist/cpsat/rules/variables.d.ts +4 -0
  196. package/dist/cpsat/rules/variables.d.ts.map +1 -0
  197. package/dist/cpsat/rules/variables.js +10 -0
  198. package/dist/cpsat/rules/variables.js.map +1 -0
  199. package/dist/cpsat/rules.d.ts +20 -3
  200. package/dist/cpsat/rules.d.ts.map +1 -1
  201. package/dist/cpsat/rules.js +19 -2
  202. package/dist/cpsat/rules.js.map +1 -1
  203. package/dist/cpsat/semantic-time.d.ts +7 -6
  204. package/dist/cpsat/semantic-time.d.ts.map +1 -1
  205. package/dist/cpsat/semantic-time.js +15 -28
  206. package/dist/cpsat/semantic-time.js.map +1 -1
  207. package/dist/cpsat/types.d.ts +47 -4
  208. package/dist/cpsat/types.d.ts.map +1 -1
  209. package/dist/cpsat/types.js +24 -1
  210. package/dist/cpsat/types.js.map +1 -1
  211. package/dist/cpsat/utils.d.ts +23 -6
  212. package/dist/cpsat/utils.d.ts.map +1 -1
  213. package/dist/cpsat/utils.js +76 -15
  214. package/dist/cpsat/utils.js.map +1 -1
  215. package/dist/cpsat/validation-reporter.d.ts +6 -2
  216. package/dist/cpsat/validation-reporter.d.ts.map +1 -1
  217. package/dist/cpsat/validation-reporter.js +122 -10
  218. package/dist/cpsat/validation-reporter.js.map +1 -1
  219. package/dist/cpsat/validation.types.d.ts +21 -10
  220. package/dist/cpsat/validation.types.d.ts.map +1 -1
  221. package/dist/datetime.utils.d.ts +7 -13
  222. package/dist/datetime.utils.d.ts.map +1 -1
  223. package/dist/datetime.utils.js +29 -36
  224. package/dist/datetime.utils.js.map +1 -1
  225. package/dist/index.d.ts +15 -9
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.js +11 -4
  228. package/dist/index.js.map +1 -1
  229. package/dist/schedule/cost.d.ts +192 -0
  230. package/dist/schedule/cost.d.ts.map +1 -0
  231. package/dist/schedule/cost.js +151 -0
  232. package/dist/schedule/cost.js.map +1 -0
  233. package/dist/schedule/coverage.d.ts +114 -0
  234. package/dist/schedule/coverage.d.ts.map +1 -0
  235. package/dist/schedule/coverage.js +56 -0
  236. package/dist/schedule/coverage.js.map +1 -0
  237. package/dist/schedule/definition.d.ts +346 -0
  238. package/dist/schedule/definition.d.ts.map +1 -0
  239. package/dist/schedule/definition.js +668 -0
  240. package/dist/schedule/definition.js.map +1 -0
  241. package/dist/schedule/index.d.ts +67 -0
  242. package/dist/schedule/index.d.ts.map +1 -0
  243. package/dist/schedule/index.js +69 -0
  244. package/dist/schedule/index.js.map +1 -0
  245. package/dist/schedule/rules.d.ts +678 -0
  246. package/dist/schedule/rules.d.ts.map +1 -0
  247. package/dist/schedule/rules.js +554 -0
  248. package/dist/schedule/rules.js.map +1 -0
  249. package/dist/schedule/shift-patterns.d.ts +17 -0
  250. package/dist/schedule/shift-patterns.d.ts.map +1 -0
  251. package/dist/schedule/shift-patterns.js +24 -0
  252. package/dist/schedule/shift-patterns.js.map +1 -0
  253. package/dist/schedule/time-periods.d.ts +79 -0
  254. package/dist/schedule/time-periods.d.ts.map +1 -0
  255. package/dist/schedule/time-periods.js +101 -0
  256. package/dist/schedule/time-periods.js.map +1 -0
  257. package/dist/types.d.ts +67 -3
  258. package/dist/types.d.ts.map +1 -1
  259. package/dist/types.js +64 -0
  260. package/dist/types.js.map +1 -1
  261. package/package.json +8 -14
  262. package/solver/src/solver/models.py +41 -4
  263. package/solver/src/solver/solver.py +546 -157
  264. package/solver/tests/test_solver.py +363 -7
  265. package/src/client.schemas.ts +127 -10
  266. package/src/client.ts +3 -0
  267. package/src/client.types.ts +73 -7
  268. package/src/cpsat/cost.ts +17 -7
  269. package/src/cpsat/model-builder.ts +614 -129
  270. package/src/cpsat/response.ts +57 -13
  271. package/src/cpsat/rule-descriptor.ts +311 -0
  272. package/src/cpsat/rules/artifacts.ts +56 -0
  273. package/src/cpsat/rules/assign-together.ts +104 -69
  274. package/src/cpsat/rules/assigned-day.ts +70 -0
  275. package/src/cpsat/rules/assignment-priority.ts +54 -58
  276. package/src/cpsat/rules/assignment-terms.ts +43 -0
  277. package/src/cpsat/rules/concurrent-intervals.ts +93 -0
  278. package/src/cpsat/rules/cost-utils.ts +1 -9
  279. package/src/cpsat/rules/day-cost-multiplier.ts +101 -81
  280. package/src/cpsat/rules/day-cost-surcharge.ts +91 -70
  281. package/src/cpsat/rules/index.ts +30 -21
  282. package/src/cpsat/rules/location-preference.ts +47 -52
  283. package/src/cpsat/rules/max-concurrent-assignments.ts +170 -0
  284. package/src/cpsat/rules/max-consecutive-days.ts +74 -91
  285. package/src/cpsat/rules/max-days-of-week-per-period.ts +127 -0
  286. package/src/cpsat/rules/max-days-week.ts +117 -0
  287. package/src/cpsat/rules/max-hours-day.ts +64 -84
  288. package/src/cpsat/rules/max-hours-week.ts +74 -90
  289. package/src/cpsat/rules/max-shifts-day.ts +65 -85
  290. package/src/cpsat/rules/min-consecutive-days.ts +161 -127
  291. package/src/cpsat/rules/min-days-of-week-per-period.ts +144 -0
  292. package/src/cpsat/rules/min-days-week.ts +122 -0
  293. package/src/cpsat/rules/min-hours-day.ts +79 -58
  294. package/src/cpsat/rules/min-hours-week.ts +87 -62
  295. package/src/cpsat/rules/min-rest-between-shifts.ts +191 -178
  296. package/src/cpsat/rules/minimize-cost.ts +175 -188
  297. package/src/cpsat/rules/must-assign.ts +71 -0
  298. package/src/cpsat/rules/overtime-daily-multiplier.ts +158 -140
  299. package/src/cpsat/rules/overtime-daily-surcharge.ts +141 -126
  300. package/src/cpsat/rules/overtime-tiered-multiplier.ts +234 -253
  301. package/src/cpsat/rules/overtime-weekly-multiplier.ts +183 -175
  302. package/src/cpsat/rules/overtime-weekly-surcharge.ts +161 -150
  303. package/src/cpsat/rules/pattern-eligibility.ts +26 -0
  304. package/src/cpsat/rules/pattern-time.ts +30 -0
  305. package/src/cpsat/rules/registry.ts +140 -56
  306. package/src/cpsat/rules/resolver.ts +58 -30
  307. package/src/cpsat/rules/role-preference.ts +92 -0
  308. package/src/cpsat/rules/rules.types.ts +92 -17
  309. package/src/cpsat/rules/scope.types.ts +32 -27
  310. package/src/cpsat/rules/target-days-week.ts +105 -0
  311. package/src/cpsat/rules/target-peak-concurrent-assignments.ts +212 -0
  312. package/src/cpsat/rules/time-cost-surcharge.ts +116 -122
  313. package/src/cpsat/rules/time-off.ts +154 -163
  314. package/src/cpsat/rules/variables.ts +11 -0
  315. package/src/cpsat/rules.ts +43 -17
  316. package/src/cpsat/semantic-time.ts +29 -43
  317. package/src/cpsat/types.ts +53 -4
  318. package/src/cpsat/utils.ts +92 -20
  319. package/src/cpsat/validation-reporter.ts +170 -19
  320. package/src/cpsat/validation.types.ts +22 -11
  321. package/src/datetime.utils.ts +45 -44
  322. package/src/index.ts +72 -15
  323. package/src/schedule/cost.ts +221 -0
  324. package/src/schedule/coverage.ts +164 -0
  325. package/src/schedule/definition.ts +1447 -0
  326. package/src/schedule/index.ts +132 -0
  327. package/src/schedule/rules.ts +1028 -0
  328. package/src/schedule/shift-patterns.ts +29 -0
  329. package/src/schedule/time-periods.ts +120 -0
  330. package/src/types.ts +114 -2
  331. package/dist/llms.d.ts +0 -2
  332. package/dist/llms.d.ts.map +0 -1
  333. package/dist/llms.js +0 -3
  334. package/dist/llms.js.map +0 -1
  335. package/dist/schedule.d.ts +0 -917
  336. package/dist/schedule.d.ts.map +0 -1
  337. package/dist/schedule.js +0 -1323
  338. package/dist/schedule.js.map +0 -1
  339. package/llms.txt +0 -758
  340. package/src/llms.ts +0 -3
  341. package/src/schedule.ts +0 -1960
@@ -1,6 +1,6 @@
1
1
  import * as z from "zod";
2
- import type { CompilationRule } from "../model-builder.js";
3
- import type { Term } from "../types.js";
2
+ import { defineRuleDescriptor } from "../rule-descriptor.js";
3
+ import type { RuleArtifact } from "../rule-descriptor.js";
4
4
  import { priorityToPenalty } from "../utils.js";
5
5
  import {
6
6
  PrioritySchema,
@@ -9,8 +9,11 @@ import {
9
9
  resolveMembersFromScope,
10
10
  ruleGroup,
11
11
  } from "./scope.types.js";
12
+ import { assignmentTermsForDay } from "./assignment-terms.js";
13
+ import { maxAssignableMinutesForDay, patternDurationMinutes } from "./pattern-time.js";
14
+ import { hardConstraint, reportValidation, softConstraint } from "./artifacts.js";
12
15
 
13
- const MinHoursDaySchema = z
16
+ export const MinHoursDaySchema = z
14
17
  .object({
15
18
  hours: z.number().min(0),
16
19
  priority: PrioritySchema,
@@ -18,71 +21,89 @@ const MinHoursDaySchema = z
18
21
  .and(entityScope(["members", "roles", "skills"]));
19
22
 
20
23
  /**
21
- * Configuration for {@link createMinHoursDayRule}.
22
- *
23
- * - `hours` (required): minimum hours required per day when scheduled
24
- * - `priority` (required): how strictly the solver enforces this rule
25
- *
26
- * Entity scoping (at most one): `memberIds`, `roleIds`, `skillIds`
24
+ * Configuration for {@link minHoursDayRuleDescriptor}.
27
25
  */
28
26
  export type MinHoursDayConfig = z.infer<typeof MinHoursDaySchema>;
29
27
 
30
28
  /**
31
- * Ensures a person works at least a minimum number of hours per day.
29
+ * Low-level descriptor for the `min-hours-day` rule.
32
30
  *
33
- * @param config - See {@link MinHoursDayConfig}
34
- * @example
35
- * ```ts
36
- * createMinHoursDayRule({ hours: 6, priority: "MANDATORY" });
37
- * ```
31
+ * @category Rules
38
32
  */
39
- export function createMinHoursDayRule(config: MinHoursDayConfig): CompilationRule {
40
- const parsed = MinHoursDaySchema.parse(config);
41
- const scope = parseEntityScope(parsed);
42
- const { hours, priority } = parsed;
43
- const minMinutes = hours * 60;
44
- const group = ruleGroup(`min-hours-day:${hours}`, `Min ${hours}h per day`, scope);
45
-
46
- return {
47
- compile(b) {
48
- if (hours <= 0) return;
33
+ export const minHoursDayRuleDescriptor = defineRuleDescriptor({
34
+ name: "min-hours-day",
35
+ schema: MinHoursDaySchema,
36
+ compile(config, ctx) {
37
+ const scope = parseEntityScope(config);
38
+ const { hours, priority } = config;
39
+ const minMinutes = hours * 60;
40
+ const group = ruleGroup(`min-hours-day:${hours}`, `Min ${hours}h per day`, scope);
41
+ const members = resolveMembersFromScope(scope, [...ctx.members]);
49
42
 
50
- const members = resolveMembersFromScope(scope, b.members);
43
+ const artifacts: RuleArtifact[] = [];
44
+ for (const member of members) {
45
+ for (const day of ctx.days) {
46
+ const terms = assignmentTermsForDay(member, day, ctx.shiftPatterns, patternDurationMinutes);
47
+ if (terms.length === 0) continue;
51
48
 
52
- for (const emp of members) {
53
- for (const day of b.days) {
54
- const terms: Term[] = [];
55
- for (const pattern of b.shiftPatterns) {
56
- if (!b.canAssign(emp, pattern)) continue;
57
- if (!b.patternAvailableOnDay(pattern, day)) continue;
58
- terms.push({
59
- var: b.assignment(emp.id, pattern.id, day),
60
- coeff: b.patternDuration(pattern.id),
61
- });
62
- }
49
+ const context = { memberIds: [member.id], days: [day.iso] };
50
+ const constraintId = `min-hours-day:${member.id}:${day.iso}`;
51
+ const description = `${member.id} min ${hours}h on ${day.iso}`;
63
52
 
64
- if (terms.length === 0) continue;
65
-
66
- const constraintId = `min-hours-day:${emp.id}:${day}`;
67
-
68
- if (priority === "MANDATORY") {
69
- b.addLinear(terms, ">=", minMinutes);
70
- } else {
71
- b.addSoftLinear(terms, ">=", minMinutes, priorityToPenalty(priority), constraintId);
72
- b.reporter.trackConstraint({
73
- id: constraintId,
74
- type: "rule",
75
- rule: "min-hours-day",
76
- description: `${emp.id} min ${hours}h on ${day}`,
77
- targetValue: minMinutes,
53
+ if (priority === "MANDATORY") {
54
+ artifacts.push(
55
+ hardConstraint({
56
+ group,
57
+ description,
58
+ context,
59
+ validation: reportValidation(constraintId),
60
+ terms,
78
61
  comparator: ">=",
79
- day,
80
- context: { memberIds: [emp.id], days: [day] },
62
+ targetValue: minMinutes,
63
+ }),
64
+ {
65
+ kind: "pre-solve-feedback",
66
+ run(preSolveContext, reporter) {
67
+ const maxMinutes = maxAssignableMinutesForDay(
68
+ member,
69
+ day,
70
+ preSolveContext.shiftPatterns,
71
+ );
72
+ if (maxMinutes >= minMinutes) return;
73
+ reporter.reportRuleError({
74
+ rule: "min-hours-day",
75
+ message: `${member.id} cannot reach ${hours}h on ${day.iso}; maximum possible is ${Math.round((maxMinutes / 60) * 10) / 10}h.`,
76
+ context,
77
+ suggestions: [
78
+ `Reduce the daily minimum for ${member.id}`,
79
+ `Add a longer shift on ${day.iso}`,
80
+ ],
81
+ group,
82
+ });
83
+ },
84
+ },
85
+ );
86
+ } else {
87
+ artifacts.push(
88
+ softConstraint({
81
89
  group,
82
- });
83
- }
90
+ description,
91
+ context,
92
+ validation: reportValidation(),
93
+ terms,
94
+ comparator: ">=",
95
+ targetValue: minMinutes,
96
+ penalty: priorityToPenalty(priority),
97
+ constraintId,
98
+ }),
99
+ );
84
100
  }
85
101
  }
86
- },
87
- };
88
- }
102
+ }
103
+
104
+ return {
105
+ rule: "min-hours-day",
106
+ artifacts,
107
+ };
108
+ },
109
+ });
@@ -1,7 +1,7 @@
1
1
  import * as z from "zod";
2
2
  import { DayOfWeekSchema } from "../../types.js";
3
- import type { CompilationRule } from "../model-builder.js";
4
- import type { Term } from "../types.js";
3
+ import { defineRuleDescriptor } from "../rule-descriptor.js";
4
+ import type { RuleArtifact } from "../rule-descriptor.js";
5
5
  import { priorityToPenalty, splitIntoWeeks } from "../utils.js";
6
6
  import {
7
7
  PrioritySchema,
@@ -10,6 +10,9 @@ import {
10
10
  resolveMembersFromScope,
11
11
  ruleGroup,
12
12
  } from "./scope.types.js";
13
+ import { assignmentTermsForDays } from "./assignment-terms.js";
14
+ import { maxAssignableMinutesForDay, patternDurationMinutes } from "./pattern-time.js";
15
+ import { hardConstraint, reportValidation, softConstraint } from "./artifacts.js";
13
16
 
14
17
  const MinHoursWeekBase = z.object({
15
18
  hours: z.number().min(0),
@@ -17,79 +20,101 @@ const MinHoursWeekBase = z.object({
17
20
  weekStartsOn: DayOfWeekSchema.optional(),
18
21
  });
19
22
 
20
- const MinHoursWeekSchema = MinHoursWeekBase.and(entityScope(["members", "roles", "skills"]));
23
+ export const MinHoursWeekSchema = MinHoursWeekBase.and(entityScope(["members", "roles", "skills"]));
21
24
 
22
25
  /**
23
- * Configuration for {@link createMinHoursWeekRule}.
24
- *
25
- * - `hours` (required): minimum hours required per scheduling week
26
- * - `priority` (required): how strictly the solver enforces this rule
27
- * - `weekStartsOn` (optional): which day starts the week; defaults to {@link ModelBuilder.weekStartsOn}
28
- *
29
- * Entity scoping (at most one): `memberIds`, `roleIds`, `skillIds`
26
+ * Configuration for {@link minHoursWeekRuleDescriptor}.
30
27
  */
31
28
  export type MinHoursWeekConfig = z.infer<typeof MinHoursWeekSchema>;
32
29
 
33
30
  /**
34
- * Enforces a minimum total number of hours per scheduling week.
31
+ * Low-level descriptor for the `min-hours-week` rule.
35
32
  *
36
- * @param config - See {@link MinHoursWeekConfig}
37
- * @example
38
- * ```ts
39
- * createMinHoursWeekRule({ hours: 30, priority: "HIGH" });
40
- * ```
33
+ * @category Rules
41
34
  */
42
- export function createMinHoursWeekRule(config: MinHoursWeekConfig): CompilationRule {
43
- const parsed = MinHoursWeekSchema.parse(config);
44
- const scope = parseEntityScope(parsed);
45
- const { hours, priority, weekStartsOn } = parsed;
46
- const minMinutes = hours * 60;
47
- const group = ruleGroup(`min-hours-week:${hours}`, `Min ${hours}h per week`, scope);
48
-
49
- return {
50
- compile(b) {
51
- if (hours <= 0) return;
35
+ export const minHoursWeekRuleDescriptor = defineRuleDescriptor({
36
+ name: "min-hours-week",
37
+ schema: MinHoursWeekSchema,
38
+ compile(config, ctx) {
39
+ const scope = parseEntityScope(config);
40
+ const { hours, priority, weekStartsOn } = config;
41
+ const minMinutes = hours * 60;
42
+ const group = ruleGroup(`min-hours-week:${hours}`, `Min ${hours}h per week`, scope);
43
+ const members = resolveMembersFromScope(scope, [...ctx.members]);
44
+ const weeks = splitIntoWeeks([...ctx.days], weekStartsOn ?? ctx.weekStartsOn);
52
45
 
53
- const members = resolveMembersFromScope(scope, b.members);
54
- const weeks = splitIntoWeeks(b.days, weekStartsOn ?? b.weekStartsOn);
46
+ const artifacts: RuleArtifact[] = [];
47
+ for (const member of members) {
48
+ for (const weekDays of weeks) {
49
+ const weekStart = weekDays[0];
50
+ if (!weekStart) continue;
55
51
 
56
- for (const emp of members) {
57
- for (const weekDays of weeks) {
58
- const terms: Term[] = [];
59
- for (const day of weekDays) {
60
- for (const pattern of b.shiftPatterns) {
61
- if (!b.canAssign(emp, pattern)) continue;
62
- if (!b.patternAvailableOnDay(pattern, day)) continue;
63
- terms.push({
64
- var: b.assignment(emp.id, pattern.id, day),
65
- coeff: b.patternDuration(pattern.id),
66
- });
67
- }
68
- }
52
+ const terms = assignmentTermsForDays(
53
+ member,
54
+ weekDays,
55
+ ctx.shiftPatterns,
56
+ patternDurationMinutes,
57
+ );
58
+ if (terms.length === 0) continue;
69
59
 
70
- if (terms.length === 0) continue;
60
+ const description = `${member.id} min ${hours}h in week starting ${weekStart.iso}`;
61
+ const context = { memberIds: [member.id], days: weekDays.map((day) => day.iso) };
62
+ const constraintId = `min-hours-week:${member.id}:${weekStart.iso}`;
71
63
 
72
- const weekLabel = weekDays[0]!;
73
- const constraintId = `min-hours-week:${emp.id}:${weekLabel}`;
74
-
75
- if (priority === "MANDATORY") {
76
- b.addLinear(terms, ">=", minMinutes);
77
- } else {
78
- b.addSoftLinear(terms, ">=", minMinutes, priorityToPenalty(priority), constraintId);
79
- b.reporter.trackConstraint({
80
- id: constraintId,
81
- type: "rule",
82
- rule: "min-hours-week",
83
- description: `${emp.id} min ${hours}h in week starting ${weekLabel}`,
84
- targetValue: minMinutes,
64
+ if (priority === "MANDATORY") {
65
+ artifacts.push(
66
+ hardConstraint({
67
+ group,
68
+ description,
69
+ context,
70
+ validation: reportValidation(constraintId),
71
+ terms,
85
72
  comparator: ">=",
86
- day: weekLabel,
87
- context: { memberIds: [emp.id], days: weekDays },
73
+ targetValue: minMinutes,
74
+ }),
75
+ {
76
+ kind: "pre-solve-feedback",
77
+ run(preSolveContext, reporter) {
78
+ const maxMinutes = weekDays.reduce(
79
+ (total, day) =>
80
+ total + maxAssignableMinutesForDay(member, day, preSolveContext.shiftPatterns),
81
+ 0,
82
+ );
83
+ if (maxMinutes >= minMinutes) return;
84
+ reporter.reportRuleError({
85
+ rule: "min-hours-week",
86
+ message: `${member.id} cannot reach ${hours}h in week starting ${weekStart.iso}; maximum possible is ${Math.round((maxMinutes / 60) * 10) / 10}h.`,
87
+ context,
88
+ suggestions: [
89
+ `Reduce the weekly minimum for ${member.id}`,
90
+ `Add longer or additional shifts in the week starting ${weekStart.iso}`,
91
+ ],
92
+ group,
93
+ });
94
+ },
95
+ },
96
+ );
97
+ } else {
98
+ artifacts.push(
99
+ softConstraint({
88
100
  group,
89
- });
90
- }
101
+ description,
102
+ context,
103
+ validation: reportValidation(),
104
+ terms,
105
+ comparator: ">=",
106
+ targetValue: minMinutes,
107
+ penalty: priorityToPenalty(priority),
108
+ constraintId,
109
+ }),
110
+ );
91
111
  }
92
112
  }
93
- },
94
- };
95
- }
113
+ }
114
+
115
+ return {
116
+ rule: "min-hours-week",
117
+ artifacts,
118
+ };
119
+ },
120
+ });