@flowselections/floriday-voorraad 1.0.34 → 1.0.35
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/voorraad/VoorraadStockCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/VoorraadStockCard.js +104 -5
- package/dist-lib/hooks/useTradeItemStock.d.ts +7 -5
- package/dist-lib/hooks/useTradeItemStock.d.ts.map +1 -1
- package/dist-lib/hooks/useTradeItemStock.js +14 -18
- package/dist-lib/lib/module-health.functions.d.ts.map +1 -1
- package/dist-lib/lib/module-health.functions.js +88 -0
- package/package.json +1 -1
|
@@ -159,6 +159,94 @@ export const getModuleHealth = createServerFn({ method: "GET" })
|
|
|
159
159
|
detail: "Status van de geplande taken kon niet worden opgehaald.",
|
|
160
160
|
});
|
|
161
161
|
}
|
|
162
|
+
// --- Dubbele voorraadregels -------------------------------------------
|
|
163
|
+
try {
|
|
164
|
+
const { data: legacyRows } = await admin
|
|
165
|
+
.from("trade_item_stock")
|
|
166
|
+
.select("trade_item_key")
|
|
167
|
+
.like("trade_item_key", "product:%")
|
|
168
|
+
.limit(500);
|
|
169
|
+
const legacy = (legacyRows ?? []);
|
|
170
|
+
const ids = legacy
|
|
171
|
+
.map((r) => String(r.trade_item_key).slice(8))
|
|
172
|
+
.filter((v) => /^[0-9a-f-]{36}$/i.test(v));
|
|
173
|
+
let doubles = 0;
|
|
174
|
+
if (ids.length) {
|
|
175
|
+
const { data: prods } = await admin
|
|
176
|
+
.from("products")
|
|
177
|
+
.select("id")
|
|
178
|
+
.in("id", ids);
|
|
179
|
+
doubles = (prods ?? []).length;
|
|
180
|
+
}
|
|
181
|
+
checks.push({
|
|
182
|
+
id: "stock_keys",
|
|
183
|
+
label: "Voorraadregels per artikel",
|
|
184
|
+
status: doubles > 0 ? "warn" : "ok",
|
|
185
|
+
detail: doubles > 0
|
|
186
|
+
? `${doubles} artikel(en) hebben nog een oude, tweede voorraadregel.`
|
|
187
|
+
: "Elk artikel heeft precies één voorraadregel.",
|
|
188
|
+
hint: doubles > 0
|
|
189
|
+
? "Sla de voorraad van die artikelen één keer opnieuw op; de regels worden dan automatisch samengevoegd."
|
|
190
|
+
: undefined,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Controle mag de statuskaart nooit blokkeren.
|
|
195
|
+
}
|
|
196
|
+
// --- Aantallen bij producten gelijk aan de voorraad? -------------------
|
|
197
|
+
try {
|
|
198
|
+
const { data: stockRows } = await admin
|
|
199
|
+
.from("trade_item_stock")
|
|
200
|
+
.select("trade_item_key,physical_stock,reserved_stock")
|
|
201
|
+
.limit(2000);
|
|
202
|
+
const rows = (stockRows ?? []);
|
|
203
|
+
const byKey = new Map(rows.map((r) => [String(r.trade_item_key), Number(r.physical_stock ?? 0)]));
|
|
204
|
+
const { data: prodRows } = await admin
|
|
205
|
+
.from("products")
|
|
206
|
+
.select("id,product,quantity,trade_item_key,floriday_trade_item_id")
|
|
207
|
+
.limit(2000);
|
|
208
|
+
let mismatch = 0;
|
|
209
|
+
for (const p of (prodRows ?? [])) {
|
|
210
|
+
const key = (p.floriday_trade_item_id && byKey.has(String(p.floriday_trade_item_id))
|
|
211
|
+
? String(p.floriday_trade_item_id)
|
|
212
|
+
: null) ??
|
|
213
|
+
(p.trade_item_key && byKey.has(String(p.trade_item_key))
|
|
214
|
+
? String(p.trade_item_key)
|
|
215
|
+
: null) ??
|
|
216
|
+
(byKey.has(`product:${p.id}`) ? `product:${p.id}` : null);
|
|
217
|
+
if (!key)
|
|
218
|
+
continue;
|
|
219
|
+
if (Number(p.quantity ?? 0) !== byKey.get(key))
|
|
220
|
+
mismatch += 1;
|
|
221
|
+
}
|
|
222
|
+
checks.push({
|
|
223
|
+
id: "quantity_sync",
|
|
224
|
+
label: "Aantallen bij producten",
|
|
225
|
+
status: mismatch > 0 ? "warn" : "ok",
|
|
226
|
+
detail: mismatch > 0
|
|
227
|
+
? `${mismatch} product(en) tonen een ander aantal dan de voorraad.`
|
|
228
|
+
: "Elk product toont hetzelfde aantal als de voorraad.",
|
|
229
|
+
hint: mismatch > 0
|
|
230
|
+
? "Sla de voorraad van die producten één keer opnieuw op; het aantal loopt daarna weer mee."
|
|
231
|
+
: undefined,
|
|
232
|
+
});
|
|
233
|
+
// --- Reserveringen hoger dan de liggende voorraad --------------------
|
|
234
|
+
const over = rows.filter((r) => Number(r.reserved_stock ?? 0) > Number(r.physical_stock ?? 0)).length;
|
|
235
|
+
checks.push({
|
|
236
|
+
id: "reservations",
|
|
237
|
+
label: "Reserveringen",
|
|
238
|
+
status: over > 0 ? "warn" : "ok",
|
|
239
|
+
detail: over > 0
|
|
240
|
+
? `${over} artikel(en) hebben meer gereserveerd dan er liggend is.`
|
|
241
|
+
: "Geen artikelen met meer reserveringen dan voorraad.",
|
|
242
|
+
hint: over > 0
|
|
243
|
+
? "Dit komt door openstaande orders. Controleer of die orders nog terecht openstaan; afgeronde of geannuleerde orders geven de reservering vrij."
|
|
244
|
+
: undefined,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
// Controle mag de statuskaart nooit blokkeren.
|
|
249
|
+
}
|
|
162
250
|
return { checkedAt: new Date().toISOString(), checks };
|
|
163
251
|
});
|
|
164
252
|
/** Geeft vastgelopen wachtrijregels handmatig vrij. */
|