@flowselections/floriday-verkoop-module 1.0.54 → 1.0.55
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/verkoop/OrderKarindelingCard.d.ts.map +1 -1
- package/dist-lib/components/verkoop/OrderKarindelingCard.js +6 -3
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +42 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +42 -0
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +42 -0
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +42 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/cart-lock.functions.d.ts +42 -0
- package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-planning-settings.functions.d.ts +462 -0
- package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-replan.functions.d.ts +128 -26
- package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-replan.functions.js +55 -32
- package/dist-lib/lib/create-order.functions.d.ts +714 -0
- package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +126 -0
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +42 -0
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-mirror.functions.d.ts +42 -0
- package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-public.functions.d.ts +294 -0
- package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-writes.functions.d.ts +210 -0
- package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
- package/dist-lib/lib/invoice-timing.functions.d.ts +168 -0
- package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -1
- package/dist-lib/lib/invoice-timing.functions.js +12 -6
- package/dist-lib/lib/load-carriers.functions.d.ts +42 -0
- package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/logistics-engine.functions.d.ts +210 -0
- package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
- package/dist-lib/lib/logistics-engine.functions.js +10 -5
- package/dist-lib/lib/logistics-stock.functions.d.ts +84 -0
- package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-addresses.functions.d.ts +42 -0
- package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-addresses.functions.js +15 -9
- package/dist-lib/lib/order-buffers.functions.d.ts +126 -0
- package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-buffers.functions.js +10 -10
- package/dist-lib/lib/order-carrier.functions.d.ts +84 -0
- package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-carrier.functions.js +20 -11
- package/dist-lib/lib/order-pickup.functions.d.ts +84 -0
- package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-pickup.functions.js +20 -11
- package/dist-lib/lib/order-row.server.d.ts +24 -0
- package/dist-lib/lib/order-row.server.d.ts.map +1 -0
- package/dist-lib/lib/order-row.server.js +58 -0
- package/dist-lib/lib/order-shipments.functions.d.ts +168 -0
- package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-shipments.functions.js +11 -6
- package/dist-lib/lib/salesorders-list.functions.d.ts +42 -0
- package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
- package/dist-lib/lib/salesorders.functions.d.ts +210 -0
- package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
- package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +84 -0
- package/dist-lib/lib/stock-consumption-alerts.functions.d.ts.map +1 -1
- package/dist-lib/lib/tradeitems.functions.d.ts +42 -0
- package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { createServerFn } from "@tanstack/react-start";
|
|
7
7
|
import { z } from "zod";
|
|
8
8
|
import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
|
|
9
|
+
import { resolveOrderRow } from "./order-row.server";
|
|
9
10
|
import { CART_PLANNER_VERSION, planCarts, } from "./cart-planner";
|
|
10
11
|
import { resolveBufferForOrderInternal } from "./order-buffers.functions";
|
|
11
12
|
export async function replanBufferInternal(bufferId) {
|
|
@@ -360,8 +361,12 @@ export async function replanOrderCartsFromCron(orderId) {
|
|
|
360
361
|
}
|
|
361
362
|
export const replanOrderCarts = createServerFn({ method: "POST" })
|
|
362
363
|
.middleware([requireSupabaseAuth])
|
|
363
|
-
.inputValidator((input) => z.object({ orderId: z.string().
|
|
364
|
-
.handler(async ({ data }) =>
|
|
364
|
+
.inputValidator((input) => z.object({ orderId: z.string().min(1) }).parse(input))
|
|
365
|
+
.handler(async ({ data, context }) => {
|
|
366
|
+
// DTO-id kan een Floriday salesOrderId zijn.
|
|
367
|
+
const order = await resolveOrderRow(context.supabase, data.orderId);
|
|
368
|
+
return replanOrderInternal(order.id);
|
|
369
|
+
});
|
|
365
370
|
// ─── Queue drain (aangeroepen door pg_cron elke minuut) ─────────────────────
|
|
366
371
|
export async function drainCartReplanQueue(limit = 50) {
|
|
367
372
|
const { supabaseAdmin } = await import("../integrations/supabase/client.server");
|
|
@@ -406,65 +411,79 @@ export async function drainCartReplanQueue(limit = 50) {
|
|
|
406
411
|
// logistics_plan_queue). De UI berekent NIETS zelf: hij toont wat er staat.
|
|
407
412
|
export const listOrderCarts = createServerFn({ method: "GET" })
|
|
408
413
|
.middleware([requireSupabaseAuth])
|
|
409
|
-
.inputValidator((input) => z.object({ orderId: z.string().
|
|
414
|
+
.inputValidator((input) => z.object({ orderId: z.string().min(1) }).parse(input))
|
|
410
415
|
.handler(async ({ data, context }) => {
|
|
411
|
-
|
|
416
|
+
// Elke query faalt HARD. "Geen karren" en "kon niet laden" zijn twee
|
|
417
|
+
// verschillende dingen; stilzwijgend een lege array teruggeven verbergt
|
|
418
|
+
// fouten (RLS, kolomnaam, embed) als "nog geen karindeling".
|
|
419
|
+
const fail = (what, error) => {
|
|
420
|
+
throw new Error(`Karindeling laden mislukt (${what}): ${error?.message ?? "onbekende fout"}`);
|
|
421
|
+
};
|
|
422
|
+
// De DTO-id is voor Floriday-orders het salesOrderId, niet orders.id.
|
|
423
|
+
// resolveOrderRow doet de twee-staps-lookup + botsingswaarschuwing.
|
|
424
|
+
const orderRow = await resolveOrderRow(context.supabase, data.orderId);
|
|
425
|
+
const dbOrderId = orderRow.id;
|
|
426
|
+
const bufferId = orderRow.buffer_id;
|
|
427
|
+
const lockRes = await context.supabase
|
|
412
428
|
.from("orders")
|
|
413
|
-
.select("
|
|
414
|
-
.eq("id",
|
|
429
|
+
.select("plan_locked_at")
|
|
430
|
+
.eq("id", dbOrderId)
|
|
415
431
|
.maybeSingle();
|
|
416
|
-
|
|
417
|
-
|
|
432
|
+
if (lockRes.error)
|
|
433
|
+
fail("plan-lock lezen", lockRes.error);
|
|
434
|
+
const planLockedAt = lockRes.data?.plan_locked_at ?? null;
|
|
418
435
|
const select = "id, order_id, buffer_id, cart_number, source, is_complete, occupancy_pct, total_layers_used, algorithm_version, carrier_type, max_layers, notes, order_cart_items(id, order_item_id, product_id, product_name, crates, plants_per_crate, crates_per_layer, layers_per_cart, layer_fraction, layer_share_pct)";
|
|
419
436
|
const base = context.supabase.from("order_carts").select(select);
|
|
420
|
-
const
|
|
437
|
+
const cartsRes = await (bufferId
|
|
421
438
|
? base.eq("buffer_id", bufferId)
|
|
422
|
-
: base.eq("order_id",
|
|
439
|
+
: base.eq("order_id", dbOrderId)).order("cart_number");
|
|
440
|
+
if (cartsRes.error)
|
|
441
|
+
fail("karren lezen", cartsRes.error);
|
|
442
|
+
const carts = (cartsRes.data ?? []);
|
|
423
443
|
// Orders in de scope + ordernummer per orderregel (voor de badges).
|
|
424
444
|
let orders = [];
|
|
425
445
|
if (bufferId) {
|
|
426
|
-
const
|
|
446
|
+
const sibs = await context.supabase
|
|
427
447
|
.from("orders")
|
|
428
448
|
.select("id, order_number")
|
|
429
449
|
.eq("buffer_id", bufferId)
|
|
430
450
|
.is("deleted_at", null);
|
|
431
|
-
|
|
451
|
+
if (sibs.error)
|
|
452
|
+
fail("orders in buffer lezen", sibs.error);
|
|
453
|
+
orders = (sibs.data ?? []).map((o) => ({
|
|
432
454
|
id: o.id,
|
|
433
455
|
order_number: o.order_number ?? null,
|
|
434
456
|
}));
|
|
435
457
|
}
|
|
436
458
|
if (orders.length === 0) {
|
|
437
|
-
|
|
438
|
-
.from("orders")
|
|
439
|
-
.select("id, order_number")
|
|
440
|
-
.eq("id", data.orderId)
|
|
441
|
-
.maybeSingle();
|
|
442
|
-
if (own) {
|
|
443
|
-
orders = [{ id: own.id, order_number: own.order_number ?? null }];
|
|
444
|
-
}
|
|
459
|
+
orders = [{ id: dbOrderId, order_number: orderRow.order_number ?? null }];
|
|
445
460
|
}
|
|
446
461
|
const orderIds = orders.map((o) => o.id);
|
|
447
462
|
let itemOrders = [];
|
|
448
463
|
if (orderIds.length > 0) {
|
|
449
|
-
const
|
|
464
|
+
const its = await context.supabase
|
|
450
465
|
.from("order_items")
|
|
451
466
|
.select("id, order_id")
|
|
452
467
|
.in("order_id", orderIds);
|
|
453
|
-
|
|
468
|
+
if (its.error)
|
|
469
|
+
fail("orderregels lezen", its.error);
|
|
470
|
+
itemOrders = (its.data ?? []).map((i) => ({
|
|
454
471
|
id: i.id,
|
|
455
472
|
order_id: i.order_id,
|
|
456
473
|
}));
|
|
457
474
|
}
|
|
458
475
|
// Blokkadereden alleen ophalen als er niets gepland staat.
|
|
459
476
|
let blocked = null;
|
|
460
|
-
if (
|
|
461
|
-
const
|
|
477
|
+
if (carts.length === 0 && orderIds.length > 0) {
|
|
478
|
+
const dec = await context.supabase
|
|
462
479
|
.from("logistics_decisions")
|
|
463
480
|
.select("subject_id, slot, explanation, result, created_at")
|
|
464
481
|
.in("subject_id", orderIds)
|
|
465
482
|
.order("created_at", { ascending: false })
|
|
466
483
|
.limit(1);
|
|
467
|
-
|
|
484
|
+
if (dec.error)
|
|
485
|
+
fail("blokkadereden lezen", dec.error);
|
|
486
|
+
const d = (dec.data ?? [])[0];
|
|
468
487
|
if (d) {
|
|
469
488
|
blocked = {
|
|
470
489
|
reason: d.result?.reason ?? d.slot ?? null,
|
|
@@ -473,13 +492,15 @@ export const listOrderCarts = createServerFn({ method: "GET" })
|
|
|
473
492
|
};
|
|
474
493
|
}
|
|
475
494
|
if (!blocked) {
|
|
476
|
-
const
|
|
495
|
+
const q = await context.supabase
|
|
477
496
|
.from("logistics_plan_queue")
|
|
478
497
|
.select("order_id, status, reason, error, updated_at")
|
|
479
498
|
.in("order_id", orderIds)
|
|
480
499
|
.order("updated_at", { ascending: false })
|
|
481
500
|
.limit(1);
|
|
482
|
-
|
|
501
|
+
if (q.error)
|
|
502
|
+
fail("planqueue lezen", q.error);
|
|
503
|
+
const r = (q.data ?? [])[0];
|
|
483
504
|
if (r && (r.error || r.reason)) {
|
|
484
505
|
blocked = {
|
|
485
506
|
reason: r.reason ?? null,
|
|
@@ -489,12 +510,14 @@ export const listOrderCarts = createServerFn({ method: "GET" })
|
|
|
489
510
|
}
|
|
490
511
|
}
|
|
491
512
|
}
|
|
492
|
-
return { carts
|
|
513
|
+
return { carts, bufferId, orderId: dbOrderId, planLockedAt, orders, itemOrders, blocked };
|
|
493
514
|
});
|
|
494
515
|
export const replanBufferForOrder = createServerFn({ method: "POST" })
|
|
495
516
|
.middleware([requireSupabaseAuth])
|
|
496
|
-
.inputValidator((input) => z.object({ orderId: z.string().
|
|
497
|
-
.handler(async ({ data }) => {
|
|
498
|
-
|
|
499
|
-
|
|
517
|
+
.inputValidator((input) => z.object({ orderId: z.string().min(1) }).parse(input))
|
|
518
|
+
.handler(async ({ data, context }) => {
|
|
519
|
+
// DTO-id kan een Floriday salesOrderId zijn.
|
|
520
|
+
const order = await resolveOrderRow(context.supabase, data.orderId);
|
|
521
|
+
const bufferId = await resolveBufferForOrderInternal(order.id);
|
|
522
|
+
return replanScopeInternal({ bufferId, orderId: order.id });
|
|
500
523
|
});
|