@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.
@@ -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. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/floriday-voorraad",
3
- "version": "1.0.34",
3
+ "version": "1.0.35",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "main": "./dist-lib/index.js",