@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.
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts +9 -0
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -0
- package/dist-lib/components/afhandeling/DagDetailDialog.js +145 -0
- package/dist-lib/components/afhandeling/LeveringenPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/LeveringenPage.js +11 -5
- package/dist-lib/components/afhandeling/PickAgendaView.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/PickAgendaView.js +13 -4
- package/dist-lib/components/afhandeling/PlanningAgendaPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/PlanningAgendaPage.js +2 -2
- package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts +12 -0
- package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts.map +1 -0
- package/dist-lib/components/afhandeling/ServiceAreaSelect.js +79 -0
- package/dist-lib/components/afhandeling/VervoerderForm.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/VervoerderForm.js +53 -6
- package/dist-lib/components/afhandeling/VervoerdersPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/VervoerdersPage.js +23 -5
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +2 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.js +53 -18
- package/dist-lib/components/pickstation/PakbonTemplate.d.ts +5 -2
- package/dist-lib/components/pickstation/PakbonTemplate.d.ts.map +1 -1
- package/dist-lib/components/pickstation/PakbonTemplate.js +12 -10
- package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
- package/dist-lib/components/settings/AfhandelingSettingsCard.js +18 -6
- package/dist-lib/hooks/useOrderPlanning.d.ts +3 -0
- package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderPlanning.js +47 -6
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +2261 -136
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +2261 -136
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +2261 -136
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +2329 -134
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +1 -0
- package/dist-lib/lib/afhandelingSettings.functions.d.ts +9431 -5172
- package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
- package/dist-lib/lib/afhandelingSettings.functions.js +27 -2
- package/dist-lib/lib/carrierSignupMail.server.d.ts +56 -0
- package/dist-lib/lib/carrierSignupMail.server.d.ts.map +1 -0
- package/dist-lib/lib/carrierSignupMail.server.js +229 -0
- package/dist-lib/lib/carriers.functions.d.ts +33377 -15579
- package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/carriers.functions.js +28 -2
- package/dist-lib/lib/cartAssignments.functions.d.ts +46479 -0
- package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -0
- package/dist-lib/lib/cartAssignments.functions.js +130 -0
- package/dist-lib/lib/cartMoveImpact.d.ts +8 -0
- package/dist-lib/lib/cartMoveImpact.d.ts.map +1 -0
- package/dist-lib/lib/cartMoveImpact.js +26 -0
- package/dist-lib/lib/floriday.functions.d.ts +2265 -136
- package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday.functions.js +178 -98
- package/dist-lib/lib/geo/euServiceAreas.d.ts +30 -0
- package/dist-lib/lib/geo/euServiceAreas.d.ts.map +1 -0
- package/dist-lib/lib/geo/euServiceAreas.js +277 -0
- package/dist-lib/lib/invalidatePlanning.d.ts +11 -0
- package/dist-lib/lib/invalidatePlanning.d.ts.map +1 -0
- package/dist-lib/lib/invalidatePlanning.js +25 -0
- package/dist-lib/lib/pickstationI18n.d.ts +4 -0
- package/dist-lib/lib/pickstationI18n.d.ts.map +1 -1
- package/dist-lib/lib/pickstationI18n.js +24 -0
- package/dist-lib/lib/pickstationOrders.server.d.ts +1 -1
- package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -1
- package/dist-lib/lib/pickstationOrders.server.js +305 -177
- package/dist-lib/lib/pickstationTypes.d.ts +11 -2
- package/dist-lib/lib/pickstationTypes.d.ts.map +1 -1
- package/dist-lib/lib/planning.d.ts +18 -2
- package/dist-lib/lib/planning.d.ts.map +1 -1
- package/dist-lib/lib/planning.js +96 -33
- package/package.json +2 -2
package/dist-lib/lib/planning.js
CHANGED
|
@@ -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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
|
144
|
-
|
|
145
|
-
|
|
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
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
for (let
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
169
|
-
const
|
|
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:
|
|
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.
|
|
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.
|
|
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",
|