@flowselections/floriday-afhandeling-module 1.0.58 → 1.0.61

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 (28) hide show
  1. package/dist-lib/components/afhandeling/AutoSendStatus.d.ts +5 -0
  2. package/dist-lib/components/afhandeling/AutoSendStatus.d.ts.map +1 -0
  3. package/dist-lib/components/afhandeling/AutoSendStatus.js +22 -0
  4. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
  5. package/dist-lib/components/afhandeling/DagDetailDialog.js +2 -1
  6. package/dist-lib/components/afhandeling/NuVersturenButton.js +1 -1
  7. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
  8. package/dist-lib/components/afhandeling/WeekAgendaView.js +57 -10
  9. package/dist-lib/hooks/useConsistencyCheck.d.ts +1 -1
  10. package/dist-lib/hooks/useConsistencyCheck.d.ts.map +1 -1
  11. package/dist-lib/hooks/useConsistencyCheck.js +5 -3
  12. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
  13. package/dist-lib/integrations/supabase/previewAuthStorage.js +22 -4
  14. package/dist-lib/integrations/supabase/types.d.ts +384 -2
  15. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  16. package/dist-lib/integrations/supabase/types.js +1 -0
  17. package/dist-lib/lib/floriday.functions.d.ts +2 -0
  18. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  19. package/dist-lib/lib/floriday.functions.js +1 -0
  20. package/dist-lib/lib/floridayLoading.functions.d.ts +11 -0
  21. package/dist-lib/lib/floridayLoading.functions.d.ts.map +1 -1
  22. package/dist-lib/lib/floridayLoading.functions.js +17 -5
  23. package/dist-lib/lib/serverRoutes/autoSend.handler.d.ts +2 -0
  24. package/dist-lib/lib/serverRoutes/autoSend.handler.d.ts.map +1 -0
  25. package/dist-lib/lib/serverRoutes/autoSend.handler.js +102 -0
  26. package/dist-lib/moduleDefinition.d.ts.map +1 -1
  27. package/dist-lib/moduleDefinition.js +5 -2
  28. package/package.json +2 -2
@@ -39,6 +39,7 @@ export const Constants = {
39
39
  "veilingbon",
40
40
  "afleverbrief",
41
41
  "veilingbrief",
42
+ "traysticker",
42
43
  ],
43
44
  doc_orientation: ["portrait", "landscape"],
44
45
  exact_env: ["staging", "live"],
@@ -20,6 +20,8 @@ export interface FloridayOrder {
20
20
  hasStickers?: boolean;
21
21
  /** Floriday salesOrderId — nodig voor afleverbrief PDF via gateway. */
22
22
  salesOrderId?: string | null;
23
+ /** Floriday-afmeldstand uit de order (custom_fields.floriday_fulfilled). */
24
+ floridayFulfilled?: boolean;
23
25
  /**
24
26
  * Deze module toont uitsluitend orders uit de orderadministratie van de
25
27
  * Verkoop-module (public.orders). Daarom is dit altijd waar; het veld blijft
@@ -1 +1 @@
1
- {"version":3,"file":"floriday.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday.functions.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AA4CD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;8CAEJ,sBAAsB,GAAG,SAAS,8DA+LxD,CAAC;AAEL,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAGD;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;;;YAEsB,aAAa,EAAE;YAAU,MAAM;GAqB7E,CAAC"}
1
+ {"version":3,"file":"floriday.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday.functions.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AA4CD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;8CAEJ,sBAAsB,GAAG,SAAS,8DAgMxD,CAAC;AAEL,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAGD;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;;;YAEsB,aAAa,EAAE;YAAU,MAAM;GAqB7E,CAAC"}
@@ -190,6 +190,7 @@ export const getFloridayOrders = createServerFn({ method: "GET" })
190
190
  city: deliveryLocation?.city ?? null,
191
191
  hasStickers: salesOrderId ? stickerOrderIds.has(salesOrderId) : false,
192
192
  salesOrderId,
193
+ floridayFulfilled: fields.floriday_fulfilled === true || fields.floriday_fulfilled === "true",
193
194
  mirrored: true,
194
195
  mirroredOrderId: orderId,
195
196
  };
@@ -67,6 +67,7 @@ export interface SendResult {
67
67
  }
68
68
  /** Floriday 2026v1 AddLoadCarrierConfiguration.loadCarrierReference: maximaal 14 tekens. */
69
69
  export declare const LOAD_CARRIER_REF_MAX = 14;
70
+ export declare const ACCEPTED: Set<string>;
70
71
  /** Stelt de belading samen en toont de controles. Verstuurt niets. */
71
72
  export declare const prepareFloridayLoading: import("@tanstack/start-client-core").RequiredFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
72
73
  supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
@@ -92,4 +93,14 @@ export declare const sendFloridayLoading: import("@tanstack/start-client-core").
92
93
  }) => {
93
94
  orderRef: string;
94
95
  }, Promise<SendResult>>;
96
+ /** Controle vooraf, ook bruikbaar vanuit de getekende auto-send-route. */
97
+ export declare function prepareLoadingServer(supabase: any, orderRef: string): Promise<LoadingPreview>;
98
+ /**
99
+ * De enige verzendkern (AGENTS.md): "Nu versturen" en automatisch versturen
100
+ * gebruiken allebei deze functie met dezelfde vaste kenmerken.
101
+ */
102
+ export declare function runLoadingSend(supabase: any, p: LoadingPreview, actor: {
103
+ userId: string | null;
104
+ source: "manual" | "auto-send";
105
+ }): Promise<SendResult>;
95
106
  //# sourceMappingURL=floridayLoading.functions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floridayLoading.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floridayLoading.functions.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AACD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AACD,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC;AACD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,kEAAkE;IAClE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AACD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3H;AAQD,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,KAAK,CAAC;AA+TvC,sEAAsE;AACtE,eAAO,MAAM,sBAAsB;;;;0CAEb;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE;;2BAC4E,CAAC;AAEvH;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;;;;0CAEV;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE;;uBA0DtC,CAAC"}
1
+ {"version":3,"file":"floridayLoading.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floridayLoading.functions.ts"],"names":[],"mappings":"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"}
@@ -85,7 +85,7 @@ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
85
85
  // Auto-verwerking (1.0.64) neemt alleen aan; deze statussen betekenen dat de oude
86
86
  // route tóch al belading/verzendbrief heeft gedaan → nooit nog eens versturen.
87
87
  const AUTO_ALREADY_SENT = new Set(["sending_fulfillment", "generating_delivery_note", "done"]);
88
- const ACCEPTED = new Set(["created", "already_fulfilled"]);
88
+ export const ACCEPTED = new Set(["created", "already_fulfilled"]);
89
89
  async function buildLoading(supabase, orderRef) {
90
90
  if (!orderRef)
91
91
  throw new Error("Geen order opgegeven.");
@@ -371,15 +371,27 @@ export const sendFloridayLoading = createServerFn({ method: "POST" })
371
371
  .middleware([requireSupabaseAuth])
372
372
  .inputValidator((d) => ({ orderRef: String(d?.orderRef ?? "").trim() }))
373
373
  .handler(async ({ data, context }) => {
374
- const supabase = context.supabase;
375
- const p = await buildLoading(supabase, data.orderRef);
374
+ const p = await buildLoading(context.supabase, data.orderRef);
376
375
  if (!p.canSend)
377
376
  throw new Error(`Niet verstuurd: ${p.blockers.join(" ") || "geen opdracht."}`);
377
+ return runLoadingSend(context.supabase, p, { userId: context.userId, source: "manual" });
378
+ });
379
+ /** Controle vooraf, ook bruikbaar vanuit de getekende auto-send-route. */
380
+ export async function prepareLoadingServer(supabase, orderRef) {
381
+ return buildLoading(supabase, orderRef);
382
+ }
383
+ /**
384
+ * De enige verzendkern (AGENTS.md): "Nu versturen" en automatisch versturen
385
+ * gebruiken allebei deze functie met dezelfde vaste kenmerken.
386
+ */
387
+ export async function runLoadingSend(supabase, p, actor) {
378
388
  const { sendFulfillmentOrder, floridayFoutTekst } = await import("./floridayFulfillmentSend.server");
379
389
  const log = async (s, row) => {
390
+ const rs = row.request_summary ?? {};
380
391
  const { error } = await supabase.from("floriday_loading_attempts").insert({
381
392
  fulfillment_order_id: s.fulfillmentOrderId, delivery_order_id: s.deliveryOrderId,
382
- sales_order_ids: s.salesOrderIds, order_refs: s.orderRefs, created_by: context.userId, ...row,
393
+ sales_order_ids: s.salesOrderIds, order_refs: s.orderRefs, created_by: actor.userId, ...row,
394
+ request_summary: { ...rs, source: actor.source },
383
395
  });
384
396
  if (error)
385
397
  console.warn("[belading] log mislukt", error.message);
@@ -429,4 +441,4 @@ export const sendFloridayLoading = createServerFn({ method: "POST" })
429
441
  results.push({ fulfillmentOrderId: s.fulfillmentOrderId, code, httpStatus, message, deliveryNote });
430
442
  }
431
443
  return { ok: results.every((r) => ACCEPTED.has(r.code)), results };
432
- });
444
+ }
@@ -0,0 +1,2 @@
1
+ export declare function handleAutoSend(request: Request): Promise<Response>;
2
+ //# sourceMappingURL=autoSend.handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoSend.handler.d.ts","sourceRoot":"","sources":["../../../src/lib/serverRoutes/autoSend.handler.ts"],"names":[],"mappings":"AAqBA,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsCxE"}
@@ -0,0 +1,102 @@
1
+ // /api/public/hooks/afhandeling-auto-send — aanroep door de Logistieke Engine
2
+ // (koppelprompt 23). Getekend: x-timestamp (epoch-ms) + x-signature (hex
3
+ // HMAC-SHA256 over "<timestamp>.<rawBody>"), sleutel = Floriday-gatewaygeheim.
4
+ // Fail closed: geen geheim = niets doen. Versturen loopt via runLoadingSend.
5
+ import { z } from "zod";
6
+ const MAX_SKEW_MS = 5 * 60000;
7
+ const bodySchema = z.object({ orderId: z.string().uuid() }).strict();
8
+ const json = (status, body) => Response.json(body, { status });
9
+ function hex(buf) {
10
+ return [...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, "0")).join("");
11
+ }
12
+ function safeEqual(a, b) {
13
+ if (a.length !== b.length)
14
+ return false;
15
+ let d = 0;
16
+ for (let i = 0; i < a.length; i++)
17
+ d |= a.charCodeAt(i) ^ b.charCodeAt(i);
18
+ return d === 0;
19
+ }
20
+ export async function handleAutoSend(request) {
21
+ const rawBody = await request.text();
22
+ const ts = request.headers.get("x-timestamp")?.trim() ?? "";
23
+ const sig = (request.headers.get("x-signature")?.trim() ?? "").toLowerCase();
24
+ if (!/^\d{13}$/.test(ts))
25
+ return json(401, { ok: false, code: "invalid_timestamp", error: "x-timestamp moet epoch-milliseconden zijn." });
26
+ if (Math.abs(Date.now() - Number(ts)) > MAX_SKEW_MS)
27
+ return json(401, { ok: false, code: "timestamp_out_of_range", error: "x-timestamp valt buiten de marge van 5 minuten." });
28
+ let secret;
29
+ try {
30
+ const { getFloridayGatewaySecret } = await import("../centralSecrets.server");
31
+ secret = await getFloridayGatewaySecret();
32
+ }
33
+ catch {
34
+ return json(401, { ok: false, code: "gateway_not_configured", error: "Ondertekeningsgeheim niet beschikbaar; niets verstuurd." });
35
+ }
36
+ const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
37
+ const expected = hex(await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(`${ts}.${rawBody}`)));
38
+ if (!sig || !safeEqual(sig, expected))
39
+ return json(401, { ok: false, code: "invalid_signature", error: "Handtekening klopt niet." });
40
+ let parsed;
41
+ try {
42
+ const r = bodySchema.safeParse(JSON.parse(rawBody));
43
+ if (!r.success)
44
+ return json(400, { ok: false, code: "invalid_body", error: "Body moet {\"orderId\":\"<uuid>\"} zijn." });
45
+ parsed = r.data;
46
+ }
47
+ catch {
48
+ return json(400, { ok: false, code: "invalid_body", error: "Body is geen geldige JSON." });
49
+ }
50
+ const orderId = parsed.orderId;
51
+ if (request.headers.get("idempotency-key")?.trim() !== `auto-send:${orderId}`)
52
+ return json(400, { ok: false, code: "invalid_idempotency_key", error: "idempotency-key moet auto-send:<orderId> zijn." });
53
+ try {
54
+ return await processOrder(orderId);
55
+ }
56
+ catch (e) {
57
+ const msg = e instanceof Error ? e.message : String(e);
58
+ return json(500, { ok: false, code: "internal_error", error: msg || "Onverwachte fout tijdens versturen." });
59
+ }
60
+ }
61
+ async function processOrder(orderId) {
62
+ const { supabaseAdmin } = await import("../../integrations/supabase/client.server");
63
+ const sb = supabaseAdmin;
64
+ const { data: order, error: oErr } = await sb.from("orders")
65
+ .select("id, order_number, custom_fields").eq("id", orderId).is("deleted_at", null).maybeSingle();
66
+ if (oErr)
67
+ return json(500, { ok: false, code: "lookup_failed", error: `Order kon niet worden opgezocht: ${oErr.message}` });
68
+ if (!order)
69
+ return json(422, { ok: false, code: "not_floriday", error: "Order niet gevonden." });
70
+ const cf = order.custom_fields ?? {};
71
+ const salesOrderId = typeof cf.floriday_sales_order_id === "string" ? cf.floriday_sales_order_id
72
+ : typeof cf.salesOrderId === "string" ? cf.salesOrderId : null;
73
+ if (!salesOrderId)
74
+ return json(422, { ok: false, code: "not_floriday", error: "Order heeft geen Floriday-id." });
75
+ const { ACCEPTED, prepareLoadingServer, runLoadingSend } = await import("../floridayLoading.functions");
76
+ const ref = order.order_number ?? order.id;
77
+ const already = async () => {
78
+ if (cf.floriday_fulfilled === true)
79
+ return true;
80
+ const { data } = await sb.from("floriday_loading_attempts").select("code")
81
+ .eq("step", "send").contains("order_refs", [ref]).in("code", [...ACCEPTED]).limit(1);
82
+ return Array.isArray(data) && data.length > 0;
83
+ };
84
+ if (await already())
85
+ return json(200, { ok: true, code: "already_sent" });
86
+ let p;
87
+ try {
88
+ p = await prepareLoadingServer(sb, ref);
89
+ }
90
+ catch (e) {
91
+ return json(409, { ok: false, code: "not_ready", error: e instanceof Error ? e.message : String(e) });
92
+ }
93
+ if (!p.canSend)
94
+ return json(409, { ok: false, code: "not_ready", error: p.blockers.join(" ") || "Geen opdracht." });
95
+ const res = await runLoadingSend(sb, p, { userId: null, source: "auto-send" });
96
+ if (res.ok) {
97
+ const allAlready = res.results.every((r) => r.code === "already_fulfilled");
98
+ return json(200, { ok: true, code: allAlready ? "already_sent" : "sent", results: res.results });
99
+ }
100
+ const fail = res.results.find((r) => !ACCEPTED.has(r.code));
101
+ return json(502, { ok: false, code: "floriday_rejected", error: fail?.message ?? "Floriday weigert de opdracht.", results: res.results });
102
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"moduleDefinition.d.ts","sourceRoot":"","sources":["../src/moduleDefinition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAgBvD,eAAO,MAAM,yBAAyB,EAAE,UAqBvC,CAAC"}
1
+ {"version":3,"file":"moduleDefinition.d.ts","sourceRoot":"","sources":["../src/moduleDefinition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAgBvD,eAAO,MAAM,yBAAyB,EAAE,UAuBvC,CAAC"}
@@ -23,9 +23,12 @@ export const floridayAfhandelingModule = {
23
23
  const info = getPickMode();
24
24
  if (info.showCartControl)
25
25
  return [...baseChildren, cartControlChild];
26
- if (info.status !== "ok") {
27
- return [...baseChildren, { ...cartControlChild, label: "Controle karren (onbekend)" }];
26
+ if (info.status !== "ok" && info.lastError) {
27
+ return [...baseChildren, { ...cartControlChild, label: "Controle karren (werkwijze niet bereikbaar)" }];
28
28
  }
29
+ // Werkwijze wordt nog opgehaald: zonder toevoeging tonen.
30
+ if (info.status !== "ok")
31
+ return [...baseChildren, cartControlChild];
29
32
  return baseChildren;
30
33
  },
31
34
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/floriday-afhandeling-module",
3
- "version": "1.0.58",
3
+ "version": "1.0.61",
4
4
  "private": false,
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -53,7 +53,7 @@
53
53
  "@rsbuild/core": "^1.0.0",
54
54
  "@tailwindcss/vite": "^4.2.1",
55
55
  "@tanstack/react-query": "^5.83.0",
56
- "@tanstack/router-plugin": "^1.167.10",
56
+ "@tanstack/router-plugin": "1.167.33",
57
57
  "@types/node": "^22.16.5",
58
58
  "@types/react": "^19.2.0",
59
59
  "@types/react-dom": "^19.2.0",