@flowselections/logistiek-engine 1.0.230 → 1.0.233

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.
@@ -12860,36 +12860,7 @@ EXCEPTION WHEN undefined_object OR undefined_table OR undefined_function OR inva
12860
12860
  RAISE NOTICE 'logistiek-engine: functie public.logistics_order_is_topick overgeslagen (onderdeel van andere module ontbreekt): %', SQLERRM;
12861
12861
  END $fsdo$;
12862
12862
 
12863
- DO $fsdo$ BEGIN
12864
- EXECUTE $fsdef$CREATE OR REPLACE FUNCTION public.logistics_order_item_autolink()
12865
- RETURNS trigger
12866
- LANGUAGE plpgsql
12867
- SECURITY DEFINER
12868
- SET search_path TO 'public'
12869
- AS $function$
12870
- DECLARE m record;
12871
- BEGIN
12872
- IF NEW.product_id IS NULL THEN
12873
- m := public.logistics_resolve_product_match(NEW.product_name::text);
12874
- NEW.product_id := m.product_id;
12875
- IF m.match_type IN ('naam', 'onbekend')
12876
- AND (TG_OP = 'INSERT' OR NEW.product_name IS DISTINCT FROM OLD.product_name) THEN
12877
- BEGIN
12878
- INSERT INTO public.logistics_autolink_audit
12879
- (order_id, order_item_id, order_source, product_name, product_id, match_type, product_floriday_id)
12880
- SELECT NEW.order_id, NEW.id, o.order_source, NEW.product_name::text, m.product_id, m.match_type,
12881
- (SELECT p.floriday_trade_item_id::text FROM public.products p WHERE p.id = m.product_id)
12882
- FROM (SELECT NEW.order_id AS id) x LEFT JOIN public.orders o ON o.id = x.id;
12883
- EXCEPTION WHEN others THEN NULL; -- loggen mag een orderregel nooit laten mislukken
12884
- END;
12885
- END IF;
12886
- END IF;
12887
- RETURN NEW;
12888
- END $function$
12889
- $fsdef$;
12890
- EXCEPTION WHEN undefined_object OR undefined_table OR undefined_function OR invalid_schema_name THEN
12891
- RAISE NOTICE 'logistiek-engine: functie public.logistics_order_item_autolink overgeslagen (onderdeel van andere module ontbreekt): %', SQLERRM;
12892
- END $fsdo$;
12863
+ -- logistics_order_item_autolink: zie blok 1.0.231 onderaan (hoogste niveau, geen DO-blok).
12893
12864
 
12894
12865
  DO $fsdo$ BEGIN
12895
12866
  EXECUTE $fsdef$CREATE OR REPLACE FUNCTION public.logistics_order_line_allocation(p_order_item_id uuid)
@@ -39729,3 +39700,112 @@ BEGIN
39729
39700
  END $function$;
39730
39701
  REVOKE ALL ON FUNCTION public.logistics_ladingdrager_resolve_plan(text) FROM authenticated;
39731
39702
 
39703
+ -- logistiek-engine 1.0.231: de Engine is de enige eigenaar van het koppelen van orderregels.
39704
+ -- Floriday-regels (met source_line_key) koppelen alleen via Voorraad (voorraad_orderregel_trade_item_bron), nooit op naam.
39705
+ -- Functies staan op het hoogste niveau (geen DO-blok), zodat het update-dashboard ze meeneemt.
39706
+
39707
+ ALTER TABLE IF EXISTS public.logistics_autolink_audit ADD COLUMN IF NOT EXISTS bron text;
39708
+ ALTER TABLE IF EXISTS public.logistics_autolink_audit ADD COLUMN IF NOT EXISTS status text;
39709
+ ALTER TABLE IF EXISTS public.logistics_autolink_audit ADD COLUMN IF NOT EXISTS source_line_key text;
39710
+ ALTER TABLE IF EXISTS public.logistics_autolink_audit ADD COLUMN IF NOT EXISTS melding text;
39711
+
39712
+ CREATE OR REPLACE FUNCTION public.logistics_order_item_autolink()
39713
+ RETURNS trigger
39714
+ LANGUAGE plpgsql
39715
+ SECURITY DEFINER
39716
+ SET search_path TO 'public'
39717
+ AS $function$
39718
+ DECLARE
39719
+ m record;
39720
+ v_key text := NULLIF(btrim(COALESCE(NEW.source_line_key, '')), '');
39721
+ v_res jsonb;
39722
+ v_status text;
39723
+ v_pid uuid;
39724
+ v_melding text;
39725
+ BEGIN
39726
+ -- Een al gevulde product_id nooit overschrijven.
39727
+ IF NEW.product_id IS NOT NULL THEN RETURN NEW; END IF;
39728
+
39729
+ IF v_key IS NOT NULL THEN
39730
+ -- Floriday-regel: alleen bij het aanmaken via Voorraad koppelen; nooit op naam gokken.
39731
+ IF TG_OP <> 'INSERT' THEN RETURN NEW; END IF;
39732
+ BEGIN
39733
+ IF to_regprocedure('public.voorraad_orderregel_trade_item_bron(uuid,text)') IS NULL THEN
39734
+ v_status := 'voorraad_ontbreekt';
39735
+ v_melding := 'Voorraad-functie voorraad_orderregel_trade_item_bron ontbreekt; regel opgeslagen zonder artikel';
39736
+ ELSE
39737
+ EXECUTE 'SELECT public.voorraad_orderregel_trade_item_bron($1, $2)' INTO v_res USING NEW.order_id, v_key;
39738
+ v_status := COALESCE(NULLIF(v_res->>'status', ''), 'onbekend');
39739
+ IF v_status IN ('eenduidig', 'ok') THEN
39740
+ BEGIN
39741
+ v_pid := NULLIF(v_res->>'product_id', '')::uuid;
39742
+ EXCEPTION WHEN others THEN v_pid := NULL;
39743
+ END;
39744
+ -- Alleen een bestaand artikel (ook gearchiveerd) koppelen.
39745
+ IF v_pid IS NOT NULL AND EXISTS (SELECT 1 FROM public.products p WHERE p.id = v_pid) THEN
39746
+ NEW.product_id := v_pid;
39747
+ ELSE
39748
+ v_melding := 'Voorraad gaf een artikel dat niet bestaat; regel opgeslagen zonder artikel';
39749
+ v_pid := NULL;
39750
+ END IF;
39751
+ END IF;
39752
+ END IF;
39753
+ EXCEPTION WHEN others THEN
39754
+ v_status := 'voorraad_fout';
39755
+ v_melding := left(SQLERRM, 500);
39756
+ v_pid := NULL;
39757
+ NEW.product_id := NULL;
39758
+ END;
39759
+ BEGIN
39760
+ INSERT INTO public.logistics_autolink_audit
39761
+ (order_id, order_item_id, order_source, product_name, product_id, match_type, product_floriday_id,
39762
+ bron, status, source_line_key, melding)
39763
+ SELECT NEW.order_id, NEW.id, o.order_source, NEW.product_name::text, v_pid, v_status,
39764
+ COALESCE(v_res->>'trade_item_id', (SELECT p.floriday_trade_item_id::text FROM public.products p WHERE p.id = v_pid)),
39765
+ 'voorraad_floriday', v_status, v_key, v_melding
39766
+ FROM (SELECT NEW.order_id AS id) x LEFT JOIN public.orders o ON o.id = x.id;
39767
+ EXCEPTION WHEN others THEN NULL; -- loggen mag een orderregel nooit laten mislukken
39768
+ END;
39769
+ RETURN NEW;
39770
+ END IF;
39771
+
39772
+ -- Mailbox- en handmatige orders (zonder source_line_key): koppelen op naam, zoals voorheen.
39773
+ BEGIN
39774
+ m := public.logistics_resolve_product_match(NEW.product_name::text);
39775
+ NEW.product_id := m.product_id;
39776
+ EXCEPTION WHEN others THEN
39777
+ NEW.product_id := NULL;
39778
+ RETURN NEW;
39779
+ END;
39780
+ IF m.match_type IN ('naam', 'onbekend')
39781
+ AND (TG_OP = 'INSERT' OR NEW.product_name IS DISTINCT FROM OLD.product_name) THEN
39782
+ BEGIN
39783
+ INSERT INTO public.logistics_autolink_audit
39784
+ (order_id, order_item_id, order_source, product_name, product_id, match_type, product_floriday_id, bron, status)
39785
+ SELECT NEW.order_id, NEW.id, o.order_source, NEW.product_name::text, m.product_id, m.match_type,
39786
+ (SELECT p.floriday_trade_item_id::text FROM public.products p WHERE p.id = m.product_id),
39787
+ 'naam', m.match_type
39788
+ FROM (SELECT NEW.order_id AS id) x LEFT JOIN public.orders o ON o.id = x.id;
39789
+ EXCEPTION WHEN others THEN NULL;
39790
+ END;
39791
+ END IF;
39792
+ RETURN NEW;
39793
+ END $function$;
39794
+
39795
+ REVOKE ALL ON FUNCTION public.logistics_order_item_autolink() FROM PUBLIC, anon, authenticated;
39796
+ GRANT EXECUTE ON FUNCTION public.logistics_order_item_autolink() TO service_role;
39797
+
39798
+ CREATE OR REPLACE FUNCTION public.logistics_install_check_231()
39799
+ RETURNS TABLE(punt text, ok boolean, uitleg text) LANGUAGE sql STABLE SET search_path TO 'public' AS $$
39800
+ SELECT 'koppelen via Voorraad', position('voorraad_orderregel_trade_item_bron' IN pg_get_functiondef('public.logistics_order_item_autolink()'::regprocedure)) > 0,
39801
+ 'Floriday-regels koppelen via Voorraad, nooit op naam'
39802
+ UNION ALL SELECT 'audit-kolommen', EXISTS (SELECT 1 FROM information_schema.columns
39803
+ WHERE table_schema = 'public' AND table_name = 'logistics_autolink_audit' AND column_name = 'bron'),
39804
+ 'Koppelaudit heeft bron en status'
39805
+ UNION ALL SELECT 'triggervolgorde', 'trg_logistics_order_item_autolink' < 'trg_order_items_autolink',
39806
+ 'Engine-koppeling vuurt vóór de Voorraad-trigger'
39807
+ UNION ALL SELECT 'vingerafdruk met artikel', position('product_id' IN pg_get_functiondef('public.logistics_plan_inhoud_fp(uuid)'::regprocedure)) > 0,
39808
+ 'Een later gekoppeld artikel biedt de order opnieuw aan'
39809
+ $$;
39810
+ REVOKE ALL ON FUNCTION public.logistics_install_check_231() FROM PUBLIC, anon, authenticated;
39811
+ GRANT EXECUTE ON FUNCTION public.logistics_install_check_231() TO service_role;
@@ -45,7 +45,7 @@ function createSupabaseClient() {
45
45
  }
46
46
  let _supabase;
47
47
  // Import the supabase client like this:
48
- // import { supabase } from "./client.js";
48
+ // import { supabase } from "../../integrations/supabase/client.js";
49
49
  export const supabase = new Proxy({}, {
50
50
  get(_, prop, receiver) {
51
51
  if (!_supabase)
@@ -20,7 +20,7 @@ function createSupabaseAdminClient() {
20
20
  let _supabaseAdmin;
21
21
  // Server-side Supabase client with service role - bypasses RLS
22
22
  // SECURITY: Only use this for trusted server-side operations, never expose to client code
23
- // Import like: import { supabaseAdmin } from "./client.server.js";
23
+ // Import like: import { supabaseAdmin } from "../../integrations/supabase/client.server.js";
24
24
  export const supabaseAdmin = new Proxy({}, {
25
25
  get(_, prop, receiver) {
26
26
  if (!_supabaseAdmin)