@flowselections/pick-schermen-kwekers 1.0.93 → 1.0.94

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/pick-schermen-kwekers",
3
- "version": "1.0.93",
3
+ "version": "1.0.94",
4
4
  "flowselections": {
5
5
  "moduleId": "pick-schermen",
6
6
  "schema": {
@@ -20,6 +20,14 @@
20
20
  "nav": false,
21
21
  "public": true
22
22
  }
23
+ ],
24
+ "crons": [
25
+ {
26
+ "name": "pick-history-cleanup",
27
+ "kind": "sql",
28
+ "schedule": "35 * * * *",
29
+ "sql": "SELECT public.pick_cleanup_history();"
30
+ }
23
31
  ]
24
32
  },
25
33
  "private": false,
@@ -6441,4 +6441,132 @@ BEGIN
6441
6441
  END IF;
6442
6442
  END $mig$;
6443
6443
  REVOKE ALL ON FUNCTION public.pick_ensure_defaults_intern() FROM PUBLIC, anon, authenticated;
6444
- GRANT EXECUTE ON FUNCTION public.pick_ensure_defaults_intern() TO service_role;
6444
+ GRANT EXECUTE ON FUNCTION public.pick_ensure_defaults_intern() TO service_role;
6445
+ -- ===== Golf 1: pickhistorie (20261110191301_eb6ef686-ecc0-446d-a7d8-65dfa16a2855.sql) =====
6446
+ -- Golf 1: pickhistorie alleen gewijzigde velden + eigen opruiming in porties
6447
+ CREATE OR REPLACE FUNCTION public.pick_queue_audit()
6448
+ RETURNS trigger
6449
+ LANGUAGE plpgsql
6450
+ SECURITY DEFINER
6451
+ SET search_path TO 'public'
6452
+ AS $function$
6453
+ DECLARE
6454
+ v_old jsonb; v_new jsonb; v_o jsonb := '{}'::jsonb; v_n jsonb := '{}'::jsonb; k text;
6455
+ BEGIN
6456
+ IF TG_OP = 'INSERT' THEN
6457
+ INSERT INTO public.pick_station_history(entity_table, entity_id, action, changed_by, old_data, new_data)
6458
+ VALUES ('pick_queue', NEW.id, TG_OP, auth.uid(), NULL, jsonb_strip_nulls(to_jsonb(NEW)));
6459
+ RETURN NEW;
6460
+ ELSIF TG_OP = 'DELETE' THEN
6461
+ INSERT INTO public.pick_station_history(entity_table, entity_id, action, changed_by, old_data, new_data)
6462
+ VALUES ('pick_queue', OLD.id, TG_OP, auth.uid(), jsonb_strip_nulls(to_jsonb(OLD)), NULL);
6463
+ RETURN OLD;
6464
+ END IF;
6465
+
6466
+ v_old := to_jsonb(OLD); v_new := to_jsonb(NEW);
6467
+ FOR k IN SELECT jsonb_object_keys(v_new) LOOP
6468
+ IF k <> 'updated_at' AND (v_old -> k) IS DISTINCT FROM (v_new -> k) THEN
6469
+ v_o := v_o || jsonb_build_object(k, v_old -> k);
6470
+ v_n := v_n || jsonb_build_object(k, v_new -> k);
6471
+ END IF;
6472
+ END LOOP;
6473
+ IF v_n = '{}'::jsonb THEN RETURN NEW; END IF; -- niets wezenlijks gewijzigd
6474
+ v_o := v_o || jsonb_build_object('updated_at', v_old -> 'updated_at');
6475
+ v_n := v_n || jsonb_build_object('updated_at', v_new -> 'updated_at');
6476
+ INSERT INTO public.pick_station_history(entity_table, entity_id, action, changed_by, old_data, new_data)
6477
+ VALUES ('pick_queue', NEW.id, TG_OP, auth.uid(), v_o, v_n);
6478
+ RETURN NEW;
6479
+ END; $function$;
6480
+ GRANT EXECUTE ON FUNCTION public.pick_queue_audit() TO anon, authenticated, service_role;
6481
+
6482
+ CREATE OR REPLACE FUNCTION public.pick_cleanup_history()
6483
+ RETURNS jsonb
6484
+ LANGUAGE plpgsql
6485
+ VOLATILE
6486
+ SECURITY DEFINER
6487
+ SET search_path TO 'public'
6488
+ AS $function$
6489
+ DECLARE
6490
+ v_days integer; v_start timestamptz := clock_timestamp(); v_total integer := 0; n integer; v_bron text := 'standaard';
6491
+ BEGIN
6492
+ IF current_user NOT IN ('postgres','service_role','supabase_admin')
6493
+ AND NOT COALESCE(public.has_role(auth.uid(), 'admin'), false) THEN
6494
+ RAISE EXCEPTION 'Geen toegang tot het opruimen van de pickhistorie.' USING ERRCODE = '42501';
6495
+ END IF;
6496
+ IF to_regprocedure('public.logistics_retention_days(text)') IS NOT NULL THEN
6497
+ BEGIN
6498
+ EXECUTE 'SELECT public.logistics_retention_days($1)' INTO v_days USING 'pick_history_retention_days';
6499
+ v_bron := 'engine';
6500
+ EXCEPTION WHEN OTHERS THEN
6501
+ RAISE WARNING 'pick_cleanup_history: termijn uit Engine niet leesbaar (%), standaard 30 dagen', SQLERRM;
6502
+ v_days := NULL;
6503
+ END;
6504
+ END IF;
6505
+ IF v_days IS NULL OR v_days < 1 THEN v_days := 30; v_bron := 'standaard'; END IF;
6506
+
6507
+ LOOP
6508
+ WITH weg AS (SELECT id FROM public.pick_station_history
6509
+ WHERE created_at < now() - make_interval(days => v_days)
6510
+ ORDER BY created_at LIMIT 10000)
6511
+ DELETE FROM public.pick_station_history h USING weg WHERE h.id = weg.id;
6512
+ GET DIAGNOSTICS n = ROW_COUNT;
6513
+ v_total := v_total + n;
6514
+ EXIT WHEN n = 0 OR clock_timestamp() - v_start > interval '20 seconds';
6515
+ END LOOP;
6516
+ RETURN jsonb_build_object('verwijderd', v_total, 'termijn_dagen', v_days, 'bron', v_bron,
6517
+ 'duur_ms', round(extract(epoch FROM clock_timestamp() - v_start) * 1000));
6518
+ END $function$;
6519
+ REVOKE ALL ON FUNCTION public.pick_cleanup_history() FROM PUBLIC, anon, authenticated;
6520
+ GRANT EXECUTE ON FUNCTION public.pick_cleanup_history() TO service_role;
6521
+
6522
+ COMMENT ON FUNCTION public.pick_reset_print(uuid, text) IS 'Verouderd: niet meer in gebruik (scherm gebruikt variant met _cart_id via p_device_key-wrapper). Verwijderen als handmatige stap.';
6523
+ COMMENT ON FUNCTION public.pick_enqueue_print_job(uuid, uuid, text, boolean) IS 'Verouderd: niet meer door het scherm aangeroepen; nog genest gebruikt door oude kernvarianten. Verwijderen als handmatige stap na controle.';
6524
+ -- 20261110194034_4411e109-0b93-4bc4-833b-fc93487e214c.sql
6525
+ -- Golf 1 aanvulling: binnen payload alleen gewijzigde onderdelen in de historie
6526
+ CREATE OR REPLACE FUNCTION public.pick_queue_audit()
6527
+ RETURNS trigger
6528
+ LANGUAGE plpgsql
6529
+ SECURITY DEFINER
6530
+ SET search_path TO 'public'
6531
+ AS $function$
6532
+ DECLARE
6533
+ v_old jsonb; v_new jsonb; v_o jsonb := '{}'::jsonb; v_n jsonb := '{}'::jsonb; k text; s text;
6534
+ v_po jsonb; v_pn jsonb;
6535
+ BEGIN
6536
+ IF TG_OP = 'INSERT' THEN
6537
+ INSERT INTO public.pick_station_history(entity_table, entity_id, action, changed_by, old_data, new_data)
6538
+ VALUES ('pick_queue', NEW.id, TG_OP, auth.uid(), NULL, jsonb_strip_nulls(to_jsonb(NEW)));
6539
+ RETURN NEW;
6540
+ ELSIF TG_OP = 'DELETE' THEN
6541
+ INSERT INTO public.pick_station_history(entity_table, entity_id, action, changed_by, old_data, new_data)
6542
+ VALUES ('pick_queue', OLD.id, TG_OP, auth.uid(), jsonb_strip_nulls(to_jsonb(OLD)), NULL);
6543
+ RETURN OLD;
6544
+ END IF;
6545
+
6546
+ v_old := to_jsonb(OLD); v_new := to_jsonb(NEW);
6547
+ FOR k IN SELECT jsonb_object_keys(v_new) LOOP
6548
+ IF k <> 'updated_at' AND (v_old -> k) IS DISTINCT FROM (v_new -> k) THEN
6549
+ IF jsonb_typeof(v_old -> k) = 'object' AND jsonb_typeof(v_new -> k) = 'object' THEN
6550
+ v_po := '{}'::jsonb; v_pn := '{}'::jsonb;
6551
+ FOR s IN SELECT jsonb_object_keys(v_old -> k) UNION SELECT jsonb_object_keys(v_new -> k) LOOP
6552
+ IF (v_old -> k -> s) IS DISTINCT FROM (v_new -> k -> s) THEN
6553
+ v_po := v_po || jsonb_build_object(s, COALESCE(v_old -> k -> s, 'null'::jsonb));
6554
+ v_pn := v_pn || jsonb_build_object(s, COALESCE(v_new -> k -> s, 'null'::jsonb));
6555
+ END IF;
6556
+ END LOOP;
6557
+ v_o := v_o || jsonb_build_object(k, v_po);
6558
+ v_n := v_n || jsonb_build_object(k, v_pn);
6559
+ ELSE
6560
+ v_o := v_o || jsonb_build_object(k, v_old -> k);
6561
+ v_n := v_n || jsonb_build_object(k, v_new -> k);
6562
+ END IF;
6563
+ END IF;
6564
+ END LOOP;
6565
+ IF v_n = '{}'::jsonb THEN RETURN NEW; END IF;
6566
+ v_o := v_o || jsonb_build_object('updated_at', v_old -> 'updated_at');
6567
+ v_n := v_n || jsonb_build_object('updated_at', v_new -> 'updated_at');
6568
+ INSERT INTO public.pick_station_history(entity_table, entity_id, action, changed_by, old_data, new_data)
6569
+ VALUES ('pick_queue', NEW.id, TG_OP, auth.uid(), v_o, v_n);
6570
+ RETURN NEW;
6571
+ END; $function$;
6572
+ GRANT EXECUTE ON FUNCTION public.pick_queue_audit() TO anon, authenticated, service_role;