@flowselections/logistiek-engine 1.0.33 → 1.0.34

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.
@@ -1 +1 @@
1
- {"version":3,"file":"FloridayPoortCard.d.ts","sourceRoot":"","sources":["../../src/components/FloridayPoortCard.tsx"],"names":[],"mappings":"AA6BA,wBAAgB,iBAAiB,gCAoGhC"}
1
+ {"version":3,"file":"FloridayPoortCard.d.ts","sourceRoot":"","sources":["../../src/components/FloridayPoortCard.tsx"],"names":[],"mappings":"AA6BA,wBAAgB,iBAAiB,gCAqIhC"}
@@ -22,7 +22,8 @@ export function FloridayPoortCard() {
22
22
  const { status, loading, fout, reload } = useFloridayGate();
23
23
  const refusals = Array.isArray(status.last_refusals) ? status.last_refusals : [];
24
24
  const sends = Array.isArray(status.last_sends) ? status.last_sends : [];
25
+ const extern = Array.isArray(status.external_writes) ? status.external_writes : [];
25
26
  return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: [status.enabled ? (_jsx(ShieldCheck, { className: "h-4 w-4 text-primary" })) : (_jsx(ShieldOff, { className: "h-4 w-4 text-muted-foreground" })), "Statussen wijzigen in Floriday"] }), _jsx(CardDescription, { children: status.enabled
26
27
  ? "Staat aan: een order wordt pas afgehandeld ná een goedgekeurde karrencontrole."
27
- : "Staat uit: er gaat geen enkele statuswijziging naar Floriday." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void reload(), children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), "Vernieuwen"] })] }), _jsx(CardContent, { className: "space-y-4", children: loading ? (_jsx(Skeleton, { className: "h-20 w-full" })) : (_jsxs(_Fragment, { children: [fout ? (_jsxs("p", { className: "text-sm text-destructive", children: [fout, " Zolang dit niet gelezen kan worden, wordt er niets verstuurd."] })) : null, _jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-4", children: [_jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Stand" }), _jsx(Badge, { variant: status.enabled ? "default" : "outline", children: status.enabled ? "Aan" : "Uit" })] }), _jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Vandaag verstuurd" }), _jsx("p", { className: "text-lg font-semibold", children: status.sent_today })] }), _jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Vandaag tegengehouden" }), _jsx("p", { className: "text-lg font-semibold", children: status.blocked_today })] }), _jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Nog in de wachtrij" }), _jsx("p", { className: "text-lg font-semibold", children: status.open_pushes })] })] }), refusals.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", children: "Laatst tegengehouden" }), _jsx("ul", { className: "space-y-1 text-sm text-muted-foreground", children: refusals.map((r, i) => (_jsxs("li", { className: "flex flex-wrap gap-2", children: [_jsx("span", { className: "font-medium text-foreground", children: r.order_ref }), _jsx("span", { children: r.reason }), _jsx("span", { className: "ml-auto", children: tijd(r.created_at) })] }, `${r.order_ref}-${i}`))) })] })) : null, sends.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", children: "Laatst verstuurd" }), _jsx("ul", { className: "space-y-1 text-sm text-muted-foreground", children: sends.map((s, i) => (_jsxs("li", { className: "flex flex-wrap gap-2", children: [_jsx("span", { className: "font-medium text-foreground", children: s.order_ref }), _jsx("span", { children: s.ok ? "gelukt" : "mislukt" }), _jsx("span", { children: s.source_module ?? "onbekende bron" }), _jsx("span", { className: "ml-auto", children: tijd(s.created_at) })] }, `${s.order_ref}-${i}`))) })] })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: "Vandaag is er vanuit deze omgeving nog niets naar Floriday gestuurd." }))] })) })] }));
28
+ : "Staat uit: er gaat geen enkele statuswijziging naar Floriday." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void reload(), children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), "Vernieuwen"] })] }), _jsx(CardContent, { className: "space-y-4", children: loading ? (_jsx(Skeleton, { className: "h-20 w-full" })) : (_jsxs(_Fragment, { children: [fout ? (_jsxs("p", { className: "text-sm text-destructive", children: [fout, " Zolang dit niet gelezen kan worden, wordt er niets verstuurd."] })) : null, _jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-4", children: [_jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Statussen" }), _jsx(Badge, { variant: status.enabled ? "default" : "outline", children: status.enabled ? "Aan" : "Uit" })] }), _jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Voorraad doorgeven" }), _jsx(Badge, { variant: status.stock_enabled ? "default" : "outline", children: status.stock_enabled ? "Aan" : "Uit" })] }), _jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Vandaag verstuurd" }), _jsx("p", { className: "text-lg font-semibold", children: status.sent_today })] }), _jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Vandaag tegengehouden" }), _jsx("p", { className: "text-lg font-semibold", children: status.blocked_today })] }), _jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Nog in de wachtrij" }), _jsx("p", { className: "text-lg font-semibold", children: status.open_pushes })] })] }), refusals.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", children: "Laatst tegengehouden" }), _jsx("ul", { className: "space-y-1 text-sm text-muted-foreground", children: refusals.map((r, i) => (_jsxs("li", { className: "flex flex-wrap gap-2", children: [_jsx("span", { className: "font-medium text-foreground", children: r.order_ref }), _jsx("span", { children: r.reason }), _jsx("span", { className: "ml-auto", children: tijd(r.created_at) })] }, `${r.order_ref}-${i}`))) })] })) : null, sends.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", children: "Laatst verstuurd" }), _jsx("ul", { className: "space-y-1 text-sm text-muted-foreground", children: sends.map((s, i) => (_jsxs("li", { className: "flex flex-wrap gap-2", children: [_jsx("span", { className: "font-medium text-foreground", children: s.order_ref }), _jsx("span", { children: s.ok ? "gelukt" : "mislukt" }), _jsx("span", { children: s.source_module ?? "onbekende bron" }), _jsx("span", { className: "ml-auto", children: tijd(s.created_at) })] }, `${s.order_ref}-${i}`))) })] })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: "Vandaag is er vanuit deze omgeving nog niets naar Floriday gestuurd." })), extern.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", children: "Al het verkeer naar Floriday (48 uur)" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Ook verkeer van andere onderdelen. Zie je hier iets wat niet van ons komt, dan schrijft een ander onderdeel rechtstreeks naar Floriday." }), _jsx("ul", { className: "space-y-1 text-sm text-muted-foreground", children: extern.map((w, i) => (_jsxs("li", { className: "flex flex-wrap gap-2", children: [_jsx("span", { className: "font-medium text-foreground", children: w.action ?? "onbekend" }), _jsx("span", { children: w.module ?? "onbekende module" }), _jsx("span", { children: w.caller ?? "onbekende aanroeper" }), _jsxs("span", { children: [w.gelukt, " van ", w.pogingen, " gelukt"] }), _jsx("span", { className: "ml-auto", children: tijd(w.laatst) })] }, `${w.module}-${w.action}-${i}`))) })] })) : null] })) })] }));
28
29
  }
@@ -13,13 +13,23 @@ export interface FloridayGateSend {
13
13
  source_module: string | null;
14
14
  created_at: string;
15
15
  }
16
+ export interface FloridayGateExternalWrite {
17
+ module: string | null;
18
+ caller: string | null;
19
+ action: string | null;
20
+ pogingen: number;
21
+ gelukt: number;
22
+ laatst: string;
23
+ }
16
24
  export interface FloridayGateStatus {
17
25
  enabled: boolean;
26
+ stock_enabled: boolean;
18
27
  sent_today: number;
19
28
  blocked_today: number;
20
29
  open_pushes: number;
21
30
  last_refusals: FloridayGateRefusal[];
22
31
  last_sends: FloridayGateSend[];
32
+ external_writes: FloridayGateExternalWrite[];
23
33
  }
24
34
  export declare function useFloridayGate(): {
25
35
  status: FloridayGateStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"useFloridayGate.d.ts","sourceRoot":"","sources":["../../src/hooks/useFloridayGate.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAWD,wBAAgB,eAAe;;;;;EAkC9B"}
1
+ {"version":3,"file":"useFloridayGate.d.ts","sourceRoot":"","sources":["../../src/hooks/useFloridayGate.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,eAAe,EAAE,yBAAyB,EAAE,CAAC;CAC9C;AAaD,wBAAgB,eAAe;;;;;EAoC9B"}
@@ -5,11 +5,13 @@ import { useCallback, useEffect, useState } from "react";
5
5
  import { supabase } from "@flowselections/core";
6
6
  const LEEG = {
7
7
  enabled: false,
8
+ stock_enabled: false,
8
9
  sent_today: 0,
9
10
  blocked_today: 0,
10
11
  open_pushes: 0,
11
12
  last_refusals: [],
12
13
  last_sends: [],
14
+ external_writes: [],
13
15
  };
14
16
  export function useFloridayGate() {
15
17
  const [status, setStatus] = useState(LEEG);
@@ -27,11 +29,13 @@ export function useFloridayGate() {
27
29
  const d = data;
28
30
  setStatus({
29
31
  enabled: d.enabled === true,
32
+ stock_enabled: d.stock_enabled === true,
30
33
  sent_today: Number(d.sent_today ?? 0),
31
34
  blocked_today: Number(d.blocked_today ?? 0),
32
35
  open_pushes: Number(d.open_pushes ?? 0),
33
36
  last_refusals: Array.isArray(d.last_refusals) ? d.last_refusals : [],
34
37
  last_sends: Array.isArray(d.last_sends) ? d.last_sends : [],
38
+ external_writes: Array.isArray(d.external_writes) ? d.external_writes : [],
35
39
  });
36
40
  setFout(null);
37
41
  }
@@ -1,11 +1,11 @@
1
1
  import type { SupabaseClient } from "@supabase/supabase-js";
2
- export type FloridayGuardAction = "fulfillment_order_send" | "queue_push" | "status_update" | "load_carrier_update";
2
+ export type FloridayGuardAction = "fulfillment_order_send" | "queue_push" | "status_update" | "load_carrier_update" | "stock_publish" | "trade_item_update";
3
3
  export interface FloridayGuardDecision {
4
4
  allowed: boolean;
5
5
  /** Leesbare reden waarom er niet verstuurd mag worden. */
6
6
  reason: string | null;
7
7
  /** Machineleesbaar, om op te kunnen filteren. */
8
- code: "toegestaan" | "schakelaar_uit" | "schakelaar_onleesbaar" | "poort_ontbreekt" | "niet_goedgekeurd";
8
+ code: "toegestaan" | "schakelaar_uit" | "schakelaar_onleesbaar" | "poort_ontbreekt" | "onbekende_actie" | "niet_goedgekeurd";
9
9
  }
10
10
  /** Verstuurde poging vastleggen, zodat achteraf aantoonbaar is wat wij deden. */
11
11
  export declare function logFloridaySend(sb: SupabaseClient, args: {
@@ -1 +1 @@
1
- {"version":3,"file":"floridayGuard.server.d.ts","sourceRoot":"","sources":["../../src/lib/floridayGuard.server.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,mBAAmB,GAC3B,wBAAwB,GACxB,YAAY,GACZ,eAAe,GACf,qBAAqB,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iDAAiD;IACjD,IAAI,EACA,YAAY,GACZ,gBAAgB,GAChB,uBAAuB,GACvB,iBAAiB,GACjB,kBAAkB,CAAC;CACxB;AA+BD,iFAAiF;AACjF,wBAAsB,eAAe,CACnC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE;IACJ,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,qBAAqB,CAAC,CAqDhC"}
1
+ {"version":3,"file":"floridayGuard.server.d.ts","sourceRoot":"","sources":["../../src/lib/floridayGuard.server.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,mBAAmB,GAC3B,wBAAwB,GACxB,YAAY,GACZ,eAAe,GACf,qBAAqB,GACrB,eAAe,GACf,mBAAmB,CAAC;AAoBxB,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iDAAiD;IACjD,IAAI,EACA,YAAY,GACZ,gBAAgB,GAChB,uBAAuB,GACvB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,CAAC;CACxB;AAgCD,iFAAiF;AACjF,wBAAsB,eAAe,CACnC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE;IACJ,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,qBAAqB,CAAC,CAgEhC"}
@@ -16,6 +16,22 @@
16
16
  // Geen omgevingswaarden in dit bestand: de shell-aanduiding komt uit de
17
17
  // omgeving en blijft leeg als die er niet is.
18
18
  // ============================================================================
19
+ /** Elke actie die deze module kent. Staat een actie hier niet in, dan gaat er niets weg. */
20
+ const BEKENDE_ACTIES = [
21
+ "fulfillment_order_send",
22
+ "queue_push",
23
+ "status_update",
24
+ "load_carrier_update",
25
+ "stock_publish",
26
+ "trade_item_update",
27
+ ];
28
+ /** Acties die om een goedgekeurde karrencontrole vragen. */
29
+ const ORDERGEBONDEN = [
30
+ "fulfillment_order_send",
31
+ "queue_push",
32
+ "status_update",
33
+ "load_carrier_update",
34
+ ];
19
35
  /** Naam van de shell waarin deze module draait; leeg als die ontbreekt. */
20
36
  function shellName() {
21
37
  const env = globalThis.process
@@ -64,27 +80,37 @@ export async function logFloridaySend(sb, args) {
64
80
  export async function floridayStatusGuard(sb, args) {
65
81
  const module = args.module ?? "logistiek-engine";
66
82
  const orderRef = args.orderRef ?? null;
67
- // 1. Staat de schakelaar aan? Alles behalve een expliciete true is "nee".
83
+ // 0. Onbekende actie? Dan weten we niet welke schakelaar geldt: niet versturen.
84
+ if (!BEKENDE_ACTIES.includes(args.action)) {
85
+ const reason = `Onbekende actie "${args.action}" richting Floriday; er wordt niets verstuurd.`;
86
+ await logRefusal(sb, orderRef, reason, args.action, module);
87
+ return { allowed: false, reason, code: "onbekende_actie" };
88
+ }
89
+ // 1. Staat de bijbehorende schakelaar aan? Alles behalve true is "nee".
68
90
  let enabled = null;
69
91
  try {
70
- const { data, error } = await sb.rpc("logistics_floriday_status_updates_enabled");
92
+ const { data, error } = await sb.rpc("logistics_floriday_write_allowed", {
93
+ _action: args.action,
94
+ });
71
95
  enabled = error ? null : data === true;
72
96
  }
73
97
  catch {
74
98
  enabled = null;
75
99
  }
76
100
  if (enabled === null) {
77
- const reason = "De poort op statuswijzigingen kan niet gelezen worden in deze omgeving; er wordt niets naar Floriday gestuurd.";
101
+ const reason = "De poort op schrijfacties kan niet gelezen worden in deze omgeving; er wordt niets naar Floriday gestuurd.";
78
102
  await logRefusal(sb, orderRef, reason, args.action, module);
79
103
  return { allowed: false, reason, code: "poort_ontbreekt" };
80
104
  }
81
105
  if (!enabled) {
82
- const reason = "Statussen wijzigen in Floriday staat uit in de actieve werkwijze.";
106
+ const reason = ORDERGEBONDEN.includes(args.action)
107
+ ? "Statussen wijzigen in Floriday staat uit in de actieve werkwijze."
108
+ : "Voorraad doorgeven aan Floriday staat uit in de actieve werkwijze.";
83
109
  await logRefusal(sb, orderRef, reason, args.action, module);
84
110
  return { allowed: false, reason, code: "schakelaar_uit" };
85
111
  }
86
112
  // 2. Ordergebonden acties vragen om een goedgekeurde karrencontrole.
87
- if (args.requireApproval !== false && orderRef) {
113
+ if (args.requireApproval !== false && orderRef && ORDERGEBONDEN.includes(args.action)) {
88
114
  let approved = null;
89
115
  try {
90
116
  const { data, error } = await sb.rpc("logistics_floriday_order_approved", {
@@ -5,6 +5,7 @@
5
5
  */
6
6
  export declare const PROMPT_MODULE_LABELS: {
7
7
  readonly layoutmaker: "Layout maker (pakbonnen, verzendbrieven, extra)";
8
+ readonly floridaykoppeling: "Floriday koppeling (authenticatie en gateway)";
8
9
  readonly verkoop: "Floriday - Verkoop Module";
9
10
  readonly voorraad: "Floriday - Voorraad Module";
10
11
  readonly afhandeling: "Floriday - Afhandeling Module";
@@ -1 +1 @@
1
- {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;CAGvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AA6sGD,eAAO,MAAM,cAAc,EAAE,YAAY,EAUL,CAAC;AAErC,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAeR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAIR"}
1
+ {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;CAIvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AA4yGD,eAAO,MAAM,cAAc,EAAE,YAAY,EAUL,CAAC;AAErC,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAeR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAIR"}
@@ -15,6 +15,7 @@ import { LOGISTICS_MODULES } from "./logisticsTasks";
15
15
  export const PROMPT_MODULE_LABELS = {
16
16
  ...LOGISTICS_MODULES,
17
17
  layoutmaker: "Layout maker (pakbonnen, verzendbrieven, extra)",
18
+ floridaykoppeling: "Floriday koppeling (authenticatie en gateway)",
18
19
  };
19
20
  function sharedBlock(moduleKey) {
20
21
  const key = moduleKey === "<modulesleutel>" ? "<modulesleutel>" : moduleKey;
@@ -2833,6 +2834,40 @@ CONTROLELIJST
2833
2834
  [ ] Ontbrekende poortfunctie leidt tot blokkeren, niet tot doorsturen.
2834
2835
  [ ] Weigeringen en verzendingen staan in het logboek met module en omgeving.`,
2835
2836
  },
2837
+ {
2838
+ number: 5,
2839
+ title: "Ook voorraadberichten door de poort",
2840
+ date: "2026-09-07",
2841
+ withSharedContract: false,
2842
+ summary: "Naast statussen gaan ook voorraad- en artikelberichten alleen weg als de bijbehorende schakelaar aan staat.",
2843
+ body: `NIEUWE EIS BOVENOP PROMPT 4
2844
+ Prompt 4 blijft gelden. Daar bovenop: ook voorraadverkeer gaat door de poort.
2845
+
2846
+ ÉÉN VRAAG VOOR ELKE SCHRIJFACTIE
2847
+ select public.logistics_floriday_write_allowed(<actie>)
2848
+
2849
+ Gebruik deze actienamen:
2850
+ stock_publish voorraad publiceren (bijv. doorlopende voorraad)
2851
+ trade_item_update artikelgegevens wijzigen
2852
+ status_update statuswijziging van een order
2853
+ fulfillment_order_send order afhandelen
2854
+
2855
+ Antwoord niet exact true, functie onbekend, database niet bereikbaar, of een
2856
+ actie die niet in de lijst staat: NIET versturen.
2857
+
2858
+ WAT DIT BETEKENT
2859
+ - Staat "Voorraad doorgeven aan Floriday" uit, dan blijven ook geplande
2860
+ synchronisaties en achtergrondtaken stil. Zet de wachtrij op wachten; gooi
2861
+ niets weg en probeer het niet stiekem opnieuw.
2862
+ - Lezen (ophalen van orders, artikelen, referentiedata) mag altijd.
2863
+ - Iedere weigering en verzending vastleggen zoals in prompt 4.
2864
+
2865
+ CONTROLELIJST
2866
+ [ ] Met de voorraadschakelaar uit gaat er geen voorraad- of artikelbericht weg.
2867
+ [ ] Cronjobs en herhaalpogingen vragen elke keer opnieuw toestemming.
2868
+ [ ] Onbekende actie wordt geweigerd, niet toegestaan.
2869
+ [ ] Geen URL's, sleutels, project-refs, klantnamen of vaste id's in code.`,
2870
+ },
2836
2871
  ],
2837
2872
  },
2838
2873
  klanten: {
@@ -3187,6 +3222,61 @@ CONTROLELIJST
3187
3222
  },
3188
3223
  ],
3189
3224
  },
3225
+ floridaykoppeling: {
3226
+ order: 10,
3227
+ summary: "De enige verbinding met Floriday. Beslist zelf niets over orders of voorraad, maar weigert elke schrijfactie waarvoor geen groen licht is.",
3228
+ revisions: [
3229
+ {
3230
+ number: 1,
3231
+ title: "Poort op alle schrijfacties richting Floriday",
3232
+ date: "2026-09-07",
3233
+ withSharedContract: false,
3234
+ summary: "Elke schrijfactie richting Floriday gaat door één controle; geen groen licht of geen leesbaar antwoord betekent niet versturen.",
3235
+ body: `WAAROM
3236
+ Dezelfde modules draaien in meerdere shells met elk een eigen database. Een
3237
+ regel die alleen in één database staat, ontbreekt in de andere. Daarom hoort de
3238
+ controle in deze koppelmodule, want alles gaat hier langs.
3239
+
3240
+ WAT JE BOUWT
3241
+ Voordat je ook maar iets naar Floriday schrijft (POST, PUT, PATCH, DELETE) vraag
3242
+ je in de database:
3243
+
3244
+ select public.logistics_floriday_write_allowed(<actie>)
3245
+
3246
+ Actienamen die bestaan:
3247
+ fulfillment_order_send, queue_push, status_update, load_carrier_update
3248
+ stock_publish, trade_item_update
3249
+
3250
+ REGELS, ZONDER UITZONDERING
3251
+ - Antwoord is niet exact true -> niet versturen.
3252
+ - Functie bestaat niet, geen verbinding, foutmelding -> niet versturen.
3253
+ - Actie staat niet in de lijst hierboven -> niet versturen.
3254
+ - Ordergebonden acties vragen daarnaast om
3255
+ public.logistics_floriday_order_approved(<ordernummer>) = true.
3256
+ - Leesacties (ophalen van orders, documenten, pdf's, referentiedata) blijven
3257
+ gewoon toegestaan.
3258
+
3259
+ VASTLEGGEN
3260
+ - Geweigerd: public.logistics_floriday_log_refusal(ordernummer, reden, module,
3261
+ shell, actie).
3262
+ - Wel verstuurd: public.logistics_floriday_log_send(ordernummer, actie, gelukt,
3263
+ httpstatus, detail, module, shell).
3264
+
3265
+ NIET DOEN
3266
+ - Geen eigen uitzonderingslijst, geen "alleen deze ene keer", geen omweg via een
3267
+ achtergrondtaak, cronjob of webhook.
3268
+ - Geen herhaalpogingen die de controle overslaan; elke poging vraagt opnieuw.
3269
+ - Geen URL's, sleutels, project-refs, klantnamen of vaste database-id's in code
3270
+ of migraties.
3271
+
3272
+ CONTROLELIJST
3273
+ [ ] Staat de schakelaar uit, dan gaat er geen enkele schrijfactie weg.
3274
+ [ ] Is de controle onleesbaar, dan gaat er ook niets weg.
3275
+ [ ] Elke weigering en elke verzending staat in het logboek.
3276
+ [ ] Lezen blijft werken.`,
3277
+ },
3278
+ ],
3279
+ },
3190
3280
  };
3191
3281
  export const MODULE_PROMPTS = Object.keys(MODULES)
3192
3282
  .map((moduleKey) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}
@@ -920,6 +920,13 @@ export const RULE_STEPS = [
920
920
  default: false,
921
921
  description: "Staat dit uit, dan verstuurt de Logistics Engine geen enkele statuswijziging naar Floriday. Staat dit aan, dan wordt een order pas op afgehandeld gezet nadat de karrencontrole is goedgekeurd.",
922
922
  },
923
+ {
924
+ key: "floriday_stock_updates",
925
+ label: "Voorraad doorgeven aan Floriday",
926
+ type: "toggle",
927
+ default: false,
928
+ description: "Staat dit uit, dan gaat er ook geen voorraad of artikelgegevens naar Floriday. Zet dit uit als er helemaal niets meer naar Floriday geschreven mag worden.",
929
+ },
923
930
  {
924
931
  key: "sample_percentage",
925
932
  label: "Steekproefpercentage",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/logistiek-engine",
3
- "version": "1.0.33",
3
+ "version": "1.0.34",
4
4
  "flowselections": {
5
5
  "moduleId": "logistiek-engine",
6
6
  "pages": [