@flowselections/floriday-afhandeling-module 1.0.9 → 1.0.10

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 (72) hide show
  1. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts +9 -0
  2. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -0
  3. package/dist-lib/components/afhandeling/DagDetailDialog.js +145 -0
  4. package/dist-lib/components/afhandeling/LeveringenPage.d.ts.map +1 -1
  5. package/dist-lib/components/afhandeling/LeveringenPage.js +11 -5
  6. package/dist-lib/components/afhandeling/PickAgendaView.d.ts.map +1 -1
  7. package/dist-lib/components/afhandeling/PickAgendaView.js +13 -4
  8. package/dist-lib/components/afhandeling/PlanningAgendaPage.d.ts.map +1 -1
  9. package/dist-lib/components/afhandeling/PlanningAgendaPage.js +2 -2
  10. package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts +12 -0
  11. package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts.map +1 -0
  12. package/dist-lib/components/afhandeling/ServiceAreaSelect.js +79 -0
  13. package/dist-lib/components/afhandeling/VervoerderForm.d.ts.map +1 -1
  14. package/dist-lib/components/afhandeling/VervoerderForm.js +53 -6
  15. package/dist-lib/components/afhandeling/VervoerdersPage.d.ts.map +1 -1
  16. package/dist-lib/components/afhandeling/VervoerdersPage.js +23 -5
  17. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +2 -1
  18. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
  19. package/dist-lib/components/afhandeling/WeekAgendaView.js +53 -18
  20. package/dist-lib/components/pickstation/PakbonTemplate.d.ts +5 -2
  21. package/dist-lib/components/pickstation/PakbonTemplate.d.ts.map +1 -1
  22. package/dist-lib/components/pickstation/PakbonTemplate.js +12 -10
  23. package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
  24. package/dist-lib/components/settings/AfhandelingSettingsCard.js +18 -6
  25. package/dist-lib/hooks/useOrderPlanning.d.ts +3 -0
  26. package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
  27. package/dist-lib/hooks/useOrderPlanning.js +47 -6
  28. package/dist-lib/integrations/supabase/auth-middleware.d.ts +2261 -136
  29. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  30. package/dist-lib/integrations/supabase/client.d.ts +2261 -136
  31. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  32. package/dist-lib/integrations/supabase/client.server.d.ts +2261 -136
  33. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  34. package/dist-lib/integrations/supabase/types.d.ts +2329 -134
  35. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  36. package/dist-lib/integrations/supabase/types.js +1 -0
  37. package/dist-lib/lib/afhandelingSettings.functions.d.ts +9431 -5172
  38. package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
  39. package/dist-lib/lib/afhandelingSettings.functions.js +27 -2
  40. package/dist-lib/lib/carrierSignupMail.server.d.ts +56 -0
  41. package/dist-lib/lib/carrierSignupMail.server.d.ts.map +1 -0
  42. package/dist-lib/lib/carrierSignupMail.server.js +229 -0
  43. package/dist-lib/lib/carriers.functions.d.ts +33377 -15579
  44. package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
  45. package/dist-lib/lib/carriers.functions.js +28 -2
  46. package/dist-lib/lib/cartAssignments.functions.d.ts +46479 -0
  47. package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -0
  48. package/dist-lib/lib/cartAssignments.functions.js +130 -0
  49. package/dist-lib/lib/cartMoveImpact.d.ts +8 -0
  50. package/dist-lib/lib/cartMoveImpact.d.ts.map +1 -0
  51. package/dist-lib/lib/cartMoveImpact.js +26 -0
  52. package/dist-lib/lib/floriday.functions.d.ts +2265 -136
  53. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  54. package/dist-lib/lib/floriday.functions.js +178 -98
  55. package/dist-lib/lib/geo/euServiceAreas.d.ts +30 -0
  56. package/dist-lib/lib/geo/euServiceAreas.d.ts.map +1 -0
  57. package/dist-lib/lib/geo/euServiceAreas.js +277 -0
  58. package/dist-lib/lib/invalidatePlanning.d.ts +11 -0
  59. package/dist-lib/lib/invalidatePlanning.d.ts.map +1 -0
  60. package/dist-lib/lib/invalidatePlanning.js +25 -0
  61. package/dist-lib/lib/pickstationI18n.d.ts +4 -0
  62. package/dist-lib/lib/pickstationI18n.d.ts.map +1 -1
  63. package/dist-lib/lib/pickstationI18n.js +24 -0
  64. package/dist-lib/lib/pickstationOrders.server.d.ts +1 -1
  65. package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -1
  66. package/dist-lib/lib/pickstationOrders.server.js +305 -177
  67. package/dist-lib/lib/pickstationTypes.d.ts +11 -2
  68. package/dist-lib/lib/pickstationTypes.d.ts.map +1 -1
  69. package/dist-lib/lib/planning.d.ts +18 -2
  70. package/dist-lib/lib/planning.d.ts.map +1 -1
  71. package/dist-lib/lib/planning.js +96 -33
  72. package/package.json +2 -2
@@ -116,62 +116,125 @@ export function calculateOrderPlanning(deliveryDate, rules) {
116
116
  transportRegisterDate: transportRegister,
117
117
  pickStartDate: pickStart,
118
118
  scheduledPickDate: pickStart,
119
+ pickAssignments: [{ date: pickStart, cartCount: 0 }],
119
120
  movedEarlier: false,
120
121
  selectedMoment: moment,
121
122
  };
122
123
  }
123
124
  export function distributePickDates(items, options) {
124
- if (!options.enabled || options.maxWorkdaysEarlier <= 0) {
125
- return items.map((it) => {
126
- if (!it.planning)
127
- return it;
128
- return {
129
- ...it,
130
- planning: {
131
- ...it.planning,
132
- scheduledPickDate: it.planning.pickStartDate,
133
- movedEarlier: false,
134
- },
135
- };
136
- });
137
- }
125
+ const getCarts = (it) => {
126
+ const n = options.getCartCount?.(it);
127
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : 1;
128
+ };
129
+ const getOverride = (it, idx) => {
130
+ const raw = options.getCartOverride?.(it, idx);
131
+ if (!raw)
132
+ return null;
133
+ const date = raw instanceof Date ? raw : raw.date;
134
+ const out = new Date(date);
135
+ out.setHours(0, 0, 0, 0);
136
+ const movedFrom = raw instanceof Date ? null : raw.movedFromDate;
137
+ const movedFromDate = movedFrom ? new Date(movedFrom) : null;
138
+ if (movedFromDate)
139
+ movedFromDate.setHours(0, 0, 0, 0);
140
+ return { date: out, movedFromDate };
141
+ };
142
+ const key = (d) => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
143
+ const load = new Map();
144
+ const result = new Map();
145
+ const distribute = options.enabled && options.maxWorkdaysEarlier > 0;
138
146
  const sorted = [...items].sort((a, b) => {
139
147
  const ad = a.planning?.pickStartDate.getTime() ?? Infinity;
140
148
  const bd = b.planning?.pickStartDate.getTime() ?? Infinity;
141
149
  return ad - bd;
142
150
  });
143
- const load = new Map();
144
- const key = (d) => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
145
- const result = new Map();
151
+ const baseTargets = new Map();
152
+ // Stap 1: bepaal eerst de volledige automatische verdeling, zonder
153
+ // handmatige overrides. Daardoor blijft de automatische balans stabiel en
154
+ // kan een latere handmatige verplaatsing niet door volgende orders worden
155
+ // "teruggevuld".
146
156
  for (const item of sorted) {
147
157
  if (!item.planning) {
148
158
  result.set(item, item);
149
159
  continue;
150
160
  }
151
161
  const deadline = item.planning.pickStartDate;
152
- const candidates = [deadline];
153
- let cursor = deadline;
154
- for (let i = 0; i < options.maxWorkdaysEarlier; i++) {
155
- cursor = subtractWorkdays(cursor, 1, options.holidays);
156
- candidates.unshift(cursor);
162
+ const carts = getCarts(item);
163
+ // Kandidaten in chronologische volgorde
164
+ const candidates = [];
165
+ if (distribute) {
166
+ let cursor = deadline;
167
+ for (let i = 0; i < options.maxWorkdaysEarlier; i++) {
168
+ cursor = subtractWorkdays(cursor, 1, options.holidays);
169
+ candidates.unshift(cursor);
170
+ }
157
171
  }
158
- let best = candidates[0];
159
- let bestLoad = load.get(key(best)) ?? 0;
160
- for (let i = 1; i < candidates.length; i++) {
161
- const c = candidates[i];
162
- const l = load.get(key(c)) ?? 0;
163
- if (l < bestLoad) {
164
- best = c;
165
- bestLoad = l;
172
+ candidates.push(deadline);
173
+ const targets = [];
174
+ for (let c = 0; c < carts; c++) {
175
+ let target;
176
+ if (!distribute) {
177
+ target = deadline;
178
+ load.set(key(target), (load.get(key(target)) ?? 0) + 1);
179
+ }
180
+ else {
181
+ let best = candidates[candidates.length - 1];
182
+ let bestLoad = load.get(key(best)) ?? 0;
183
+ for (let i = candidates.length - 2; i >= 0; i--) {
184
+ const cand = candidates[i];
185
+ const l = load.get(key(cand)) ?? 0;
186
+ if (l < bestLoad) {
187
+ best = cand;
188
+ bestLoad = l;
189
+ }
190
+ }
191
+ target = best;
192
+ load.set(key(target), bestLoad + 1);
193
+ }
194
+ targets[c] = target;
195
+ }
196
+ baseTargets.set(item, targets);
197
+ }
198
+ // Stap 2: pas overrides pas toe nadat alle automatische doelen vaststaan.
199
+ // Dit maakt een verplaatsing absoluut: 10/10 wordt na één kar verplaatsen
200
+ // echt 9/11, niet opnieuw 10/10 door load-balancing.
201
+ for (const item of sorted) {
202
+ if (!item.planning)
203
+ continue;
204
+ const deadline = item.planning.pickStartDate;
205
+ const carts = getCarts(item);
206
+ const targets = [...(baseTargets.get(item) ?? [])];
207
+ const perDay = new Map();
208
+ for (let c = 0; c < carts; c++) {
209
+ const override = getOverride(item, c);
210
+ if (override) {
211
+ // Handmatige verplaatsingen gelden altijd voor de concrete kar-index
212
+ // die de gebruiker aanklikt. Niet ruilen met een andere kar op dezelfde
213
+ // brondag, want dan blijft de aangeklikte kar visueel staan.
214
+ targets[c] = override.date;
215
+ }
216
+ }
217
+ for (let c = 0; c < carts; c++) {
218
+ const target = targets[c];
219
+ const k = key(target);
220
+ const existing = perDay.get(k);
221
+ if (existing) {
222
+ existing.cartCount += 1;
223
+ existing.cartIndexes.push(c);
224
+ }
225
+ else {
226
+ perDay.set(k, { date: target, cartCount: 1, cartIndexes: [c] });
166
227
  }
167
228
  }
168
- load.set(key(best), bestLoad + 1);
169
- const moved = best.getTime() !== deadline.getTime();
229
+ const assignments = Array.from(perDay.values()).sort((a, b) => a.date.getTime() - b.date.getTime());
230
+ const earliest = assignments[0]?.date ?? deadline;
231
+ const moved = assignments.some((a) => a.date.getTime() !== deadline.getTime());
170
232
  result.set(item, {
171
233
  ...item,
172
234
  planning: {
173
235
  ...item.planning,
174
- scheduledPickDate: best,
236
+ scheduledPickDate: earliest,
237
+ pickAssignments: assignments,
175
238
  movedEarlier: moved,
176
239
  },
177
240
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/floriday-afhandeling-module",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "private": false,
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -41,7 +41,7 @@
41
41
  "@cloudflare/vite-plugin": "^1.25.5",
42
42
  "@eslint/js": "^9.32.0",
43
43
  "@flowselections/core": "^1.0.11",
44
- "@lovable.dev/vite-tanstack-config": "2.6.2",
44
+ "@lovable.dev/vite-tanstack-config": "2.6.4",
45
45
  "@rsbuild/core": "^1.0.0",
46
46
  "@tailwindcss/vite": "^4.2.1",
47
47
  "@tanstack/react-query": "^5.83.0",