@flowselections/floriday-voorraad 1.0.133 → 1.0.137

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 (31) hide show
  1. package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -1
  2. package/dist-lib/components/voorraad/ArtikelWizard.js +42 -18
  3. package/dist-lib/components/voorraad/FloridayInfoCard.d.ts.map +1 -1
  4. package/dist-lib/components/voorraad/FloridayInfoCard.js +19 -0
  5. package/dist-lib/integrations/supabase/types.d.ts +283 -0
  6. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  7. package/dist-lib/lib/__tests__/release-134.test.d.ts +2 -0
  8. package/dist-lib/lib/__tests__/release-134.test.d.ts.map +1 -0
  9. package/dist-lib/lib/__tests__/release-134.test.js +50 -0
  10. package/dist-lib/lib/__tests__/release-136.test.d.ts +2 -0
  11. package/dist-lib/lib/__tests__/release-136.test.d.ts.map +1 -0
  12. package/dist-lib/lib/__tests__/release-136.test.js +36 -0
  13. package/dist-lib/lib/floriday-warehouse.functions.d.ts.map +1 -1
  14. package/dist-lib/lib/floriday-warehouse.functions.js +4 -2
  15. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  16. package/dist-lib/lib/floriday-writes.functions.js +11 -10
  17. package/dist-lib/lib/idempotency-key.d.ts +11 -0
  18. package/dist-lib/lib/idempotency-key.d.ts.map +1 -0
  19. package/dist-lib/lib/idempotency-key.js +41 -0
  20. package/dist-lib/lib/publish-errors.d.ts +1 -1
  21. package/dist-lib/lib/publish-errors.d.ts.map +1 -1
  22. package/dist-lib/lib/publish-errors.js +10 -0
  23. package/dist-lib/lib/publish-pipeline.js +1 -1
  24. package/dist-lib/lib/publish-status.d.ts +13 -1
  25. package/dist-lib/lib/publish-status.d.ts.map +1 -1
  26. package/dist-lib/lib/publish-status.js +22 -1
  27. package/dist-lib/lib/publish-verify.d.ts +25 -0
  28. package/dist-lib/lib/publish-verify.d.ts.map +1 -0
  29. package/dist-lib/lib/publish-verify.js +44 -0
  30. package/package.json +2 -2
  31. package/sql/floriday-voorraad-schema.sql +108 -27
@@ -1,4 +1,4 @@
1
- -- @flowselections/floriday-voorraad 1.0.132 – volledig schema (idempotent, geen gegevens).
1
+ -- @flowselections/floriday-voorraad 1.0.136 – volledig schema (idempotent, geen gegevens).
2
2
  -- Gegenereerd uit de database met scripts/generate-voorraad-schema.py. Niet met de hand wijzigen.
3
3
  -- Volgorde 20. Ontbrekende tabellen van andere modules worden overgeslagen met een NOTICE; draai opnieuw na die module.
4
4
  -- De statuscontrole van floriday_continuous_stock_queue is van Voorraad en wordt hier opnieuw gemaakt.
@@ -5181,12 +5181,11 @@ DECLARE k text;
5181
5181
  BEGIN
5182
5182
  PERFORM public.voorraad_vereis('ingelogd', 'recompute_reserved_for_order');
5183
5183
  FOR k IN
5184
- SELECT DISTINCT p.trade_item_key
5184
+ SELECT DISTINCT public.voorraad_orderregel_sleutel(oi.product_id::text)
5185
5185
  FROM logistics_active.order_items oi
5186
- JOIN public.products p ON p.id = oi.product_id
5187
- WHERE oi.order_id = p_order_id AND p.trade_item_key IS NOT NULL
5186
+ WHERE oi.order_id = p_order_id AND oi.product_id IS NOT NULL
5188
5187
  LOOP
5189
- PERFORM public.recompute_reserved_stock(k);
5188
+ IF k IS NOT NULL THEN PERFORM public.recompute_reserved_stock(k); END IF;
5190
5189
  END LOOP;
5191
5190
  END $function$
5192
5191
  ;
@@ -5210,16 +5209,15 @@ DECLARE
5210
5209
  v_products uuid[];
5211
5210
  v_pid uuid;
5212
5211
  v_leads boolean;
5212
+ v_refs text[];
5213
5213
  BEGIN
5214
5214
  PERFORM public.voorraad_vereis('ingelogd', 'recompute_reserved_stock');
5215
5215
  IF p_trade_item_key IS NULL OR btrim(p_trade_item_key) = '' THEN RETURN; END IF;
5216
5216
  IF current_setting('app.recomputing_reserved', true) = 'on' THEN RETURN; END IF;
5217
5217
 
5218
- -- B1: nieuwe of losse sleutel zonder orderregels, toewijzing of set-/groepsrelatie en reservering 0: niets te doen.
5219
5218
  v_key := public.logistics_reserved_key(p_trade_item_key);
5220
5219
  IF public.logistics_reserved_fast_skip(p_trade_item_key, v_key) THEN RETURN; END IF;
5221
5220
 
5222
- -- Set of groepshoofdproduct: gericht herberekenen op de onderdelen en leden (M7).
5223
5221
  SELECT array_agg(p.id) INTO v_products
5224
5222
  FROM public.products p
5225
5223
  WHERE (p.trade_item_key = btrim(p_trade_item_key)
@@ -5247,8 +5245,6 @@ BEGIN
5247
5245
  RETURN;
5248
5246
  END IF;
5249
5247
 
5250
- -- Sleutel hoort bij een groep of samenstelling: de toewijzing hangt van andere
5251
- -- regels af, dus volledig herberekenen.
5252
5248
  IF v_key LIKE 'group:%'
5253
5249
  OR EXISTS (SELECT 1 FROM public.logistics_reservation_allocations a
5254
5250
  WHERE a.trade_item_key = v_key AND a.source = 'group')
@@ -5265,18 +5261,28 @@ BEGIN
5265
5261
  RETURN;
5266
5262
  END IF;
5267
5263
 
5264
+ SELECT array_agg(DISTINCT r) INTO v_refs FROM (
5265
+ SELECT p.id::text AS r FROM public.products p
5266
+ WHERE p.trade_item_key = v_key OR p.floriday_trade_item_id = v_key OR p.id::text = v_key
5267
+ OR 'product:' || p.id::text = v_key
5268
+ UNION
5269
+ SELECT btrim(p.floriday_trade_item_id) FROM public.products p
5270
+ WHERE (p.trade_item_key = v_key OR p.floriday_trade_item_id = v_key OR 'product:' || p.id::text = v_key)
5271
+ AND NULLIF(btrim(COALESCE(p.floriday_trade_item_id,'')),'') IS NOT NULL
5272
+ UNION SELECT v_key
5273
+ ) x WHERE r IS NOT NULL;
5274
+
5268
5275
  v_leads := public.voorraad_floriday_leads_key(v_key);
5269
5276
  SELECT CEIL(COALESCE(SUM(COALESCE(oi.quantity, 0)), 0))::integer INTO v_sum
5270
5277
  FROM logistics_active.order_items oi
5271
5278
  JOIN public.orders o ON o.id = oi.order_id
5272
- JOIN public.products p ON p.id = oi.product_id
5273
- WHERE COALESCE(NULLIF(btrim(COALESCE(p.floriday_trade_item_id, '')), ''),
5274
- NULLIF(btrim(COALESCE(p.trade_item_key, '')), ''), p.id::text) = v_key
5279
+ WHERE oi.product_id::text = ANY(v_refs)
5280
+ AND public.voorraad_orderregel_sleutel(oi.product_id::text) = v_key
5275
5281
  AND o.status = 'Nog te picken' AND NOT public.logistics_reserved_order_excluded(o.id)
5276
5282
  AND NOT (public.normalize_order_source(o.order_source) = 'FO' AND v_leads)
5277
- AND NOT EXISTS (SELECT 1 FROM public.product_bom_items b WHERE b.parent_product_id = p.id)
5283
+ AND NOT EXISTS (SELECT 1 FROM public.product_bom_items b WHERE b.parent_product_id = oi.product_id)
5278
5284
  AND NOT EXISTS (SELECT 1 FROM public.product_groups pg
5279
- WHERE pg.is_active = true AND (pg.id = p.id OR pg.head_product_id = p.id))
5285
+ WHERE pg.is_active = true AND (pg.id = oi.product_id OR pg.head_product_id = oi.product_id))
5280
5286
  AND NOT EXISTS (
5281
5287
  SELECT 1 FROM public.stock_mutation_log sml
5282
5288
  WHERE sml.order_item_id = oi.id
@@ -6752,7 +6758,7 @@ AS $function$
6752
6758
  DECLARE v_key text; v_old_key text;
6753
6759
  BEGIN
6754
6760
  IF (TG_OP = 'INSERT') THEN
6755
- SELECT p.trade_item_key INTO v_key FROM public.products p WHERE p.id = NEW.product_id;
6761
+ v_key := public.voorraad_orderregel_sleutel(NEW.product_id::text);
6756
6762
  PERFORM public.recompute_reserved_stock(v_key);
6757
6763
  RETURN NEW;
6758
6764
  ELSIF (TG_OP = 'UPDATE') THEN
@@ -6763,15 +6769,15 @@ BEGIN
6763
6769
  AND NEW.source_line_key IS NOT DISTINCT FROM OLD.source_line_key THEN
6764
6770
  RETURN NEW;
6765
6771
  END IF;
6766
- SELECT p.trade_item_key INTO v_key FROM public.products p WHERE p.id = NEW.product_id;
6767
- SELECT p.trade_item_key INTO v_old_key FROM public.products p WHERE p.id = OLD.product_id;
6772
+ v_key := public.voorraad_orderregel_sleutel(NEW.product_id::text);
6773
+ v_old_key := public.voorraad_orderregel_sleutel(OLD.product_id::text);
6768
6774
  PERFORM public.recompute_reserved_stock(v_key);
6769
6775
  IF v_old_key IS DISTINCT FROM v_key THEN
6770
6776
  PERFORM public.recompute_reserved_stock(v_old_key);
6771
6777
  END IF;
6772
6778
  RETURN NEW;
6773
6779
  ELSIF (TG_OP = 'DELETE') THEN
6774
- SELECT p.trade_item_key INTO v_old_key FROM public.products p WHERE p.id = OLD.product_id;
6780
+ v_old_key := public.voorraad_orderregel_sleutel(OLD.product_id::text);
6775
6781
  PERFORM public.recompute_reserved_stock(v_old_key);
6776
6782
  RETURN OLD;
6777
6783
  END IF;
@@ -8704,31 +8710,51 @@ CREATE OR REPLACE FUNCTION public.voorraad_correctie_1131(p_uitvoeren boolean DE
8704
8710
  SECURITY DEFINER
8705
8711
  SET search_path TO 'public'
8706
8712
  AS $function$
8707
- DECLARE v_rows jsonb; v_result jsonb;
8713
+ DECLARE v_rows jsonb; v_result jsonb; v_done jsonb := '[]'::jsonb; r record;
8708
8714
  BEGIN
8709
8715
  PERFORM public.voorraad_vereis('server', 'voorraad_correctie_1131');
8710
- IF p_uitvoeren THEN
8711
- RAISE EXCEPTION 'Correctie 1131 is alleen als overzicht vrijgegeven; uitvoeren wacht op akkoord' USING ERRCODE = 'VR012';
8712
- END IF;
8716
+ PERFORM pg_advisory_xact_lock(hashtextextended('voorraad_correctie_1131', 0));
8713
8717
  SELECT COALESCE(jsonb_agg(jsonb_build_object(
8714
8718
  'artikelnummer', c.article_number,
8715
8719
  'voorraadartikel', c.id, 'canonieke_sleutel', public.voorraad_canoniek_sleutel(c.id),
8716
8720
  'spiegelproduct', m.id, 'spiegel_bron', m.custom_fields->>'source',
8717
- 'spiegel_herkend_als_verkoop', (m.custom_fields->>'source') = 'sales-module-floriday-mirror',
8718
8721
  'canonieke_regel', (SELECT to_jsonb(s) - 'notes' FROM public.trade_item_stock s
8719
8722
  WHERE s.trade_item_key = public.voorraad_canoniek_sleutel(c.id) AND s.archived_at IS NULL LIMIT 1),
8720
8723
  'spiegelregels', (SELECT jsonb_agg(to_jsonb(s) - 'notes' ORDER BY s.id) FROM public.trade_item_stock s
8721
8724
  WHERE s.trade_item_key IN (m.id::text, m.trade_item_key, 'product:' || m.id::text)
8722
8725
  AND s.trade_item_key IS DISTINCT FROM public.voorraad_canoniek_sleutel(c.id)
8723
- AND s.archived_at IS NULL),
8724
- 'voorstel', 'reserveringen opnieuw berekenen zodat ze op de canonieke regel landen; spiegelregel archiveren (archived_at, archived_into = canonieke sleutel); fysieke voorraad van de spiegel niet optellen, alleen loggen; spiegelproduct verdwijnt uit voorraadlijst en tellingen; niets verwijderen'
8726
+ AND s.archived_at IS NULL)
8725
8727
  ) ORDER BY c.article_number), '[]'::jsonb)
8726
8728
  INTO v_rows
8727
8729
  FROM public.products m
8728
8730
  JOIN public.products c ON c.floriday_trade_item_id = m.id::text AND c.id <> m.id;
8729
- v_result := jsonb_build_object('ok', true, 'status', 'voorstel', 'artikelen', v_rows);
8731
+
8732
+ IF p_uitvoeren THEN
8733
+ -- Archiveren in vaste volgorde; fysieke voorraad van de spiegel wordt niet opgeteld, alleen vastgelegd.
8734
+ FOR r IN
8735
+ SELECT s.id, s.trade_item_key, s.physical_stock, s.reserved_stock, public.voorraad_canoniek_sleutel(c.id) AS canon
8736
+ FROM public.products m
8737
+ JOIN public.products c ON c.floriday_trade_item_id = m.id::text AND c.id <> m.id
8738
+ JOIN public.trade_item_stock s ON s.trade_item_key IN (m.id::text, m.trade_item_key, 'product:' || m.id::text)
8739
+ WHERE s.archived_at IS NULL
8740
+ AND s.trade_item_key IS DISTINCT FROM public.voorraad_canoniek_sleutel(c.id)
8741
+ ORDER BY s.id
8742
+ FOR UPDATE OF s
8743
+ LOOP
8744
+ UPDATE public.trade_item_stock
8745
+ SET archived_at = now(), archived_into = r.canon,
8746
+ archived_reason = 'voorraad_correctie_1131: spiegelregel; reserveringen landen na herberekening op ' || r.canon,
8747
+ reserved_stock = 0
8748
+ WHERE id = r.id AND archived_at IS NULL;
8749
+ v_done := v_done || jsonb_build_object('regel', r.id, 'sleutel', r.trade_item_key, 'fysiek', r.physical_stock,
8750
+ 'gereserveerd_voor', r.reserved_stock, 'naar', r.canon);
8751
+ END LOOP;
8752
+ END IF;
8753
+
8754
+ v_result := jsonb_build_object('ok', true, 'status', CASE WHEN p_uitvoeren THEN 'uitgevoerd' ELSE 'voorstel' END,
8755
+ 'artikelen', v_rows, 'gearchiveerd', v_done);
8730
8756
  INSERT INTO public.voorraad_correcties(correctie, uitgevoerd_door, proef, aantallen, hash_ok)
8731
- VALUES ('voorraad_correctie_1131', COALESCE(auth.uid()::text, session_user::text), true, v_result, true);
8757
+ VALUES ('voorraad_correctie_1131', COALESCE(auth.uid()::text, session_user::text), NOT p_uitvoeren, v_result, true);
8732
8758
  RETURN v_result;
8733
8759
  END $function$
8734
8760
  ;
@@ -8763,6 +8789,39 @@ END $function$
8763
8789
  REVOKE ALL ON FUNCTION voorraad_correctie_1132(boolean) FROM PUBLIC;
8764
8790
  REVOKE ALL ON FUNCTION voorraad_correctie_1132(boolean) FROM anon;
8765
8791
  GRANT EXECUTE ON FUNCTION voorraad_correctie_1132(boolean) TO service_role;
8792
+ CREATE OR REPLACE FUNCTION public.voorraad_correctie_1136(p_uitvoeren boolean DEFAULT false)
8793
+ RETURNS jsonb
8794
+ LANGUAGE plpgsql
8795
+ SECURITY DEFINER
8796
+ SET search_path TO 'public'
8797
+ AS $function$
8798
+ DECLARE pid constant uuid := '27612767-2b14-468c-b169-a8f9a4abe053'; p record; v_status text; v_result jsonb; v_after numeric;
8799
+ BEGIN
8800
+ PERFORM public.voorraad_vereis('server', 'voorraad_correctie_1136');
8801
+ PERFORM pg_advisory_xact_lock(hashtextextended('voorraad_correctie_1136', 0));
8802
+ SELECT * INTO p FROM public.products WHERE id = pid FOR UPDATE;
8803
+ IF p.id IS NULL OR p.article_number IS DISTINCT FROM 'TQA2810A' THEN v_status := 'overgeslagen: artikel wijkt af';
8804
+ ELSIF p.sale_price = 1.40 THEN v_status := 'al uitgevoerd';
8805
+ ELSIF p.sale_price IS DISTINCT FROM 1.25 THEN v_status := 'overgeslagen: prijs gewijzigd';
8806
+ ELSE v_status := CASE WHEN p_uitvoeren THEN 'uitgevoerd' ELSE 'voorstel' END; END IF;
8807
+ IF v_status = 'uitgevoerd' THEN
8808
+ UPDATE public.products SET sale_price = 1.40, updated_at = now() WHERE id = pid;
8809
+ END IF;
8810
+ SELECT sale_price INTO v_after FROM public.products WHERE id = pid;
8811
+ v_result := jsonb_build_object('ok', v_status NOT LIKE 'overgeslagen%', 'status', v_status, 'product', pid, 'voor', p.sale_price, 'na', v_after);
8812
+ INSERT INTO public.voorraad_correcties(correctie, uitgevoerd_door, proef, aantallen, hash_ok)
8813
+ VALUES ('voorraad_correctie_1136', COALESCE(auth.uid()::text, session_user::text), NOT p_uitvoeren, v_result, true);
8814
+ RETURN v_result;
8815
+ END $function$
8816
+ ;
8817
+ REVOKE ALL ON FUNCTION voorraad_correctie_1136(boolean) FROM PUBLIC;
8818
+ REVOKE ALL ON FUNCTION voorraad_correctie_1136(boolean) FROM anon;
8819
+ REVOKE EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) FROM PUBLIC;
8820
+ GRANT EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) TO authenticated;
8821
+ GRANT EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) TO service_role;
8822
+ REVOKE EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) FROM anon;
8823
+ GRANT EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) TO authenticated;
8824
+ GRANT EXECUTE ON FUNCTION voorraad_correctie_1136(boolean) TO service_role;
8766
8825
  CREATE OR REPLACE FUNCTION public.voorraad_correctie_status(p_correctie text DEFAULT '1098'::text)
8767
8826
  RETURNS jsonb
8768
8827
  LANGUAGE plpgsql
@@ -9252,6 +9311,28 @@ GRANT EXECUTE ON FUNCTION voorraad_order_geannuleerd(text,timestamp with time zo
9252
9311
  REVOKE EXECUTE ON FUNCTION voorraad_order_geannuleerd(text,timestamp with time zone,timestamp with time zone) FROM anon;
9253
9312
  GRANT EXECUTE ON FUNCTION voorraad_order_geannuleerd(text,timestamp with time zone,timestamp with time zone) TO authenticated;
9254
9313
  GRANT EXECUTE ON FUNCTION voorraad_order_geannuleerd(text,timestamp with time zone,timestamp with time zone) TO service_role;
9314
+ CREATE OR REPLACE FUNCTION public.voorraad_orderregel_sleutel(p_ref text)
9315
+ RETURNS text
9316
+ LANGUAGE plpgsql
9317
+ STABLE SECURITY DEFINER
9318
+ SET search_path TO 'public'
9319
+ AS $function$
9320
+ DECLARE v_key text;
9321
+ BEGIN
9322
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_orderregel_sleutel');
9323
+ IF p_ref IS NULL OR btrim(p_ref) = '' THEN RETURN NULL; END IF;
9324
+ BEGIN
9325
+ SELECT c.trade_item_key INTO v_key FROM public.voorraad_canoniek_artikel(p_ref) c;
9326
+ EXCEPTION WHEN others THEN
9327
+ RETURN NULL;
9328
+ END;
9329
+ RETURN v_key;
9330
+ END $function$
9331
+ ;
9332
+ REVOKE ALL ON FUNCTION voorraad_orderregel_sleutel(text) FROM PUBLIC;
9333
+ REVOKE ALL ON FUNCTION voorraad_orderregel_sleutel(text) FROM anon;
9334
+ GRANT EXECUTE ON FUNCTION voorraad_orderregel_sleutel(text) TO authenticated;
9335
+ GRANT EXECUTE ON FUNCTION voorraad_orderregel_sleutel(text) TO service_role;
9255
9336
  CREATE OR REPLACE FUNCTION public.voorraad_packing_from_floriday(p_product_id uuid, p_uitvoeren boolean)
9256
9337
  RETURNS jsonb
9257
9338
  LANGUAGE plpgsql