@flowselections/floriday-voorraad 1.0.156 → 1.0.158

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,3 +1,12 @@
1
+ /**
2
+ * Deze verwerkers staan zonder expliciete instelling alleen aan zolang er
3
+ * minstens één ERP-leidend artikel is (erp_leading = true, of een artikel van
4
+ * vóór 1.0.84 met een andere modus dan Uit). Anders uit: een Shell die alles
5
+ * uit Floriday overneemt, verstuurt dan niets.
6
+ */
7
+ export declare const DEFAULT_ON_IF_ERP_LEADING: Set<string>;
8
+ /** Standaard aan zonder voorwaarde (alleen lezen uit Floriday, verstuurt niets). */
9
+ export declare const DEFAULT_ON: Set<string>;
1
10
  export declare function hookEnabled(name: string): Promise<boolean>;
2
11
  export declare function runGuardedHook(request: Request, name: string, handle: (request: Request) => Promise<Response>, label: string): Promise<Response>;
3
12
  //# sourceMappingURL=guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/server-hooks/guard.ts"],"names":[],"mappings":"AA+DA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAahE;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,EAC/C,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC,CAUnB"}
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/server-hooks/guard.ts"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,aAAuD,CAAC;AAE9F,oFAAoF;AACpF,eAAO,MAAM,UAAU,aAAmD,CAAC;AAsC3E,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAchE;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,EAC/C,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC,CAUnB"}
@@ -19,9 +19,9 @@ const CORS = {
19
19
  * vóór 1.0.84 met een andere modus dan Uit). Anders uit: een Shell die alles
20
20
  * uit Floriday overneemt, verstuurt dan niets.
21
21
  */
22
- const DEFAULT_ON_IF_ERP_LEADING = new Set(["floriday_base_supply", "logistics_tasks"]);
22
+ export const DEFAULT_ON_IF_ERP_LEADING = new Set(["floriday_base_supply", "logistics_tasks"]);
23
23
  /** Standaard aan zonder voorwaarde (alleen lezen uit Floriday, verstuurt niets). */
24
- const DEFAULT_ON = new Set(["follow_floriday", "floriday_versies"]);
24
+ export const DEFAULT_ON = new Set(["follow_floriday", "floriday_versies"]);
25
25
  async function hasErpLeadingArticle(admin) {
26
26
  const lead = await admin
27
27
  .from("floriday_inventory_settings")
@@ -64,7 +64,8 @@ export async function hookEnabled(name) {
64
64
  .select("value")
65
65
  .eq("key", `voorraad_hook_enabled.${name}`)
66
66
  .maybeSingle();
67
- if (!data) {
67
+ // 'standaard' (vastgelegd door voorraad_ensure_defaults) = dezelfde regel als geen rij.
68
+ if (!data || String(data.value).trim().toLowerCase() === "standaard") {
68
69
  if (DEFAULT_ON.has(name))
69
70
  return true;
70
71
  return DEFAULT_ON_IF_ERP_LEADING.has(name) && (await hasErpLeadingArticle(admin));
@@ -1,3 +1,15 @@
1
+ /**
2
+ * Upload-handler voor artikelfoto's (losse app én Shell via flowselections.serverRoutes).
3
+ * Alleen ingelogde gebruikers van deze database (sessie-bearer); de gateway-
4
+ * sleutel blijft server-side. Server-only.
5
+ *
6
+ * Flow (§14.11):
7
+ * 1. Browser POSTet multipart/form-data met `file` en optioneel `tradeItemId`.
8
+ * 2. Wij verifiëren de Supabase-bearer en bepalen de actieve koppeling zelf.
9
+ * 3. We sturen de RAW bytes door naar /api/public/gateway/media-upload —
10
+ * géén base64-inflatie, géén formData-rebuild. HMAC zit in
11
+ * gatewayMediaUpload (server-only secret).
12
+ */
1
13
  type UploadReason = "image_too_small" | "image_too_large" | "unsupported_type" | "invalid_payload" | "network" | "not_logged_in" | "not_connected" | "config_missing" | "unknown";
2
14
  /** Breedte/hoogte uit PNG-IHDR of JPEG-SOF-marker. */
3
15
  export declare function imageSize(b: Uint8Array): {
@@ -1 +1 @@
1
- {"version":3,"file":"trade-item-photo.d.ts","sourceRoot":"","sources":["../../src/server-hooks/trade-item-photo.ts"],"names":[],"mappings":"AAqBA,KAAK,YAAY,GACb,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,GACjB,SAAS,GACT,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,SAAS,CAAC;AAgFd,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAmBxE;AAKD,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,GACX;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASjD;AAMD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+P9E"}
1
+ {"version":3,"file":"trade-item-photo.d.ts","sourceRoot":"","sources":["../../src/server-hooks/trade-item-photo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,KAAK,YAAY,GACb,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,GACjB,SAAS,GACT,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,SAAS,CAAC;AAgFd,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAmBxE;AAKD,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,GACX;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASjD;AAMD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+P9E"}
@@ -10,7 +10,6 @@
10
10
  * géén base64-inflatie, géén formData-rebuild. HMAC zit in
11
11
  * gatewayMediaUpload (server-only secret).
12
12
  */
13
- import { createClient } from "@supabase/supabase-js";
14
13
  function json(body, status = 200) {
15
14
  return new Response(JSON.stringify(body), {
16
15
  status,
@@ -134,10 +133,16 @@ export async function handleTradeItemPhoto(request) {
134
133
  if (request.method !== "POST")
135
134
  return json({ error: "Method not allowed" }, 405);
136
135
  try {
137
- const SUPABASE_URL = process.env.SUPABASE_URL;
138
- const SUPABASE_PUBLISHABLE_KEY = process.env.SUPABASE_PUBLISHABLE_KEY;
139
- if (!SUPABASE_URL || !SUPABASE_PUBLISHABLE_KEY) {
140
- return plainFail("config_missing", 500, "SUPABASE_URL/SUPABASE_PUBLISHABLE_KEY ontbreekt op de server");
136
+ // C1: geen eigen client met de publishable key. Sessie server-side
137
+ // controleren met de service-role-client (getUser), pas daarna verder.
138
+ let supabase;
139
+ try {
140
+ const { getAdminClient } = await import("../lib/supabase-admin.server.js");
141
+ supabase = getAdminClient();
142
+ }
143
+ catch (e) {
144
+ console.error("[trade-item-photo] serverconfiguratie ontbreekt", e);
145
+ return plainFail("config_missing", 500, "SUPABASE_URL/SUPABASE_SERVICE_ROLE_KEY ontbreekt op de server");
141
146
  }
142
147
  // --- 1. Bearer-validatie -------------------------------------------------
143
148
  const authHeader = request.headers.get("authorization");
@@ -148,12 +153,8 @@ export async function handleTradeItemPhoto(request) {
148
153
  const token = authHeader.slice("Bearer ".length).trim();
149
154
  if (!token)
150
155
  return plainFail("not_logged_in", 401, "Unauthorized: leeg token");
151
- const supabase = createClient(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, {
152
- global: { headers: { Authorization: `Bearer ${token}` } },
153
- auth: { storage: undefined, persistSession: false, autoRefreshToken: false },
154
- });
155
- const { data: claimsData, error: claimsErr } = await supabase.auth.getClaims(token);
156
- if (claimsErr || !claimsData?.claims?.sub) {
156
+ const { data: userData, error: userErr } = await supabase.auth.getUser(token);
157
+ if (userErr || !userData?.user?.id) {
157
158
  return plainFail("not_logged_in", 401, "Unauthorized: token ongeldig");
158
159
  }
159
160
  // --- 2. Multipart body ---------------------------------------------------
@@ -218,7 +219,7 @@ export async function handleTradeItemPhoto(request) {
218
219
  // ZONDER versie-prefix — die moet dus in het pad zelf zitten.
219
220
  const path = "/suppliers-api-2026v1/media";
220
221
  const requestTimestamp = Date.now();
221
- const clientUserId = claimsData.claims.sub;
222
+ const clientUserId = userData.user.id;
222
223
  const reportFailure = async (info) => {
223
224
  // (a) push naar Auth-module diagnostics-endpoint
224
225
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/floriday-voorraad",
3
- "version": "1.0.156",
3
+ "version": "1.0.158",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "main": "./dist-lib/index.js",
@@ -52,7 +52,7 @@
52
52
  "@cloudflare/vite-plugin": "^1.25.5",
53
53
  "@electric-sql/pglite": "^0.5.15",
54
54
  "@eslint/js": "^9.32.0",
55
- "@flowselections/core": "1.0.35",
55
+ "@flowselections/core": "1.0.37",
56
56
  "@lovable.dev/vite-tanstack-config": "2.26.5",
57
57
  "@rsbuild/core": "^1.0.0",
58
58
  "@tailwindcss/vite": "^4.2.1",
@@ -185,6 +185,33 @@
185
185
  "OPTIONS"
186
186
  ]
187
187
  }
188
- ]
188
+ ],
189
+ "crons": [
190
+ {
191
+ "name": "voorraad-floriday-base-supply",
192
+ "kind": "http",
193
+ "path": "/api/public/hooks/floriday-base-supply",
194
+ "schedule": "* * * * *"
195
+ },
196
+ {
197
+ "name": "voorraad-floriday-follow",
198
+ "kind": "http",
199
+ "path": "/api/public/hooks/floriday-follow",
200
+ "replaces": [
201
+ "floriday-follow-hourly"
202
+ ],
203
+ "schedule": "23 * * * *"
204
+ },
205
+ {
206
+ "name": "voorraad-logistics-tasks-run",
207
+ "kind": "http",
208
+ "path": "/api/public/hooks/logistics-tasks-run",
209
+ "schedule": "* * * * *"
210
+ }
211
+ ],
212
+ "install": {
213
+ "ensureDefaults": "voorraad_ensure_defaults",
214
+ "installCheck": "voorraad_install_check"
215
+ }
189
216
  }
190
217
  }
package/sql/AGENTS.md CHANGED
@@ -9,7 +9,7 @@
9
9
  - `sql/floriday-voorraad-schema.sql` must name the newest `supabase/migrations` file in its "Laatste migratie" header and contain the required objects; `scripts/check-schema-version.mjs` (prepublishOnly + test) blocks publishing otherwise; the header version is informational and never higher than package.json, because 1.0.139 shipped a stale schema and the dashboard bumps versions without schema changes.
10
10
  - Default data only via `voorraad_ensure_defaults()` (system data upserted by code keeping `naam_aangepast`, retired codes set inactive; customer settings only inserted when missing, with column defaults equal to reader fallbacks); bump `voorraad_defaults_versie()` on every list change, because new shells get the schema without data and the fast exit compares that version.
11
11
  - Load carrier → Engine code only via the Engine's `logistics_ladingdrager_resolve`; no own mapping list or fallback, because two lists drift.
12
- - Floriday trade items become own articles only via `voorraad_floriday_artikelen_aanmaken` (match GTIN → article code → name; ambiguity goes to `voorraad_koppel_twijfel`, never guessed; reuses the existing stock row keyed by the Floriday id); the cache trigger only enqueues and wakes a self-unscheduling drain, with an hourly safety net from `voorraad_ensure_defaults`, because inline creation slowed Floriday-auth syncs.
12
+ - Floriday trade items become own articles only via `voorraad_floriday_artikelen_aanmaken` (match GTIN → article code → name; ambiguity goes to `voorraad_koppel_twijfel`, never guessed; reuses the existing stock row keyed by the Floriday id); the cache trigger only enqueues, because inline creation slowed Floriday-auth syncs.
13
13
  - Floriday order lines resolve their article only from source metadata (`voorraad_orderregel_trade_item`, sales order id → trade item), overriding name matches; existing empty lines only via `voorraad_correctie_1144` (unambiguous, not shipped/cancelled/processed, batched), because name matches linked the wrong article.
14
14
  - Fust balance counts only bookings from the start moment (`fust_startmoment`, global or per fust) plus the opening count; earlier bookings stay visible but outside the balance, and an automatic start moment is set only when none exists and `fust_stock_mutations` is empty, because existing shells must choose their own start.
15
15
  - The stock list reads only `voorraad_lijst` (search/filter/sort/count/page on the server, max 500 per page, archived rows only under filter `gearchiveerd`); quick stock changes from the list go through `voorraad_voorraad_corrigeren` (delta + reason, row-locked), because client-side merging hit silent 1,000-row limits and absolute saves could overwrite concurrent order consumption.
@@ -17,4 +17,4 @@
17
17
  - A price change re-queues Floriday stock rows only when `voorraad_floriday_volgt(product)` (ERP leading and mode not DISABLED), because local-steered articles must never gain queue rows.
18
18
  - Custom fields and tray sticker save only via `voorraad_eigen_velden_opslaan` / `voorraad_traysticker_opslaan` (compare against the state at opening), because direct table writes overwrote concurrent edits.
19
19
  - Replaced/expired Floriday trade item versions are recorded only by `voorraad_floriday_versies_vastleggen` (server-only, from a complete error-free per-id read round, blocked above the max share with a message, source recorded); they never become visible articles (alias to the successor or an archived article with stock mode off), and historic shipped lines of such versions never get recalculated fust (`voorraad_fust_historisch_vervallen`), because old versions doubled the catalogue and re-linking history must not book anything.
20
- - New visible articles from Floriday are created only after a successful version round for that connection (`voorraad_floriday_versieronde_geslaagd`); rounds run only automatically (cron → reconcile hook `?taak=versies`, portions via `_volgende`/`_portie`), an item failing 3 consecutive rounds is set aside as unknown (never marked, never created), and only a whole failed round produces a user notice, because users must never need a manual step and one bad item must not block forever.
20
+ - New visible articles from Floriday are created only after a successful version round for that connection (`voorraad_floriday_versieronde_geslaagd`); rounds run only automatically (portions via `_volgende`/`_portie`), an item failing 3 consecutive rounds is set aside as unknown (never marked, never created), and only a whole failed round produces a user notice, because users must never need a manual step and one bad item must not block forever.
@@ -1,5 +1,5 @@
1
- -- @flowselections/floriday-voorraad 1.0.155 – volledig schema (idempotent, geen gegevens).
2
- -- Laatste migratie: 20261105084822_83a0e67a-a170-423b-a118-b20bb20eaa4a.sql
1
+ -- @flowselections/floriday-voorraad 1.0.157 – volledig schema (idempotent, geen gegevens).
2
+ -- Laatste migratie: 20261105135333_640ef1da-e3c7-4569-8060-2fd73ac2ca6c.sql
3
3
  -- Gegenereerd uit de database met scripts/generate-voorraad-schema.py. Niet met de hand wijzigen.
4
4
  -- Volgorde 20. Ontbrekende tabellen van andere modules worden overgeslagen met een NOTICE; draai opnieuw na die module.
5
5
  -- De statuscontrole van floriday_continuous_stock_queue is van Voorraad en wordt hier opnieuw gemaakt.
@@ -995,10 +995,6 @@ END $function$
995
995
  ;
996
996
  REVOKE ALL ON FUNCTION apply_stock_consumption(text,numeric,uuid,uuid,text,text) FROM PUBLIC;
997
997
  REVOKE ALL ON FUNCTION apply_stock_consumption(text,numeric,uuid,uuid,text,text) FROM anon;
998
- REVOKE EXECUTE ON FUNCTION apply_stock_consumption(text,numeric,uuid,uuid,text,text) FROM PUBLIC;
999
- GRANT EXECUTE ON FUNCTION apply_stock_consumption(text,numeric,uuid,uuid,text,text) TO authenticated;
1000
- GRANT EXECUTE ON FUNCTION apply_stock_consumption(text,numeric,uuid,uuid,text,text) TO service_role;
1001
- REVOKE EXECUTE ON FUNCTION apply_stock_consumption(text,numeric,uuid,uuid,text,text) FROM anon;
1002
998
  GRANT EXECUTE ON FUNCTION apply_stock_consumption(text,numeric,uuid,uuid,text,text) TO authenticated;
1003
999
  GRANT EXECUTE ON FUNCTION apply_stock_consumption(text,numeric,uuid,uuid,text,text) TO service_role;
1004
1000
  CREATE OR REPLACE FUNCTION public.apply_stock_reservation(p_trade_item_key text, p_qty numeric, p_order_id uuid, p_order_item_id uuid, p_source text, p_reason text)
@@ -1039,10 +1035,6 @@ END $function$
1039
1035
  ;
1040
1036
  REVOKE ALL ON FUNCTION apply_stock_reservation(text,numeric,uuid,uuid,text,text) FROM PUBLIC;
1041
1037
  REVOKE ALL ON FUNCTION apply_stock_reservation(text,numeric,uuid,uuid,text,text) FROM anon;
1042
- REVOKE EXECUTE ON FUNCTION apply_stock_reservation(text,numeric,uuid,uuid,text,text) FROM PUBLIC;
1043
- GRANT EXECUTE ON FUNCTION apply_stock_reservation(text,numeric,uuid,uuid,text,text) TO authenticated;
1044
- GRANT EXECUTE ON FUNCTION apply_stock_reservation(text,numeric,uuid,uuid,text,text) TO service_role;
1045
- REVOKE EXECUTE ON FUNCTION apply_stock_reservation(text,numeric,uuid,uuid,text,text) FROM anon;
1046
1038
  GRANT EXECUTE ON FUNCTION apply_stock_reservation(text,numeric,uuid,uuid,text,text) TO authenticated;
1047
1039
  GRANT EXECUTE ON FUNCTION apply_stock_reservation(text,numeric,uuid,uuid,text,text) TO service_role;
1048
1040
  CREATE OR REPLACE FUNCTION public.autolink_product_to_floriday(p_product_id uuid)
@@ -1099,10 +1091,6 @@ $function$
1099
1091
  ;
1100
1092
  REVOKE ALL ON FUNCTION autolink_product_to_floriday(uuid) FROM PUBLIC;
1101
1093
  REVOKE ALL ON FUNCTION autolink_product_to_floriday(uuid) FROM anon;
1102
- REVOKE EXECUTE ON FUNCTION autolink_product_to_floriday(uuid) FROM PUBLIC;
1103
- GRANT EXECUTE ON FUNCTION autolink_product_to_floriday(uuid) TO authenticated;
1104
- GRANT EXECUTE ON FUNCTION autolink_product_to_floriday(uuid) TO service_role;
1105
- REVOKE EXECUTE ON FUNCTION autolink_product_to_floriday(uuid) FROM anon;
1106
1094
  GRANT EXECUTE ON FUNCTION autolink_product_to_floriday(uuid) TO authenticated;
1107
1095
  GRANT EXECUTE ON FUNCTION autolink_product_to_floriday(uuid) TO service_role;
1108
1096
  CREATE OR REPLACE FUNCTION public.backfill_open_order_reservations()
@@ -1136,10 +1124,6 @@ END $function$
1136
1124
  ;
1137
1125
  REVOKE ALL ON FUNCTION backfill_open_order_reservations() FROM PUBLIC;
1138
1126
  REVOKE ALL ON FUNCTION backfill_open_order_reservations() FROM anon;
1139
- REVOKE EXECUTE ON FUNCTION backfill_open_order_reservations() FROM PUBLIC;
1140
- GRANT EXECUTE ON FUNCTION backfill_open_order_reservations() TO authenticated;
1141
- GRANT EXECUTE ON FUNCTION backfill_open_order_reservations() TO service_role;
1142
- REVOKE EXECUTE ON FUNCTION backfill_open_order_reservations() FROM anon;
1143
1127
  GRANT EXECUTE ON FUNCTION backfill_open_order_reservations() TO authenticated;
1144
1128
  GRANT EXECUTE ON FUNCTION backfill_open_order_reservations() TO service_role;
1145
1129
  CREATE OR REPLACE FUNCTION public.calculate_floriday_desired_stock(p_connection_id uuid, p_product_id uuid)
@@ -1558,29 +1542,23 @@ $function$
1558
1542
  ;
1559
1543
  REVOKE ALL ON FUNCTION claim_floriday_stock_queue(integer,text) FROM PUBLIC;
1560
1544
  REVOKE ALL ON FUNCTION claim_floriday_stock_queue(integer,text) FROM anon;
1561
- REVOKE EXECUTE ON FUNCTION claim_floriday_stock_queue(integer,text) FROM PUBLIC;
1562
- GRANT EXECUTE ON FUNCTION claim_floriday_stock_queue(integer,text) TO authenticated;
1563
- GRANT EXECUTE ON FUNCTION claim_floriday_stock_queue(integer,text) TO service_role;
1564
- REVOKE EXECUTE ON FUNCTION claim_floriday_stock_queue(integer,text) FROM anon;
1565
1545
  GRANT EXECUTE ON FUNCTION claim_floriday_stock_queue(integer,text) TO authenticated;
1566
1546
  GRANT EXECUTE ON FUNCTION claim_floriday_stock_queue(integer,text) TO service_role;
1567
1547
  CREATE OR REPLACE FUNCTION public.cleanup_floriday_stock_queue()
1568
1548
  RETURNS void
1569
- LANGUAGE sql
1549
+ LANGUAGE plpgsql
1570
1550
  SECURITY DEFINER
1571
1551
  SET search_path TO 'public'
1572
1552
  AS $function$
1553
+ BEGIN
1554
+ PERFORM public.voorraad_vereis('server', 'cleanup_floriday_stock_queue');
1573
1555
  DELETE FROM public.floriday_continuous_stock_queue
1574
1556
  WHERE status IN ('sent', 'superseded')
1575
1557
  AND updated_at < now() - interval '30 days';
1576
- $function$
1558
+ END $function$
1577
1559
  ;
1578
1560
  REVOKE ALL ON FUNCTION cleanup_floriday_stock_queue() FROM PUBLIC;
1579
1561
  REVOKE ALL ON FUNCTION cleanup_floriday_stock_queue() FROM anon;
1580
- REVOKE EXECUTE ON FUNCTION cleanup_floriday_stock_queue() FROM PUBLIC;
1581
- GRANT EXECUTE ON FUNCTION cleanup_floriday_stock_queue() TO authenticated;
1582
- GRANT EXECUTE ON FUNCTION cleanup_floriday_stock_queue() TO service_role;
1583
- REVOKE EXECUTE ON FUNCTION cleanup_floriday_stock_queue() FROM anon;
1584
1562
  GRANT EXECUTE ON FUNCTION cleanup_floriday_stock_queue() TO authenticated;
1585
1563
  GRANT EXECUTE ON FUNCTION cleanup_floriday_stock_queue() TO service_role;
1586
1564
  CREATE OR REPLACE FUNCTION public.cleanup_voorraad_module_history()
@@ -1783,10 +1761,6 @@ $function$
1783
1761
  ;
1784
1762
  REVOKE ALL ON FUNCTION complete_floriday_stock_queue(uuid,boolean,text,boolean,text) FROM PUBLIC;
1785
1763
  REVOKE ALL ON FUNCTION complete_floriday_stock_queue(uuid,boolean,text,boolean,text) FROM anon;
1786
- REVOKE EXECUTE ON FUNCTION complete_floriday_stock_queue(uuid,boolean,text,boolean,text) FROM PUBLIC;
1787
- GRANT EXECUTE ON FUNCTION complete_floriday_stock_queue(uuid,boolean,text,boolean,text) TO authenticated;
1788
- GRANT EXECUTE ON FUNCTION complete_floriday_stock_queue(uuid,boolean,text,boolean,text) TO service_role;
1789
- REVOKE EXECUTE ON FUNCTION complete_floriday_stock_queue(uuid,boolean,text,boolean,text) FROM anon;
1790
1764
  GRANT EXECUTE ON FUNCTION complete_floriday_stock_queue(uuid,boolean,text,boolean,text) TO authenticated;
1791
1765
  GRANT EXECUTE ON FUNCTION complete_floriday_stock_queue(uuid,boolean,text,boolean,text) TO service_role;
1792
1766
  CREATE OR REPLACE FUNCTION public.complete_floriday_stock_queue_outcome(p_id uuid, p_outcome text, p_availability_sent boolean DEFAULT false, p_quantity_sent boolean DEFAULT false, p_error text DEFAULT NULL::text, p_attempt_id text DEFAULT NULL::text, p_permanent boolean DEFAULT false)
@@ -2615,7 +2589,6 @@ $function$
2615
2589
  ;
2616
2590
  REVOKE ALL ON FUNCTION ensure_trade_item_stock_row(text) FROM PUBLIC;
2617
2591
  REVOKE ALL ON FUNCTION ensure_trade_item_stock_row(text) FROM anon;
2618
- REVOKE EXECUTE ON FUNCTION ensure_trade_item_stock_row(text) FROM anon;
2619
2592
  GRANT EXECUTE ON FUNCTION ensure_trade_item_stock_row(text) TO authenticated;
2620
2593
  GRANT EXECUTE ON FUNCTION ensure_trade_item_stock_row(text) TO service_role;
2621
2594
  CREATE OR REPLACE FUNCTION public.ensure_trade_item_stock_row_key(p_key text)
@@ -2822,10 +2795,6 @@ END $function$
2822
2795
  ;
2823
2796
  REVOKE ALL ON FUNCTION find_trade_item_key(text,text,uuid) FROM PUBLIC;
2824
2797
  REVOKE ALL ON FUNCTION find_trade_item_key(text,text,uuid) FROM anon;
2825
- REVOKE EXECUTE ON FUNCTION find_trade_item_key(text,text,uuid) FROM PUBLIC;
2826
- GRANT EXECUTE ON FUNCTION find_trade_item_key(text,text,uuid) TO authenticated;
2827
- GRANT EXECUTE ON FUNCTION find_trade_item_key(text,text,uuid) TO service_role;
2828
- REVOKE EXECUTE ON FUNCTION find_trade_item_key(text,text,uuid) FROM anon;
2829
2798
  GRANT EXECUTE ON FUNCTION find_trade_item_key(text,text,uuid) TO authenticated;
2830
2799
  GRANT EXECUTE ON FUNCTION find_trade_item_key(text,text,uuid) TO service_role;
2831
2800
  CREATE OR REPLACE FUNCTION public.floriday_adopt_connection(p_old uuid, p_new uuid)
@@ -2879,7 +2848,6 @@ $function$
2879
2848
  ;
2880
2849
  REVOKE ALL ON FUNCTION floriday_adopt_connection(uuid,uuid) FROM PUBLIC;
2881
2850
  REVOKE ALL ON FUNCTION floriday_adopt_connection(uuid,uuid) FROM anon;
2882
- REVOKE EXECUTE ON FUNCTION floriday_adopt_connection(uuid,uuid) FROM anon;
2883
2851
  GRANT EXECUTE ON FUNCTION floriday_adopt_connection(uuid,uuid) TO authenticated;
2884
2852
  GRANT EXECUTE ON FUNCTION floriday_adopt_connection(uuid,uuid) TO service_role;
2885
2853
  CREATE OR REPLACE FUNCTION public.floriday_autoheal_connections()
@@ -2926,7 +2894,6 @@ $function$
2926
2894
  ;
2927
2895
  REVOKE ALL ON FUNCTION floriday_autoheal_connections() FROM PUBLIC;
2928
2896
  REVOKE ALL ON FUNCTION floriday_autoheal_connections() FROM anon;
2929
- REVOKE EXECUTE ON FUNCTION floriday_autoheal_connections() FROM anon;
2930
2897
  GRANT EXECUTE ON FUNCTION floriday_autoheal_connections() TO authenticated;
2931
2898
  GRANT EXECUTE ON FUNCTION floriday_autoheal_connections() TO service_role;
2932
2899
  CREATE OR REPLACE FUNCTION public.floriday_capture_stock_snapshot()
@@ -3876,7 +3843,6 @@ END; $function$
3876
3843
  ;
3877
3844
  REVOKE ALL ON FUNCTION floriday_relink_products(uuid) FROM PUBLIC;
3878
3845
  REVOKE ALL ON FUNCTION floriday_relink_products(uuid) FROM anon;
3879
- REVOKE EXECUTE ON FUNCTION floriday_relink_products(uuid) FROM anon;
3880
3846
  GRANT EXECUTE ON FUNCTION floriday_relink_products(uuid) TO authenticated;
3881
3847
  GRANT EXECUTE ON FUNCTION floriday_relink_products(uuid) TO service_role;
3882
3848
  CREATE OR REPLACE FUNCTION public.floriday_requeue_dead_letters(p_connection_id uuid DEFAULT NULL::uuid)
@@ -4274,86 +4240,73 @@ REVOKE ALL ON FUNCTION fust_types_duplicate_guard() FROM anon;
4274
4240
  GRANT EXECUTE ON FUNCTION fust_types_duplicate_guard() TO service_role;
4275
4241
  CREATE OR REPLACE FUNCTION public.get_active_floriday_context()
4276
4242
  RETURNS TABLE(connection_id uuid, user_id uuid)
4277
- LANGUAGE sql
4243
+ LANGUAGE plpgsql
4278
4244
  STABLE SECURITY DEFINER
4279
4245
  SET search_path TO 'public'
4280
4246
  AS $function$
4281
- SELECT ts.connection_id, ts.user_id
4247
+ BEGIN
4248
+ PERFORM public.voorraad_vereis('ingelogd', 'get_active_floriday_context');
4249
+ RETURN QUERY SELECT ts.connection_id, ts.user_id
4282
4250
  FROM public.trade_item_stock ts
4283
4251
  JOIN public.floriday_connections fc ON fc.id = ts.connection_id AND fc.is_active
4284
4252
  ORDER BY ts.created_at ASC
4285
4253
  LIMIT 1;
4286
- $function$
4254
+ END $function$
4287
4255
  ;
4288
4256
  REVOKE ALL ON FUNCTION get_active_floriday_context() FROM PUBLIC;
4289
4257
  REVOKE ALL ON FUNCTION get_active_floriday_context() FROM anon;
4290
- REVOKE EXECUTE ON FUNCTION get_active_floriday_context() FROM PUBLIC;
4291
- GRANT EXECUTE ON FUNCTION get_active_floriday_context() TO authenticated;
4292
- GRANT EXECUTE ON FUNCTION get_active_floriday_context() TO service_role;
4293
- REVOKE EXECUTE ON FUNCTION get_active_floriday_context() FROM anon;
4294
4258
  GRANT EXECUTE ON FUNCTION get_active_floriday_context() TO authenticated;
4295
4259
  GRANT EXECUTE ON FUNCTION get_active_floriday_context() TO service_role;
4296
4260
  CREATE OR REPLACE FUNCTION public.get_group_allocation_keys(p_product_id uuid)
4297
4261
  RETURNS TABLE(k text, ord integer)
4298
- LANGUAGE sql
4262
+ LANGUAGE plpgsql
4299
4263
  STABLE SECURITY DEFINER
4300
4264
  SET search_path TO 'public'
4301
- AS $function$
4302
- WITH grp AS (
4303
- SELECT pg.id AS group_id
4304
- FROM public.product_groups pg
4305
- WHERE pg.is_active = true
4306
- AND (pg.head_product_id = p_product_id OR pg.id = p_product_id)
4307
- ORDER BY pg.created_at ASC
4308
- LIMIT 1
4309
- )
4310
- SELECT public.resolve_group_member_stock_key(pgi.trade_item_id) AS k,
4311
- pgi.sort_order::int AS ord
4312
- FROM public.product_group_items pgi
4313
- JOIN grp ON grp.group_id = pgi.product_group_id
4314
- WHERE public.resolve_group_member_stock_key(pgi.trade_item_id) IS NOT NULL
4315
- ORDER BY pgi.sort_order ASC NULLS LAST, pgi.created_at ASC;
4316
- $function$
4265
+ AS $function$
4266
+ BEGIN
4267
+ PERFORM public.voorraad_vereis('ingelogd', 'get_group_allocation_keys');
4268
+ RETURN QUERY
4269
+ WITH grp AS (
4270
+ SELECT pg.id AS group_id FROM public.product_groups pg
4271
+ WHERE pg.is_active = true AND (pg.head_product_id = p_product_id OR pg.id = p_product_id)
4272
+ ORDER BY pg.created_at ASC LIMIT 1
4273
+ )
4274
+ SELECT public.resolve_group_member_stock_key(pgi.trade_item_id), pgi.sort_order::int
4275
+ FROM public.product_group_items pgi
4276
+ JOIN grp ON grp.group_id = pgi.product_group_id
4277
+ WHERE public.resolve_group_member_stock_key(pgi.trade_item_id) IS NOT NULL
4278
+ ORDER BY pgi.sort_order ASC NULLS LAST, pgi.created_at ASC;
4279
+ END $function$
4317
4280
  ;
4318
4281
  REVOKE ALL ON FUNCTION get_group_allocation_keys(uuid) FROM PUBLIC;
4319
4282
  REVOKE ALL ON FUNCTION get_group_allocation_keys(uuid) FROM anon;
4320
- REVOKE EXECUTE ON FUNCTION get_group_allocation_keys(uuid) FROM PUBLIC;
4321
- GRANT EXECUTE ON FUNCTION get_group_allocation_keys(uuid) TO authenticated;
4322
- GRANT EXECUTE ON FUNCTION get_group_allocation_keys(uuid) TO service_role;
4323
- REVOKE EXECUTE ON FUNCTION get_group_allocation_keys(uuid) FROM anon;
4324
4283
  GRANT EXECUTE ON FUNCTION get_group_allocation_keys(uuid) TO authenticated;
4325
4284
  GRANT EXECUTE ON FUNCTION get_group_allocation_keys(uuid) TO service_role;
4326
4285
  CREATE OR REPLACE FUNCTION public.get_group_head_key(p_group_id uuid)
4327
4286
  RETURNS text
4328
- LANGUAGE sql
4287
+ LANGUAGE plpgsql
4329
4288
  STABLE SECURITY DEFINER
4330
4289
  SET search_path TO 'public'
4331
- AS $function$
4332
- WITH top_member AS (
4333
- SELECT public.resolve_group_member_stock_key(pgi.trade_item_id) AS k
4334
- FROM public.product_group_items pgi
4335
- WHERE pgi.product_group_id = p_group_id
4336
- ORDER BY pgi.sort_order ASC NULLS LAST, pgi.created_at ASC
4337
- LIMIT 1
4338
- ), g AS (
4339
- SELECT head_product_id, head_trade_item_floriday_id
4340
- FROM public.product_groups
4341
- WHERE id = p_group_id AND is_active = true
4342
- LIMIT 1
4343
- )
4344
- SELECT COALESCE(
4345
- (SELECT k FROM top_member WHERE k IS NOT NULL AND k <> ''),
4346
- (SELECT head_trade_item_floriday_id FROM g WHERE head_trade_item_floriday_id IS NOT NULL AND head_trade_item_floriday_id <> ''),
4347
- (SELECT 'product:' || head_product_id::text FROM g WHERE head_product_id IS NOT NULL)
4348
- );
4349
- $function$
4290
+ AS $function$
4291
+ BEGIN
4292
+ PERFORM public.voorraad_vereis('ingelogd', 'get_group_head_key');
4293
+ RETURN (
4294
+ WITH top_member AS (
4295
+ SELECT public.resolve_group_member_stock_key(pgi.trade_item_id) AS k
4296
+ FROM public.product_group_items pgi WHERE pgi.product_group_id = p_group_id
4297
+ ORDER BY pgi.sort_order ASC NULLS LAST, pgi.created_at ASC LIMIT 1
4298
+ ), g AS (
4299
+ SELECT head_product_id, head_trade_item_floriday_id FROM public.product_groups
4300
+ WHERE id = p_group_id AND is_active = true LIMIT 1
4301
+ )
4302
+ SELECT COALESCE(
4303
+ (SELECT top_member.k FROM top_member WHERE top_member.k IS NOT NULL AND top_member.k <> ''),
4304
+ (SELECT head_trade_item_floriday_id FROM g WHERE head_trade_item_floriday_id IS NOT NULL AND head_trade_item_floriday_id <> ''),
4305
+ (SELECT 'product:' || head_product_id::text FROM g WHERE head_product_id IS NOT NULL)));
4306
+ END $function$
4350
4307
  ;
4351
4308
  REVOKE ALL ON FUNCTION get_group_head_key(uuid) FROM PUBLIC;
4352
4309
  REVOKE ALL ON FUNCTION get_group_head_key(uuid) FROM anon;
4353
- REVOKE EXECUTE ON FUNCTION get_group_head_key(uuid) FROM PUBLIC;
4354
- GRANT EXECUTE ON FUNCTION get_group_head_key(uuid) TO authenticated;
4355
- GRANT EXECUTE ON FUNCTION get_group_head_key(uuid) TO service_role;
4356
- REVOKE EXECUTE ON FUNCTION get_group_head_key(uuid) FROM anon;
4357
4310
  GRANT EXECUTE ON FUNCTION get_group_head_key(uuid) TO authenticated;
4358
4311
  GRANT EXECUTE ON FUNCTION get_group_head_key(uuid) TO service_role;
4359
4312
  CREATE OR REPLACE FUNCTION public.get_product_stock(p_product_id uuid)
@@ -4536,10 +4489,6 @@ $function$
4536
4489
  ;
4537
4490
  REVOKE ALL ON FUNCTION merge_products(uuid,uuid) FROM PUBLIC;
4538
4491
  REVOKE ALL ON FUNCTION merge_products(uuid,uuid) FROM anon;
4539
- REVOKE EXECUTE ON FUNCTION merge_products(uuid,uuid) FROM PUBLIC;
4540
- GRANT EXECUTE ON FUNCTION merge_products(uuid,uuid) TO authenticated;
4541
- GRANT EXECUTE ON FUNCTION merge_products(uuid,uuid) TO service_role;
4542
- REVOKE EXECUTE ON FUNCTION merge_products(uuid,uuid) FROM anon;
4543
4492
  GRANT EXECUTE ON FUNCTION merge_products(uuid,uuid) TO authenticated;
4544
4493
  GRANT EXECUTE ON FUNCTION merge_products(uuid,uuid) TO service_role;
4545
4494
  CREATE OR REPLACE FUNCTION public.normalize_order_source(p_src text)
@@ -5101,10 +5050,6 @@ END $function$
5101
5050
  ;
5102
5051
  REVOKE ALL ON FUNCTION promote_trade_item_key(text,text) FROM PUBLIC;
5103
5052
  REVOKE ALL ON FUNCTION promote_trade_item_key(text,text) FROM anon;
5104
- REVOKE EXECUTE ON FUNCTION promote_trade_item_key(text,text) FROM PUBLIC;
5105
- GRANT EXECUTE ON FUNCTION promote_trade_item_key(text,text) TO authenticated;
5106
- GRANT EXECUTE ON FUNCTION promote_trade_item_key(text,text) TO service_role;
5107
- REVOKE EXECUTE ON FUNCTION promote_trade_item_key(text,text) FROM anon;
5108
5053
  GRANT EXECUTE ON FUNCTION promote_trade_item_key(text,text) TO authenticated;
5109
5054
  GRANT EXECUTE ON FUNCTION promote_trade_item_key(text,text) TO service_role;
5110
5055
  CREATE OR REPLACE FUNCTION public.recompute_all_reserved_stock()
@@ -5313,10 +5258,6 @@ $function$
5313
5258
  ;
5314
5259
  REVOKE ALL ON FUNCTION recompute_all_reserved_stock() FROM PUBLIC;
5315
5260
  REVOKE ALL ON FUNCTION recompute_all_reserved_stock() FROM anon;
5316
- REVOKE EXECUTE ON FUNCTION recompute_all_reserved_stock() FROM PUBLIC;
5317
- GRANT EXECUTE ON FUNCTION recompute_all_reserved_stock() TO authenticated;
5318
- GRANT EXECUTE ON FUNCTION recompute_all_reserved_stock() TO service_role;
5319
- REVOKE EXECUTE ON FUNCTION recompute_all_reserved_stock() FROM anon;
5320
5261
  GRANT EXECUTE ON FUNCTION recompute_all_reserved_stock() TO authenticated;
5321
5262
  GRANT EXECUTE ON FUNCTION recompute_all_reserved_stock() TO service_role;
5322
5263
  CREATE OR REPLACE FUNCTION public.recompute_order_status(p_order_id uuid)
@@ -5372,10 +5313,6 @@ $function$
5372
5313
  ;
5373
5314
  REVOKE ALL ON FUNCTION recompute_order_status(uuid) FROM PUBLIC;
5374
5315
  REVOKE ALL ON FUNCTION recompute_order_status(uuid) FROM anon;
5375
- REVOKE EXECUTE ON FUNCTION recompute_order_status(uuid) FROM PUBLIC;
5376
- GRANT EXECUTE ON FUNCTION recompute_order_status(uuid) TO authenticated;
5377
- GRANT EXECUTE ON FUNCTION recompute_order_status(uuid) TO service_role;
5378
- REVOKE EXECUTE ON FUNCTION recompute_order_status(uuid) FROM anon;
5379
5316
  GRANT EXECUTE ON FUNCTION recompute_order_status(uuid) TO authenticated;
5380
5317
  GRANT EXECUTE ON FUNCTION recompute_order_status(uuid) TO service_role;
5381
5318
  CREATE OR REPLACE FUNCTION public.recompute_reserved_for_order(p_order_id uuid)
@@ -5398,10 +5335,6 @@ END $function$
5398
5335
  ;
5399
5336
  REVOKE ALL ON FUNCTION recompute_reserved_for_order(uuid) FROM PUBLIC;
5400
5337
  REVOKE ALL ON FUNCTION recompute_reserved_for_order(uuid) FROM anon;
5401
- REVOKE EXECUTE ON FUNCTION recompute_reserved_for_order(uuid) FROM PUBLIC;
5402
- GRANT EXECUTE ON FUNCTION recompute_reserved_for_order(uuid) TO authenticated;
5403
- GRANT EXECUTE ON FUNCTION recompute_reserved_for_order(uuid) TO service_role;
5404
- REVOKE EXECUTE ON FUNCTION recompute_reserved_for_order(uuid) FROM anon;
5405
5338
  GRANT EXECUTE ON FUNCTION recompute_reserved_for_order(uuid) TO authenticated;
5406
5339
  GRANT EXECUTE ON FUNCTION recompute_reserved_for_order(uuid) TO service_role;
5407
5340
  CREATE OR REPLACE FUNCTION public.recompute_reserved_stock(p_trade_item_key text)
@@ -5507,10 +5440,6 @@ $function$
5507
5440
  ;
5508
5441
  REVOKE ALL ON FUNCTION recompute_reserved_stock(text) FROM PUBLIC;
5509
5442
  REVOKE ALL ON FUNCTION recompute_reserved_stock(text) FROM anon;
5510
- REVOKE EXECUTE ON FUNCTION recompute_reserved_stock(text) FROM PUBLIC;
5511
- GRANT EXECUTE ON FUNCTION recompute_reserved_stock(text) TO authenticated;
5512
- GRANT EXECUTE ON FUNCTION recompute_reserved_stock(text) TO service_role;
5513
- REVOKE EXECUTE ON FUNCTION recompute_reserved_stock(text) FROM anon;
5514
5443
  GRANT EXECUTE ON FUNCTION recompute_reserved_stock(text) TO authenticated;
5515
5444
  GRANT EXECUTE ON FUNCTION recompute_reserved_stock(text) TO service_role;
5516
5445
  CREATE OR REPLACE FUNCTION public.requeue_skipped_stock_rows(p_status text, p_connection_id uuid, p_trade_item_id text DEFAULT NULL::text)
@@ -5647,57 +5576,36 @@ $function$
5647
5576
  ;
5648
5577
  REVOKE ALL ON FUNCTION resolve_group_allocation(uuid,integer) FROM PUBLIC;
5649
5578
  REVOKE ALL ON FUNCTION resolve_group_allocation(uuid,integer) FROM anon;
5650
- REVOKE EXECUTE ON FUNCTION resolve_group_allocation(uuid,integer) FROM PUBLIC;
5651
- GRANT EXECUTE ON FUNCTION resolve_group_allocation(uuid,integer) TO authenticated;
5652
- GRANT EXECUTE ON FUNCTION resolve_group_allocation(uuid,integer) TO service_role;
5653
- REVOKE EXECUTE ON FUNCTION resolve_group_allocation(uuid,integer) FROM anon;
5654
5579
  GRANT EXECUTE ON FUNCTION resolve_group_allocation(uuid,integer) TO authenticated;
5655
5580
  GRANT EXECUTE ON FUNCTION resolve_group_allocation(uuid,integer) TO service_role;
5656
5581
  CREATE OR REPLACE FUNCTION public.resolve_group_member_stock_key(p_trade_item_id text)
5657
5582
  RETURNS text
5658
- LANGUAGE sql
5583
+ LANGUAGE plpgsql
5659
5584
  STABLE SECURITY DEFINER
5660
5585
  SET search_path TO 'public'
5661
5586
  AS $function$
5662
- SELECT CASE
5587
+ BEGIN
5588
+ PERFORM public.voorraad_vereis('ingelogd', 'resolve_group_member_stock_key');
5589
+ RETURN (SELECT CASE
5663
5590
  WHEN p_trade_item_id IS NULL OR btrim(p_trade_item_id) = '' THEN NULL
5664
5591
  WHEN p_trade_item_id LIKE 'draft:%' OR p_trade_item_id LIKE 'group:%' THEN p_trade_item_id
5665
5592
  WHEN p_trade_item_id LIKE 'product:%' THEN COALESCE(
5666
- (
5667
- SELECT COALESCE(
5668
- NULLIF(btrim(COALESCE(p.floriday_trade_item_id, '')), ''),
5669
- NULLIF(btrim(COALESCE(p.trade_item_key, '')), ''),
5670
- p.id::text
5671
- )
5672
- FROM public.products p
5673
- WHERE p.id::text = substring(p_trade_item_id from 9)
5674
- LIMIT 1
5675
- ),
5676
- p_trade_item_id
5677
- )
5593
+ (SELECT COALESCE(NULLIF(btrim(COALESCE(p.floriday_trade_item_id, '')), ''),
5594
+ NULLIF(btrim(COALESCE(p.trade_item_key, '')), ''), p.id::text)
5595
+ FROM public.products p WHERE p.id::text = substring(p_trade_item_id from 9) LIMIT 1),
5596
+ p_trade_item_id)
5678
5597
  WHEN EXISTS (SELECT 1 FROM public.products p WHERE p.id::text = p_trade_item_id) THEN (
5679
- SELECT COALESCE(
5680
- NULLIF(btrim(COALESCE(p.floriday_trade_item_id, '')), ''),
5681
- NULLIF(btrim(COALESCE(p.trade_item_key, '')), ''),
5682
- p.id::text
5683
- )
5684
- FROM public.products p
5685
- WHERE p.id::text = p_trade_item_id
5686
- LIMIT 1
5687
- )
5688
- WHEN EXISTS (
5689
- SELECT 1 FROM public.trade_item_drafts d WHERE d.id::text = p_trade_item_id
5690
- ) THEN 'draft:' || p_trade_item_id
5691
- WHEN EXISTS (
5692
- SELECT 1 FROM public.trade_item_stock s WHERE s.trade_item_key = 'draft:' || p_trade_item_id
5693
- ) THEN 'draft:' || p_trade_item_id
5598
+ SELECT COALESCE(NULLIF(btrim(COALESCE(p.floriday_trade_item_id, '')), ''),
5599
+ NULLIF(btrim(COALESCE(p.trade_item_key, '')), ''), p.id::text)
5600
+ FROM public.products p WHERE p.id::text = p_trade_item_id LIMIT 1)
5601
+ WHEN EXISTS (SELECT 1 FROM public.trade_item_drafts d WHERE d.id::text = p_trade_item_id) THEN 'draft:' || p_trade_item_id
5602
+ WHEN EXISTS (SELECT 1 FROM public.trade_item_stock s WHERE s.trade_item_key = 'draft:' || p_trade_item_id) THEN 'draft:' || p_trade_item_id
5694
5603
  ELSE p_trade_item_id
5695
- END;
5696
- $function$
5604
+ END);
5605
+ END $function$
5697
5606
  ;
5698
5607
  REVOKE ALL ON FUNCTION resolve_group_member_stock_key(text) FROM PUBLIC;
5699
5608
  REVOKE ALL ON FUNCTION resolve_group_member_stock_key(text) FROM anon;
5700
- REVOKE EXECUTE ON FUNCTION resolve_group_member_stock_key(text) FROM anon;
5701
5609
  GRANT EXECUTE ON FUNCTION resolve_group_member_stock_key(text) TO authenticated;
5702
5610
  GRANT EXECUTE ON FUNCTION resolve_group_member_stock_key(text) TO service_role;
5703
5611
  CREATE OR REPLACE FUNCTION public.resolve_product_id_for_item(p_product_name text)
@@ -5718,37 +5626,25 @@ END $function$
5718
5626
  ;
5719
5627
  REVOKE ALL ON FUNCTION resolve_product_id_for_item(text) FROM PUBLIC;
5720
5628
  REVOKE ALL ON FUNCTION resolve_product_id_for_item(text) FROM anon;
5721
- REVOKE EXECUTE ON FUNCTION resolve_product_id_for_item(text) FROM PUBLIC;
5722
- GRANT EXECUTE ON FUNCTION resolve_product_id_for_item(text) TO authenticated;
5723
- GRANT EXECUTE ON FUNCTION resolve_product_id_for_item(text) TO service_role;
5724
- REVOKE EXECUTE ON FUNCTION resolve_product_id_for_item(text) FROM anon;
5725
5629
  GRANT EXECUTE ON FUNCTION resolve_product_id_for_item(text) TO authenticated;
5726
5630
  GRANT EXECUTE ON FUNCTION resolve_product_id_for_item(text) TO service_role;
5727
5631
  CREATE OR REPLACE FUNCTION public.resolve_stock_trade_item_key(p_product_id uuid)
5728
5632
  RETURNS text
5729
- LANGUAGE sql
5633
+ LANGUAGE plpgsql
5730
5634
  STABLE SECURITY DEFINER
5731
5635
  SET search_path TO 'public'
5732
- AS $function$
5733
- SELECT COALESCE(
5734
- (
5735
- SELECT hp.trade_item_key
5736
- FROM public.product_groups pg
5737
- JOIN public.products hp ON hp.id = pg.head_product_id
5738
- WHERE pg.id = p_product_id
5739
- AND pg.is_active = true
5740
- LIMIT 1
5741
- ),
5742
- (SELECT trade_item_key FROM public.products WHERE id = p_product_id)
5743
- );
5744
- $function$
5636
+ AS $function$
5637
+ BEGIN
5638
+ PERFORM public.voorraad_vereis('ingelogd', 'resolve_stock_trade_item_key');
5639
+ RETURN COALESCE(
5640
+ (SELECT hp.trade_item_key FROM public.product_groups pg
5641
+ JOIN public.products hp ON hp.id = pg.head_product_id
5642
+ WHERE pg.id = p_product_id AND pg.is_active = true LIMIT 1),
5643
+ (SELECT trade_item_key FROM public.products WHERE id = p_product_id));
5644
+ END $function$
5745
5645
  ;
5746
5646
  REVOKE ALL ON FUNCTION resolve_stock_trade_item_key(uuid) FROM PUBLIC;
5747
5647
  REVOKE ALL ON FUNCTION resolve_stock_trade_item_key(uuid) FROM anon;
5748
- REVOKE EXECUTE ON FUNCTION resolve_stock_trade_item_key(uuid) FROM PUBLIC;
5749
- GRANT EXECUTE ON FUNCTION resolve_stock_trade_item_key(uuid) TO authenticated;
5750
- GRANT EXECUTE ON FUNCTION resolve_stock_trade_item_key(uuid) TO service_role;
5751
- REVOKE EXECUTE ON FUNCTION resolve_stock_trade_item_key(uuid) FROM anon;
5752
5648
  GRANT EXECUTE ON FUNCTION resolve_stock_trade_item_key(uuid) TO authenticated;
5753
5649
  GRANT EXECUTE ON FUNCTION resolve_stock_trade_item_key(uuid) TO service_role;
5754
5650
  CREATE OR REPLACE FUNCTION public.reverse_production(p_parent_key text, p_quantity numeric, p_user_id uuid DEFAULT NULL::uuid, p_connection_id uuid DEFAULT NULL::uuid, p_reason text DEFAULT NULL::text)
@@ -5929,10 +5825,6 @@ END $function$
5929
5825
  ;
5930
5826
  REVOKE ALL ON FUNCTION run_floriday_continuous_stock_sync() FROM PUBLIC;
5931
5827
  REVOKE ALL ON FUNCTION run_floriday_continuous_stock_sync() FROM anon;
5932
- REVOKE EXECUTE ON FUNCTION run_floriday_continuous_stock_sync() FROM PUBLIC;
5933
- GRANT EXECUTE ON FUNCTION run_floriday_continuous_stock_sync() TO authenticated;
5934
- GRANT EXECUTE ON FUNCTION run_floriday_continuous_stock_sync() TO service_role;
5935
- REVOKE EXECUTE ON FUNCTION run_floriday_continuous_stock_sync() FROM anon;
5936
5828
  GRANT EXECUTE ON FUNCTION run_floriday_continuous_stock_sync() TO authenticated;
5937
5829
  GRANT EXECUTE ON FUNCTION run_floriday_continuous_stock_sync() TO service_role;
5938
5830
  CREATE OR REPLACE FUNCTION public.run_floriday_follow()
@@ -6035,10 +5927,6 @@ END $function$
6035
5927
  ;
6036
5928
  REVOKE ALL ON FUNCTION run_logistics_tasks_dispatch() FROM PUBLIC;
6037
5929
  REVOKE ALL ON FUNCTION run_logistics_tasks_dispatch() FROM anon;
6038
- REVOKE EXECUTE ON FUNCTION run_logistics_tasks_dispatch() FROM PUBLIC;
6039
- GRANT EXECUTE ON FUNCTION run_logistics_tasks_dispatch() TO authenticated;
6040
- GRANT EXECUTE ON FUNCTION run_logistics_tasks_dispatch() TO service_role;
6041
- REVOKE EXECUTE ON FUNCTION run_logistics_tasks_dispatch() FROM anon;
6042
5930
  GRANT EXECUTE ON FUNCTION run_logistics_tasks_dispatch() TO authenticated;
6043
5931
  GRANT EXECUTE ON FUNCTION run_logistics_tasks_dispatch() TO service_role;
6044
5932
  CREATE OR REPLACE FUNCTION public.self_heal_floriday_links()
@@ -6100,10 +5988,6 @@ END $function$
6100
5988
  ;
6101
5989
  REVOKE ALL ON FUNCTION self_heal_floriday_links() FROM PUBLIC;
6102
5990
  REVOKE ALL ON FUNCTION self_heal_floriday_links() FROM anon;
6103
- REVOKE EXECUTE ON FUNCTION self_heal_floriday_links() FROM PUBLIC;
6104
- GRANT EXECUTE ON FUNCTION self_heal_floriday_links() TO authenticated;
6105
- GRANT EXECUTE ON FUNCTION self_heal_floriday_links() TO service_role;
6106
- REVOKE EXECUTE ON FUNCTION self_heal_floriday_links() FROM anon;
6107
5991
  GRANT EXECUTE ON FUNCTION self_heal_floriday_links() TO authenticated;
6108
5992
  GRANT EXECUTE ON FUNCTION self_heal_floriday_links() TO service_role;
6109
5993
  CREATE OR REPLACE FUNCTION public.set_module_runtime_config_updated_at()
@@ -6212,10 +6096,6 @@ END; $function$
6212
6096
  ;
6213
6097
  REVOKE ALL ON FUNCTION set_product_stock(uuid,numeric,numeric,numeric,text,text) FROM PUBLIC;
6214
6098
  REVOKE ALL ON FUNCTION set_product_stock(uuid,numeric,numeric,numeric,text,text) FROM anon;
6215
- REVOKE EXECUTE ON FUNCTION set_product_stock(uuid,numeric,numeric,numeric,text,text) FROM PUBLIC;
6216
- GRANT EXECUTE ON FUNCTION set_product_stock(uuid,numeric,numeric,numeric,text,text) TO authenticated;
6217
- GRANT EXECUTE ON FUNCTION set_product_stock(uuid,numeric,numeric,numeric,text,text) TO service_role;
6218
- REVOKE EXECUTE ON FUNCTION set_product_stock(uuid,numeric,numeric,numeric,text,text) FROM anon;
6219
6099
  GRANT EXECUTE ON FUNCTION set_product_stock(uuid,numeric,numeric,numeric,text,text) TO authenticated;
6220
6100
  GRANT EXECUTE ON FUNCTION set_product_stock(uuid,numeric,numeric,numeric,text,text) TO service_role;
6221
6101
  CREATE OR REPLACE FUNCTION public.set_updated_at_order_fust_bookings()
@@ -6736,29 +6616,25 @@ GRANT EXECUTE ON FUNCTION trade_item_prices_touch_updated_at() TO authenticated;
6736
6616
  GRANT EXECUTE ON FUNCTION trade_item_prices_touch_updated_at() TO service_role;
6737
6617
  CREATE OR REPLACE FUNCTION public.trade_item_stock_duplicates()
6738
6618
  RETURNS TABLE(product_id uuid, product_name text, keys text[], row_count integer)
6739
- LANGUAGE sql
6619
+ LANGUAGE plpgsql
6740
6620
  STABLE SECURITY DEFINER
6741
6621
  SET search_path TO 'public'
6742
6622
  AS $function$
6743
- SELECT p.id,
6744
- p.product,
6745
- array_agg(ts.trade_item_key ORDER BY ts.trade_item_key),
6746
- count(*)::int
6747
- FROM public.products p
6748
- JOIN public.trade_item_stock ts
6749
- ON ts.trade_item_key = p.id::text
6750
- OR ts.trade_item_key = 'product:' || p.id::text
6751
- OR (p.floriday_trade_item_id IS NOT NULL AND ts.trade_item_key = p.floriday_trade_item_id)
6752
- GROUP BY p.id, p.product
6623
+ BEGIN
6624
+ PERFORM public.voorraad_vereis('ingelogd', 'trade_item_stock_duplicates');
6625
+ RETURN QUERY
6626
+ SELECT p.id, p.product, array_agg(ts.trade_item_key ORDER BY ts.trade_item_key), count(*)::int
6627
+ FROM public.products p
6628
+ JOIN public.trade_item_stock ts
6629
+ ON ts.trade_item_key = p.id::text
6630
+ OR ts.trade_item_key = 'product:' || p.id::text
6631
+ OR (p.floriday_trade_item_id IS NOT NULL AND ts.trade_item_key = p.floriday_trade_item_id)
6632
+ GROUP BY p.id, p.product
6753
6633
  HAVING count(*) > 1;
6754
- $function$
6634
+ END $function$
6755
6635
  ;
6756
6636
  REVOKE ALL ON FUNCTION trade_item_stock_duplicates() FROM PUBLIC;
6757
6637
  REVOKE ALL ON FUNCTION trade_item_stock_duplicates() FROM anon;
6758
- REVOKE EXECUTE ON FUNCTION trade_item_stock_duplicates() FROM PUBLIC;
6759
- GRANT EXECUTE ON FUNCTION trade_item_stock_duplicates() TO authenticated;
6760
- GRANT EXECUTE ON FUNCTION trade_item_stock_duplicates() TO service_role;
6761
- REVOKE EXECUTE ON FUNCTION trade_item_stock_duplicates() FROM anon;
6762
6638
  GRANT EXECUTE ON FUNCTION trade_item_stock_duplicates() TO authenticated;
6763
6639
  GRANT EXECUTE ON FUNCTION trade_item_stock_duplicates() TO service_role;
6764
6640
  CREATE OR REPLACE FUNCTION public.trg_cart_numbers_sync_order_status_fn()
@@ -8045,10 +7921,6 @@ END $function$
8045
7921
  ;
8046
7922
  REVOKE ALL ON FUNCTION voorraad_afboeken(uuid,text,numeric,text,text) FROM PUBLIC;
8047
7923
  REVOKE ALL ON FUNCTION voorraad_afboeken(uuid,text,numeric,text,text) FROM anon;
8048
- REVOKE EXECUTE ON FUNCTION voorraad_afboeken(uuid,text,numeric,text,text) FROM PUBLIC;
8049
- GRANT EXECUTE ON FUNCTION voorraad_afboeken(uuid,text,numeric,text,text) TO authenticated;
8050
- GRANT EXECUTE ON FUNCTION voorraad_afboeken(uuid,text,numeric,text,text) TO service_role;
8051
- REVOKE EXECUTE ON FUNCTION voorraad_afboeken(uuid,text,numeric,text,text) FROM anon;
8052
7924
  GRANT EXECUTE ON FUNCTION voorraad_afboeken(uuid,text,numeric,text,text) TO authenticated;
8053
7925
  GRANT EXECUTE ON FUNCTION voorraad_afboeken(uuid,text,numeric,text,text) TO service_role;
8054
7926
  CREATE OR REPLACE FUNCTION public.voorraad_alert_floriday_not_updated(p_key text, p_qty numeric, p_order_id uuid, p_order_item_id uuid)
@@ -9306,10 +9178,6 @@ END $function$
9306
9178
  ;
9307
9179
  REVOKE ALL ON FUNCTION voorraad_correctie_1136(boolean) FROM PUBLIC;
9308
9180
  REVOKE ALL ON FUNCTION voorraad_correctie_1136(boolean) FROM anon;
9309
- REVOKE EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) FROM PUBLIC;
9310
- GRANT EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) TO authenticated;
9311
- GRANT EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) TO service_role;
9312
- REVOKE EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) FROM anon;
9313
9181
  GRANT EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) TO authenticated;
9314
9182
  GRANT EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) TO service_role;
9315
9183
  CREATE OR REPLACE FUNCTION public.voorraad_correctie_1140(p_uitvoeren boolean DEFAULT false)
@@ -9524,7 +9392,7 @@ CREATE OR REPLACE FUNCTION public.voorraad_defaults_versie()
9524
9392
  LANGUAGE sql
9525
9393
  IMMUTABLE
9526
9394
  SET search_path TO 'public'
9527
- AS $function$ SELECT 3 $function$
9395
+ AS $function$ SELECT 4 $function$
9528
9396
  ;
9529
9397
  REVOKE ALL ON FUNCTION voorraad_defaults_versie() FROM PUBLIC;
9530
9398
  REVOKE ALL ON FUNCTION voorraad_defaults_versie() FROM anon;
@@ -9610,7 +9478,7 @@ DECLARE
9610
9478
  v_ph text[] := ARRAY['artikelcode','artikelnummer','naam','name','code','article code','articlecode','test','-','x','nvt','n.v.t.','tbd','todo'];
9611
9479
  v_lc jsonb := '[{"code":"AUCTION_TROLLEY","naam":"Stapelwagen","volgorde":1},{"code":"DANISH_TROLLEY","naam":"Deense container","volgorde":2},{"code":"EURO_TROLLEY","naam":"Euro-rolcontainer","volgorde":3},{"code":"PALLET","naam":"Pallet","volgorde":4},{"code":"EURO_PALLET","naam":"Euro-pallet","volgorde":5},{"code":"NONE","naam":"Geen ladingdrager","volgorde":6}]';
9612
9480
  v_vervallen text[] := ARRAY[]::text[];
9613
- n_ph int := 0; n_lc_nieuw int := 0; n_lc_bij int := 0; n_lc_uit int := 0; n_lim int := 0; n_inst int := 0; n_fust int := 0;
9481
+ n_ph int := 0; n_lc_nieuw int := 0; n_lc_bij int := 0; n_lc_uit int := 0; n_lim int := 0; n_inst int := 0; n_fust int := 0; n_sch int := 0;
9614
9482
  v_idx text := 'bestaat'; v_job text := 'bestaat'; v_res jsonb; v_job_ok boolean;
9615
9483
  BEGIN
9616
9484
  PERFORM public.voorraad_vereis('ingelogd', 'voorraad_ensure_defaults');
@@ -9623,6 +9491,7 @@ BEGIN
9623
9491
  AND EXISTS (SELECT 1 FROM public.voorraad_load_carrier_types)
9624
9492
  AND EXISTS (SELECT 1 FROM public.voorraad_instellingen WHERE id)
9625
9493
  AND NOT EXISTS (SELECT 1 FROM public.fust_types WHERE saldo_bijhouden IS NULL)
9494
+ AND (SELECT count(*) FROM public.module_runtime_config WHERE key LIKE 'voorraad_hook_enabled.%') >= 7
9626
9495
  AND v_job_ok THEN
9627
9496
  RETURN jsonb_build_object('ok', true, 'versie', v_versie, 'overgeslagen', true);
9628
9497
  END IF;
@@ -9654,6 +9523,21 @@ BEGIN
9654
9523
  UPDATE public.fust_types SET saldo_bijhouden = NOT COALESCE(vbn_code IN (999, 800), false) WHERE saldo_bijhouden IS NULL;
9655
9524
  GET DIAGNOSTICS n_fust = ROW_COUNT;
9656
9525
 
9526
+ -- Schakelaars van de verwerkers: alleen aanmaken als ze ontbreken, nooit overschrijven.
9527
+ -- 'standaard' = dezelfde regel als zonder rij (aan zolang er een ERP-leidend artikel is).
9528
+ PERFORM set_config('voorraad.schakelaar_defaults', 'aan', true);
9529
+ INSERT INTO public.module_runtime_config(key, value) VALUES
9530
+ ('voorraad_hook_enabled.follow_floriday', 'true'),
9531
+ ('voorraad_hook_enabled.floriday_versies', 'true'),
9532
+ ('voorraad_hook_enabled.floriday_base_supply', 'standaard'),
9533
+ ('voorraad_hook_enabled.logistics_tasks', 'standaard'),
9534
+ ('voorraad_hook_enabled.stock_reconcile', 'false'),
9535
+ ('voorraad_hook_enabled.continuous_stock', 'false'),
9536
+ ('voorraad_hook_enabled.continuous_stock_pull', 'false')
9537
+ ON CONFLICT (key) DO NOTHING;
9538
+ GET DIAGNOSTICS n_sch = ROW_COUNT;
9539
+ PERFORM set_config('voorraad.schakelaar_defaults', '', true);
9540
+
9657
9541
  -- Unieke index op het Floriday-id; overslaan (en melden in de installatiecontrole) bij dubbelen.
9658
9542
  IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE schemaname = 'public' AND indexname = 'products_floriday_trade_item_id_uniek') THEN
9659
9543
  IF jsonb_array_length(public.voorraad_floriday_dubbele_ids()) = 0 THEN
@@ -9677,7 +9561,7 @@ BEGIN
9677
9561
 
9678
9562
  v_res := jsonb_build_object('plaatshoudercodes_toegevoegd', n_ph, 'ladingdragers_toegevoegd', n_lc_nieuw,
9679
9563
  'ladingdragers_bijgewerkt', n_lc_bij, 'ladingdragers_niet_actief', n_lc_uit, 'herberekenlimieten_aangemaakt', n_lim,
9680
- 'instellingen_aangemaakt', n_inst, 'fustsoorten_saldo_ingevuld', n_fust, 'unieke_index', v_idx, 'uurlijkse_controle', v_job);
9564
+ 'instellingen_aangemaakt', n_inst, 'fustsoorten_saldo_ingevuld', n_fust, 'unieke_index', v_idx, 'uurlijkse_controle', v_job, 'schakelaars_aangemaakt', n_sch);
9681
9565
  INSERT INTO public.voorraad_defaults_state(id, versie, toegepast_at, resultaat) VALUES (true, v_versie, now(), v_res)
9682
9566
  ON CONFLICT (id) DO UPDATE SET versie = EXCLUDED.versie, toegepast_at = EXCLUDED.toegepast_at, resultaat = EXCLUDED.resultaat;
9683
9567
  RETURN jsonb_build_object('ok', true, 'versie', v_versie, 'overgeslagen', false) || v_res;
@@ -9954,15 +9838,17 @@ REVOKE ALL ON FUNCTION voorraad_floriday_artikelen_vangnet() FROM anon;
9954
9838
  GRANT EXECUTE ON FUNCTION voorraad_floriday_artikelen_vangnet() TO service_role;
9955
9839
  CREATE OR REPLACE FUNCTION public.voorraad_floriday_dubbele_ids()
9956
9840
  RETURNS jsonb
9957
- LANGUAGE sql
9841
+ LANGUAGE plpgsql
9958
9842
  STABLE SECURITY DEFINER
9959
9843
  SET search_path TO 'public'
9960
9844
  AS $function$
9961
- SELECT COALESCE(jsonb_agg(jsonb_build_object('floriday_id', k, 'artikelen', ids) ORDER BY k), '[]'::jsonb)
9845
+ BEGIN
9846
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_floriday_dubbele_ids');
9847
+ RETURN (SELECT COALESCE(jsonb_agg(jsonb_build_object('floriday_id', k, 'artikelen', ids) ORDER BY k), '[]'::jsonb)
9962
9848
  FROM (SELECT lower(btrim(floriday_trade_item_id)) k, jsonb_agg(id ORDER BY id) ids
9963
9849
  FROM public.products WHERE NULLIF(btrim(COALESCE(floriday_trade_item_id,'')),'') IS NOT NULL
9964
- GROUP BY 1 HAVING count(*) > 1) d
9965
- $function$
9850
+ GROUP BY 1 HAVING count(*) > 1) d);
9851
+ END $function$
9966
9852
  ;
9967
9853
  REVOKE ALL ON FUNCTION voorraad_floriday_dubbele_ids() FROM PUBLIC;
9968
9854
  REVOKE ALL ON FUNCTION voorraad_floriday_dubbele_ids() FROM anon;
@@ -9987,10 +9873,6 @@ END $function$
9987
9873
  ;
9988
9874
  REVOKE ALL ON FUNCTION voorraad_floriday_klaarzetten_toegestaan() FROM PUBLIC;
9989
9875
  REVOKE ALL ON FUNCTION voorraad_floriday_klaarzetten_toegestaan() FROM anon;
9990
- REVOKE EXECUTE ON FUNCTION voorraad_floriday_klaarzetten_toegestaan() FROM PUBLIC;
9991
- GRANT EXECUTE ON FUNCTION voorraad_floriday_klaarzetten_toegestaan() TO authenticated;
9992
- GRANT EXECUTE ON FUNCTION voorraad_floriday_klaarzetten_toegestaan() TO service_role;
9993
- REVOKE EXECUTE ON FUNCTION voorraad_floriday_klaarzetten_toegestaan() FROM anon;
9994
9876
  GRANT EXECUTE ON FUNCTION voorraad_floriday_klaarzetten_toegestaan() TO authenticated;
9995
9877
  GRANT EXECUTE ON FUNCTION voorraad_floriday_klaarzetten_toegestaan() TO service_role;
9996
9878
  CREATE OR REPLACE FUNCTION public.voorraad_floriday_leads_key(p_key text)
@@ -10363,13 +10245,15 @@ REVOKE ALL ON FUNCTION voorraad_floriday_volgt(uuid) FROM anon;
10363
10245
  GRANT EXECUTE ON FUNCTION voorraad_floriday_volgt(uuid) TO service_role;
10364
10246
  CREATE OR REPLACE FUNCTION public.voorraad_fust_bijhouden(p_fust_type_id uuid)
10365
10247
  RETURNS boolean
10366
- LANGUAGE sql
10248
+ LANGUAGE plpgsql
10367
10249
  STABLE SECURITY DEFINER
10368
10250
  SET search_path TO 'public'
10369
10251
  AS $function$
10370
- SELECT COALESCE(f.saldo_bijhouden, NOT COALESCE(f.vbn_code IN (999, 800), false))
10371
- FROM public.fust_types f WHERE f.id = p_fust_type_id
10372
- $function$
10252
+ BEGIN
10253
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_fust_bijhouden');
10254
+ RETURN (SELECT COALESCE(f.saldo_bijhouden, NOT COALESCE(f.vbn_code IN (999, 800), false))
10255
+ FROM public.fust_types f WHERE f.id = p_fust_type_id);
10256
+ END $function$
10373
10257
  ;
10374
10258
  REVOKE ALL ON FUNCTION voorraad_fust_bijhouden(uuid) FROM PUBLIC;
10375
10259
  REVOKE ALL ON FUNCTION voorraad_fust_bijhouden(uuid) FROM anon;
@@ -10602,14 +10486,16 @@ GRANT EXECUTE ON FUNCTION voorraad_fust_startmoment_opslaan(uuid,timestamp with
10602
10486
  GRANT EXECUTE ON FUNCTION voorraad_fust_startmoment_opslaan(uuid,timestamp with time zone,integer,jsonb,text) TO service_role;
10603
10487
  CREATE OR REPLACE FUNCTION public.voorraad_fust_startmoment_van(p_fust_type_id uuid)
10604
10488
  RETURNS timestamp with time zone
10605
- LANGUAGE sql
10489
+ LANGUAGE plpgsql
10606
10490
  STABLE SECURITY DEFINER
10607
10491
  SET search_path TO 'public'
10608
10492
  AS $function$
10609
- SELECT COALESCE(
10493
+ BEGIN
10494
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_fust_startmoment_van');
10495
+ RETURN COALESCE(
10610
10496
  (SELECT s.moment FROM public.fust_startmoment s WHERE s.fust_type_id = public.voorraad_active_fust_id(NULL, p_fust_type_id)),
10611
- (SELECT s.moment FROM public.fust_startmoment s WHERE s.fust_type_id IS NULL))
10612
- $function$
10497
+ (SELECT s.moment FROM public.fust_startmoment s WHERE s.fust_type_id IS NULL));
10498
+ END $function$
10613
10499
  ;
10614
10500
  REVOKE ALL ON FUNCTION voorraad_fust_startmoment_van(uuid) FROM PUBLIC;
10615
10501
  REVOKE ALL ON FUNCTION voorraad_fust_startmoment_van(uuid) FROM anon;
@@ -10617,13 +10503,15 @@ GRANT EXECUTE ON FUNCTION voorraad_fust_startmoment_van(uuid) TO authenticated;
10617
10503
  GRANT EXECUTE ON FUNCTION voorraad_fust_startmoment_van(uuid) TO service_role;
10618
10504
  CREATE OR REPLACE FUNCTION public.voorraad_fust_voor_startmoment(p_fust_type_id uuid, p_lever date)
10619
10505
  RETURNS boolean
10620
- LANGUAGE sql
10506
+ LANGUAGE plpgsql
10621
10507
  STABLE SECURITY DEFINER
10622
10508
  SET search_path TO 'public'
10623
10509
  AS $function$
10624
- SELECT p_fust_type_id IS NOT NULL AND p_lever IS NOT NULL
10625
- AND COALESCE(p_lever < (public.voorraad_fust_startmoment_van(p_fust_type_id) AT TIME ZONE 'Europe/Amsterdam')::date, false)
10626
- $function$
10510
+ BEGIN
10511
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_fust_voor_startmoment');
10512
+ RETURN p_fust_type_id IS NOT NULL AND p_lever IS NOT NULL
10513
+ AND COALESCE(p_lever < (public.voorraad_fust_startmoment_van(p_fust_type_id) AT TIME ZONE 'Europe/Amsterdam')::date, false);
10514
+ END $function$
10627
10515
  ;
10628
10516
  REVOKE ALL ON FUNCTION voorraad_fust_voor_startmoment(uuid,date) FROM PUBLIC;
10629
10517
  REVOKE ALL ON FUNCTION voorraad_fust_voor_startmoment(uuid,date) FROM anon;
@@ -10739,14 +10627,23 @@ REVOKE ALL ON FUNCTION voorraad_hook_base_url() FROM anon;
10739
10627
  GRANT EXECUTE ON FUNCTION voorraad_hook_base_url() TO service_role;
10740
10628
  CREATE OR REPLACE FUNCTION public.voorraad_hook_on(p_name text)
10741
10629
  RETURNS boolean
10742
- LANGUAGE sql
10630
+ LANGUAGE plpgsql
10743
10631
  STABLE SECURITY DEFINER
10744
10632
  SET search_path TO 'public'
10745
10633
  AS $function$
10746
- SELECT COALESCE((SELECT lower(trim(value)) = 'true' FROM public.module_runtime_config
10747
- WHERE key = 'voorraad_hook_enabled.' || p_name),
10748
- p_name IN ('floriday_base_supply','logistics_tasks','follow_floriday'));
10749
- $function$
10634
+ DECLARE v text;
10635
+ BEGIN
10636
+ PERFORM public.voorraad_vereis('server', 'voorraad_hook_on');
10637
+ -- Zelfde regel als src/server-hooks/guard.ts (hookEnabled).
10638
+ SELECT lower(trim(value)) INTO v FROM public.module_runtime_config WHERE key = 'voorraad_hook_enabled.' || p_name;
10639
+ IF v IS NOT NULL AND v <> 'standaard' THEN RETURN v = 'true'; END IF;
10640
+ IF p_name IN ('follow_floriday', 'floriday_versies') THEN RETURN true; END IF;
10641
+ IF p_name IN ('floriday_base_supply', 'logistics_tasks') THEN
10642
+ RETURN EXISTS (SELECT 1 FROM public.floriday_inventory_settings WHERE erp_leading = true)
10643
+ OR EXISTS (SELECT 1 FROM public.floriday_inventory_settings WHERE erp_leading IS NULL AND stock_mode <> 'DISABLED');
10644
+ END IF;
10645
+ RETURN false;
10646
+ END $function$
10750
10647
  ;
10751
10648
  REVOKE ALL ON FUNCTION voorraad_hook_on(text) FROM PUBLIC;
10752
10649
  REVOKE ALL ON FUNCTION voorraad_hook_on(text) FROM anon;
@@ -10781,6 +10678,8 @@ CREATE OR REPLACE FUNCTION public.voorraad_hook_switch_jobs()
10781
10678
  SET search_path TO 'public'
10782
10679
  AS $function$
10783
10680
  BEGIN
10681
+ -- Vastleggen van standaardschakelaars verandert niets aan bestaande taken.
10682
+ IF TG_OP = 'INSERT' AND current_setting('voorraad.schakelaar_defaults', true) = 'aan' THEN RETURN NEW; END IF;
10784
10683
  IF NEW.key IN ('voorraad_hook_enabled.continuous_stock','voorraad_hook_enabled.continuous_stock_pull') THEN
10785
10684
  IF public.voorraad_hook_on('continuous_stock') OR public.voorraad_hook_on('continuous_stock_pull') THEN
10786
10685
  IF NOT EXISTS (SELECT 1 FROM cron.job WHERE jobname = 'floriday-continuous-stock-sync') THEN
@@ -11584,10 +11483,6 @@ END $function$
11584
11483
  ;
11585
11484
  REVOKE ALL ON FUNCTION voorraad_overzicht_orderregel_koppeling(integer) FROM PUBLIC;
11586
11485
  REVOKE ALL ON FUNCTION voorraad_overzicht_orderregel_koppeling(integer) FROM anon;
11587
- REVOKE EXECUTE ON FUNCTION voorraad_overzicht_orderregel_koppeling(integer) FROM PUBLIC;
11588
- GRANT EXECUTE ON FUNCTION voorraad_overzicht_orderregel_koppeling(integer) TO authenticated;
11589
- GRANT EXECUTE ON FUNCTION voorraad_overzicht_orderregel_koppeling(integer) TO service_role;
11590
- REVOKE EXECUTE ON FUNCTION voorraad_overzicht_orderregel_koppeling(integer) FROM anon;
11591
11486
  GRANT EXECUTE ON FUNCTION voorraad_overzicht_orderregel_koppeling(integer) TO authenticated;
11592
11487
  GRANT EXECUTE ON FUNCTION voorraad_overzicht_orderregel_koppeling(integer) TO service_role;
11593
11488
  CREATE OR REPLACE FUNCTION public.voorraad_packing_from_floriday(p_product_id uuid, p_uitvoeren boolean)