@flowselections/logistiek-engine 1.0.187 → 1.0.189

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.
@@ -4066,6 +4066,7 @@ DO $fsdo$ BEGIN
4066
4066
  SET search_path TO 'public'
4067
4067
  AS $function$
4068
4068
  BEGIN
4069
+ PERFORM public.logistics_acc_guard('ingelogd', 'claim_logistics_tasks');
4069
4070
  RETURN QUERY
4070
4071
  WITH candidates AS (
4071
4072
  SELECT t.id
@@ -4109,6 +4110,7 @@ AS $function$
4109
4110
  DECLARE
4110
4111
  v_total integer := 0;
4111
4112
  BEGIN
4113
+ PERFORM public.logistics_acc_guard('ingelogd', 'control_mark_carts_delivered');
4112
4114
  SELECT count(*)::integer INTO v_total
4113
4115
  FROM public.control_mark_carts_delivered_detail(p_carts) r
4114
4116
  WHERE r.outcome = 'delivered';
@@ -4129,6 +4131,7 @@ DO $fsdo$ BEGIN
4129
4131
  AS $function$
4130
4132
  DECLARE r record; v_cart uuid; v_res jsonb; v_today date; v_bron text;
4131
4133
  BEGIN
4134
+ PERFORM public.logistics_acc_guard('ingelogd', 'control_mark_carts_delivered_detail');
4132
4135
  IF auth.uid() IS NULL AND coalesce(auth.role(), '') <> 'service_role' THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
4133
4136
  IF p_carts IS NULL OR jsonb_typeof(p_carts) <> 'array' OR jsonb_array_length(p_carts) = 0 THEN RETURN; END IF;
4134
4137
  FOR r IN
@@ -4251,6 +4254,7 @@ DO $fsdo$ BEGIN
4251
4254
  STABLE SECURITY DEFINER
4252
4255
  SET search_path TO 'public'
4253
4256
  AS $function$
4257
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_active_pick_workdays');
4254
4258
  SELECT COALESCE(
4255
4259
  (SELECT ARRAY(
4256
4260
  SELECT jsonb_array_elements_text(c.settings -> 'orderpicken' -> 'pick_workdays')
@@ -4320,6 +4324,7 @@ AS $function$
4320
4324
  DECLARE
4321
4325
  v_buf uuid; v_sales text; v_del text; v_n int; v_id text; v_key text; v_sent boolean;
4322
4326
  BEGIN
4327
+ PERFORM public.logistics_acc_guard('server', 'logistics_afhandeling_fulfillment_order');
4323
4328
  SELECT buffer_id, nullif(btrim(floriday_sales_order_id),'') INTO v_buf, v_sales FROM public.orders WHERE id = _order_id;
4324
4329
  IF NOT FOUND THEN
4325
4330
  RETURN jsonb_build_object('fulfillmentOrderId', NULL, 'sleutel', NULL, 'kandidaten', 0, 'verstuurd', false);
@@ -4372,6 +4377,7 @@ DECLARE
4372
4377
  v_rem numeric := public.logistics_plan_setting('verdeling_rem_minuten', NULL);
4373
4378
  n_base int := 0; n_replan int := 0; n_rem int := 0; n_same int := 0; n_frozen int := 0;
4374
4379
  BEGIN
4380
+ PERFORM public.logistics_acc_guard('server', 'logistics_allocation_check_changes');
4375
4381
  IF public.logistics_plan_setting('verdeling_bevriezen_actief', 0) <> 1 THEN
4376
4382
  RETURN jsonb_build_object('status', 'uit');
4377
4383
  END IF;
@@ -4423,6 +4429,7 @@ DO $fsdo$ BEGIN
4423
4429
  STABLE SECURITY DEFINER
4424
4430
  SET search_path TO 'public'
4425
4431
  AS $function$
4432
+ SELECT public.logistics_acc_guard('server', 'logistics_allocation_fp');
4426
4433
  SELECT md5(COALESCE(string_agg(a.order_item_id::text || '|' || COALESCE(a.trade_item_key,'') || '|' || round(a.qty, 3)::text,
4427
4434
  ';' ORDER BY a.order_item_id, a.trade_item_key, a.source), ''))
4428
4435
  FROM public.logistics_reservation_allocations a
@@ -4441,6 +4448,7 @@ DO $fsdo$ BEGIN
4441
4448
  STABLE SECURITY DEFINER
4442
4449
  SET search_path TO 'public'
4443
4450
  AS $function$
4451
+ SELECT public.logistics_acc_guard('server', 'logistics_allocation_frozen');
4444
4452
  SELECT p_order_id IS NOT NULL
4445
4453
  AND public.logistics_plan_setting('verdeling_bevriezen_actief', 0) = 1
4446
4454
  AND (EXISTS (SELECT 1 FROM public.orders o WHERE o.id = p_order_id AND o.plan_locked_at IS NOT NULL)
@@ -4476,6 +4484,7 @@ DECLARE
4476
4484
  v_items jsonb := '[]'::jsonb;
4477
4485
  c text;
4478
4486
  BEGIN
4487
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_allowed_load_carriers');
4479
4488
  IF p_strategy_id IS NOT NULL THEN
4480
4489
  SELECT settings INTO v_settings
4481
4490
  FROM public.logistics_rule_configs
@@ -4558,6 +4567,7 @@ DO $fsdo$ BEGIN
4558
4567
  SET search_path TO 'public'
4559
4568
  AS $function$
4560
4569
  BEGIN
4570
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_apply_document_layouts');
4561
4571
  UPDATE public.pick_queue q
4562
4572
  SET payload = coalesce(q.payload, '{}'::jsonb),
4563
4573
  updated_at = now()
@@ -4582,6 +4592,7 @@ DECLARE
4582
4592
  v_missing text[]; v_run uuid; v_tasks int := 0; v_rows int := 0; v_carts int := 0; v_stickers int := 0;
4583
4593
  v_peer uuid; v_reason constant text := 'Afgehandeld in Floriday'; v_fail text;
4584
4594
  BEGIN
4595
+ PERFORM public.logistics_acc_guard('server', 'logistics_apply_external_fulfillment');
4585
4596
  SELECT * INTO ev FROM public.logistics_events WHERE id = p_event_id;
4586
4597
  IF NOT FOUND THEN RETURN NULL; END IF;
4587
4598
  pl := coalesce(ev.payload, '{}'::jsonb);
@@ -4710,6 +4721,7 @@ DO $fsdo$ BEGIN
4710
4721
  AS $function$
4711
4722
  DECLARE v_buffer uuid; v_number text;
4712
4723
  BEGIN
4724
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_apply_order_buffer');
4713
4725
  SELECT order_number INTO v_number FROM public.orders WHERE id = p_order_id AND deleted_at IS NULL;
4714
4726
  IF v_number IS NULL THEN
4715
4727
  RETURN jsonb_build_object('applied', false, 'reason', 'order_not_found');
@@ -4733,6 +4745,7 @@ AS $function$
4733
4745
  DECLARE
4734
4746
  a public.logistics_delay_alerts%ROWTYPE;
4735
4747
  BEGIN
4748
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_approve_delay_reschedule');
4736
4749
  SELECT * INTO a FROM public.logistics_delay_alerts WHERE id = p_alert_id;
4737
4750
  IF NOT FOUND OR a.user_id <> auth.uid() THEN RETURN false; END IF;
4738
4751
 
@@ -4768,6 +4781,7 @@ DO $fsdo$ BEGIN
4768
4781
  SET search_path TO 'public'
4769
4782
  AS $function$
4770
4783
  BEGIN
4784
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_archived_orders');
4771
4785
  IF auth.uid() IS NULL THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
4772
4786
  RETURN QUERY SELECT q.id, q.order_id, COALESCE(o.order_number, q.order_id::text), o.delivery_date::date,
4773
4787
  q.reason, q.reason_code, q.error, COALESCE(q.attempts,0), q.updated_at
@@ -4788,6 +4802,7 @@ DO $fsdo$ BEGIN
4788
4802
  AS $function$
4789
4803
  DECLARE r record; v_at timestamptz;
4790
4804
  BEGIN
4805
+ PERFORM public.logistics_acc_guard('server', 'logistics_auto_send_claim');
4791
4806
  -- Eerst afsluiten wat al met de hand verstuurd is.
4792
4807
  FOR r IN SELECT a.id, a.order_id FROM public.logistics_auto_send a WHERE a.status IN ('wachtend','bezig') LOOP
4793
4808
  v_at := public.logistics_auto_send_sent_elsewhere(r.order_id);
@@ -4820,6 +4835,7 @@ DO $fsdo$ BEGIN
4820
4835
  AS $function$
4821
4836
  DECLARE v_members uuid[]; v_lead uuid; v_buf uuid; v_carts uuid[];
4822
4837
  BEGIN
4838
+ PERFORM public.logistics_acc_guard('server', 'logistics_auto_send_enqueue_for_order');
4823
4839
  IF NOT coalesce((public.logistics_pick_mode()->>'autoSendLoading')::boolean, false) THEN RETURN false; END IF;
4824
4840
  v_members := public.logistics_unit_order_ids(p_order_id);
4825
4841
  v_lead := v_members[1];
@@ -4856,6 +4872,7 @@ DO $fsdo$ BEGIN
4856
4872
  AS $function$
4857
4873
  DECLARE r public.logistics_auto_send; v_wait int[] := ARRAY[1,5,15,60];
4858
4874
  BEGIN
4875
+ PERFORM public.logistics_acc_guard('server', 'logistics_auto_send_finish');
4859
4876
  SELECT * INTO r FROM public.logistics_auto_send WHERE id = p_id FOR UPDATE;
4860
4877
  IF NOT FOUND OR r.status IN ('verstuurd','mislukt') THEN RETURN jsonb_build_object('ok', false, 'reden', 'niet_actief'); END IF;
4861
4878
  IF p_ok THEN
@@ -4916,6 +4933,7 @@ DO $fsdo$ BEGIN
4916
4933
  STABLE SECURITY DEFINER
4917
4934
  SET search_path TO 'public'
4918
4935
  AS $function$
4936
+ SELECT public.logistics_acc_guard('server', 'logistics_auto_send_route_missing');
4919
4937
  SELECT EXISTS (SELECT 1 FROM public.logistics_auto_send a WHERE a.last_http_status = 404
4920
4938
  AND a.updated_at > coalesce((SELECT max(b.sent_at) FROM public.logistics_auto_send b WHERE b.status = 'verstuurd' AND coalesce(b.sent_how,'automatisch') = 'automatisch'), '-infinity'))
4921
4939
  $function$
@@ -4933,6 +4951,7 @@ DO $fsdo$ BEGIN
4933
4951
  AS $function$
4934
4952
  DECLARE j jsonb; v_at timestamptz;
4935
4953
  BEGIN
4954
+ PERFORM public.logistics_acc_guard('server', 'logistics_auto_send_sent_elsewhere');
4936
4955
  j := public.logistics_afhandeling_fulfillment_order(p_order_id);
4937
4956
  IF NOT coalesce((j->>'verstuurd')::boolean, false) THEN RETURN NULL; END IF;
4938
4957
  SELECT min(a.created_at) INTO v_at FROM public.floriday_loading_attempts a
@@ -4970,6 +4989,7 @@ DO $fsdo$ BEGIN
4970
4989
  AS $function$
4971
4990
  DECLARE r public.logistics_auto_send; v_tekst text; v_status text; v_sent timestamptz; v_how text; v_elders timestamptz;
4972
4991
  BEGIN
4992
+ PERFORM public.logistics_acc_guard('server', 'logistics_auto_send_status_core');
4973
4993
  SELECT * INTO r FROM public.logistics_auto_send a WHERE a.order_id = p_order_id OR p_order_id = ANY(a.order_ids)
4974
4994
  ORDER BY a.created_at DESC LIMIT 1;
4975
4995
  IF NOT FOUND THEN
@@ -5014,6 +5034,7 @@ DECLARE
5014
5034
  v_ov jsonb;
5015
5035
  v_val text;
5016
5036
  BEGIN
5037
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_backorder_allowed');
5017
5038
  IF p_strategy_id IS NOT NULL THEN
5018
5039
  SELECT settings INTO v_settings FROM public.logistics_rule_configs
5019
5040
  WHERE strategy_id = p_strategy_id AND user_id = auth.uid() LIMIT 1;
@@ -5164,6 +5185,7 @@ DO $fsdo$ BEGIN
5164
5185
  AS $function$
5165
5186
  DECLARE v_last record; v_cur text; v_shell text;
5166
5187
  BEGIN
5188
+ PERFORM public.logistics_acc_guard('server', 'logistics_base_url_check_status');
5167
5189
  PERFORM public.logistics_base_url_checks_resolve();
5168
5190
  SELECT value INTO v_cur FROM public.module_runtime_config WHERE key = 'logistics_tick_base_url';
5169
5191
  SELECT value INTO v_shell FROM public.module_runtime_config WHERE key = 'shell_base_url';
@@ -5196,6 +5218,7 @@ DECLARE
5196
5218
  q_status int; q_content text; q_done boolean;
5197
5219
  v_ping_ok boolean; v_route_ok boolean; v_rows int;
5198
5220
  BEGIN
5221
+ PERFORM public.logistics_acc_guard('server', 'logistics_base_url_checks_resolve');
5199
5222
  FOR r IN SELECT * FROM public.logistics_base_url_checks WHERE status = 'wachtend' ORDER BY id FOR UPDATE SKIP LOCKED LOOP
5200
5223
  SELECT h.status_code, h.content, true INTO p_status, p_content, p_done
5201
5224
  FROM net._http_response h WHERE h.id = r.ping_request_id;
@@ -5262,6 +5285,7 @@ DO $fsdo$ BEGIN
5262
5285
  STABLE SECURITY DEFINER
5263
5286
  SET search_path TO 'public'
5264
5287
  AS $function$
5288
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_belading_verstuurder');
5265
5289
  SELECT CASE WHEN lower(btrim(value)) IN ('engine','afhandeling') THEN lower(btrim(value)) END
5266
5290
  FROM public.module_runtime_config WHERE key = 'belading_verstuurder'
5267
5291
  $function$
@@ -5377,6 +5401,7 @@ DO $fsdo$ BEGIN
5377
5401
  SET search_path TO 'public'
5378
5402
  AS $function$
5379
5403
  BEGIN
5404
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_blocked_orders');
5380
5405
  IF auth.uid() IS NULL THEN
5381
5406
  RAISE EXCEPTION 'Niet ingelogd';
5382
5407
  END IF;
@@ -5414,6 +5439,7 @@ DECLARE
5414
5439
  v_pending integer := 0;
5415
5440
  v_last timestamptz;
5416
5441
  BEGIN
5442
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_blocked_overview');
5417
5443
  IF auth.uid() IS NULL THEN
5418
5444
  RAISE EXCEPTION 'Niet ingelogd';
5419
5445
  END IF;
@@ -5446,6 +5472,7 @@ DO $fsdo$ BEGIN
5446
5472
  STABLE SECURITY DEFINER
5447
5473
  SET search_path TO 'public'
5448
5474
  AS $function$
5475
+ SELECT public.logistics_acc_guard('server', 'logistics_buffer_closed_for_join');
5449
5476
  SELECT b.closed_at IS NOT NULL
5450
5477
  OR (b.close_at IS NOT NULL AND b.close_at <= now())
5451
5478
  OR public.logistics_buffer_handled(b.id)
@@ -5511,6 +5538,7 @@ DECLARE
5511
5538
  v_settings jsonb;
5512
5539
  d jsonb;
5513
5540
  BEGIN
5541
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_buffer_decision');
5514
5542
  IF p_strategy_id IS NOT NULL THEN
5515
5543
  SELECT settings INTO v_settings FROM public.logistics_rule_configs
5516
5544
  WHERE strategy_id = p_strategy_id AND (v_user IS NULL OR user_id = v_user)
@@ -5690,6 +5718,7 @@ DECLARE
5690
5718
  i int;
5691
5719
  v_locked uuid[] := ARRAY[]::uuid[];
5692
5720
  BEGIN
5721
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_buffer_detach_late_orders');
5693
5722
  FOR r IN
5694
5723
  SELECT b.id, b.buffer_key,
5695
5724
  (SELECT count(*) FROM public.orders o WHERE o.buffer_id = b.id AND o.deleted_at IS NULL) AS orders
@@ -5812,6 +5841,7 @@ DO $fsdo$ BEGIN
5812
5841
  STABLE SECURITY DEFINER
5813
5842
  SET search_path TO 'public'
5814
5843
  AS $function$
5844
+ SELECT public.logistics_acc_guard('server', 'logistics_buffer_frozen');
5815
5845
  SELECT p_buffer IS NOT NULL AND (
5816
5846
  EXISTS (SELECT 1 FROM logistics_active.order_carts oc
5817
5847
  WHERE oc.buffer_id = p_buffer
@@ -5839,6 +5869,7 @@ DO $fsdo$ BEGIN
5839
5869
  STABLE SECURITY DEFINER
5840
5870
  SET search_path TO 'public'
5841
5871
  AS $function$
5872
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_buffer_frozen_order');
5842
5873
  SELECT EXISTS (
5843
5874
  SELECT 1
5844
5875
  FROM public.orders o
@@ -5868,6 +5899,7 @@ DO $fsdo$ BEGIN
5868
5899
  STABLE SECURITY DEFINER
5869
5900
  SET search_path TO 'public'
5870
5901
  AS $function$
5902
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_buffer_handled');
5871
5903
  WITH karren AS (
5872
5904
  SELECT oc.id, oc.cart_number, oc.order_id
5873
5905
  FROM logistics_active.order_carts oc
@@ -5924,6 +5956,7 @@ DECLARE
5924
5956
  v_uid uuid;
5925
5957
  v_id uuid;
5926
5958
  BEGIN
5959
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_buffer_notify');
5927
5960
  v_uid := auth.uid();
5928
5961
  IF v_uid IS NULL THEN
5929
5962
  SELECT user_id INTO v_uid FROM public.logistics_rule_configs
@@ -5964,6 +5997,7 @@ DECLARE
5964
5997
  v_id uuid;
5965
5998
  v_closed boolean;
5966
5999
  BEGIN
6000
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_buffer_open_key');
5967
6001
  IF p_base_key IS NULL OR btrim(p_base_key) = '' THEN
5968
6002
  RETURN p_base_key;
5969
6003
  END IF;
@@ -6017,6 +6051,7 @@ DECLARE
6017
6051
  d jsonb;
6018
6052
  results jsonb := '[]'::jsonb;
6019
6053
  BEGIN
6054
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_buffer_simulate');
6020
6055
  IF jsonb_typeof(p_orders) <> 'array' THEN
6021
6056
  RETURN jsonb_build_object('orders', '[]'::jsonb, 'groups', '[]'::jsonb);
6022
6057
  END IF;
@@ -6063,6 +6098,7 @@ DO $fsdo$ BEGIN
6063
6098
  AS $function$
6064
6099
  DECLARE o public.orders%ROWTYPE; d jsonb; v_ref text; v_key text; v_buffer uuid; v_try int := 0; v_skip text[] := '{}';
6065
6100
  BEGIN
6101
+ PERFORM public.logistics_acc_guard('server', 'logistics_buffer_target');
6066
6102
  SELECT * INTO o FROM public.orders WHERE id = p_order_id;
6067
6103
  IF NOT FOUND OR o.deleted_at IS NOT NULL THEN RETURN jsonb_build_object('soort','geen'); END IF;
6068
6104
  IF public.logistics_order_buffer_excluded(o.id) THEN RETURN jsonb_build_object('soort','uitgesloten'); END IF;
@@ -6137,6 +6173,7 @@ DO $fsdo$ BEGIN
6137
6173
  AS $function$
6138
6174
  DECLARE uid uuid := COALESCE(p_user_id, auth.uid()); n integer;
6139
6175
  BEGIN
6176
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cancel_order');
6140
6177
  IF uid IS NULL THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
6141
6178
 
6142
6179
  UPDATE public.logistics_tasks
@@ -6165,6 +6202,7 @@ AS $function$
6165
6202
  DECLARE
6166
6203
  v_n integer;
6167
6204
  BEGIN
6205
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cancel_orphan_tasks');
6168
6206
  UPDATE public.logistics_tasks t
6169
6207
  SET status = 'cancelled',
6170
6208
  updated_at = now(),
@@ -6215,6 +6253,7 @@ DO $fsdo$ BEGIN
6215
6253
  AS $function$
6216
6254
  DECLARE v_n integer := 0;
6217
6255
  BEGIN
6256
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cancel_stale_cart_pick_rows');
6218
6257
  IF p_order_ids IS NULL OR array_length(p_order_ids,1) IS NULL THEN RETURN 0; END IF;
6219
6258
  UPDATE public.pick_queue q
6220
6259
  SET cancelled_at = now(), updated_at = now(),
@@ -6271,6 +6310,7 @@ DECLARE
6271
6310
  v_capacity numeric;
6272
6311
  v_result jsonb := '[]'::jsonb;
6273
6312
  BEGIN
6313
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_capacity_day_check');
6274
6314
  SELECT settings, user_id INTO v_settings, v_owner
6275
6315
  FROM public.logistics_rule_configs
6276
6316
  WHERE (v_user IS NULL OR user_id = v_user)
@@ -6531,6 +6571,7 @@ DO $fsdo$ BEGIN
6531
6571
  AS $function$
6532
6572
  DECLARE v_n int; v_ok int; v_bad text; v_done int;
6533
6573
  BEGIN
6574
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_archive');
6534
6575
  IF auth.uid() IS NULL OR NOT public.logistics_is_beheer() THEN
6535
6576
  RAISE EXCEPTION 'Alleen beheer mag karren archiveren.';
6536
6577
  END IF;
@@ -6568,6 +6609,7 @@ DO $fsdo$ BEGIN
6568
6609
  STABLE SECURITY DEFINER
6569
6610
  SET search_path TO 'public'
6570
6611
  AS $function$
6612
+ SELECT public.logistics_acc_guard('server', 'logistics_cart_archive_classify');
6571
6613
  WITH k AS MATERIALIZED (SELECT public.logistics_tz() AS tz, public.logistics_local_today() AS d),
6572
6614
  base AS MATERIALIZED (
6573
6615
  SELECT c.id, c.cart_number, c.buffer_id, c.order_id, c.created_at,
@@ -6654,6 +6696,7 @@ DO $fsdo$ BEGIN
6654
6696
  SET search_path TO 'public'
6655
6697
  AS $function$
6656
6698
  BEGIN
6699
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_archive_preview');
6657
6700
  IF auth.uid() IS NULL OR NOT public.logistics_is_beheer() THEN
6658
6701
  RAISE EXCEPTION 'Alleen beheer mag de archiveerlijst bekijken.';
6659
6702
  END IF;
@@ -6704,6 +6747,7 @@ DO $fsdo$ BEGIN
6704
6747
  AS $function$
6705
6748
  DECLARE v_n int; v_weg int;
6706
6749
  BEGIN
6750
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_barcode_opschonen');
6707
6751
  WITH kandidaat AS (
6708
6752
  SELECT b.cart_id FROM public.logistics_cart_barcode b
6709
6753
  WHERE b.created_at < now() - interval '14 days'
@@ -6733,7 +6777,9 @@ DO $fsdo$ BEGIN
6733
6777
  RETURNS text
6734
6778
  LANGUAGE sql
6735
6779
  IMMUTABLE
6780
+ SET search_path TO 'public'
6736
6781
  AS $function$
6782
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_barcode_value');
6737
6783
  SELECT CASE WHEN _cart_id IS NULL THEN NULL
6738
6784
  ELSE 'LC' || upper(substring(replace(_cart_id::text, '-', '') from 1 for 16))
6739
6785
  END;
@@ -6750,6 +6796,7 @@ DO $fsdo$ BEGIN
6750
6796
  STABLE SECURITY DEFINER
6751
6797
  SET search_path TO 'public'
6752
6798
  AS $function$
6799
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_checkin_at');
6753
6800
  select min(coalesce(
6754
6801
  lt.planned_end,
6755
6802
  lt.due_at,
@@ -6771,6 +6818,7 @@ DO $fsdo$ BEGIN
6771
6818
  STABLE SECURITY DEFINER
6772
6819
  SET search_path TO 'public'
6773
6820
  AS $function$
6821
+ SELECT public.logistics_acc_guard('server', 'logistics_cart_coverage_check');
6774
6822
  WITH o AS (
6775
6823
  SELECT id, order_number, order_source, status, buffer_id,
6776
6824
  (status IN ('Verzonden','Gereed voor facturatie')) afgehandeld
@@ -6822,6 +6870,7 @@ DO $fsdo$ BEGIN
6822
6870
  AS $function$
6823
6871
  DECLARE v_c record; v_crates int; v_buf int; v_start timestamptz; v_reason text; v_wait timestamptz;
6824
6872
  BEGIN
6873
+ PERFORM public.logistics_acc_guard('server', 'logistics_cart_extra_fields');
6825
6874
  SELECT * INTO v_c FROM logistics_active.order_carts WHERE id = p_cart_id;
6826
6875
  IF NOT FOUND THEN RETURN '{}'::jsonb; END IF;
6827
6876
  SELECT sum(coalesce(crates,0))::int INTO v_crates FROM logistics_active.order_cart_items WHERE cart_id = p_cart_id;
@@ -6851,6 +6900,7 @@ DO $fsdo$ BEGIN
6851
6900
  STABLE SECURITY DEFINER
6852
6901
  SET search_path TO 'public'
6853
6902
  AS $function$
6903
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_fixed_numbering');
6854
6904
  WITH c AS (SELECT * FROM public.order_carts WHERE id = p_cart_id),
6855
6905
  u AS (
6856
6906
  SELECT c2.id, c2.total_carts FROM c JOIN public.order_carts c2
@@ -6876,6 +6926,7 @@ DO $fsdo$ BEGIN
6876
6926
  STABLE SECURITY DEFINER
6877
6927
  SET search_path TO 'public'
6878
6928
  AS $function$
6929
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_handled');
6879
6930
  WITH parts AS (
6880
6931
  SELECT DISTINCT btrim(t.nr) AS ref FROM unnest(string_to_array(coalesce(p_order_id, ''), ',')) AS t(nr) WHERE btrim(t.nr) <> ''
6881
6932
  ), keys AS (
@@ -6909,6 +6960,7 @@ DO $fsdo$ BEGIN
6909
6960
  STABLE SECURITY DEFINER
6910
6961
  SET search_path TO 'public'
6911
6962
  AS $function$
6963
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_has_packing_slip');
6912
6964
  SELECT p_cart_id IS NOT NULL AND EXISTS (
6913
6965
  SELECT 1 FROM public.pick_queue q
6914
6966
  WHERE q.cancelled_at IS NULL
@@ -6928,6 +6980,7 @@ DO $fsdo$ BEGIN
6928
6980
  STABLE SECURITY DEFINER
6929
6981
  SET search_path TO 'public'
6930
6982
  AS $function$
6983
+ SELECT public.logistics_acc_guard('server', 'logistics_cart_ids_frozen');
6931
6984
  SELECT c FROM unnest(COALESCE(p_cart_ids, ARRAY[]::uuid[])) AS c
6932
6985
  WHERE public.logistics_cart_is_frozen(c);
6933
6986
  $function$
@@ -6943,6 +6996,7 @@ DO $fsdo$ BEGIN
6943
6996
  STABLE SECURITY DEFINER
6944
6997
  SET search_path TO 'public'
6945
6998
  AS $function$
6999
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_index');
6946
7000
  WITH bounds AS (
6947
7001
  SELECT
6948
7002
  COALESCE(p_from, (now() AT TIME ZONE public.logistics_tz())::date) AS d_from,
@@ -7082,6 +7136,7 @@ DO $fsdo$ BEGIN
7082
7136
  STABLE SECURITY DEFINER
7083
7137
  SET search_path TO 'public'
7084
7138
  AS $function$
7139
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_is_archived');
7085
7140
  SELECT EXISTS (SELECT 1 FROM public.order_carts WHERE id = p_cart_id AND archived_at IS NOT NULL)
7086
7141
  $function$
7087
7142
  $fsdef$;
@@ -7096,6 +7151,7 @@ DO $fsdo$ BEGIN
7096
7151
  STABLE SECURITY DEFINER
7097
7152
  SET search_path TO 'public'
7098
7153
  AS $function$
7154
+ SELECT public.logistics_acc_guard('server', 'logistics_cart_is_frozen');
7099
7155
  SELECT p_cart_id IS NOT NULL AND (
7100
7156
  EXISTS (
7101
7157
  SELECT 1 FROM public.print_jobs pj
@@ -7126,6 +7182,7 @@ DO $fsdo$ BEGIN
7126
7182
  AS $function$
7127
7183
  declare c public.order_carts; l integer; p integer;
7128
7184
  begin
7185
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_is_full');
7129
7186
  select * into c from logistics_active.order_carts where id = p_cart_id;
7130
7187
  if not found then return false; end if;
7131
7188
  l := public.logistics_full_cart_min_layers();
@@ -7174,6 +7231,7 @@ DO $fsdo$ BEGIN
7174
7231
  AS $function$
7175
7232
  DECLARE v_id uuid; v_fix jsonb; v_lead uuid; v_items jsonb;
7176
7233
  BEGIN
7234
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_json_fixed');
7177
7235
  BEGIN v_id := nullif(p_cart->>'cartId','')::uuid; EXCEPTION WHEN others THEN RETURN p_cart; END;
7178
7236
  IF v_id IS NULL THEN RETURN p_cart; END IF;
7179
7237
  v_fix := public.logistics_cart_fixed_numbering(v_id);
@@ -7204,6 +7262,7 @@ DO $fsdo$ BEGIN
7204
7262
  STABLE SECURITY DEFINER
7205
7263
  SET search_path TO 'public'
7206
7264
  AS $function$
7265
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_layout_method');
7207
7266
  select jsonb_build_object(
7208
7267
  'layoutMethod', m,
7209
7268
  'showLayerLayout', m = 'afmetingen'
@@ -7229,6 +7288,7 @@ DO $fsdo$ BEGIN
7229
7288
  STABLE SECURITY DEFINER
7230
7289
  SET search_path TO 'public'
7231
7290
  AS $function$
7291
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_order_ids');
7232
7292
  SELECT coalesce(array_agg(DISTINCT x.oid) FILTER (WHERE x.oid IS NOT NULL), '{}') FROM (
7233
7293
  SELECT c.order_id AS oid FROM logistics_active.order_carts c WHERE c.id = p_cart_id
7234
7294
  UNION SELECT oi.order_id FROM logistics_active.order_cart_items ci JOIN public.order_items oi ON oi.id = ci.order_item_id
@@ -7247,6 +7307,7 @@ DO $fsdo$ BEGIN
7247
7307
  STABLE SECURITY DEFINER
7248
7308
  SET search_path TO 'public'
7249
7309
  AS $function$
7310
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_order_refs');
7250
7311
  select coalesce(array_agg(distinct o.order_number), '{}'::text[])
7251
7312
  from public.orders o
7252
7313
  where o.id in (
@@ -7269,6 +7330,7 @@ DO $fsdo$ BEGIN
7269
7330
  STABLE SECURITY DEFINER
7270
7331
  SET search_path TO 'public'
7271
7332
  AS $function$
7333
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_pick_starts_at');
7272
7334
  SELECT min(lt.planned_start) FROM public.logistics_tasks lt
7273
7335
  WHERE lt.order_ref = ANY(public.logistics_cart_order_refs(p_cart_id))
7274
7336
  AND lt.task_type = 'pick.execute' AND lt.status NOT IN ('done','cancelled','superseded','skipped')
@@ -7290,6 +7352,7 @@ DECLARE
7290
7352
  r record;
7291
7353
  v_status jsonb;
7292
7354
  BEGIN
7355
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_plan_overview');
7293
7356
  FOR r IN
7294
7357
  SELECT o.order_number, NULLIF(o.delivery_date, '')::date AS ddate
7295
7358
  FROM public.orders o
@@ -7346,6 +7409,7 @@ DO $fsdo$ BEGIN
7346
7409
  AS $function$
7347
7410
  DECLARE r jsonb; v_start timestamptz; v_code text; v_ref text;
7348
7411
  BEGIN
7412
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_plan_status_core');
7349
7413
  r := public.logistics_cart_plan_status_core_v152(p_ref);
7350
7414
  v_ref := coalesce(r->>'orderRef', p_ref);
7351
7415
  SELECT min(lt.planned_start) INTO v_start FROM public.logistics_tasks lt
@@ -7377,6 +7441,7 @@ declare
7377
7441
  v_cart jsonb; v_cart_id uuid; v_busy boolean := false; v_blocked text;
7378
7442
  v_uuid uuid; v_ref_type text; v_q_order uuid; v_t jsonb;
7379
7443
  begin
7444
+ PERFORM public.logistics_acc_guard('server', 'logistics_cart_plan_status_core_v152');
7380
7445
  if p_ref is null or btrim(p_ref) = '' then
7381
7446
  return jsonb_build_object('ready', false, 'released', false,
7382
7447
  'reason', 'Geen order- of documentnummer meegegeven.');
@@ -7525,6 +7590,7 @@ DO $fsdo$ BEGIN
7525
7590
  AS $function$
7526
7591
  DECLARE v_refs text[]; v_ref text; v_released boolean := false; v_until timestamptz;
7527
7592
  BEGIN
7593
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_release_reason');
7528
7594
  v_refs := public.logistics_cart_order_refs(p_cart_id);
7529
7595
  IF v_refs IS NULL OR cardinality(v_refs) = 0 THEN RETURN 'Deze kar hoort bij geen enkele actieve order.'; END IF;
7530
7596
  FOREACH v_ref IN ARRAY v_refs LOOP
@@ -7549,7 +7615,8 @@ DO $fsdo$ BEGIN
7549
7615
  LANGUAGE sql
7550
7616
  STABLE SECURITY DEFINER
7551
7617
  SET search_path TO 'public'
7552
- AS $function$ select public.logistics_cart_release_reason(p_cart_id) is null; $function$
7618
+ AS $function$
7619
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_released'); select public.logistics_cart_release_reason(p_cart_id) is null; $function$
7553
7620
  $fsdef$;
7554
7621
  EXCEPTION WHEN undefined_object OR undefined_table OR undefined_function OR invalid_schema_name THEN
7555
7622
  RAISE NOTICE 'logistiek-engine: functie public.logistics_cart_released overgeslagen (onderdeel van andere module ontbreekt): %', SQLERRM;
@@ -7561,7 +7628,8 @@ DO $fsdo$ BEGIN
7561
7628
  LANGUAGE sql
7562
7629
  STABLE SECURITY DEFINER
7563
7630
  SET search_path TO 'public'
7564
- AS $function$ SELECT EXISTS (SELECT 1 FROM public.logistics_control_scan s
7631
+ AS $function$
7632
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_scanned'); SELECT EXISTS (SELECT 1 FROM public.logistics_control_scan s
7565
7633
  WHERE s.cart_id = p_cart_id AND s.approved_at IS NOT NULL AND s.status <> 'geannuleerd') $function$
7566
7634
  $fsdef$;
7567
7635
  EXCEPTION WHEN undefined_object OR undefined_table OR undefined_function OR invalid_schema_name THEN
@@ -7715,6 +7783,7 @@ DO $fsdo$ BEGIN
7715
7783
  STABLE SECURITY DEFINER
7716
7784
  SET search_path TO 'public'
7717
7785
  AS $function$
7786
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_slip_queued');
7718
7787
  SELECT p_cart IS NOT NULL AND EXISTS (
7719
7788
  SELECT 1 FROM public.print_jobs pj
7720
7789
  WHERE pj.payload->>'cart_id' = p_cart::text AND pj.documenttype = 'pakbon'
@@ -7760,6 +7829,7 @@ DO $fsdo$ BEGIN
7760
7829
  AS $function$
7761
7830
  DECLARE r record; v_res jsonb := '[]'::jsonb; v_why text;
7762
7831
  BEGIN
7832
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_unarchive');
7763
7833
  IF auth.uid() IS NULL OR NOT public.logistics_is_beheer() THEN
7764
7834
  RAISE EXCEPTION 'Alleen beheer mag karren terugzetten.';
7765
7835
  END IF;
@@ -7798,6 +7868,7 @@ DO $fsdo$ BEGIN
7798
7868
  STABLE SECURITY DEFINER
7799
7869
  SET search_path TO 'public'
7800
7870
  AS $function$
7871
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_units');
7801
7872
  WITH idx AS (SELECT * FROM public.logistics_cart_index(p_from, p_to)),
7802
7873
  u AS (SELECT * FROM public.logistics_pick_units()),
7803
7874
  j AS (
@@ -7836,6 +7907,7 @@ DO $fsdo$ BEGIN
7836
7907
  STABLE SECURITY DEFINER
7837
7908
  SET search_path TO 'public'
7838
7909
  AS $function$
7910
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_cart_wait_until');
7839
7911
  SELECT CASE WHEN public.logistics_cart_is_full(p_cart_id) OR public.logistics_pick_partial_mode() = 'also_before' THEN NULL
7840
7912
  ELSE coalesce(
7841
7913
  (SELECT min(lt.planned_start) FROM public.logistics_tasks lt
@@ -7860,6 +7932,7 @@ DECLARE
7860
7932
  s jsonb;
7861
7933
  v numeric;
7862
7934
  BEGIN
7935
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_carts_per_print');
7863
7936
  SELECT settings INTO s
7864
7937
  FROM public.logistics_rule_configs
7865
7938
  ORDER BY is_active DESC, (status = 'actief') DESC, updated_at DESC
@@ -7889,6 +7962,7 @@ DECLARE
7889
7962
  v_allow boolean := public.logistics_backorder_allowed(p_strategy_id);
7890
7963
  v_shortages jsonb;
7891
7964
  BEGIN
7965
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_check_order_allowed');
7892
7966
  IF p_lines IS NULL OR jsonb_typeof(p_lines) <> 'array' THEN
7893
7967
  RETURN jsonb_build_object('allowed', true, 'allowBackorder', v_allow, 'shortages', '[]'::jsonb);
7894
7968
  END IF;
@@ -7950,6 +8024,7 @@ DECLARE
7950
8024
  emails text[]; prio_text text; prio integer;
7951
8025
  alert_id uuid; note_id uuid; lines text := '';
7952
8026
  BEGIN
8027
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_check_order_stock');
7953
8028
  SELECT * INTO ev FROM public.logistics_events WHERE id = p_event_id;
7954
8029
  IF NOT FOUND OR ev.event_type <> 'order.received' OR ev.shadow THEN RETURN NULL; END IF;
7955
8030
 
@@ -8062,6 +8137,7 @@ DO $fsdo$ BEGIN
8062
8137
  AS $function$
8063
8138
  DECLARE t public.logistics_tasks%ROWTYPE;
8064
8139
  BEGIN
8140
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_claim_next_task');
8065
8141
  SELECT * INTO t FROM public.logistics_tasks
8066
8142
  WHERE user_id = auth.uid() AND owner_module = p_owner_module
8067
8143
  AND status = 'planned' AND shadow = false
@@ -8090,6 +8166,7 @@ DO $fsdo$ BEGIN
8090
8166
  AS $function$
8091
8167
  DECLARE t public.logistics_tasks%ROWTYPE;
8092
8168
  BEGIN
8169
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_claim_task');
8093
8170
  SELECT * INTO t FROM public.logistics_tasks
8094
8171
  WHERE id = p_task_id AND user_id = auth.uid() AND status = 'planned'
8095
8172
  FOR UPDATE SKIP LOCKED;
@@ -8121,6 +8198,7 @@ DECLARE
8121
8198
  v_after bigint;
8122
8199
  v_limit integer := greatest(1, least(coalesce(p_limit, 20000), 100000));
8123
8200
  BEGIN
8201
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cleanup_duplicate_order_lines');
8124
8202
  IF p_order_id IS NULL THEN
8125
8203
  RETURN jsonb_build_object('ok', false, 'reden', 'geen_order');
8126
8204
  END IF;
@@ -8219,6 +8297,7 @@ DECLARE
8219
8297
  v_limit integer := GREATEST(100, LEAST(COALESCE(p_limit, 20000), 200000));
8220
8298
  v_trace int := 0; v_arch int := 0; v_pick int := 0; v_barcode int := 0; v_autolink int := 0; n int; i int; r int;
8221
8299
  BEGIN
8300
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cleanup_history');
8222
8301
  FOR i IN 1..4 LOOP
8223
8302
  n := 0;
8224
8303
  IF v_trace_days IS NOT NULL AND v_trace_days >= 1 THEN
@@ -8283,6 +8362,7 @@ DECLARE
8283
8362
  v_zonder_kar int := 0;
8284
8363
  v_verdwenen_kar int := 0;
8285
8364
  BEGIN
8365
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cleanup_orphan_print_jobs');
8286
8366
  UPDATE public.print_jobs j
8287
8367
  SET status = 'geannuleerd'::print_job_status,
8288
8368
  foutmelding = 'Vervallen: deze pakbon hoorde bij een order in plaats van bij een kar. Er staan nieuwe pakbonnen per kar klaar.',
@@ -8325,6 +8405,7 @@ DECLARE
8325
8405
  v_days integer := public.logistics_task_retention_days();
8326
8406
  v_deleted integer := 0;
8327
8407
  BEGIN
8408
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cleanup_tasks');
8328
8409
  -- Geen ingestelde bewaartermijn: niets opruimen en dat duidelijk melden.
8329
8410
  IF v_days IS NULL OR v_days < 1 THEN
8330
8411
  RETURN jsonb_build_object(
@@ -8469,6 +8550,7 @@ DO $fsdo$ BEGIN
8469
8550
  STABLE SECURITY DEFINER
8470
8551
  SET search_path TO 'public'
8471
8552
  AS $function$
8553
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_consistency_check');
8472
8554
  WITH vandaag AS (SELECT (now() AT TIME ZONE public.logistics_tz())::date AS d),
8473
8555
  idx AS (SELECT * FROM public.logistics_cart_index((SELECT d FROM vandaag), (SELECT d FROM vandaag))),
8474
8556
  agenda AS (SELECT a.cart_count FROM public.logistics_pick_agenda((SELECT d FROM vandaag), (SELECT d FROM vandaag)) a),
@@ -8545,6 +8627,7 @@ declare
8545
8627
  v_source text;
8546
8628
  v_count integer;
8547
8629
  begin
8630
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_complete_cart');
8548
8631
  select c.order_id, c.cart_number into v_order, v_index
8549
8632
  from logistics_active.order_carts c where c.id = p_cart_id;
8550
8633
  if v_order is null or v_index is null then
@@ -8594,6 +8677,7 @@ declare
8594
8677
  v_is_flo boolean; v_scanner uuid; v_printer uuid; v_scan public.logistics_control_scan%rowtype;
8595
8678
  v_res jsonb; v_ok boolean; v_scan_only boolean; v_marked integer;
8596
8679
  begin
8680
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_scan_approve');
8597
8681
  v_look := public.logistics_control_scan_lookup(p_barcode);
8598
8682
  if not coalesce((v_look->>'ok')::boolean, false) then
8599
8683
  return v_look;
@@ -8678,6 +8762,7 @@ DO $fsdo$ BEGIN
8678
8762
  SET search_path TO 'public'
8679
8763
  AS $function$
8680
8764
  begin
8765
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_scan_claim');
8681
8766
  update public.logistics_control_scan s
8682
8767
  set status = 'mislukt',
8683
8768
  error_code = 'wachtlimiet',
@@ -8722,6 +8807,7 @@ DO $fsdo$ BEGIN
8722
8807
  AS $function$
8723
8808
  declare r public.logistics_control_scan%rowtype; v_status text;
8724
8809
  begin
8810
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_scan_finish');
8725
8811
  v_status := coalesce(_status, case when _ok then 'in_printwachtrij' else 'mislukt' end);
8726
8812
  if v_status = 'geprint' then v_status := 'in_printwachtrij'; end if;
8727
8813
  update public.logistics_control_scan
@@ -8755,6 +8841,7 @@ declare
8755
8841
  v_look jsonb; v_cart_id uuid; v_order_id uuid; v_sales text;
8756
8842
  v_scan public.logistics_control_scan%rowtype; v_seq record;
8757
8843
  begin
8844
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_scan_lookup');
8758
8845
  v_look := public.logistics_barcode_lookup(p_barcode);
8759
8846
  if not coalesce((v_look->>'ok')::boolean, false) then return v_look; end if;
8760
8847
  v_cart_id := nullif(v_look->'cart'->>'cartId','')::uuid;
@@ -8793,6 +8880,7 @@ DO $fsdo$ BEGIN
8793
8880
  STABLE SECURITY DEFINER
8794
8881
  SET search_path TO 'public'
8795
8882
  AS $function$
8883
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_control_scan_overview');
8796
8884
  select coalesce(jsonb_agg(x order by x->>'updatedAt' desc), '[]'::jsonb)
8797
8885
  from (
8798
8886
  select jsonb_build_object(
@@ -8830,6 +8918,7 @@ DECLARE
8830
8918
  s public.logistics_control_scan%rowtype;
8831
8919
  v_look jsonb; v_cart jsonb; v_layout jsonb; v_layout_id uuid; v_doc_type text; v_res jsonb;
8832
8920
  BEGIN
8921
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_scan_print_own');
8833
8922
  SELECT * INTO s FROM public.logistics_control_scan WHERE id = p_scan_id;
8834
8923
  IF s.id IS NULL THEN
8835
8924
  RETURN jsonb_build_object('ok', false, 'error', 'Deze controle bestaat niet meer.');
@@ -8886,6 +8975,7 @@ DO $fsdo$ BEGIN
8886
8975
  AS $function$
8887
8976
  DECLARE v_n integer := 0; v_c uuid;
8888
8977
  BEGIN
8978
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_scan_record_afmelding');
8889
8979
  IF p_order_id IS NULL THEN RETURN 0; END IF;
8890
8980
  FOR v_c IN SELECT oc.id FROM logistics_active.order_carts oc WHERE oc.order_id = p_order_id LOOP
8891
8981
  v_n := v_n + public.logistics_control_scan_record_afmelding_cart(v_c, p_bron);
@@ -8907,6 +8997,7 @@ AS $function$
8907
8997
  DECLARE v_bron text := CASE WHEN p_bron IN ('scanner','bulk','controlepost') THEN p_bron ELSE 'onbekend' END;
8908
8998
  v_n integer := 0; v_order uuid; v_number text; v_flo boolean;
8909
8999
  BEGIN
9000
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_scan_record_afmelding_cart');
8910
9001
  IF p_cart_id IS NULL THEN RETURN 0; END IF;
8911
9002
  SELECT (public.logistics_cart_order_ids(p_cart_id))[1] INTO v_order;
8912
9003
  SELECT o.order_number, nullif(btrim(coalesce(o.floriday_sales_order_id::text,'')),'') IS NOT NULL
@@ -8935,6 +9026,7 @@ DO $fsdo$ BEGIN
8935
9026
  AS $function$
8936
9027
  declare r public.logistics_control_scan%rowtype; v_res jsonb;
8937
9028
  begin
9029
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_scan_retry');
8938
9030
  update public.logistics_control_scan
8939
9031
  set status = case when is_floriday then 'afleverbrief_aangevraagd' else 'goedgekeurd' end,
8940
9032
  attempts = 0, locked_until = null, error = null, error_code = null, updated_at = now()
@@ -8972,6 +9064,7 @@ declare
8972
9064
  f jsonb;
8973
9065
  v_mode text;
8974
9066
  begin
9067
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_control_settings');
8975
9068
  select settings->'controle'->'fields' into f
8976
9069
  from public.logistics_rule_configs
8977
9070
  order by is_active desc, (status = 'actief') desc, updated_at desc
@@ -9006,6 +9099,7 @@ AS $function$
9006
9099
  DECLARE
9007
9100
  v jsonb;
9008
9101
  BEGIN
9102
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cron_health');
9009
9103
  IF auth.uid() IS NULL THEN
9010
9104
  RAISE EXCEPTION 'Niet ingelogd';
9011
9105
  END IF;
@@ -9051,6 +9145,7 @@ DECLARE
9051
9145
  v_tz text := public.logistics_opening_timezone();
9052
9146
  v_has_exception boolean;
9053
9147
  BEGIN
9148
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_day_windows');
9054
9149
  IF v_tz IS NULL THEN
9055
9150
  RAISE EXCEPTION 'Tijdzone van de vestiging ontbreekt in logistics_time_settings; werkuren kunnen niet berekend worden.';
9056
9151
  END IF;
@@ -9136,6 +9231,7 @@ DO $fsdo$ BEGIN
9136
9231
  STABLE SECURITY DEFINER
9137
9232
  SET search_path TO 'public'
9138
9233
  AS $function$
9234
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_delivery_agenda');
9139
9235
  WITH idx AS (SELECT * FROM public.logistics_cart_units('1900-01-01'::date, '2999-12-31'::date)),
9140
9236
  scope AS (
9141
9237
  SELECT * FROM idx
@@ -9182,6 +9278,7 @@ DO $fsdo$ BEGIN
9182
9278
  AS $function$
9183
9279
  DECLARE v_tz text := public.logistics_tz(); v_moments jsonb; v_best record; v_list jsonb; v_rows jsonb;
9184
9280
  BEGIN
9281
+ PERFORM public.logistics_acc_guard('server', 'logistics_departure_calc');
9185
9282
  IF v_tz IS NULL THEN
9186
9283
  RETURN jsonb_build_object('ok', false, 'reason', 'De tijdzone van de vestiging ontbreekt. Stel die in bij Werktijden.');
9187
9284
  END IF;
@@ -9250,6 +9347,7 @@ DECLARE v_tz text := public.logistics_tz(); v_carrier uuid := p_carrier_id; v_no
9250
9347
  v jsonb; v_feasible boolean; v_first date; v_first_dl timestamptz; d date; t jsonb; v_reason text;
9251
9348
  v_next jsonb; m jsonb; v_own jsonb;
9252
9349
  BEGIN
9350
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_departure_preview');
9253
9351
  IF v_tz IS NULL THEN
9254
9352
  RETURN jsonb_build_object('ok', false, 'reason', 'De tijdzone van de vestiging ontbreekt. Stel die in bij Werktijden.');
9255
9353
  END IF;
@@ -9334,6 +9432,7 @@ DO $fsdo$ BEGIN
9334
9432
  STABLE SECURITY DEFINER
9335
9433
  SET search_path TO 'public'
9336
9434
  AS $function$
9435
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_document_layout');
9337
9436
  SELECT public.logistics_document_layout_v2(_document_code, false);
9338
9437
  $function$
9339
9438
  $fsdef$;
@@ -9354,6 +9453,7 @@ DECLARE
9354
9453
  k text;
9355
9454
  v text;
9356
9455
  BEGIN
9456
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_document_station');
9357
9457
  SELECT settings->'pickstations'->'fields' INTO f
9358
9458
  FROM public.logistics_rule_configs
9359
9459
  ORDER BY is_active DESC, (status = 'actief') DESC, updated_at DESC
@@ -9445,6 +9545,7 @@ DO $fsdo$ BEGIN
9445
9545
  STABLE SECURITY DEFINER
9446
9546
  SET search_path TO 'public'
9447
9547
  AS $function$
9548
+ SELECT public.logistics_acc_guard('server', 'logistics_double_group_lines');
9448
9549
  WITH g AS (
9449
9550
  SELECT oi.id, oi.order_id,
9450
9551
  (SELECT pg.id FROM public.product_groups pg
@@ -9480,6 +9581,7 @@ DECLARE
9480
9581
  ev public.logistics_events%ROWTYPE;
9481
9582
  new_id uuid;
9482
9583
  BEGIN
9584
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_emit_event');
9483
9585
  IF uid IS NULL THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
9484
9586
 
9485
9587
  IF p_idempotency_key IS NOT NULL THEN
@@ -9525,6 +9627,7 @@ DO $fsdo$ BEGIN
9525
9627
  SET search_path TO 'public'
9526
9628
  AS $function$
9527
9629
  BEGIN
9630
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_enqueue_shipping_note_with_slip');
9528
9631
  -- Bewust leeg. Zie trg_logistics_shipping_note_after_slip op public.print_jobs.
9529
9632
  RETURN NULL;
9530
9633
  END;
@@ -9545,6 +9648,7 @@ DECLARE
9545
9648
  item public.pick_queue; dt public.pick_document_types; doc_code text; slip public.print_jobs;
9546
9649
  layout_meta jsonb; v_layout uuid; v_doc_type text := 'sticker'; v_layout_type text; v_plek uuid; v_cart text; v_res jsonb;
9547
9650
  BEGIN
9651
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_enqueue_sticker_with_slip');
9548
9652
  IF NOT public.logistics_sticker_follows_slip() THEN RETURN NULL; END IF;
9549
9653
  IF coalesce(_is_herprint, false) THEN RETURN NULL; END IF;
9550
9654
  SELECT * INTO item FROM public.pick_queue WHERE id = _queue_item_id;
@@ -9638,6 +9742,7 @@ AS $function$
9638
9742
  DECLARE
9639
9743
  v_code text;
9640
9744
  BEGIN
9745
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_ensure_cart_barcode');
9641
9746
  IF _cart_id IS NULL THEN RETURN NULL; END IF;
9642
9747
  v_code := public.logistics_cart_barcode_value(_cart_id);
9643
9748
 
@@ -9664,6 +9769,7 @@ declare
9664
9769
  v_log_id uuid; v_order_id uuid; v_order_ref text; v_unit_ref text;
9665
9770
  v_actions jsonb := '[]'::jsonb; v_status jsonb; v_cart record; v_rows integer := 0;
9666
9771
  begin
9772
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_ensure_pick_data');
9667
9773
  insert into public.logistics_pick_data_requests(event_id, order_ref, missing, status)
9668
9774
  values (p_event_id, coalesce(btrim(p_ref), ''), coalesce(p_missing, '[]'::jsonb), 'processing')
9669
9775
  returning id into v_log_id;
@@ -9730,6 +9836,7 @@ DO $fsdo$ BEGIN
9730
9836
  SECURITY DEFINER
9731
9837
  SET search_path TO 'public'
9732
9838
  AS $function$
9839
+ SELECT public.logistics_acc_guard('server', 'logistics_ensure_runtime_defaults');
9733
9840
  INSERT INTO public.module_runtime_config (key, value, updated_at)
9734
9841
  VALUES ('belading_verstuurder', 'engine', now())
9735
9842
  ON CONFLICT (key) DO NOTHING;
@@ -9750,6 +9857,7 @@ DECLARE
9750
9857
  slip record; v_order public.orders; v_order_number text; v_cart uuid; v_bron boolean;
9751
9858
  v_fo integer := 0; v_bvo integer := 0; v_onbekend integer := 0; v_bekeken integer := 0;
9752
9859
  BEGIN
9860
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_ensure_shipping_notes');
9753
9861
  IF NOT public.logistics_shipping_note_follows_slip() THEN
9754
9862
  RETURN jsonb_build_object('actief', false, 'bekeken', 0, 'floriday', 0, 'eigen', 0);
9755
9863
  END IF;
@@ -9852,6 +9960,7 @@ DECLARE
9852
9960
  r record;
9853
9961
  v_key text;
9854
9962
  BEGIN
9963
+ PERFORM public.logistics_acc_guard('server', 'logistics_expand_line');
9855
9964
  IF p_product_id IS NULL OR COALESCE(p_qty, 0) <= 0 THEN RETURN; END IF;
9856
9965
 
9857
9966
  IF p_product_id = ANY(p_path) THEN
@@ -9911,6 +10020,7 @@ DO $fsdo$ BEGIN
9911
10020
  STABLE SECURITY DEFINER
9912
10021
  SET search_path TO 'public'
9913
10022
  AS $function$
10023
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_external_fulfillment_key_report');
9914
10024
  SELECT o.id, o.order_number, o.floriday_sales_order_id, count(*)::int,
9915
10025
  count(*) FILTER (WHERE nullif(btrim(coalesce(oi.source_line_key,'')),'') IS NULL)::int,
9916
10026
  count(*) FILTER (WHERE nullif(btrim(coalesce(oi.source_line_key,'')),'') IS NOT NULL
@@ -9935,6 +10045,7 @@ DO $fsdo$ BEGIN
9935
10045
  AS $function$
9936
10046
  DECLARE t public.logistics_tasks%ROWTYPE;
9937
10047
  BEGIN
10048
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_fail_task');
9938
10049
  UPDATE public.logistics_tasks
9939
10050
  SET status = 'failed', error = p_error, claimed_by = NULL, claimed_at = NULL, updated_at = now()
9940
10051
  WHERE id = p_task_id AND user_id = auth.uid()
@@ -9958,6 +10069,7 @@ DECLARE
9958
10069
  v_since timestamptz := (SELECT departure_rule_since FROM public.logistics_time_settings ORDER BY updated_at DESC NULLS LAST LIMIT 1);
9959
10070
  v_n integer := 0;
9960
10071
  BEGIN
10072
+ PERFORM public.logistics_acc_guard('server', 'logistics_fill_cart_departure');
9961
10073
  IF v_since IS NULL THEN RETURN 0; END IF;
9962
10074
  WITH carts AS (
9963
10075
  SELECT c.id FROM public.order_carts c
@@ -10005,6 +10117,7 @@ DECLARE
10005
10117
  v_nr text;
10006
10118
  v_order_id uuid;
10007
10119
  BEGIN
10120
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_fix_wrong_shipping_notes');
10008
10121
  FOR r IN
10009
10122
  SELECT j.id,
10010
10123
  nullif(replace(j.idempotentie_sleutel, 'verzendbrief-bij-pakbon:', ''), '') AS slip_txt,
@@ -10055,6 +10168,7 @@ DO $fsdo$ BEGIN
10055
10168
  STABLE SECURITY DEFINER
10056
10169
  SET search_path TO 'public'
10057
10170
  AS $function$
10171
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_floriday_cart_plan');
10058
10172
  WITH so AS (
10059
10173
  SELECT o.floriday_sales_order_id::text AS sid FROM public.orders o WHERE o.id = p_order_id
10060
10174
  ), lc AS (
@@ -10086,6 +10200,7 @@ DO $fsdo$ BEGIN
10086
10200
  SET search_path TO 'public'
10087
10201
  AS $function$
10088
10202
  BEGIN
10203
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_floriday_claim_pushes');
10089
10204
  RETURN QUERY
10090
10205
  WITH due AS (
10091
10206
  SELECT p.id
@@ -10141,6 +10256,7 @@ DO $fsdo$ BEGIN
10141
10256
  SECURITY DEFINER
10142
10257
  SET search_path TO 'public'
10143
10258
  AS $function$
10259
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_floriday_finish_push');
10144
10260
  SELECT public.logistics_floriday_finish_push_v2(
10145
10261
  _id, _revision, _ok, _error, _fulfillment_order_id, _sent_hash,
10146
10262
  _permanent, _max_attempts, _max_age_hours, NULL, NULL, NULL
@@ -10158,6 +10274,7 @@ DO $fsdo$ BEGIN
10158
10274
  SECURITY DEFINER
10159
10275
  SET search_path TO 'public'
10160
10276
  AS $function$
10277
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_floriday_finish_push_v2');
10161
10278
  SELECT public.logistics_floriday_finish_push_v3(
10162
10279
  _id, _revision,
10163
10280
  CASE WHEN _ok THEN 'ok' ELSE 'error' END,
@@ -10189,6 +10306,7 @@ DECLARE
10189
10306
  _age_limit integer;
10190
10307
  _is_wait boolean;
10191
10308
  BEGIN
10309
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_floriday_finish_push_v3');
10192
10310
  SELECT * INTO _row FROM public.logistics_floriday_pushes WHERE id = _id FOR UPDATE;
10193
10311
  IF NOT FOUND THEN
10194
10312
  RETURN 'missing';
@@ -10398,6 +10516,7 @@ DO $fsdo$ BEGIN
10398
10516
  AS $function$
10399
10517
  DECLARE v jsonb;
10400
10518
  BEGIN
10519
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_floriday_is_read_only');
10401
10520
  BEGIN
10402
10521
  v := public.floriday_write_mode();
10403
10522
  EXCEPTION WHEN OTHERS THEN
@@ -10420,6 +10539,7 @@ DO $fsdo$ BEGIN
10420
10539
  AS $function$
10421
10540
  DECLARE v_count int; v_std int; v_id uuid;
10422
10541
  BEGIN
10542
+ PERFORM public.logistics_acc_guard('server', 'logistics_floriday_layout_id');
10423
10543
  SELECT count(*), count(*) FILTER (WHERE is_standaard IS TRUE)
10424
10544
  INTO v_count, v_std
10425
10545
  FROM public.document_layouts
@@ -10453,6 +10573,7 @@ DO $fsdo$ BEGIN
10453
10573
  SECURITY DEFINER
10454
10574
  SET search_path TO 'public'
10455
10575
  AS $function$
10576
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_floriday_log_refusal');
10456
10577
  INSERT INTO public.logistics_floriday_push_refusals (order_ref, reason, source_module, source_shell, action)
10457
10578
  VALUES (COALESCE(NULLIF(btrim(_order_ref), ''), 'onbekend'), _reason, _module, _shell, _action)
10458
10579
  $function$
@@ -10468,6 +10589,7 @@ DO $fsdo$ BEGIN
10468
10589
  SECURITY DEFINER
10469
10590
  SET search_path TO 'public'
10470
10591
  AS $function$
10592
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_floriday_log_send');
10471
10593
  INSERT INTO public.logistics_floriday_status_sends (order_ref, action, ok, http_status, detail, source_module, source_shell)
10472
10594
  VALUES (COALESCE(NULLIF(btrim(_order_ref), ''), 'onbekend'), _action, COALESCE(_ok,false), _http_status, _detail, _module, _shell)
10473
10595
  $function$
@@ -10540,6 +10662,7 @@ DO $fsdo$ BEGIN
10540
10662
  STABLE SECURITY DEFINER
10541
10663
  SET search_path TO 'public'
10542
10664
  AS $function$
10665
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_floriday_order_approved');
10543
10666
  SELECT EXISTS (SELECT 1 FROM public.logistics_control_scan s WHERE s.approved_at IS NOT NULL AND s.order_number = _order_ref)
10544
10667
  OR EXISTS (SELECT 1 FROM public.orders o
10545
10668
  JOIN public.order_items oi ON oi.order_id = o.id
@@ -10562,6 +10685,7 @@ AS $function$
10562
10685
  DECLARE
10563
10686
  _n integer;
10564
10687
  BEGIN
10688
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_floriday_prune_pushes');
10565
10689
  DELETE FROM public.logistics_floriday_pushes
10566
10690
  WHERE (
10567
10691
  (status = 'sent' AND sent_at IS NOT NULL AND sent_at < now() - make_interval(days => GREATEST(_days, 1)))
@@ -10585,6 +10709,7 @@ DO $fsdo$ BEGIN
10585
10709
  SET search_path TO 'public'
10586
10710
  AS $function$
10587
10711
  BEGIN
10712
+ PERFORM public.logistics_acc_guard('server', 'logistics_floriday_push_hold_read_only');
10588
10713
  UPDATE public.logistics_floriday_pushes
10589
10714
  SET status = 'pending', locked_until = NULL, locked_by = NULL,
10590
10715
  last_error = 'Tegengehouden: alleen lezen', last_error_code = 'alleen_lezen',
@@ -10608,6 +10733,7 @@ DECLARE
10608
10733
  _id uuid;
10609
10734
  _reason text;
10610
10735
  BEGIN
10736
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_floriday_queue_push');
10611
10737
  IF _order_ref IS NULL OR btrim(_order_ref) = '' THEN RETURN NULL; END IF;
10612
10738
 
10613
10739
  IF NOT public.logistics_floriday_status_updates_enabled() THEN
@@ -10648,6 +10774,7 @@ DO $fsdo$ BEGIN
10648
10774
  AS $function$
10649
10775
  DECLARE v_p int := 0; v_s int := 0;
10650
10776
  BEGIN
10777
+ PERFORM public.logistics_acc_guard('server', 'logistics_floriday_release_read_only');
10651
10778
  IF public.logistics_floriday_is_read_only() THEN
10652
10779
  RETURN jsonb_build_object('readOnly', true, 'pushes', 0, 'shippingNotes', 0);
10653
10780
  END IF;
@@ -10733,6 +10860,7 @@ DO $fsdo$ BEGIN
10733
10860
  STABLE SECURITY DEFINER
10734
10861
  SET search_path TO 'public'
10735
10862
  AS $function$
10863
+ SELECT public.logistics_acc_guard('server', 'logistics_frozen_allocation_scaled');
10736
10864
  WITH a AS (
10737
10865
  SELECT a.trade_item_key, a.source, a.group_id, a.qty AS old_qty,
10738
10866
  CASE WHEN COALESCE(a.line_qty, 0) > 0 THEN a.qty * GREATEST(COALESCE(p_new_qty, 0), 0) / a.line_qty ELSE a.qty END AS raw
@@ -10766,6 +10894,7 @@ DECLARE
10766
10894
  v_reason text; v_hard boolean; v_delivered integer := 0; v_cancelled integer := 0;
10767
10895
  v_open integer := 0; v_reasons jsonb := '[]'::jsonb;
10768
10896
  BEGIN
10897
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_fulfill_barcode_requests');
10769
10898
  FOR r IN
10770
10899
  SELECT v.print_job_id, v.cart_id::text AS cart_id, v.cart_index, v.order_ref, v.order_nummer,
10771
10900
  j.id AS job_id, j.payload
@@ -10881,6 +11010,7 @@ DO $fsdo$ BEGIN
10881
11010
  STABLE SECURITY DEFINER
10882
11011
  SET search_path TO 'public'
10883
11012
  AS $function$
11013
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_full_cart_min_layers');
10884
11014
  SELECT NULLIF(GREATEST(0, COALESCE(
10885
11015
  (SELECT public.logistics_rule_num(settings, 'karrenindeling', 'full_cart_min_layers', NULL)
10886
11016
  FROM public.logistics_rule_configs
@@ -10899,6 +11029,7 @@ DO $fsdo$ BEGIN
10899
11029
  STABLE SECURITY DEFINER
10900
11030
  SET search_path TO 'public'
10901
11031
  AS $function$
11032
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_full_cart_min_percentage');
10902
11033
  SELECT NULLIF(GREATEST(0, COALESCE(
10903
11034
  (SELECT public.logistics_rule_num(settings, 'karrenindeling', 'full_cart_min_percentage', NULL)
10904
11035
  FROM public.logistics_rule_configs
@@ -11020,6 +11151,7 @@ DO $fsdo$ BEGIN
11020
11151
  STABLE SECURITY DEFINER
11021
11152
  SET search_path TO 'public'
11022
11153
  AS $function$
11154
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_is_beheer');
11023
11155
  SELECT auth.uid() IS NOT NULL AND (
11024
11156
  public.has_role(auth.uid(), 'admin') OR public.has_role(auth.uid(), 'superadmin')
11025
11157
  OR public.has_role(auth.uid(), 'developer'))
@@ -11059,6 +11191,7 @@ DO $fsdo$ BEGIN
11059
11191
  AS $function$
11060
11192
  DECLARE v text := btrim(COALESCE(p_label, '')); j jsonb;
11061
11193
  BEGIN
11194
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_is_group_label');
11062
11195
  IF left(v, 1) = '{' THEN
11063
11196
  BEGIN j := v::jsonb; v := COALESCE(j->>'nl', j->>'en', j->>'value', v);
11064
11197
  EXCEPTION WHEN others THEN NULL; END;
@@ -11113,6 +11246,7 @@ DO $fsdo$ BEGIN
11113
11246
  STABLE SECURITY DEFINER
11114
11247
  SET search_path TO 'public'
11115
11248
  AS $function$
11249
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_item_external_fulfilled');
11116
11250
  SELECT EXISTS (SELECT 1 FROM public.logistics_external_fulfillment x
11117
11251
  WHERE x.order_id = p_order_id
11118
11252
  AND (x.full_fulfilled OR lower(btrim(coalesce(p_source_line_key,''))) = ANY (x.sales_order_ids)));
@@ -11149,6 +11283,7 @@ DO $fsdo$ BEGIN
11149
11283
  STABLE SECURITY DEFINER
11150
11284
  SET search_path TO 'public'
11151
11285
  AS $function$
11286
+ SELECT public.logistics_acc_guard('server', 'logistics_key_product');
11152
11287
  SELECT p.id FROM public.products p
11153
11288
  WHERE p.floriday_trade_item_id::text = p_key OR p.id::text = p_key
11154
11289
  OR p.trade_item_key = p_key OR ('product:' || p.id::text) = p_key
@@ -11167,6 +11302,7 @@ DO $fsdo$ BEGIN
11167
11302
  STABLE SECURITY DEFINER
11168
11303
  SET search_path TO 'public'
11169
11304
  AS $function$
11305
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_layout_method_status');
11170
11306
  SELECT jsonb_build_object(
11171
11307
  'methode', public.logistics_active_layout_method(),
11172
11308
  'actieveWerkwijze', (SELECT name FROM public.logistics_rule_configs WHERE is_active ORDER BY updated_at DESC LIMIT 1),
@@ -11190,6 +11326,7 @@ DO $fsdo$ BEGIN
11190
11326
  AS $function$
11191
11327
  DECLARE v_linked int := 0; v_orders int := 0; r record;
11192
11328
  BEGIN
11329
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_link_order_items');
11193
11330
  WITH kandidaten AS (
11194
11331
  SELECT oi.id, oi.order_id, public.logistics_resolve_product_id(oi.product_name::text) AS pid
11195
11332
  FROM logistics_active.order_items oi
@@ -11269,6 +11406,7 @@ DO $fsdo$ BEGIN
11269
11406
  STABLE SECURITY DEFINER
11270
11407
  SET search_path TO 'public'
11271
11408
  AS $function$
11409
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_local_hhmi');
11272
11410
  SELECT CASE WHEN p_ts IS NULL THEN NULL
11273
11411
  WHEN public.logistics_tz() IS NULL THEN to_char(p_ts AT TIME ZONE 'UTC', 'HH24:MI') || ' UTC (tijdzone ontbreekt bij Werktijden)'
11274
11412
  ELSE to_char(p_ts AT TIME ZONE public.logistics_tz(), 'HH24:MI') END
@@ -11287,6 +11425,7 @@ DO $fsdo$ BEGIN
11287
11425
  AS $function$
11288
11426
  DECLARE v_tz text := public.logistics_tz();
11289
11427
  BEGIN
11428
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_local_today');
11290
11429
  IF v_tz IS NULL THEN
11291
11430
  RAISE EXCEPTION 'De tijdzone van de vestiging ontbreekt. Stel die in bij Werktijden.' USING ERRCODE = 'P0001';
11292
11431
  END IF;
@@ -11308,6 +11447,7 @@ DECLARE v_cart public.order_carts; v_src text; v_orders uuid[]; v_o uuid; v_k uu
11308
11447
  v_was boolean; v_klaar jsonb := '[]'::jsonb; v_wacht jsonb := '[]'::jsonb; v_seq int; v_num text;
11309
11448
  v_huidig int[]; v_ordnr text; r record;
11310
11449
  BEGIN
11450
+ PERFORM public.logistics_acc_guard('server', 'logistics_mark_cart_delivered_core');
11311
11451
  IF p_cart_id IS NULL THEN RETURN jsonb_build_object('ok', false, 'reden', 'geen_kar'); END IF;
11312
11452
  PERFORM pg_advisory_xact_lock(hashtextextended('afmelden:' || p_cart_id::text, 0));
11313
11453
  SELECT * INTO v_cart FROM logistics_active.order_carts WHERE id = p_cart_id;
@@ -11400,6 +11540,7 @@ DECLARE
11400
11540
  v_reason text;
11401
11541
  i int := 0;
11402
11542
  BEGIN
11543
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_merge_decision');
11403
11544
  IF jsonb_typeof(v_lines) <> 'array' THEN
11404
11545
  RAISE EXCEPTION 'p_lines moet een JSON-array zijn';
11405
11546
  END IF;
@@ -11503,6 +11644,7 @@ DECLARE
11503
11644
  v_moved int; v_logged int; v_total int := 0; v_count int := 0;
11504
11645
  v_lines text[] := ARRAY[]::text[];
11505
11646
  BEGIN
11647
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_merge_floriday_lines');
11506
11648
  IF p_order_id IS NULL THEN RETURN p_order_id; END IF;
11507
11649
  IF NOT public.logistics_merge_lines_enabled() THEN RETURN p_order_id; END IF;
11508
11650
  IF NOT public.logistics_order_mergeable(p_order_id) THEN RETURN p_order_id; END IF;
@@ -11593,6 +11735,7 @@ DO $fsdo$ BEGIN
11593
11735
  AS $function$
11594
11736
  DECLARE v jsonb;
11595
11737
  BEGIN
11738
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_merge_lines_enabled');
11596
11739
  SELECT c.settings->'order_verwerking'->'fields'->'floriday_merge_lines' INTO v
11597
11740
  FROM public.logistics_rule_configs c WHERE c.is_active ORDER BY c.updated_at DESC LIMIT 1;
11598
11741
  RETURN v IS NOT NULL AND jsonb_typeof(v) = 'boolean' AND v = 'true'::jsonb;
@@ -11613,6 +11756,7 @@ DO $fsdo$ BEGIN
11613
11756
  AS $function$
11614
11757
  declare r record; v_count integer := 0;
11615
11758
  begin
11759
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_merge_partial_carts');
11616
11760
  if coalesce(public.logistics_pick_mode()->>'pickMode','') <> 'cart' then
11617
11761
  return jsonb_build_object('overgeslagen', 'pickmethode is niet per kar');
11618
11762
  end if;
@@ -11741,6 +11885,7 @@ DO $fsdo$ BEGIN
11741
11885
  AS $function$
11742
11886
  DECLARE v text; v_json jsonb;
11743
11887
  BEGIN
11888
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_normalize_product_label');
11744
11889
  v := btrim(COALESCE(p_label, ''));
11745
11890
  IF v = '' THEN RETURN NULL; END IF;
11746
11891
  IF left(v, 1) = '{' THEN
@@ -11779,7 +11924,8 @@ DO $fsdo$ BEGIN
11779
11924
  LANGUAGE sql
11780
11925
  STABLE SECURITY DEFINER
11781
11926
  SET search_path TO 'public'
11782
- AS $function$ SELECT NULLIF(btrim(timezone), '') FROM public.logistics_time_settings WHERE id LIMIT 1; $function$
11927
+ AS $function$
11928
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_opening_timezone'); SELECT NULLIF(btrim(timezone), '') FROM public.logistics_time_settings WHERE id LIMIT 1; $function$
11783
11929
  $fsdef$;
11784
11930
  EXCEPTION WHEN undefined_object OR undefined_table OR undefined_function OR invalid_schema_name THEN
11785
11931
  RAISE NOTICE 'logistiek-engine: functie public.logistics_opening_timezone overgeslagen (onderdeel van andere module ontbreekt): %', SQLERRM;
@@ -11792,6 +11938,7 @@ DO $fsdo$ BEGIN
11792
11938
  STABLE SECURITY DEFINER
11793
11939
  SET search_path TO 'public'
11794
11940
  AS $function$
11941
+ SELECT public.logistics_acc_guard('server', 'logistics_order_afgemeld');
11795
11942
  SELECT p_order_id IS NOT NULL AND (
11796
11943
  EXISTS (SELECT 1 FROM public.orders o WHERE o.id = p_order_id
11797
11944
  AND lower(btrim(coalesce(o.status, ''))) IN ('verzonden','gereed voor facturatie','afgerond','klaar voor verzending'))
@@ -11815,6 +11962,7 @@ DO $fsdo$ BEGIN
11815
11962
  STABLE SECURITY DEFINER
11816
11963
  SET search_path TO 'public'
11817
11964
  AS $function$
11965
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_all_carts_scanned');
11818
11966
  SELECT cardinality(k) > 0 AND NOT EXISTS (SELECT 1 FROM unnest(k) cid WHERE NOT public.logistics_cart_scanned(cid))
11819
11967
  FROM (SELECT public.logistics_order_cart_ids(p_order_id) AS k) s
11820
11968
  $function$
@@ -11830,6 +11978,7 @@ DO $fsdo$ BEGIN
11830
11978
  STABLE SECURITY DEFINER
11831
11979
  SET search_path TO 'public'
11832
11980
  AS $function$
11981
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_backlog_info');
11833
11982
  SELECT jsonb_build_object('achterstand', true, 'leverdatum', (o.delivery_date::text)::date,
11834
11983
  'dagen', (now() AT TIME ZONE public.logistics_tz())::date - (o.delivery_date::text)::date)
11835
11984
  FROM public.orders o
@@ -11854,6 +12003,7 @@ DO $fsdo$ BEGIN
11854
12003
  STABLE SECURITY DEFINER
11855
12004
  SET search_path TO 'public'
11856
12005
  AS $function$
12006
+ SELECT public.logistics_acc_guard('server', 'logistics_order_buffer_excluded');
11857
12007
  SELECT EXISTS (SELECT 1 FROM public.logistics_order_plan_exclusion x WHERE x.order_id = p_order_id)
11858
12008
  OR public.logistics_order_afgemeld(p_order_id)
11859
12009
  $function$
@@ -11870,6 +12020,7 @@ DO $fsdo$ BEGIN
11870
12020
  STABLE SECURITY DEFINER
11871
12021
  SET search_path TO 'public'
11872
12022
  AS $function$
12023
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_cart_approval');
11873
12024
  WITH o AS (
11874
12025
  SELECT id FROM public.orders
11875
12026
  WHERE order_number = _order_ref AND deleted_at IS NULL
@@ -11935,6 +12086,7 @@ DO $fsdo$ BEGIN
11935
12086
  STABLE SECURITY DEFINER
11936
12087
  SET search_path TO 'public'
11937
12088
  AS $function$
12089
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_cart_ids');
11938
12090
  SELECT coalesce(array_agg(DISTINCT k.cid) FILTER (WHERE k.cid IS NOT NULL), '{}') FROM (
11939
12091
  SELECT c.id AS cid FROM logistics_active.order_carts c WHERE c.order_id = p_order_id
11940
12092
  UNION SELECT ci.cart_id FROM logistics_active.order_cart_items ci JOIN public.order_items oi ON oi.id = ci.order_item_id
@@ -11956,6 +12108,7 @@ AS $function$
11956
12108
  DECLARE v_number text; v_ok boolean; v_wacht jsonb; v_fp text;
11957
12109
  v_reason text := COALESCE(NULLIF(btrim(p_reason), ''), 'wijziging');
11958
12110
  BEGIN
12111
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_changed');
11959
12112
  IF p_order_id IS NULL THEN RETURN; END IF;
11960
12113
  IF COALESCE(current_setting('logistics.replanning', true), '') = '1' THEN RETURN; END IF;
11961
12114
  v_fp := public.logistics_order_fp(p_order_id);
@@ -12021,6 +12174,7 @@ DECLARE
12021
12174
  v_out text[] := '{}';
12022
12175
  v_num text;
12023
12176
  BEGIN
12177
+ PERFORM public.logistics_acc_guard('server', 'logistics_order_current_warnings');
12024
12178
  IF p_order_id IS NULL THEN RETURN v_out; END IF;
12025
12179
 
12026
12180
  IF public.logistics_allocation_frozen(p_order_id) THEN
@@ -12062,6 +12216,7 @@ DO $fsdo$ BEGIN
12062
12216
  AS $function$
12063
12217
  DECLARE r record; v_max int := COALESCE(public.logistics_plan_setting('max_attempts', 5)::int, 5);
12064
12218
  BEGIN
12219
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_definitively_blocked');
12065
12220
  IF auth.uid() IS NULL AND auth.role() <> 'service_role' THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
12066
12221
  SELECT q.status, q.attempts, q.reason_code, q.reason, q.error INTO r
12067
12222
  FROM public.logistics_plan_queue q WHERE q.order_id = p_order_id
@@ -12086,6 +12241,7 @@ DO $fsdo$ BEGIN
12086
12241
  AS $function$
12087
12242
  DECLARE v_id uuid; d jsonb;
12088
12243
  BEGIN
12244
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_departure_list');
12089
12245
  IF p_order_ids IS NULL THEN RETURN; END IF;
12090
12246
  IF array_length(p_order_ids, 1) > 1000 THEN
12091
12247
  RAISE EXCEPTION 'Maximaal 1000 orders per aanvraag.';
@@ -12129,6 +12285,7 @@ DECLARE
12129
12285
  v_stickers_zonder_pdf integer := 0;
12130
12286
  v_note_ok boolean := false;
12131
12287
  BEGIN
12288
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_documents_ready');
12132
12289
  IF coalesce(btrim(p_order_ref), '') = '' THEN
12133
12290
  RETURN jsonb_build_object('klaar', false, 'reden', 'Geen ordernummer opgegeven.');
12134
12291
  END IF;
@@ -12230,6 +12387,7 @@ DO $fsdo$ BEGIN
12230
12387
  STABLE SECURITY DEFINER
12231
12388
  SET search_path TO 'public'
12232
12389
  AS $function$
12390
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_documents_ready_bool');
12233
12391
  SELECT coalesce((public.logistics_order_documents_ready(p_order_ref) ->> 'klaar')::boolean, false);
12234
12392
  $function$
12235
12393
  $fsdef$;
@@ -12244,6 +12402,7 @@ DO $fsdo$ BEGIN
12244
12402
  STABLE SECURITY DEFINER
12245
12403
  SET search_path TO 'public'
12246
12404
  AS $function$
12405
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_external_state');
12247
12406
  SELECT jsonb_build_object('full', x.full_fulfilled, 'salesOrderIds', to_jsonb(x.sales_order_ids),
12248
12407
  'reason', x.reason, 'appliedAt', x.applied_at, 'eventId', x.event_id)
12249
12408
  FROM public.logistics_external_fulfillment x WHERE x.order_id = p_order_id;
@@ -12261,6 +12420,7 @@ DO $fsdo$ BEGIN
12261
12420
  SET search_path TO 'public'
12262
12421
  AS $function$
12263
12422
  BEGIN
12423
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_finalize_enqueue');
12264
12424
  IF p_order_id IS NULL THEN
12265
12425
  RETURN;
12266
12426
  END IF;
@@ -12296,6 +12456,7 @@ DO $fsdo$ BEGIN
12296
12456
  STABLE SECURITY DEFINER
12297
12457
  SET search_path TO 'public'
12298
12458
  AS $function$
12459
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_finalize_overview');
12299
12460
  SELECT
12300
12461
  count(*) FILTER (WHERE status = 'pending')::int,
12301
12462
  count(*) FILTER (WHERE status = 'running')::int,
@@ -12326,6 +12487,7 @@ AS $function$
12326
12487
  DECLARE
12327
12488
  v_count integer := 0;
12328
12489
  BEGIN
12490
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_finalize_prune');
12329
12491
  WITH weg AS (
12330
12492
  DELETE FROM public.logistics_order_finalize_queue q
12331
12493
  WHERE (q.status = 'done'
@@ -12354,6 +12516,7 @@ DECLARE
12354
12516
  r record;
12355
12517
  v_count integer := 0;
12356
12518
  BEGIN
12519
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_finalize_reconcile');
12357
12520
  FOR r IN
12358
12521
  WITH kandidaat AS (
12359
12522
  SELECT o.id,
@@ -12400,6 +12563,7 @@ DO $fsdo$ BEGIN
12400
12563
  SET search_path TO 'public'
12401
12564
  AS $function$
12402
12565
  BEGIN
12566
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_finalize_retry');
12403
12567
  IF auth.uid() IS NULL THEN
12404
12568
  RAISE EXCEPTION 'niet ingelogd';
12405
12569
  END IF;
@@ -12431,6 +12595,7 @@ DO $fsdo$ BEGIN
12431
12595
  AS $function$
12432
12596
  DECLARE r record; v_done integer := 0;
12433
12597
  BEGIN
12598
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_finalize_run');
12434
12599
  IF NOT EXISTS (SELECT 1 FROM public.logistics_order_finalize_queue q WHERE q.status IN ('pending', 'running')) THEN RETURN 0; END IF;
12435
12600
  FOR r IN
12436
12601
  WITH kandidaat AS (
@@ -12483,6 +12648,7 @@ DO $fsdo$ BEGIN
12483
12648
  STABLE SECURITY DEFINER
12484
12649
  SET search_path TO 'public'
12485
12650
  AS $function$
12651
+ SELECT public.logistics_acc_guard('server', 'logistics_order_fp');
12486
12652
  SELECT md5(concat_ws('|', o.status, o.delivery_date, o.customer_id, o.buffer_id, o.deleted_at, o.is_reservation,
12487
12653
  o.plan_locked_at, o.custom_fields::text))
12488
12654
  FROM public.orders o WHERE o.id = p_order_id
@@ -12501,6 +12667,7 @@ DO $fsdo$ BEGIN
12501
12667
  AS $function$
12502
12668
  DECLARE v_number text;
12503
12669
  BEGIN
12670
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_frozen');
12504
12671
  SELECT o.order_number INTO v_number FROM public.orders o WHERE o.id = p_order_id;
12505
12672
  IF v_number IS NULL THEN RETURN false; END IF;
12506
12673
  IF EXISTS (SELECT 1 FROM public.logistics_order_plan_exclusion x WHERE x.order_id = p_order_id) THEN RETURN true; END IF;
@@ -12523,6 +12690,7 @@ DO $fsdo$ BEGIN
12523
12690
  STABLE SECURITY DEFINER
12524
12691
  SET search_path TO 'public'
12525
12692
  AS $function$
12693
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_handled');
12526
12694
  WITH karren AS (SELECT DISTINCT oc.cart_number AS cart_index FROM logistics_active.order_carts oc WHERE oc.order_id = p_order_uuid),
12527
12695
  gedeeld AS (
12528
12696
  SELECT DISTINCT ci.cart_id FROM logistics_active.order_cart_items ci JOIN public.order_items oi ON oi.id = ci.order_item_id
@@ -12556,6 +12724,7 @@ DO $fsdo$ BEGIN
12556
12724
  AS $function$
12557
12725
  DECLARE r record;
12558
12726
  BEGIN
12727
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_is_archived');
12559
12728
  IF auth.uid() IS NULL AND auth.role() <> 'service_role' THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
12560
12729
  SELECT q.status, q.updated_at, COALESCE(q.error, q.reason) AS reden INTO r
12561
12730
  FROM public.logistics_plan_queue q WHERE q.order_id = p_order_id ORDER BY q.updated_at DESC LIMIT 1;
@@ -12578,6 +12747,7 @@ DO $fsdo$ BEGIN
12578
12747
  AS $function$
12579
12748
  DECLARE v_max integer := public.logistics_pick_backlog_max_days(); v_info jsonb; v_ref text;
12580
12749
  BEGIN
12750
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_is_backlog');
12581
12751
  IF v_max IS NULL THEN RETURN false; END IF;
12582
12752
  v_info := public.logistics_order_backlog_info(p_order_id);
12583
12753
  IF v_info IS NULL OR (v_info->>'dagen')::int > v_max THEN RETURN false; END IF;
@@ -12597,6 +12767,7 @@ DO $fsdo$ BEGIN
12597
12767
  STABLE SECURITY DEFINER
12598
12768
  SET search_path TO 'public'
12599
12769
  AS $function$
12770
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_is_frozen');
12600
12771
  SELECT EXISTS (
12601
12772
  SELECT 1 FROM public.pick_queue p
12602
12773
  WHERE p.cancelled_at IS NULL
@@ -12644,6 +12815,7 @@ DO $fsdo$ BEGIN
12644
12815
  STABLE SECURITY DEFINER
12645
12816
  SET search_path TO 'public'
12646
12817
  AS $function$
12818
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_is_topick');
12647
12819
  SELECT EXISTS (
12648
12820
  SELECT 1
12649
12821
  FROM public.orders o
@@ -12711,6 +12883,7 @@ DECLARE
12711
12883
  v_oi record; part record; member_rec record;
12712
12884
  v_key text; v_last text; v_rem numeric; v_av numeric; v_take numeric; v_err text;
12713
12885
  BEGIN
12886
+ PERFORM public.logistics_acc_guard('server', 'logistics_order_line_allocation');
12714
12887
  IF p_order_item_id IS NULL THEN RETURN; END IF;
12715
12888
 
12716
12889
  IF EXISTS (SELECT 1 FROM public.logistics_double_group_lines(
@@ -12796,6 +12969,7 @@ DO $fsdo$ BEGIN
12796
12969
  STABLE SECURITY DEFINER
12797
12970
  SET search_path TO 'public'
12798
12971
  AS $function$
12972
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_line_duplicates');
12799
12973
  WITH groepen AS (
12800
12974
  SELECT
12801
12975
  count(*) AS aantal
@@ -12856,6 +13030,7 @@ AS $function$
12856
13030
  DECLARE
12857
13031
  v_ok boolean;
12858
13032
  BEGIN
13033
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_mergeable');
12859
13034
  SELECT (o.deleted_at IS NULL
12860
13035
  AND o.cancelled_at IS NULL
12861
13036
  AND o.plan_locked_at IS NULL
@@ -12888,6 +13063,7 @@ DO $fsdo$ BEGIN
12888
13063
  STABLE SECURITY DEFINER
12889
13064
  SET search_path TO 'public'
12890
13065
  AS $function$
13066
+ SELECT public.logistics_acc_guard('server', 'logistics_order_on_frozen_shared_cart');
12891
13067
  SELECT EXISTS (
12892
13068
  SELECT 1 FROM public.logistics_shared_cart_peers(p_order_id) p
12893
13069
  JOIN logistics_active.order_carts c ON c.id = p.cart_id
@@ -12912,6 +13088,7 @@ DO $fsdo$ BEGIN
12912
13088
  STABLE SECURITY DEFINER
12913
13089
  SET search_path TO 'public'
12914
13090
  AS $function$
13091
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_overview');
12915
13092
  WITH idx AS (
12916
13093
  SELECT * FROM public.logistics_cart_index(
12917
13094
  COALESCE(p_from, '1900-01-01'::date),
@@ -12956,6 +13133,7 @@ DO $fsdo$ BEGIN
12956
13133
  STABLE SECURITY DEFINER
12957
13134
  SET search_path TO 'public'
12958
13135
  AS $function$
13136
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_pick_day');
12959
13137
  SELECT COALESCE(
12960
13138
  NULLIF(o.custom_fields ->> 'manual_pick_day', '')::date,
12961
13139
  (SELECT min((lt.planned_start AT TIME ZONE public.logistics_tz())::date)
@@ -12983,6 +13161,7 @@ DO $fsdo$ BEGIN
12983
13161
  AS $function$
12984
13162
  DECLARE b jsonb := public.logistics_order_plan_coverage_v165(p_order_id); x jsonb := public.logistics_order_external_state(p_order_id);
12985
13163
  BEGIN
13164
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_plan_coverage');
12986
13165
  IF x IS NULL THEN RETURN b || jsonb_build_object('externalFulfilled', NULL); END IF;
12987
13166
  IF (x->>'full')::boolean THEN
12988
13167
  b := b || jsonb_build_object('state', 'afgehandeld_extern', 'label', 'Afgehandeld in Floriday',
@@ -13002,6 +13181,7 @@ DO $fsdo$ BEGIN
13002
13181
  STABLE SECURITY DEFINER
13003
13182
  SET search_path TO 'public'
13004
13183
  AS $function$
13184
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_plan_coverage_list');
13005
13185
  WITH b AS (SELECT * FROM public.logistics_order_plan_coverage_list_v152(p_order_ids)),
13006
13186
  mem AS (
13007
13187
  SELECT DISTINCT b.buffer_id AS buf, o.id AS oid FROM b
@@ -13038,6 +13218,7 @@ DO $fsdo$ BEGIN
13038
13218
  SET search_path TO 'public'
13039
13219
  AS $function$
13040
13220
  BEGIN
13221
+ PERFORM public.logistics_acc_guard('server', 'logistics_order_plan_coverage_list_v152');
13041
13222
  IF p_order_ids IS NULL THEN RETURN; END IF;
13042
13223
  IF cardinality(p_order_ids) > 1000 THEN
13043
13224
  RAISE EXCEPTION 'Te veel orders in één aanroep (%); maximaal 1000.', cardinality(p_order_ids);
@@ -13108,6 +13289,7 @@ DECLARE
13108
13289
  v_pick text; v_picked_at timestamptz; v_total int; v_done int; v_printed int;
13109
13290
  v_ncarts int; v_nscanned int; v_scan_at timestamptz;
13110
13291
  BEGIN
13292
+ PERFORM public.logistics_acc_guard('server', 'logistics_order_plan_coverage_v165');
13111
13293
  SELECT o.id, o.order_number, o.buffer_id INTO v_order FROM public.orders o WHERE o.id = p_order_id;
13112
13294
  IF NOT FOUND THEN
13113
13295
  RETURN jsonb_build_object('orderId', p_order_id, 'state', 'onbekend', 'reason', 'Order niet gevonden.');
@@ -13257,6 +13439,7 @@ DO $fsdo$ BEGIN
13257
13439
  SET search_path TO 'public'
13258
13440
  AS $function$
13259
13441
  BEGIN
13442
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_orphan_carts_list');
13260
13443
  IF auth.uid() IS NULL OR NOT public.logistics_is_beheer() THEN
13261
13444
  RAISE EXCEPTION 'Alleen beheer mag de opruimlijst bekijken.';
13262
13445
  END IF;
@@ -13290,6 +13473,7 @@ DO $fsdo$ BEGIN
13290
13473
  STABLE SECURITY DEFINER
13291
13474
  SET search_path TO 'public'
13292
13475
  AS $function$
13476
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_orphan_carts_summary');
13293
13477
  SELECT COALESCE(jsonb_agg(jsonb_build_object('reden', x.reden, 'aantal', x.n, 'oudste', x.oudste, 'nieuwste', x.nieuwste) ORDER BY x.n DESC), '[]'::jsonb)
13294
13478
  FROM (
13295
13479
  SELECT CASE
@@ -13318,6 +13502,7 @@ DO $fsdo$ BEGIN
13318
13502
  AS $function$
13319
13503
  DECLARE v_tz text := public.logistics_tz(); v_open time; v_closed boolean; v_at timestamptz;
13320
13504
  BEGIN
13505
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_own_transport_departure');
13321
13506
  IF v_tz IS NULL THEN
13322
13507
  RETURN jsonb_build_object('ok', false, 'ownTransport', true, 'reason', 'De tijdzone van de vestiging ontbreekt. Stel die in bij Werktijden.');
13323
13508
  END IF;
@@ -13364,6 +13549,7 @@ DECLARE
13364
13549
  v_order record;
13365
13550
  v_locked timestamptz;
13366
13551
  BEGIN
13552
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_packing_block_reason');
13367
13553
  SELECT o.status, o.plan_locked_at, o.deleted_at, o.is_reservation
13368
13554
  INTO v_order
13369
13555
  FROM public.orders o
@@ -13442,6 +13628,7 @@ DO $fsdo$ BEGIN
13442
13628
  SET search_path TO 'public'
13443
13629
  AS $function$
13444
13630
  BEGIN
13631
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_packing_dismiss');
13445
13632
  IF auth.uid() IS NULL THEN
13446
13633
  RAISE EXCEPTION 'niet ingelogd';
13447
13634
  END IF;
@@ -13467,6 +13654,7 @@ DO $fsdo$ BEGIN
13467
13654
  STABLE SECURITY DEFINER
13468
13655
  SET search_path TO 'public'
13469
13656
  AS $function$
13657
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_packing_overview');
13470
13658
  SELECT
13471
13659
  count(*) FILTER (WHERE resolved_at IS NULL)::int,
13472
13660
  count(*) FILTER (WHERE resolved_at IS NULL AND needs_human)::int,
@@ -13496,6 +13684,7 @@ DECLARE
13496
13684
  v_open integer;
13497
13685
  v_fix integer;
13498
13686
  BEGIN
13687
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_packing_reconcile');
13499
13688
  v_open := public.logistics_packing_scan(p_scan_limit);
13500
13689
  v_fix := public.logistics_packing_autofix(p_fix_limit);
13501
13690
 
@@ -13522,6 +13711,7 @@ AS $function$
13522
13711
  DECLARE
13523
13712
  v_open integer := 0;
13524
13713
  BEGIN
13714
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_packing_scan');
13525
13715
  CREATE TEMP TABLE _pack_diff ON COMMIT DROP AS
13526
13716
  SELECT * FROM public.logistics_packing_diff
13527
13717
  LIMIT GREATEST(1, LEAST(p_limit, 5000));
@@ -13589,6 +13779,7 @@ DO $fsdo$ BEGIN
13589
13779
  SET search_path TO 'public'
13590
13780
  AS $function$
13591
13781
  BEGIN
13782
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_packing_set_manual');
13592
13783
  IF auth.uid() IS NULL THEN
13593
13784
  RAISE EXCEPTION 'niet ingelogd';
13594
13785
  END IF;
@@ -13613,6 +13804,7 @@ DO $fsdo$ BEGIN
13613
13804
  STABLE SECURITY DEFINER
13614
13805
  SET search_path TO 'public'
13615
13806
  AS $function$
13807
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_pakbon_old_order_row');
13616
13808
  SELECT p_ids IS NOT NULL AND cardinality(p_ids) > 0 AND EXISTS (
13617
13809
  SELECT 1 FROM public.pick_queue q
13618
13810
  JOIN public.pick_document_types t ON t.id = q.document_type_id AND t.code = 'pakbon'
@@ -13635,6 +13827,7 @@ DO $fsdo$ BEGIN
13635
13827
  STABLE SECURITY DEFINER
13636
13828
  SET search_path TO 'public'
13637
13829
  AS $function$
13830
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_pakbon_oude_orderregels');
13638
13831
  WITH oud AS (
13639
13832
  SELECT q.id, q.document_number, (q.printed_at IS NOT NULL OR q.completed_at IS NOT NULL) AS afgehandeld,
13640
13833
  array_agg(DISTINCT o.id) AS ids
@@ -13684,6 +13877,7 @@ DECLARE
13684
13877
  v_date date;
13685
13878
  v_time time;
13686
13879
  BEGIN
13880
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_parse_pickup');
13687
13881
  IF p_value IS NULL OR btrim(p_value) = '' THEN RETURN NULL; END IF;
13688
13882
  v_parts := string_to_array(p_value, '|');
13689
13883
  BEGIN
@@ -13715,6 +13909,7 @@ DO $fsdo$ BEGIN
13715
13909
  AS $function$
13716
13910
  DECLARE s jsonb; v text;
13717
13911
  BEGIN
13912
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_partial_wait_minutes');
13718
13913
  SELECT settings INTO s FROM public.logistics_rule_configs ORDER BY is_active DESC, (status = 'actief') DESC, updated_at DESC LIMIT 1;
13719
13914
  v := CASE WHEN s IS NULL THEN NULL ELSE public.logistics_rule_text(s, 'order_picken', 'deelkar_wacht_minuten', '15') END;
13720
13915
  RETURN greatest(0, least(coalesce(nullif(v, '')::int, 15), 1440));
@@ -13737,6 +13932,7 @@ DECLARE
13737
13932
  v_order_id_txt text;
13738
13933
  v_order public.orders;
13739
13934
  BEGIN
13935
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_payload_is_floriday');
13740
13936
  IF _payload IS NULL THEN RETURN NULL; END IF;
13741
13937
  IF nullif(_payload->>'floriday_sales_order_id', '') IS NOT NULL
13742
13938
  OR nullif(_payload->'data'->>'floridaySalesOrderId', '') IS NOT NULL THEN
@@ -13782,6 +13978,7 @@ DO $fsdo$ BEGIN
13782
13978
  STABLE SECURITY DEFINER
13783
13979
  SET search_path TO 'public'
13784
13980
  AS $function$
13981
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_pick_agenda');
13785
13982
  WITH idx AS (SELECT * FROM public.logistics_cart_units(p_from, p_to)),
13786
13983
  per_unit AS (
13787
13984
  SELECT i.pick_date, i.unit_ref, bool_or(i.is_buffer) AS is_buffer,
@@ -13826,6 +14023,7 @@ DO $fsdo$ BEGIN
13826
14023
  AS $function$
13827
14024
  DECLARE v_on text; v_days text; n integer;
13828
14025
  BEGIN
14026
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_pick_backlog_max_days');
13829
14027
  BEGIN
13830
14028
  SELECT lower(btrim(value)) INTO v_on FROM public.module_runtime_config WHERE key = 'logistics_pick_backlog_enabled' LIMIT 1;
13831
14029
  SELECT btrim(value) INTO v_days FROM public.module_runtime_config WHERE key = 'logistics_pick_backlog_max_days' LIMIT 1;
@@ -13852,6 +14050,7 @@ AS $function$
13852
14050
  DECLARE
13853
14051
  s jsonb;
13854
14052
  BEGIN
14053
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_pick_barcode_enabled');
13855
14054
  SELECT settings INTO s
13856
14055
  FROM public.logistics_rule_configs
13857
14056
  ORDER BY is_active DESC, (status = 'actief') DESC, updated_at DESC
@@ -13877,6 +14076,7 @@ AS $function$
13877
14076
  DECLARE
13878
14077
  p text;
13879
14078
  BEGIN
14079
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_pick_email_purpose');
13880
14080
  FOREACH p IN ARRAY ARRAY['orders','customer','klant','internal','marketing'] LOOP
13881
14081
  IF EXISTS (
13882
14082
  SELECT 1 FROM public.email_auth_connections c
@@ -13933,6 +14133,7 @@ DO $fsdo$ BEGIN
13933
14133
  AS $function$
13934
14134
  declare s jsonb; v text;
13935
14135
  begin
14136
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_pick_partial_mode');
13936
14137
  select settings into s from public.logistics_rule_configs
13937
14138
  order by is_active desc, (status = 'actief') desc, updated_at desc limit 1;
13938
14139
  if s is null then return 'after_checkin'; end if;
@@ -13953,6 +14154,7 @@ DO $fsdo$ BEGIN
13953
14154
  AS $function$
13954
14155
  DECLARE v_n integer := 0; r record;
13955
14156
  BEGIN
14157
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_pick_queue_close');
13956
14158
  IF p_ids IS NULL OR cardinality(p_ids) = 0 THEN RETURN 0; END IF;
13957
14159
  FOR r IN
13958
14160
  UPDATE public.pick_queue q
@@ -14052,6 +14254,7 @@ DECLARE
14052
14254
  pick_start timestamptz;
14053
14255
  default_minutes numeric;
14054
14256
  BEGIN
14257
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_pick_start_estimate');
14055
14258
  BEGIN
14056
14259
  checkin_at := NULLIF(p_order ->> 'checkinAt', '')::timestamptz;
14057
14260
  EXCEPTION WHEN others THEN checkin_at := NULL; END;
@@ -14113,6 +14316,7 @@ DO $fsdo$ BEGIN
14113
14316
  STABLE SECURITY DEFINER
14114
14317
  SET search_path TO 'public'
14115
14318
  AS $function$
14319
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_pick_units');
14116
14320
  WITH leden AS (
14117
14321
  SELECT o.id, o.order_number, o.buffer_id
14118
14322
  FROM public.orders o
@@ -14139,6 +14343,7 @@ DO $fsdo$ BEGIN
14139
14343
  STABLE SECURITY DEFINER
14140
14344
  SET search_path TO 'public'
14141
14345
  AS $function$
14346
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_pickup_moments_today');
14142
14347
  WITH ids AS MATERIALIZED (SELECT unnest(public.logistics_today_cart_ids()) AS id),
14143
14348
  scanned AS MATERIALIZED (
14144
14349
  SELECT DISTINCT s.cart_id FROM public.logistics_control_scan s
@@ -14227,6 +14432,7 @@ DECLARE
14227
14432
  v_pickup timestamptz;
14228
14433
  v_indeling jsonb;
14229
14434
  BEGIN
14435
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_all');
14230
14436
  IF p_user_id IS NULL THEN RAISE EXCEPTION 'user_id ontbreekt'; END IF;
14231
14437
 
14232
14438
  BEGIN
@@ -14342,6 +14548,7 @@ DECLARE
14342
14548
  v_last jsonb;
14343
14549
  v_members text[];
14344
14550
  BEGIN
14551
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_block');
14345
14552
  IF p_order_ids IS NULL OR array_length(p_order_ids, 1) IS NULL THEN
14346
14553
  RETURN 0;
14347
14554
  END IF;
@@ -14465,6 +14672,7 @@ DECLARE
14465
14672
  v_fl uuid[] := ARRAY[]::uuid[];
14466
14673
  o record;
14467
14674
  BEGIN
14675
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_buffer_sql');
14468
14676
  IF (public.logistics_cart_layout_method() ->> 'layoutMethod') = 'afmetingen' THEN
14469
14677
  RETURN 0;
14470
14678
  END IF;
@@ -14632,6 +14840,7 @@ DO $fsdo$ BEGIN
14632
14840
  AS $function$
14633
14841
  DECLARE v_limit int := COALESCE(p_limit, public.logistics_plan_setting('batch_size', 10)::int);
14634
14842
  BEGIN
14843
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_claim');
14635
14844
  PERFORM public.logistics_plan_release_stale();
14636
14845
  RETURN QUERY
14637
14846
  WITH pick AS (
@@ -14663,6 +14872,7 @@ DO $fsdo$ BEGIN
14663
14872
  AS $function$
14664
14873
  DECLARE v_n int;
14665
14874
  BEGIN
14875
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_close_claim');
14666
14876
  UPDATE public.logistics_plan_queue q
14667
14877
  SET status='geblokkeerd', reason=COALESCE(p_reason, q.reason), error=p_reason,
14668
14878
  reason_code=COALESCE(p_reason_code, public.logistics_block_reason_code(p_reason, '{}'::jsonb)),
@@ -14687,6 +14897,7 @@ DECLARE
14687
14897
  v_max int := public.logistics_plan_setting('coverage_max_attempts', 3)::int;
14688
14898
  r record; v_pct int; v_att int; v_queued int := 0; v_gaveup int := 0; v_fixed int := 0;
14689
14899
  BEGIN
14900
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_coverage_check');
14690
14901
  -- Hersteld: pogingenregel opruimen.
14691
14902
  DELETE FROM public.logistics_plan_coverage_retries c
14692
14903
  WHERE c.order_id IN (
@@ -14752,6 +14963,7 @@ DO $fsdo$ BEGIN
14752
14963
  AS $function$
14753
14964
  DECLARE v_order uuid;
14754
14965
  BEGIN
14966
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_defer');
14755
14967
  SELECT order_id INTO v_order FROM public.logistics_plan_queue WHERE id = p_id;
14756
14968
 
14757
14969
  UPDATE public.logistics_plan_queue
@@ -14782,6 +14994,7 @@ DO $fsdo$ BEGIN
14782
14994
  STABLE SECURITY DEFINER
14783
14995
  SET search_path TO 'public'
14784
14996
  AS $function$
14997
+ SELECT public.logistics_acc_guard('server', 'logistics_plan_due_count');
14785
14998
  SELECT count(*)::int FROM public.logistics_plan_queue WHERE status = 'pending' AND next_attempt_at <= now()
14786
14999
  $function$
14787
15000
  $fsdef$;
@@ -14804,6 +15017,7 @@ DECLARE
14804
15017
  v_target uuid := p_order_id;
14805
15018
  v_wacht jsonb;
14806
15019
  BEGIN
15020
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_enqueue');
14807
15021
  IF COALESCE(current_setting('logistics.merging', true), '') <> '1' THEN
14808
15022
  BEGIN
14809
15023
  PERFORM set_config('logistics.merging', '1', true);
@@ -14882,6 +15096,7 @@ DECLARE
14882
15096
  v_user uuid;
14883
15097
  v_pickup timestamptz;
14884
15098
  BEGIN
15099
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_ensure_event');
14885
15100
  SELECT id, order_number, delivery_date, custom_fields, buffer_id
14886
15101
  INTO o
14887
15102
  FROM public.orders
@@ -15000,6 +15215,7 @@ DECLARE
15000
15215
  v_next timestamptz;
15001
15216
  v_min numeric;
15002
15217
  BEGIN
15218
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_finish');
15003
15219
  SELECT order_id, attempts INTO v_order, v_attempts
15004
15220
  FROM public.logistics_plan_queue WHERE id = p_id;
15005
15221
 
@@ -15074,6 +15290,7 @@ DECLARE
15074
15290
  v_share numeric;
15075
15291
  v_crates integer;
15076
15292
  BEGIN
15293
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_floriday_order');
15077
15294
  -- Werkwijze "Indelen op basis van afmetingen": de SQL-belading mag dan niets
15078
15295
  -- indelen. Alleen de afmetingenplanner van de engine schrijft dan karren.
15079
15296
  IF (public.logistics_cart_layout_method() ->> 'layoutMethod') = 'afmetingen' THEN
@@ -15155,6 +15372,7 @@ DO $fsdo$ BEGIN
15155
15372
  AS $function$
15156
15373
  DECLARE v_resolved int := 0; v_archived int := 0; v_alerts int := 0; v_gone int := 0; v_refs text;
15157
15374
  BEGIN
15375
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_housekeeping');
15158
15376
  UPDATE public.logistics_plan_queue q SET status='opgelost', error='opgelost: order is al verzonden',
15159
15377
  claimed_at=NULL, updated_at=now()
15160
15378
  FROM public.orders o
@@ -15212,6 +15430,7 @@ DO $fsdo$ BEGIN
15212
15430
  STABLE SECURITY DEFINER
15213
15431
  SET search_path TO 'public'
15214
15432
  AS $function$
15433
+ SELECT public.logistics_acc_guard('server', 'logistics_plan_impact_orders');
15215
15434
  WITH src AS (SELECT id, buffer_id, delivery_date FROM public.orders WHERE id = p_order_id)
15216
15435
  SELECT o.id, o.buffer_id, o.delivery_date
15217
15436
  FROM public.orders o, src
@@ -15236,6 +15455,7 @@ DECLARE
15236
15455
  v_debounce int := public.logistics_plan_setting('kick_debounce_seconds', 5)::int;
15237
15456
  v_running boolean;
15238
15457
  BEGIN
15458
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_kick');
15239
15459
  -- Loopt er al een tick-ronde (slot 'tick:ronde')? Dan geen tweede ronde wekken.
15240
15460
  -- Fail-closed: kan dit niet worden vastgesteld, dan valt de EXCEPTION-tak
15241
15461
  -- hieronder en wordt de wek-aanroep overgeslagen; de minuut-cron is het vangnet.
@@ -15283,6 +15503,7 @@ AS $function$
15283
15503
  DECLARE
15284
15504
  _got boolean := false;
15285
15505
  BEGIN
15506
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_lock_acquire');
15286
15507
  IF _key IS NULL OR btrim(_key) = '' THEN
15287
15508
  RETURN false;
15288
15509
  END IF;
@@ -15316,6 +15537,7 @@ DO $fsdo$ BEGIN
15316
15537
  SECURITY DEFINER
15317
15538
  SET search_path TO 'public'
15318
15539
  AS $function$
15540
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_plan_lock_release');
15319
15541
  DELETE FROM public.logistics_plan_locks
15320
15542
  WHERE lock_key = _key
15321
15543
  AND (_owner IS NULL OR owner IS NOT DISTINCT FROM _owner);
@@ -15337,6 +15559,7 @@ BEGIN
15337
15559
  PERFORM public.logistics_order_changed(COALESCE(NEW.order_id, OLD.order_id), 'orderregels gewijzigd');
15338
15560
  EXCEPTION WHEN OTHERS THEN
15339
15561
  RAISE WARNING 'logistiek-engine: aanmelden voor indeling mislukt voor order %: %', COALESCE(NEW.order_id, OLD.order_id), SQLERRM;
15562
+ PERFORM public.logistics_plan_fail_log('trg_logistics_plan_order_items', COALESCE(NEW.order_id, OLD.order_id), SQLSTATE, SQLERRM);
15340
15563
  END;
15341
15564
  RETURN COALESCE(NEW, OLD);
15342
15565
  END;
@@ -15379,6 +15602,7 @@ BEGIN
15379
15602
  PERFORM public.logistics_order_changed(NEW.id, v_reason);
15380
15603
  EXCEPTION WHEN OTHERS THEN
15381
15604
  RAISE WARNING 'logistiek-engine: aanmelden voor indeling mislukt voor order %: %', NEW.id, SQLERRM;
15605
+ PERFORM public.logistics_plan_fail_log('trg_logistics_plan_orders', NEW.id, SQLSTATE, SQLERRM);
15382
15606
  END;
15383
15607
  RETURN NEW;
15384
15608
  END;
@@ -15436,6 +15660,7 @@ DO $fsdo$ BEGIN
15436
15660
  AS $function$
15437
15661
  declare r text; v jsonb;
15438
15662
  begin
15663
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_progress');
15439
15664
  if p_refs is null then return; end if;
15440
15665
  foreach r in array p_refs loop
15441
15666
  if r is null or btrim(r) = '' then continue; end if;
@@ -15463,6 +15688,7 @@ DO $fsdo$ BEGIN
15463
15688
  STABLE SECURITY DEFINER
15464
15689
  SET search_path TO 'public'
15465
15690
  AS $function$
15691
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_plan_progress_pct');
15466
15692
  SELECT CASE WHEN t.totaal = 0 THEN NULL
15467
15693
  ELSE LEAST(100, GREATEST(0, ROUND(100.0 * t.gedaan / t.totaal)))::int END
15468
15694
  FROM (
@@ -15487,6 +15713,7 @@ DO $fsdo$ BEGIN
15487
15713
  AS $function$
15488
15714
  DECLARE v_n int; v_days int := public.logistics_plan_setting('retention_days', 7)::int;
15489
15715
  BEGIN
15716
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_prune');
15490
15717
  DELETE FROM public.logistics_plan_queue
15491
15718
  WHERE status IN ('done','failed') AND updated_at < now() - make_interval(days => v_days);
15492
15719
  GET DIAGNOSTICS v_n = ROW_COUNT;
@@ -15506,6 +15733,7 @@ DO $fsdo$ BEGIN
15506
15733
  STABLE SECURITY DEFINER
15507
15734
  SET search_path TO 'public'
15508
15735
  AS $function$
15736
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_plan_queue_list');
15509
15737
  WITH b AS (
15510
15738
  SELECT q.*, o.order_number AS o_number, o.customer_name AS o_customer, o.created_at AS o_created,
15511
15739
  public.logistics_plan_progress_pct(q.order_id) AS pct
@@ -15560,6 +15788,7 @@ DECLARE
15560
15788
  v_txt text;
15561
15789
  r record;
15562
15790
  BEGIN
15791
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_release_stale');
15563
15792
  v_txt := 'de ronde heeft deze indeling na ' || v_min || ' minuten niet afgesloten (claim niet afgerond)';
15564
15793
  FOR r IN
15565
15794
  UPDATE public.logistics_plan_queue q
@@ -15608,6 +15837,7 @@ DECLARE
15608
15837
  v_scope text := lower(COALESCE(p_scope, 'failed'));
15609
15838
  r record;
15610
15839
  BEGIN
15840
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_reset_queue');
15611
15841
  IF auth.uid() IS NULL THEN
15612
15842
  RAISE EXCEPTION 'Niet ingelogd';
15613
15843
  END IF;
@@ -15667,6 +15897,7 @@ DECLARE
15667
15897
  v_n integer := 0;
15668
15898
  v_id uuid;
15669
15899
  BEGIN
15900
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_retry');
15670
15901
  IF auth.uid() IS NULL THEN
15671
15902
  RAISE EXCEPTION 'Niet ingelogd';
15672
15903
  END IF;
@@ -15712,6 +15943,7 @@ DO $fsdo$ BEGIN
15712
15943
  STABLE SECURITY DEFINER
15713
15944
  SET search_path TO 'public'
15714
15945
  AS $function$
15946
+ SELECT public.logistics_acc_guard('server', 'logistics_plan_setting');
15715
15947
  SELECT COALESCE((SELECT NULLIF(value,'')::numeric FROM public.logistics_plan_settings WHERE key = p_key), p_default);
15716
15948
  $function$
15717
15949
  $fsdef$;
@@ -15731,6 +15963,7 @@ declare
15731
15963
  v_plan_state text; v_progress integer; v_since timestamptz;
15732
15964
  v_order_id uuid; v_order_ref text; v_cart_id uuid; v_ref text;
15733
15965
  begin
15966
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_state_for');
15734
15967
  v_ref := btrim(coalesce(p_ref, ''));
15735
15968
  if v_ref = '' then
15736
15969
  return jsonb_build_object('ref', p_ref, 'planState', 'blocked', 'planProgress', null,
@@ -15803,6 +16036,7 @@ DO $fsdo$ BEGIN
15803
16036
  SET search_path TO 'public'
15804
16037
  AS $function$
15805
16038
  BEGIN
16039
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_timeout_running');
15806
16040
  IF auth.uid() IS NULL THEN
15807
16041
  RETURN 0;
15808
16042
  END IF;
@@ -15822,6 +16056,7 @@ DO $fsdo$ BEGIN
15822
16056
  AS $function$
15823
16057
  DECLARE v_n int := 0;
15824
16058
  BEGIN
16059
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_plan_unarchive');
15825
16060
  IF auth.uid() IS NULL THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
15826
16061
  IF p_order_ids IS NULL OR array_length(p_order_ids,1) IS NULL THEN RETURN 0; END IF;
15827
16062
  UPDATE public.logistics_plan_queue q SET status='pending', attempts=0, reason='opnieuw aangeboden na archief',
@@ -15846,6 +16081,7 @@ DECLARE
15846
16081
  v_reason text := lower(btrim(COALESCE(p_reason, '')));
15847
16082
  v_q record;
15848
16083
  BEGIN
16084
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_wachttijd');
15849
16085
  IF p_order_id IS NULL OR auth.uid() IS NOT NULL
15850
16086
  OR v_reason NOT IN ('order_gewijzigd', 'nieuwe of gewijzigde floriday-order', 'wijziging', 'change', 'verdeling gewijzigd', '') THEN
15851
16087
  RETURN jsonb_build_object('wacht', false);
@@ -15879,6 +16115,7 @@ DO $fsdo$ BEGIN
15879
16115
  SET search_path TO 'public'
15880
16116
  AS $function$
15881
16117
  BEGIN
16118
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_wachttijd_melden');
15882
16119
  PERFORM public.logistics_trace_order_step(
15883
16120
  p_order_id, 'stap:beladingindeling', 'wachttijd na mislukte indeling', 'wachtend',
15884
16121
  CASE WHEN p_wacht->>'status' = 'failed' THEN 'niet opnieuw ingedeeld (gestopt na mislukte pogingen)'
@@ -15903,6 +16140,7 @@ DO $fsdo$ BEGIN
15903
16140
  STABLE SECURITY DEFINER
15904
16141
  SET search_path TO 'public'
15905
16142
  AS $function$
16143
+ SELECT public.logistics_acc_guard('server', 'logistics_planner_cart_snapshot');
15906
16144
  SELECT COALESCE(jsonb_agg(jsonb_build_object(
15907
16145
  'cartId', c.id, 'cartNumber', c.cart_number, 'bufferId', c.buffer_id, 'orderId', c.order_id,
15908
16146
  'items', COALESCE((SELECT jsonb_agg(jsonb_build_object('orderItemId', i.order_item_id, 'crates', i.crates)
@@ -15926,6 +16164,7 @@ DO $fsdo$ BEGIN
15926
16164
  AS $function$
15927
16165
  DECLARE v text;
15928
16166
  BEGIN
16167
+ PERFORM public.logistics_acc_guard('server', 'logistics_planner_diff_mode');
15929
16168
  BEGIN
15930
16169
  SELECT lower(btrim(value)) INTO v FROM public.module_runtime_config WHERE key = 'logistics_planner_diff_mode' LIMIT 1;
15931
16170
  EXCEPTION WHEN others THEN RETURN 'off';
@@ -15947,6 +16186,7 @@ DO $fsdo$ BEGIN
15947
16186
  AS $function$
15948
16187
  DECLARE n int;
15949
16188
  BEGIN
16189
+ PERFORM public.logistics_acc_guard('server', 'logistics_planner_diff_prune');
15950
16190
  DELETE FROM public.logistics_planner_diff_runs WHERE created_at < now() - interval '30 days';
15951
16191
  GET DIAGNOSTICS n = ROW_COUNT; RETURN n;
15952
16192
  END $function$
@@ -15970,6 +16210,7 @@ DECLARE
15970
16210
  v_err text;
15971
16211
  v_comp jsonb;
15972
16212
  BEGIN
16213
+ PERFORM public.logistics_acc_guard('server', 'logistics_planner_lines');
15973
16214
  IF p_order_id IS NULL THEN RETURN; END IF;
15974
16215
  v_frozen := public.logistics_allocation_frozen(p_order_id);
15975
16216
  SELECT COALESCE(array_agg(d.order_item_id), '{}') INTO v_double FROM public.logistics_double_group_lines(p_order_id) d;
@@ -16050,6 +16291,7 @@ declare
16050
16291
  v_open integer := 0;
16051
16292
  v_totaal integer := 0;
16052
16293
  begin
16294
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_prepare_pick_documents');
16053
16295
  for r in
16054
16296
  select distinct q.order_number
16055
16297
  from public.pick_queue q
@@ -16090,6 +16332,7 @@ DO $fsdo$ BEGIN
16090
16332
  STABLE SECURITY DEFINER
16091
16333
  SET search_path TO 'public'
16092
16334
  AS $function$
16335
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_print_job_state');
16093
16336
  SELECT status::text FROM public.print_jobs WHERE id = p_job_id;
16094
16337
  $function$
16095
16338
  $fsdef$;
@@ -16109,6 +16352,7 @@ DECLARE
16109
16352
  v_code text;
16110
16353
  v_msg text;
16111
16354
  BEGIN
16355
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_print_via_layout');
16112
16356
  SELECT * INTO r FROM public.layout_print_document(
16113
16357
  _documenttype, _documentnaam, _pdf_base64, _pdf_url, _layout_id,
16114
16358
  _print_plek_id, NULL, 1, _herkomst, coalesce(_is_herprint, false),
@@ -16135,6 +16379,7 @@ DO $fsdo$ BEGIN
16135
16379
  SET search_path TO 'public'
16136
16380
  AS $function$
16137
16381
  BEGIN
16382
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_prune_buffer_member_queue');
16138
16383
  RETURN public.logistics_pick_queue_close(ARRAY(
16139
16384
  SELECT q.id FROM public.pick_queue q
16140
16385
  WHERE q.cancelled_at IS NULL AND q.completed_at IS NULL
@@ -16157,6 +16402,7 @@ DO $fsdo$ BEGIN
16157
16402
  AS $function$
16158
16403
  DECLARE v_count bigint;
16159
16404
  BEGIN
16405
+ PERFORM public.logistics_acc_guard('server', 'logistics_prune_cron_history');
16160
16406
  DELETE FROM cron.job_run_details WHERE start_time < now() - make_interval(days => GREATEST(COALESCE(p_days, 7), 1));
16161
16407
  GET DIAGNOSTICS v_count = ROW_COUNT;
16162
16408
  RETURN v_count;
@@ -16175,6 +16421,7 @@ DO $fsdo$ BEGIN
16175
16421
  AS $function$
16176
16422
  DECLARE v_n integer := 0;
16177
16423
  BEGIN
16424
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_prune_handled_pick_queue');
16178
16425
  -- Kar gescand/afgemeld: regel afronden. Karregel kijkt naar de eigen kar.
16179
16426
  v_n := public.logistics_pick_queue_close(ARRAY(
16180
16427
  SELECT q.id FROM public.pick_queue q
@@ -16210,6 +16457,7 @@ DECLARE
16210
16457
  outbox_id uuid;
16211
16458
  body_txt text;
16212
16459
  BEGIN
16460
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_queue_capacity_email');
16213
16461
  SELECT * INTO a FROM public.logistics_capacity_alerts WHERE id = p_alert_id;
16214
16462
  IF NOT FOUND OR NOT COALESCE(a.email_enabled, false) THEN RETURN NULL; END IF;
16215
16463
 
@@ -16266,6 +16514,7 @@ DO $fsdo$ BEGIN
16266
16514
  STABLE SECURITY DEFINER
16267
16515
  SET search_path TO 'public'
16268
16516
  AS $function$
16517
+ SELECT public.logistics_acc_guard('server', 'logistics_queue_row_has_open_peer');
16269
16518
  SELECT EXISTS (
16270
16519
  SELECT 1
16271
16520
  FROM jsonb_array_elements_text(
@@ -16301,6 +16550,7 @@ DECLARE
16301
16550
  conn_id uuid; lines_txt text := ''; lines_html text := ''; rec jsonb; outbox_id uuid;
16302
16551
  v_link text; v_datum text; v_code text;
16303
16552
  BEGIN
16553
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_queue_stock_email');
16304
16554
  SELECT * INTO a FROM public.logistics_stock_alerts WHERE id = p_alert_id;
16305
16555
  IF NOT FOUND THEN RETURN NULL; END IF;
16306
16556
  IF NOT COALESCE(a.email_enabled, false) THEN RETURN NULL; END IF;
@@ -16366,6 +16616,7 @@ DECLARE
16366
16616
  r record;
16367
16617
  n int := 0;
16368
16618
  BEGIN
16619
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_reapply_buffer_decisions');
16369
16620
  FOR r IN
16370
16621
  SELECT id FROM public.orders
16371
16622
  WHERE deleted_at IS NULL
@@ -16395,6 +16646,7 @@ DO $fsdo$ BEGIN
16395
16646
  AS $function$
16396
16647
  DECLARE v_today date := public.logistics_local_today(); -- fail closed zonder tijdzone
16397
16648
  BEGIN
16649
+ PERFORM public.logistics_acc_guard('server', 'logistics_rebuffer_candidates');
16398
16650
  RETURN QUERY
16399
16651
  WITH base AS MATERIALIZED (
16400
16652
  SELECT o.id FROM public.orders o
@@ -16435,6 +16687,7 @@ DECLARE
16435
16687
  changed int := 0;
16436
16688
  checked int := 0;
16437
16689
  BEGIN
16690
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_rebuffer_open_orders');
16438
16691
  FOR r IN
16439
16692
  SELECT order_ref,
16440
16693
  (array_agg(payload ORDER BY sequence))[1] AS payload,
@@ -16495,6 +16748,7 @@ DECLARE
16495
16748
  v_mode text; v_checked int := 0; v_updated int := 0; v_would int := 0;
16496
16749
  v_start timestamptz := clock_timestamp(); v_ms int; r record; v_after uuid; v_report jsonb;
16497
16750
  BEGIN
16751
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_rebuffer_orders');
16498
16752
  SELECT CASE WHEN lower(btrim(value)) = 'apply' THEN 'apply' ELSE 'report' END
16499
16753
  INTO v_mode FROM public.module_runtime_config WHERE key = 'logistics_rebuffer_mode';
16500
16754
  v_mode := coalesce(v_mode, 'report');
@@ -16540,6 +16794,7 @@ AS $function$
16540
16794
  DECLARE
16541
16795
  v_pending boolean;
16542
16796
  BEGIN
16797
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_rebuffer_pending');
16543
16798
  SELECT pending INTO v_pending FROM public.logistics_rebuffer_state WHERE id;
16544
16799
  IF NOT COALESCE(v_pending, false) THEN
16545
16800
  RETURN jsonb_build_object('skipped', true);
@@ -16561,6 +16816,7 @@ DO $fsdo$ BEGIN
16561
16816
  AS $function$
16562
16817
  DECLARE v jsonb; s record;
16563
16818
  BEGIN
16819
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_rebuffer_report');
16564
16820
  IF auth.uid() IS NULL OR NOT public.logistics_is_beheer() THEN
16565
16821
  RAISE EXCEPTION 'Alleen beheer mag de herindeellijst bekijken.';
16566
16822
  END IF;
@@ -16590,6 +16846,7 @@ DO $fsdo$ BEGIN
16590
16846
  SET search_path TO 'public'
16591
16847
  AS $function$
16592
16848
  BEGIN
16849
+ PERFORM public.logistics_acc_guard('server', 'logistics_rebuffer_simulate_open');
16593
16850
  RETURN QUERY
16594
16851
  WITH c AS MATERIALIZED (
16595
16852
  SELECT o.id, o.order_number, o.delivery_date, o.buffer_id, public.logistics_buffer_target(o.id) AS t
@@ -16631,6 +16888,7 @@ AS $function$
16631
16888
  DECLARE
16632
16889
  v_base text; v_key text; v_path text; v_req bigint; v_host text;
16633
16890
  BEGIN
16891
+ PERFORM public.logistics_acc_guard('server', 'logistics_recalc_tick_kick');
16634
16892
  BEGIN PERFORM public.logistics_tick_calls_resolve(); EXCEPTION WHEN others THEN NULL; END;
16635
16893
 
16636
16894
  SELECT NULLIF(btrim(value),'') INTO v_base FROM public.module_runtime_config WHERE key = 'logistics_tick_base_url';
@@ -16674,6 +16932,7 @@ DO $fsdo$ BEGIN
16674
16932
  AS $function$
16675
16933
  declare v_status jsonb; v_ref text; v_updated integer := 0;
16676
16934
  begin
16935
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_refresh_pick_queue_status');
16677
16936
  v_ref := btrim(coalesce(p_ref, ''));
16678
16937
  if v_ref = '' then return 0; end if;
16679
16938
  v_status := public.logistics_cart_plan_status(v_ref);
@@ -16714,6 +16973,7 @@ declare
16714
16973
  v_updated integer := 0;
16715
16974
  v_removed integer := 0;
16716
16975
  begin
16976
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_refresh_pickup_moments');
16717
16977
  -- Bron: uitsluitend de vervoerdersinstellingen van de klant (public.carriers).
16718
16978
  -- Geen omgevingswaarden of standaardtijden in code: is er niets ingesteld,
16719
16979
  -- dan gebeurt er niets en blijft de tabel leeg (fail closed).
@@ -16815,6 +17075,7 @@ DO $fsdo$ BEGIN
16815
17075
  AS $function$
16816
17076
  declare rec record; v jsonb; v_ref text; v_updated integer := 0;
16817
17077
  begin
17078
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_refresh_plan_state');
16818
17079
  for rec in
16819
17080
  select q.id, q.payload, q.order_number, q.document_number
16820
17081
  from public.pick_queue q
@@ -16854,6 +17115,7 @@ DO $fsdo$ BEGIN
16854
17115
  AS $function$
16855
17116
  DECLARE v_count int := 0; r record;
16856
17117
  BEGIN
17118
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_replan_all');
16857
17119
  IF auth.uid() IS NOT NULL AND pg_trigger_depth() = 0 AND NOT public.logistics_is_beheer() THEN
16858
17120
  RAISE EXCEPTION 'Alleen beheer (admin, superadmin of developer) mag orders opnieuw indelen.' USING ERRCODE = '42501';
16859
17121
  END IF;
@@ -16896,6 +17158,7 @@ DECLARE
16896
17158
  v_cleanup jsonb;
16897
17159
  r record;
16898
17160
  BEGIN
17161
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_replan_all_force');
16899
17162
  IF auth.uid() IS NOT NULL AND pg_trigger_depth() = 0 AND NOT public.logistics_is_beheer() THEN
16900
17163
  RAISE EXCEPTION 'Alleen beheer (admin, superadmin of developer) mag orders opnieuw indelen.' USING ERRCODE = '42501';
16901
17164
  END IF;
@@ -16995,6 +17258,7 @@ DO $fsdo$ BEGIN
16995
17258
  STABLE SECURITY DEFINER
16996
17259
  SET search_path TO 'public'
16997
17260
  AS $function$
17261
+ SELECT public.logistics_acc_guard('server', 'logistics_replan_candidates');
16998
17262
  SELECT o.id, public.logistics_order_is_frozen(o.id)
16999
17263
  FROM public.orders o
17000
17264
  WHERE o.deleted_at IS NULL AND o.cancelled_at IS NULL
@@ -17018,6 +17282,7 @@ AS $function$
17018
17282
  DECLARE v_number text; v_buffer uuid; v_items int := 0; v_carts int := 0; v_skipped int := 0;
17019
17283
  v_cart_ids uuid[]; v_empty uuid[];
17020
17284
  BEGIN
17285
+ PERFORM public.logistics_acc_guard('server', 'logistics_replan_clear_foreign_cart_items');
17021
17286
  SELECT order_number, buffer_id INTO v_number, v_buffer FROM orders WHERE id = p_order_id;
17022
17287
  IF v_number IS NULL THEN RETURN jsonb_build_object('regels',0,'karren',0); END IF;
17023
17288
 
@@ -17082,6 +17347,7 @@ DECLARE
17082
17347
  v_events int := 0; v_runs int := 0;
17083
17348
  v_target uuid; v_foreign jsonb; v_mode text := public.logistics_planner_diff_mode();
17084
17349
  BEGIN
17350
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_replan_order_journey');
17085
17351
  SELECT o.id, o.order_number, o.buffer_id INTO v_order_id, v_number, v_buffer
17086
17352
  FROM public.orders o WHERE o.order_number = p_order_ref
17087
17353
  LIMIT 1;
@@ -17141,6 +17407,7 @@ DO $fsdo$ BEGIN
17141
17407
  AS $function$
17142
17408
  DECLARE r jsonb;
17143
17409
  BEGIN
17410
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_replan_order_journey');
17144
17411
  PERFORM set_config('logistics.replan_reason', COALESCE(NULLIF(btrim(p_reason),''),'handmatige_herberekening'), true);
17145
17412
  r := public.logistics_replan_order_journey(p_order_ref);
17146
17413
  PERFORM set_config('logistics.replan_reason', '', true);
@@ -17161,6 +17428,7 @@ DO $fsdo$ BEGIN
17161
17428
  AS $function$
17162
17429
  DECLARE v_total int; v_frozen int;
17163
17430
  BEGIN
17431
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_replan_preview');
17164
17432
  IF NOT public.logistics_is_beheer() THEN
17165
17433
  RAISE EXCEPTION 'Alleen beheer (admin, superadmin of developer) mag orders opnieuw indelen.' USING ERRCODE = '42501';
17166
17434
  END IF;
@@ -17185,6 +17453,7 @@ DO $fsdo$ BEGIN
17185
17453
  AS $function$
17186
17454
  DECLARE v_ids uuid[]; v_n int; v_id uuid; v_ok int := 0;
17187
17455
  BEGIN
17456
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_replan_selected');
17188
17457
  IF NOT public.logistics_is_beheer() THEN
17189
17458
  RAISE EXCEPTION 'Alleen beheer (admin, superadmin of developer) mag orders opnieuw indelen.' USING ERRCODE = '42501';
17190
17459
  END IF;
@@ -17219,6 +17488,7 @@ DO $fsdo$ BEGIN
17219
17488
  AS $function$
17220
17489
  DECLARE v_id uuid; v_out jsonb := '[]'::jsonb; v_before jsonb;
17221
17490
  BEGIN
17491
+ PERFORM public.logistics_acc_guard('server', 'logistics_replan_selected_orders');
17222
17492
  IF p_order_ids IS NULL OR cardinality(p_order_ids) = 0 THEN RAISE EXCEPTION 'Geen orders opgegeven.'; END IF;
17223
17493
  IF cardinality(p_order_ids) > 100 THEN RAISE EXCEPTION 'Hooguit 100 orders per keer.'; END IF;
17224
17494
  FOREACH v_id IN ARRAY p_order_ids LOOP
@@ -17263,6 +17533,7 @@ DECLARE
17263
17533
  cust_email text; cust_lang text; cust_name text;
17264
17534
  mail record;
17265
17535
  BEGIN
17536
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_report_delay');
17266
17537
  SELECT * INTO ord FROM public.orders WHERE id = p_order_id AND deleted_at IS NULL;
17267
17538
  IF NOT FOUND THEN RETURN NULL; END IF;
17268
17539
 
@@ -17446,6 +17717,7 @@ DECLARE
17446
17717
  mail record;
17447
17718
  v_purpose text;
17448
17719
  BEGIN
17720
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_report_delay');
17449
17721
  SELECT * INTO ord FROM public.orders WHERE id = p_order_id AND deleted_at IS NULL;
17450
17722
  IF NOT FOUND THEN RETURN NULL; END IF;
17451
17723
 
@@ -17613,6 +17885,7 @@ DO $fsdo$ BEGIN
17613
17885
  AS $function$
17614
17886
  DECLARE r record; v_reason text; v_last text;
17615
17887
  BEGIN
17888
+ PERFORM public.logistics_acc_guard('server', 'logistics_report_frozen_shortage');
17616
17889
  IF p_order_item_ids IS NULL OR cardinality(p_order_item_ids) = 0 THEN RETURN; END IF;
17617
17890
  FOR r IN
17618
17891
  SELECT DISTINCT oi.order_id, o.order_number, COALESCE(p.product, a.trade_item_key) AS lid
@@ -17754,6 +18027,7 @@ DO $fsdo$ BEGIN
17754
18027
  AS $function$
17755
18028
  DECLARE r record; n integer := 0;
17756
18029
  BEGIN
18030
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_rescan_orders');
17757
18031
  FOR r IN SELECT id FROM public.orders
17758
18032
  WHERE deleted_at IS NULL
17759
18033
  AND created_at > now() - make_interval(days => GREATEST(p_days, 0))
@@ -17792,6 +18066,7 @@ DECLARE
17792
18066
  v_new_buffer uuid;
17793
18067
  v_mail_error text;
17794
18068
  BEGIN
18069
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_reschedule_order');
17795
18070
  prev := public.logistics_reschedule_preview(p_order_ref, p_pickup_date, p_pickup_from, p_pickup_to);
17796
18071
  IF NOT COALESCE((prev->>'ok')::boolean, false) THEN RETURN prev; END IF;
17797
18072
 
@@ -17919,6 +18194,7 @@ DECLARE
17919
18194
  v_direction text;
17920
18195
  v_tasks integer;
17921
18196
  BEGIN
18197
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_reschedule_preview');
17922
18198
  SELECT * INTO ord FROM public.orders
17923
18199
  WHERE order_number = p_order_ref AND deleted_at IS NULL
17924
18200
  ORDER BY created_at DESC LIMIT 1;
@@ -17990,6 +18266,7 @@ DECLARE
17990
18266
  v_s text;
17991
18267
  v_u uuid;
17992
18268
  BEGIN
18269
+ PERFORM public.logistics_acc_guard('server', 'logistics_reserved_fast_skip');
17993
18270
  IF p_key IS NULL OR v_raw = '' OR p_key LIKE 'group:%' OR p_key LIKE 'draft:%' THEN RETURN false; END IF;
17994
18271
 
17995
18272
  -- Reservering staat al op 0 (of er is geen rij)? Anders altijd volledig rekenen.
@@ -18056,6 +18333,7 @@ DECLARE
18056
18333
  v_key text;
18057
18334
  v_pid uuid;
18058
18335
  BEGIN
18336
+ PERFORM public.logistics_acc_guard('server', 'logistics_reserved_key');
18059
18337
  IF p_key IS NULL OR btrim(p_key) = '' THEN RETURN NULL; END IF;
18060
18338
  v_raw := btrim(p_key);
18061
18339
 
@@ -18100,6 +18378,7 @@ DO $fsdo$ BEGIN
18100
18378
  AS $function$
18101
18379
  DECLARE r record; a jsonb;
18102
18380
  BEGIN
18381
+ PERFORM public.logistics_acc_guard('server', 'logistics_reserved_order_excluded');
18103
18382
  SELECT o.deleted_at, o.cancelled_at, o.status INTO r FROM public.orders o WHERE o.id = p_order_id;
18104
18383
  IF NOT FOUND THEN RETURN false; END IF;
18105
18384
  IF r.deleted_at IS NOT NULL OR r.cancelled_at IS NOT NULL
@@ -18126,6 +18405,7 @@ DO $fsdo$ BEGIN
18126
18405
  SET search_path TO 'public'
18127
18406
  AS $function$
18128
18407
  BEGIN
18408
+ PERFORM public.logistics_acc_guard('server', 'logistics_reserved_stock_nightly');
18129
18409
  PERFORM set_config('statement_timeout', '600000', true);
18130
18410
  PERFORM public.recompute_all_reserved_stock();
18131
18411
  END
@@ -18189,6 +18469,7 @@ DO $fsdo$ BEGIN
18189
18469
  AS $function$
18190
18470
  DECLARE v jsonb;
18191
18471
  BEGIN
18472
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_resolve_settings');
18192
18473
  IF p_config_id IS NULL THEN RETURN '{}'::jsonb; END IF;
18193
18474
  IF p_version IS NOT NULL THEN
18194
18475
  SELECT settings INTO v FROM public.logistics_rule_versions
@@ -18411,6 +18692,7 @@ DO $fsdo$ BEGIN
18411
18692
  STABLE SECURITY DEFINER
18412
18693
  SET search_path TO 'public'
18413
18694
  AS $function$
18695
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_sales_order_external_fulfilled');
18414
18696
  SELECT public.logistics_item_external_fulfilled(p_order_id, p_sales_order_id);
18415
18697
  $function$
18416
18698
  $fsdef$;
@@ -18429,6 +18711,7 @@ DECLARE
18429
18711
  rec record;
18430
18712
  cnt integer := 0;
18431
18713
  BEGIN
18714
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_scan_delays');
18432
18715
  FOR rec IN
18433
18716
  SELECT o.id
18434
18717
  FROM public.orders o
@@ -18471,6 +18754,7 @@ DECLARE
18471
18754
  alert_id uuid; note_id uuid; lines text := '';
18472
18755
  existing_id uuid;
18473
18756
  BEGIN
18757
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_scan_order_stock');
18474
18758
  SELECT * INTO ord FROM public.orders WHERE id = p_order_id AND deleted_at IS NULL;
18475
18759
  IF NOT FOUND THEN RETURN NULL; END IF;
18476
18760
 
@@ -18656,6 +18940,7 @@ DO $fsdo$ BEGIN
18656
18940
  SECURITY DEFINER
18657
18941
  SET search_path TO 'public'
18658
18942
  AS $function$
18943
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_schedule_tasks');
18659
18944
  SELECT public.logistics_schedule_tasks(NULL::text)
18660
18945
  $function$
18661
18946
  $fsdef$;
@@ -18677,6 +18962,7 @@ DECLARE
18677
18962
  v_since timestamptz := (SELECT departure_rule_since FROM public.logistics_time_settings ORDER BY updated_at DESC NULLS LAST LIMIT 1);
18678
18963
  v_160 timestamptz := (SELECT rule_160_since FROM public.logistics_time_settings ORDER BY updated_at DESC NULLS LAST LIMIT 1);
18679
18964
  BEGIN
18965
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_schedule_tasks');
18680
18966
  CREATE TEMP TABLE IF NOT EXISTS tmp_logistics_dep (order_id uuid PRIMARY KEY, ref text, dep jsonb) ON COMMIT DROP;
18681
18967
  TRUNCATE tmp_logistics_dep;
18682
18968
  INSERT INTO tmp_logistics_dep(order_id, ref, dep)
@@ -18815,6 +19101,7 @@ DO $fsdo$ BEGIN
18815
19101
  STABLE SECURITY DEFINER
18816
19102
  SET search_path TO 'public'
18817
19103
  AS $function$
19104
+ SELECT public.logistics_acc_guard('server', 'logistics_set_components_scaled');
18818
19105
  WITH oi AS (
18819
19106
  SELECT o.id, o.product_id, COALESCE(o.quantity, 0)::numeric AS q
18820
19107
  FROM public.order_items o
@@ -18859,6 +19146,7 @@ DO $fsdo$ BEGIN
18859
19146
  AS $function$
18860
19147
  DECLARE uid uuid := COALESCE(p_user_id, auth.uid()); n integer;
18861
19148
  BEGIN
19149
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_set_order_priority');
18862
19150
  IF uid IS NULL THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
18863
19151
 
18864
19152
  UPDATE public.logistics_tasks
@@ -18884,6 +19172,7 @@ DECLARE
18884
19172
  v_order_id uuid;
18885
19173
  v_updated integer := 0;
18886
19174
  BEGIN
19175
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_set_pick_day');
18887
19176
  IF auth.uid() IS NULL THEN
18888
19177
  RAISE EXCEPTION 'Niet ingelogd';
18889
19178
  END IF;
@@ -18957,6 +19246,7 @@ DO $fsdo$ BEGIN
18957
19246
  STABLE SECURITY DEFINER
18958
19247
  SET search_path TO 'public'
18959
19248
  AS $function$
19249
+ SELECT public.logistics_acc_guard('server', 'logistics_shared_cart_peers');
18960
19250
  SELECT DISTINCT oi2.order_id, c.id, c.cart_number, c.buffer_id
18961
19251
  FROM public.order_items oi
18962
19252
  JOIN logistics_active.order_cart_items ci ON ci.order_item_id = oi.id
@@ -18977,6 +19267,7 @@ DO $fsdo$ BEGIN
18977
19267
  STABLE SECURITY DEFINER
18978
19268
  SET search_path TO 'public'
18979
19269
  AS $function$
19270
+ SELECT public.logistics_acc_guard('server', 'logistics_shell_base_url');
18980
19271
  SELECT CASE WHEN v ~* '^https?://[^/\s]+' THEN rtrim(v, '/') END
18981
19272
  FROM (SELECT nullif(btrim(value::text), '') v FROM public.module_runtime_config
18982
19273
  WHERE key = 'shell_base_url' LIMIT 1) s
@@ -19091,6 +19382,7 @@ DECLARE
19091
19382
  v_reden text;
19092
19383
  v_actie text;
19093
19384
  BEGIN
19385
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_shipping_note_diagnose');
19094
19386
  IF coalesce(btrim(p_order_number), '') = '' THEN
19095
19387
  RETURN jsonb_build_object('gevonden', false);
19096
19388
  END IF;
@@ -19162,6 +19454,7 @@ DO $fsdo$ BEGIN
19162
19454
  AS $function$
19163
19455
  DECLARE r record; v_cart uuid; v_n int := 0;
19164
19456
  BEGIN
19457
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_shipping_note_ensure_accepted');
19165
19458
  FOR r IN
19166
19459
  SELECT o.id, o.order_number FROM public.orders o
19167
19460
  WHERE o.deleted_at IS NULL
@@ -19231,6 +19524,7 @@ DECLARE
19231
19524
  v_slip_station uuid;
19232
19525
  v_note_station uuid;
19233
19526
  BEGIN
19527
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_shipping_note_follows_slip');
19234
19528
  SELECT settings INTO s
19235
19529
  FROM public.logistics_rule_configs
19236
19530
  ORDER BY is_active DESC, (status = 'actief') DESC, updated_at DESC
@@ -19376,6 +19670,7 @@ DECLARE
19376
19670
  v_order text;
19377
19671
  v_res jsonb;
19378
19672
  BEGIN
19673
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_shipping_note_job_for_slip');
19379
19674
  SELECT * INTO slip FROM public.print_jobs WHERE id = _slip_job_id;
19380
19675
  IF NOT FOUND THEN RETURN NULL; END IF;
19381
19676
  v_order := coalesce(slip.payload->>'ordernummer', slip.payload->>'order_number');
@@ -19452,6 +19747,7 @@ DO $fsdo$ BEGIN
19452
19747
  STABLE SECURITY DEFINER
19453
19748
  SET search_path TO 'public'
19454
19749
  AS $function$
19750
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_shipping_note_max_attempts');
19455
19751
  SELECT CASE WHEN btrim(c.value) ~ '^[0-9]{1,3}$' AND btrim(c.value)::int BETWEEN 1 AND 200
19456
19752
  THEN btrim(c.value)::int END
19457
19753
  FROM public.module_runtime_config c
@@ -19472,6 +19768,7 @@ AS $function$
19472
19768
  DECLARE
19473
19769
  v_n integer := 0; v_m integer := 0; v_k integer := 0;
19474
19770
  BEGIN
19771
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_shipping_note_release');
19475
19772
  IF public.logistics_belading_verstuurder() = 'afhandeling' THEN
19476
19773
  UPDATE public.logistics_slip_shipping_note s
19477
19774
  SET error_code = 'wacht_op_belading', retry_class = 'wacht_op_belading',
@@ -19663,6 +19960,7 @@ DO $fsdo$ BEGIN
19663
19960
  SET search_path TO 'public'
19664
19961
  AS $function$
19665
19962
  BEGIN
19963
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_shipping_note_wait_reasons');
19666
19964
  IF coalesce(auth.role(),'') <> 'service_role' AND NOT EXISTS (
19667
19965
  SELECT 1 FROM public.user_roles r WHERE r.user_id = auth.uid()
19668
19966
  AND r.role::text IN ('developer','superadmin','admin')) THEN
@@ -19696,6 +19994,7 @@ AS $function$
19696
19994
  DECLARE
19697
19995
  v_n integer := 0;
19698
19996
  BEGIN
19997
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_shipping_note_wake');
19699
19998
  IF _slip_job_id IS NULL THEN RETURN 0; END IF;
19700
19999
  UPDATE public.logistics_slip_shipping_note s
19701
20000
  SET next_attempt_at = now(),
@@ -19724,6 +20023,7 @@ DECLARE
19724
20023
  v_gewekt integer := 0;
19725
20024
  v_open integer := 0;
19726
20025
  BEGIN
20026
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_shipping_notes_wake_all');
19727
20027
  UPDATE public.logistics_slip_shipping_note s
19728
20028
  SET next_attempt_at = now(),
19729
20029
  locked_until = NULL,
@@ -19753,6 +20053,7 @@ AS $function$
19753
20053
  DECLARE
19754
20054
  v_payload jsonb;
19755
20055
  BEGIN
20056
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_is_floriday');
19756
20057
  SELECT j.payload INTO v_payload FROM public.print_jobs j WHERE j.id = _slip_job_id;
19757
20058
  IF v_payload IS NULL THEN RETURN NULL; END IF;
19758
20059
  RETURN public.logistics_payload_is_floriday(v_payload);
@@ -19770,6 +20071,7 @@ DO $fsdo$ BEGIN
19770
20071
  STABLE SECURITY DEFINER
19771
20072
  SET search_path TO 'public'
19772
20073
  AS $function$
20074
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_slip_is_herprint');
19773
20075
  SELECT EXISTS (
19774
20076
  SELECT 1 FROM public.print_jobs j
19775
20077
  WHERE j.id = p_slip_job_id
@@ -19811,6 +20113,7 @@ DO $fsdo$ BEGIN
19811
20113
  SET search_path TO 'public'
19812
20114
  AS $function$
19813
20115
  BEGIN
20116
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_claim');
19814
20117
  IF public.logistics_shipping_note_max_attempts() IS NULL THEN
19815
20118
  RETURN;
19816
20119
  END IF;
@@ -19846,6 +20149,7 @@ DO $fsdo$ BEGIN
19846
20149
  SET search_path TO 'public'
19847
20150
  AS $function$
19848
20151
  BEGIN
20152
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_finish');
19849
20153
  UPDATE public.logistics_slip_shipping_note
19850
20154
  SET status = COALESCE(_status, CASE WHEN _ok THEN 'geprint' ELSE 'mislukt' END),
19851
20155
  attempts = CASE WHEN _status = 'in_printwachtrij' THEN greatest(attempts - 1, 0) ELSE attempts END,
@@ -19872,6 +20176,7 @@ DO $fsdo$ BEGIN
19872
20176
  SET search_path TO 'public'
19873
20177
  AS $function$
19874
20178
  BEGIN
20179
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_hold');
19875
20180
  UPDATE public.logistics_slip_shipping_note
19876
20181
  SET status = 'wacht_op_vrijgave',
19877
20182
  attempts = greatest(attempts - 1, 0),
@@ -19897,6 +20202,7 @@ DO $fsdo$ BEGIN
19897
20202
  SET search_path TO 'public'
19898
20203
  AS $function$
19899
20204
  BEGIN
20205
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_hold_belading');
19900
20206
  UPDATE public.logistics_slip_shipping_note
19901
20207
  SET status = 'wacht_op_vrijgave',
19902
20208
  attempts = greatest(attempts - 1, 0),
@@ -19922,6 +20228,7 @@ DO $fsdo$ BEGIN
19922
20228
  SET search_path TO 'public'
19923
20229
  AS $function$
19924
20230
  BEGIN
20231
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_hold_kenmerk');
19925
20232
  UPDATE public.logistics_slip_shipping_note
19926
20233
  SET status = 'wacht_op_vrijgave',
19927
20234
  attempts = greatest(attempts - 1, 0),
@@ -19946,6 +20253,7 @@ DO $fsdo$ BEGIN
19946
20253
  SET search_path TO 'public'
19947
20254
  AS $function$
19948
20255
  BEGIN
20256
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_hold_layout');
19949
20257
  UPDATE public.logistics_slip_shipping_note
19950
20258
  SET status = 'wacht_op_vrijgave',
19951
20259
  attempts = greatest(attempts - 1, 0),
@@ -19970,6 +20278,7 @@ DO $fsdo$ BEGIN
19970
20278
  SET search_path TO 'public'
19971
20279
  AS $function$
19972
20280
  BEGIN
20281
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_hold_read_only');
19973
20282
  UPDATE public.logistics_slip_shipping_note
19974
20283
  SET status = 'wacht_op_vrijgave', attempts = greatest(attempts - 1, 0),
19975
20284
  locked_until = NULL, next_attempt_at = NULL, retry_class = 'alleen_lezen',
@@ -19993,6 +20302,7 @@ DECLARE
19993
20302
  v_max integer := public.logistics_shipping_note_max_attempts();
19994
20303
  v_delay integer;
19995
20304
  BEGIN
20305
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_keep_waiting');
19996
20306
  SELECT attempts INTO v_attempts FROM public.logistics_slip_shipping_note WHERE id = _id;
19997
20307
 
19998
20308
  IF v_max IS NULL OR coalesce(v_attempts, 0) >= v_max THEN
@@ -20037,6 +20347,7 @@ DO $fsdo$ BEGIN
20037
20347
  AS $function$
20038
20348
  DECLARE v_n int := 0;
20039
20349
  BEGIN
20350
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_release_layout');
20040
20351
  IF (public.logistics_floriday_layout_id('afleverbrief')->>'layout_id') IS NULL THEN RETURN 0; END IF;
20041
20352
  UPDATE public.logistics_slip_shipping_note
20042
20353
  SET status = 'wachtend', next_attempt_at = now(), retry_class = 'tijdelijk',
@@ -20062,6 +20373,7 @@ DECLARE
20062
20373
  v_open boolean;
20063
20374
  r public.logistics_slip_shipping_note%rowtype;
20064
20375
  BEGIN
20376
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_slip_note_retry');
20065
20377
  SELECT * INTO v_note FROM public.logistics_slip_shipping_note WHERE id = _id;
20066
20378
  IF v_note.id IS NULL OR v_note.status <> 'mislukt' THEN
20067
20379
  RETURN jsonb_build_object('ok', false, 'error', 'Deze verzendbrief bestaat niet (meer) of is niet mislukt.');
@@ -20100,6 +20412,7 @@ DO $fsdo$ BEGIN
20100
20412
  SECURITY DEFINER
20101
20413
  SET search_path TO 'public'
20102
20414
  AS $function$
20415
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_slip_note_skip_herprint');
20103
20416
  UPDATE public.logistics_slip_shipping_note
20104
20417
  SET status = 'overgeslagen', error_code = 'herprint',
20105
20418
  error = 'Herprint: alleen dit document opnieuw, geen nieuwe verzendbrief.',
@@ -20134,6 +20447,7 @@ DO $fsdo$ BEGIN
20134
20447
  SET search_path TO 'public'
20135
20448
  AS $function$
20136
20449
  BEGIN
20450
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sticker_blocked_list');
20137
20451
  IF auth.uid() IS NULL OR NOT public.logistics_is_beheer() THEN
20138
20452
  RAISE EXCEPTION 'Alleen beheer mag de geblokkeerde stickers bekijken.';
20139
20453
  END IF;
@@ -20157,6 +20471,7 @@ DO $fsdo$ BEGIN
20157
20471
  STABLE SECURITY DEFINER
20158
20472
  SET search_path TO 'public'
20159
20473
  AS $function$
20474
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_sticker_cart_plek');
20160
20475
  SELECT coalesce(
20161
20476
  (SELECT nullif(btrim(pj.payload->>'print_plek_id'),'') FROM public.print_jobs pj
20162
20477
  WHERE pj.payload->>'cart_id' = _cart::text AND pj.documenttype = 'pakbon'
@@ -20176,6 +20491,7 @@ DO $fsdo$ BEGIN
20176
20491
  STABLE SECURITY DEFINER
20177
20492
  SET search_path TO 'public'
20178
20493
  AS $function$
20494
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_sticker_distribution');
20179
20495
  WITH t AS (SELECT upper(coalesce(p_type,'')) AS ty),
20180
20496
  base AS (
20181
20497
  SELECT oc.id AS cart, min(oc.cart_number) AS nr, sum(coalesce(ci.crates,0))::int AS crates,
@@ -20213,6 +20529,7 @@ DO $fsdo$ BEGIN
20213
20529
  STABLE SECURITY DEFINER
20214
20530
  SET search_path TO 'public'
20215
20531
  AS $function$
20532
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_sticker_external_fulfilled');
20216
20533
  SELECT EXISTS (
20217
20534
  SELECT 1 FROM public.logistics_sticker_prints sp
20218
20535
  LEFT JOIN public.floriday_customer_stickers_cache c ON c.floriday_id = sp.bron_id AND sp.soort = 'sticker'
@@ -20234,6 +20551,7 @@ DO $fsdo$ BEGIN
20234
20551
  AS $function$
20235
20552
  DECLARE s jsonb;
20236
20553
  BEGIN
20554
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sticker_follows_slip');
20237
20555
  SELECT settings INTO s
20238
20556
  FROM public.logistics_rule_configs
20239
20557
  ORDER BY is_active DESC, (status = 'actief') DESC, updated_at DESC
@@ -20258,6 +20576,7 @@ DO $fsdo$ BEGIN
20258
20576
  AS $function$
20259
20577
  DECLARE v_pick timestamptz;
20260
20578
  BEGIN
20579
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sticker_moment');
20261
20580
  IF public.logistics_cart_is_frozen(_cart) THEN RETURN true; END IF;
20262
20581
  IF _release = 'with_packing_slip' THEN RETURN false; END IF;
20263
20582
  SELECT t.planned_start INTO v_pick FROM public.logistics_tasks t
@@ -20282,6 +20601,7 @@ DO $fsdo$ BEGIN
20282
20601
  AS $function$
20283
20602
  DECLARE t text; m text[];
20284
20603
  BEGIN
20604
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sticker_parse_size');
20285
20605
  IF p IS NULL OR p = 'null'::jsonb THEN RETURN NULL; END IF;
20286
20606
  IF jsonb_typeof(p) = 'object' THEN
20287
20607
  IF (p->>'width') ~ '^\d+(\.\d+)?$' AND (p->>'height') ~ '^\d+(\.\d+)?$' THEN
@@ -20321,6 +20641,7 @@ DO $fsdo$ BEGIN
20321
20641
  SET search_path TO 'public'
20322
20642
  AS $function$
20323
20643
  BEGIN
20644
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sticker_upsert');
20324
20645
  INSERT INTO public.logistics_sticker_prints AS t
20325
20646
  (soort, bron_id, order_id, order_number, cart_id, kopieen, breedte_mm, hoogte_mm, print_plek_id, fulfillment_order_id, status, reden)
20326
20647
  VALUES (_soort, _bron, _order, _order_number, _cart, coalesce(_kopieen,0), _size[1], _size[2], _plek, _fo, _status, _reden)
@@ -20389,6 +20710,7 @@ DO $fsdo$ BEGIN
20389
20710
  AS $function$
20390
20711
  DECLARE d date := p_day; n int := greatest(coalesce(p_days,0),0); guard int := 0;
20391
20712
  BEGIN
20713
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_subtract_pick_workdays');
20392
20714
  WHILE n > 0 AND guard < 60 LOOP
20393
20715
  d := d - 1; guard := guard + 1;
20394
20716
  IF public.logistics_is_pick_workday(d) THEN n := n - 1; END IF;
@@ -20421,6 +20743,7 @@ DECLARE
20421
20743
  v_seg_end timestamptz;
20422
20744
  v_avail numeric;
20423
20745
  BEGIN
20746
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_subtract_working_minutes');
20424
20747
  IF p_deadline IS NULL THEN
20425
20748
  RETURN jsonb_build_object('ok', false, 'reason', 'Geen deadline meegegeven.');
20426
20749
  END IF;
@@ -20486,6 +20809,7 @@ DO $fsdo$ BEGIN
20486
20809
  AS $function$
20487
20810
  DECLARE n integer;
20488
20811
  BEGIN
20812
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_supersede_stale_tasks');
20489
20813
  UPDATE public.logistics_tasks
20490
20814
  SET status = 'superseded', updated_at = now(),
20491
20815
  payload = payload || jsonb_build_object('supersededByRun', p_run_id)
@@ -20508,6 +20832,7 @@ DO $fsdo$ BEGIN
20508
20832
  AS $function$
20509
20833
  DECLARE v_core jsonb; v_back jsonb;
20510
20834
  BEGIN
20835
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sync_pick_queue');
20511
20836
  v_core := public.logistics_sync_pick_queue_core();
20512
20837
  BEGIN
20513
20838
  v_back := public.logistics_sync_pick_queue_backlog();
@@ -20535,6 +20860,7 @@ DECLARE
20535
20860
  v_lines integer; v_carts integer; v_payload jsonb; v_breakdown jsonb;
20536
20861
  v_ins integer := 0; v_upd integer := 0; v_orders integer := 0;
20537
20862
  BEGIN
20863
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sync_pick_queue_backlog');
20538
20864
  IF v_max IS NULL THEN RETURN jsonb_build_object('achterstand', 'uit'); END IF;
20539
20865
  v_pickmode := COALESCE(public.logistics_pick_mode()->>'pickMode', '');
20540
20866
  IF v_pickmode <> 'cart' THEN
@@ -20645,6 +20971,7 @@ DECLARE
20645
20971
  v_cart_lines integer; v_fix jsonb; v_cart_payload jsonb; v_cart_rows integer;
20646
20972
  v_wait timestamptz; v_reason text; v_ok boolean;
20647
20973
  BEGIN
20974
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sync_pick_queue_core');
20648
20975
  v_today := public.logistics_local_today();
20649
20976
  v_forced := NULLIF(current_setting('logistics.forced_pick_day', true), '')::date;
20650
20977
  SELECT id INTO v_type_id FROM public.pick_document_types WHERE code = 'pakbon' LIMIT 1;
@@ -20871,6 +21198,7 @@ DO $fsdo$ BEGIN
20871
21198
  AS $function$
20872
21199
  DECLARE v_sent int := 0; v_failed int := 0;
20873
21200
  BEGIN
21201
+ PERFORM public.logistics_acc_guard('server', 'logistics_sync_stock_alert_email_status');
20874
21202
  WITH k AS (
20875
21203
  SELECT a.id, o.status AS ostatus, o.sent_at, o.last_error
20876
21204
  FROM public.logistics_stock_alerts a
@@ -20912,6 +21240,7 @@ DECLARE
20912
21240
  v_carriers jsonb;
20913
21241
  v_source text;
20914
21242
  BEGIN
21243
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sync_task_carriers');
20915
21244
  FOR r IN
20916
21245
  SELECT o.order_number,
20917
21246
  COALESCE(jsonb_agg(x.entry ORDER BY x.entry ->> 'type') FILTER (WHERE x.entry IS NOT NULL), '[]'::jsonb) AS carriers,
@@ -20976,6 +21305,7 @@ DO $fsdo$ BEGIN
20976
21305
  AS $function$
20977
21306
  DECLARE v_n integer := 0;
20978
21307
  BEGIN
21308
+ PERFORM public.logistics_acc_guard('server', 'logistics_sync_task_status');
20979
21309
  WITH refs AS (
20980
21310
  SELECT DISTINCT t.order_ref FROM public.logistics_tasks t
20981
21311
  WHERE t.status IN ('planned','ready','claimed','in_progress')
@@ -21028,6 +21358,7 @@ DO $fsdo$ BEGIN
21028
21358
  STABLE SECURITY DEFINER
21029
21359
  SET search_path TO 'public'
21030
21360
  AS $function$
21361
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_task_open_counts');
21031
21362
  SELECT t.owner_module::text, count(*)
21032
21363
  FROM public.logistics_tasks t
21033
21364
  WHERE t.status::text IN ('planned','open','claimed','pending','running')
@@ -21065,6 +21396,7 @@ DO $fsdo$ BEGIN
21065
21396
  STABLE
21066
21397
  SET search_path TO 'public'
21067
21398
  AS $function$
21399
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_task_pick_minutes');
21068
21400
  SELECT COALESCE(
21069
21401
  NULLIF((
21070
21402
  SELECT SUM(COALESCE((e ->> 'count')::numeric, 1)
@@ -21145,6 +21477,7 @@ AS $function$
21145
21477
  DECLARE
21146
21478
  v_count integer := 0;
21147
21479
  BEGIN
21480
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_tasks_prune');
21148
21481
  WITH weg AS (
21149
21482
  DELETE FROM public.logistics_tasks t
21150
21483
  WHERE t.status IN ('cancelled', 'superseded')
@@ -21173,6 +21506,7 @@ DECLARE
21173
21506
  v_shell text; v_cur text; v_key text; v_path text;
21174
21507
  v_host text; v_ping bigint; v_route bigint; v_id bigint; v_open record;
21175
21508
  BEGIN
21509
+ PERFORM public.logistics_acc_guard('server', 'logistics_tick_base_url_check');
21176
21510
  IF v_uid IS NOT NULL AND NOT (
21177
21511
  public.has_role(v_uid, 'admin') OR public.has_role(v_uid, 'superadmin') OR public.has_role(v_uid, 'developer')) THEN
21178
21512
  RAISE EXCEPTION 'Geen rechten om het Shell-adres te controleren';
@@ -21248,6 +21582,7 @@ DO $fsdo$ BEGIN
21248
21582
  AS $function$
21249
21583
  DECLARE n int := 0; r record; v_json jsonb;
21250
21584
  BEGIN
21585
+ PERFORM public.logistics_acc_guard('server', 'logistics_tick_calls_resolve');
21251
21586
  FOR r IN
21252
21587
  SELECT c.id, h.status_code, h.content, h.error_msg, h.timed_out
21253
21588
  FROM public.logistics_tick_calls c
@@ -21295,6 +21630,7 @@ AS $function$
21295
21630
  DECLARE v_recent jsonb; v_fail int := 0; r record; v_last_ok timestamptz; v_last record; v_status text; v_ok_versie text;
21296
21631
  v_shell_fout_24u int; v_db_fout_24u int; v_laatste_fout timestamptz; v_laatste_stapfout jsonb;
21297
21632
  BEGIN
21633
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_tick_health');
21298
21634
  SELECT * INTO v_last FROM public.logistics_tick_calls WHERE resolved_at IS NOT NULL ORDER BY called_at DESC LIMIT 1;
21299
21635
  FOR r IN SELECT engine_ok, status_code FROM public.logistics_tick_calls WHERE resolved_at IS NOT NULL ORDER BY called_at DESC LIMIT 10 LOOP
21300
21636
  EXIT WHEN COALESCE(r.engine_ok, false) AND r.status_code = 200;
@@ -21341,6 +21677,7 @@ DO $fsdo$ BEGIN
21341
21677
  AS $function$
21342
21678
  DECLARE v_now timestamptz := now();
21343
21679
  BEGIN
21680
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_tick_ping');
21344
21681
  INSERT INTO public.logistics_tick_heartbeat (id, last_tick_at)
21345
21682
  VALUES (true, v_now)
21346
21683
  ON CONFLICT (id) DO UPDATE SET last_tick_at = EXCLUDED.last_tick_at;
@@ -21361,6 +21698,7 @@ DO $fsdo$ BEGIN
21361
21698
  AS $function$
21362
21699
  DECLARE n int;
21363
21700
  BEGIN
21701
+ PERFORM public.logistics_acc_guard('server', 'logistics_tick_runs_prune');
21364
21702
  DELETE FROM public.logistics_tick_runs
21365
21703
  WHERE (NOT has_error AND started_at < now() - interval '14 days')
21366
21704
  OR (has_error AND started_at < now() - interval '90 days');
@@ -21397,6 +21735,7 @@ DO $fsdo$ BEGIN
21397
21735
  STABLE SECURITY DEFINER
21398
21736
  SET search_path TO 'public'
21399
21737
  AS $function$
21738
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_timezone_options');
21400
21739
  SELECT n.name::text
21401
21740
  FROM pg_timezone_names n
21402
21741
  WHERE n.name LIKE '%/%'
@@ -21414,6 +21753,7 @@ DO $fsdo$ BEGIN
21414
21753
  STABLE SECURITY DEFINER
21415
21754
  SET search_path TO 'public'
21416
21755
  AS $function$
21756
+ SELECT public.logistics_acc_guard('server', 'logistics_today_cart_ids');
21417
21757
  WITH k AS MATERIALIZED (SELECT public.logistics_tz() AS tz, public.logistics_local_today() AS d)
21418
21758
  SELECT coalesce(array_agg(DISTINCT x), '{}') FROM (
21419
21759
  SELECT ci.cart_id AS x FROM k, LATERAL public.logistics_cart_index(k.d, k.d) ci WHERE ci.cart_id IS NOT NULL
@@ -21451,6 +21791,7 @@ DECLARE
21451
21791
  v_status text;
21452
21792
  v_class text;
21453
21793
  BEGIN
21794
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace');
21454
21795
  v_status := CASE WHEN p->>'status' IN ('geslaagd','wachtend','waarschuwing','overgeslagen','mislukt')
21455
21796
  THEN p->>'status' ELSE 'geslaagd' END;
21456
21797
  v_class := NULLIF(p->>'errorClass','');
@@ -21508,6 +21849,7 @@ DO $fsdo$ BEGIN
21508
21849
  STABLE SECURITY DEFINER
21509
21850
  SET search_path TO 'public'
21510
21851
  AS $function$
21852
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_trace_all_orders');
21511
21853
  WITH selected_orders AS MATERIALIZED (
21512
21854
  SELECT o.id, o.order_number, o.order_source, o.status AS order_status, o.delivery_date,
21513
21855
  o.customer_name, o.created_at, o.cancelled_at, o.buffer_id
@@ -21561,6 +21903,7 @@ DECLARE
21561
21903
  v_cols text;
21562
21904
  v_n integer := 0;
21563
21905
  BEGIN
21906
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_archive_order');
21564
21907
  SELECT string_agg(quote_ident(column_name), ', ' ORDER BY ordinal_position)
21565
21908
  INTO v_cols
21566
21909
  FROM information_schema.columns
@@ -21594,6 +21937,7 @@ DO $fsdo$ BEGIN
21594
21937
  AS $function$
21595
21938
  DECLARE item jsonb; n integer := 0;
21596
21939
  BEGIN
21940
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_batch');
21597
21941
  IF p IS NULL OR jsonb_typeof(p) <> 'array' THEN RETURN 0; END IF;
21598
21942
  FOR item IN SELECT * FROM jsonb_array_elements(p) LOOP
21599
21943
  IF public.logistics_trace(item) IS NOT NULL THEN n := n + 1; END IF;
@@ -21728,6 +22072,7 @@ DECLARE
21728
22072
  e jsonb;
21729
22073
  n integer := 0;
21730
22074
  BEGIN
22075
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_derive');
21731
22076
  IF p IS NULL OR jsonb_typeof(p) <> 'array' THEN RETURN 0; END IF;
21732
22077
 
21733
22078
  FOR e IN SELECT * FROM jsonb_array_elements(p) LOOP
@@ -21803,6 +22148,7 @@ DECLARE
21803
22148
  v_target uuid := p_order_id;
21804
22149
  v_enabled boolean;
21805
22150
  BEGIN
22151
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_order_journey_start');
21806
22152
  SELECT o.order_source, o.order_number INTO v_source, v_number
21807
22153
  FROM public.orders o WHERE o.id = p_order_id;
21808
22154
  IF v_number IS NULL THEN RETURN p_order_id; END IF;
@@ -21898,6 +22244,7 @@ DECLARE
21898
22244
  v_number text;
21899
22245
  v_node text;
21900
22246
  BEGIN
22247
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_order_origin');
21901
22248
  SELECT o.order_source, o.order_number INTO v_source, v_number
21902
22249
  FROM public.orders o WHERE o.id = p_order_id;
21903
22250
  IF v_number IS NULL THEN RETURN; END IF;
@@ -21944,6 +22291,7 @@ DO $fsdo$ BEGIN
21944
22291
  STABLE SECURITY DEFINER
21945
22292
  SET search_path TO 'public'
21946
22293
  AS $function$
22294
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_trace_order_overview');
21947
22295
  WITH o AS (
21948
22296
  SELECT o.order_number, o.order_source, o.status AS order_status, o.delivery_date,
21949
22297
  o.customer_name, o.created_at, o.cancelled_at, o.buffer_id
@@ -22053,6 +22401,7 @@ DO $fsdo$ BEGIN
22053
22401
  STABLE SECURITY DEFINER
22054
22402
  SET search_path TO 'public'
22055
22403
  AS $function$
22404
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_trace_order_state');
22056
22405
  WITH laatste AS (
22057
22406
  SELECT * FROM public.logistics_trace_events
22058
22407
  WHERE order_ref = p_order_ref
@@ -22119,6 +22468,7 @@ DECLARE
22119
22468
  v_number text;
22120
22469
  v_source text;
22121
22470
  BEGIN
22471
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_order_step');
22122
22472
  SELECT o.order_number, o.order_source INTO v_number, v_source
22123
22473
  FROM public.orders o WHERE o.id = p_order_id;
22124
22474
  IF v_number IS NULL THEN RETURN; END IF;
@@ -22157,6 +22507,7 @@ DECLARE
22157
22507
  v_search text := NULLIF(btrim(COALESCE(p_search,'')), '');
22158
22508
  v jsonb;
22159
22509
  BEGIN
22510
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_orders');
22160
22511
  EXECUTE $q$
22161
22512
  WITH refs AS (
22162
22513
  SELECT DISTINCT e.order_ref FROM public.logistics_trace_events e
@@ -22256,6 +22607,7 @@ DECLARE
22256
22607
  v_last_dn timestamptz;
22257
22608
  v_ready jsonb;
22258
22609
  BEGIN
22610
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_pick_state');
22259
22611
  IF p_order_number IS NULL OR btrim(p_order_number) = '' THEN RETURN; END IF;
22260
22612
 
22261
22613
  SELECT o.id INTO v_id
@@ -22338,6 +22690,7 @@ DECLARE
22338
22690
  r record;
22339
22691
  v_orders integer := 0;
22340
22692
  BEGIN
22693
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_progress');
22341
22694
  FOR r IN
22342
22695
  SELECT o.order_number
22343
22696
  FROM public.orders o
@@ -22380,6 +22733,7 @@ DECLARE
22380
22733
  v_pq_done integer;
22381
22734
  v_scans integer;
22382
22735
  BEGIN
22736
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_progress_order');
22383
22737
  IF p_order_ref IS NULL OR btrim(p_order_ref) = '' THEN
22384
22738
  RETURN jsonb_build_object('gevonden', false);
22385
22739
  END IF;
@@ -22609,6 +22963,7 @@ DO $fsdo$ BEGIN
22609
22963
  AS $function$
22610
22964
  DECLARE v_number text;
22611
22965
  BEGIN
22966
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_step_once');
22612
22967
  SELECT o.order_number INTO v_number FROM public.orders o WHERE o.id = p_order_id;
22613
22968
  IF v_number IS NULL THEN RETURN; END IF;
22614
22969
 
@@ -22650,6 +23005,7 @@ DECLARE
22650
23005
  v_tekst text := '';
22651
23006
  v_alert public.logistics_stock_alerts%ROWTYPE;
22652
23007
  BEGIN
23008
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_stock_check');
22653
23009
  SELECT * INTO ord FROM public.orders WHERE id = p_order_id AND deleted_at IS NULL;
22654
23010
  IF NOT FOUND THEN RETURN; END IF;
22655
23011
 
@@ -22769,6 +23125,7 @@ DO $fsdo$ BEGIN
22769
23125
  STABLE SECURITY DEFINER
22770
23126
  SET search_path TO 'public'
22771
23127
  AS $function$
23128
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_trace_timeline');
22772
23129
  SELECT COALESCE(jsonb_agg(to_jsonb(t) ORDER BY t.created_at ASC, t.id ASC), '[]'::jsonb)
22773
23130
  FROM (SELECT * FROM public.logistics_trace_events WHERE order_ref = p_order_ref
22774
23131
  ORDER BY created_at DESC LIMIT GREATEST(COALESCE(p_limit,500),1)) t;
@@ -22785,6 +23142,7 @@ DO $fsdo$ BEGIN
22785
23142
  STABLE SECURITY DEFINER
22786
23143
  SET search_path TO 'public'
22787
23144
  AS $function$
23145
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_trace_version_events');
22788
23146
  SELECT COALESCE(jsonb_agg(to_jsonb(e) ORDER BY e.created_at ASC), '[]'::jsonb)
22789
23147
  FROM (
22790
23148
  SELECT *
@@ -22816,6 +23174,7 @@ DECLARE
22816
23174
  v_carts jsonb;
22817
23175
  v_versions jsonb;
22818
23176
  BEGIN
23177
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_trace_versions');
22819
23178
  IF p_order_ref IS NULL OR p_order_ref = '' THEN
22820
23179
  RETURN jsonb_build_object('order', NULL, 'carts', NULL, 'versions', '[]'::jsonb);
22821
23180
  END IF;
@@ -22985,7 +23344,8 @@ DO $fsdo$ BEGIN
22985
23344
  LANGUAGE sql
22986
23345
  STABLE SECURITY DEFINER
22987
23346
  SET search_path TO 'public'
22988
- AS $function$ SELECT nullif(btrim(t.timezone), '') FROM public.logistics_time_settings t ORDER BY t.updated_at DESC NULLS LAST LIMIT 1 $function$
23347
+ AS $function$
23348
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_tz'); SELECT nullif(btrim(t.timezone), '') FROM public.logistics_time_settings t ORDER BY t.updated_at DESC NULLS LAST LIMIT 1 $function$
22989
23349
  $fsdef$;
22990
23350
  EXCEPTION WHEN undefined_object OR undefined_table OR undefined_function OR invalid_schema_name THEN
22991
23351
  RAISE NOTICE 'logistiek-engine: functie public.logistics_tz overgeslagen (onderdeel van andere module ontbreekt): %', SQLERRM;
@@ -22998,6 +23358,7 @@ DO $fsdo$ BEGIN
22998
23358
  STABLE SECURITY DEFINER
22999
23359
  SET search_path TO 'public'
23000
23360
  AS $function$
23361
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_unit_all_carts_scanned');
23001
23362
  SELECT NOT EXISTS (SELECT 1 FROM unnest(public.logistics_unit_order_ids(p_order_id)) m
23002
23363
  WHERE NOT public.logistics_order_all_carts_scanned(m))
23003
23364
  AND NOT EXISTS (SELECT 1 FROM public.orders o JOIN logistics_active.order_carts c ON c.buffer_id = o.buffer_id AND c.order_id IS NULL
@@ -23016,6 +23377,7 @@ DO $fsdo$ BEGIN
23016
23377
  STABLE SECURITY DEFINER
23017
23378
  SET search_path TO 'public'
23018
23379
  AS $function$
23380
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_unit_order_ids');
23019
23381
  WITH o AS (SELECT id, buffer_id FROM public.orders WHERE id = p_order_id),
23020
23382
  m AS (SELECT o2.id, o2.order_number FROM o JOIN public.orders o2 ON o2.buffer_id = o.buffer_id
23021
23383
  WHERE o.buffer_id IS NOT NULL AND o2.deleted_at IS NULL AND o2.cancelled_at IS NULL)
@@ -23036,6 +23398,7 @@ DO $fsdo$ BEGIN
23036
23398
  AS $function$
23037
23399
  DECLARE existing public.logistics_tasks%ROWTYPE;
23038
23400
  BEGIN
23401
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_upsert_task');
23039
23402
  SELECT * INTO existing FROM public.logistics_tasks
23040
23403
  WHERE user_id = p_user_id AND order_ref = p_order_ref AND task_type = p_task_type
23041
23404
  AND status NOT IN ('cancelled','superseded')
@@ -23076,6 +23439,7 @@ DO $fsdo$ BEGIN
23076
23439
  STABLE SECURITY DEFINER
23077
23440
  SET search_path TO 'public'
23078
23441
  AS $function$
23442
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_valid_timezone');
23079
23443
  SELECT EXISTS (SELECT 1 FROM pg_timezone_names n WHERE n.name = _tz)
23080
23444
  $function$
23081
23445
  $fsdef$;
@@ -23092,6 +23456,7 @@ DO $fsdo$ BEGIN
23092
23456
  AS $function$
23093
23457
  DECLARE v_base text; v_path text;
23094
23458
  BEGIN
23459
+ PERFORM public.logistics_acc_guard('server', 'logistics_verkoop_order_link');
23095
23460
  IF p_order_id IS NULL THEN RETURN NULL; END IF;
23096
23461
  v_base := public.logistics_shell_base_url();
23097
23462
  SELECT nullif(btrim(value), '') INTO v_path FROM public.module_runtime_config WHERE key = 'verkoop_order_path' LIMIT 1;
@@ -23135,6 +23500,7 @@ DO $fsdo$ BEGIN
23135
23500
  AS $function$
23136
23501
  declare c record; v_total int := 0;
23137
23502
  begin
23503
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_write_buffer_layer_positions');
23138
23504
  for c in select id from logistics_active.order_carts where buffer_id = p_buffer_id loop
23139
23505
  v_total := v_total + public.logistics_write_cart_layer_positions(c.id);
23140
23506
  end loop;
@@ -23178,6 +23544,7 @@ declare
23178
23544
  v_k int; v_s int; v_slot jsonb;
23179
23545
  v_placed jsonb := '[]'::jsonb;
23180
23546
  begin
23547
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_write_cart_layer_positions');
23181
23548
  select * into v_cart from logistics_active.order_carts where id = p_cart_id;
23182
23549
  if v_cart.id is null then return 0; end if;
23183
23550
 
@@ -23406,6 +23773,7 @@ DECLARE
23406
23773
  v_total integer := 0; v_full integer := 0; v_partial integer := 0;
23407
23774
  v_shared integer := 0; v_crates integer := 0;
23408
23775
  BEGIN
23776
+ PERFORM public.logistics_acc_guard('ingelogd', 'pick_cart_breakdown');
23409
23777
  v_orders := public.pick_buffer_order_ids(_order_id);
23410
23778
  IF v_orders IS NULL OR cardinality(v_orders) = 0 THEN v_orders := ARRAY[_order_id]; END IF;
23411
23779
  SELECT o.order_number INTO v_ref FROM public.orders o WHERE o.id = _order_id;
@@ -23533,6 +23901,9 @@ DECLARE
23533
23901
  v_key text := NULLIF(btrim(coalesce(p_key, '')), '');
23534
23902
  v_cur text;
23535
23903
  BEGIN
23904
+ PERFORM public.logistics_acc_guard('server', 'logistics_register_tick_apikey');
23905
+ -- Alleen de server van de Shell (service_role) mag dit; die geeft zijn eigen
23906
+ -- openbare sleutel door, dezelfde waarmee de minuutronde-route controleert.
23536
23907
  IF v_key IS NULL THEN
23537
23908
  RETURN jsonb_build_object('ok', false, 'status', 'geen_sleutel_op_server');
23538
23909
  END IF;
@@ -26448,13 +26819,12 @@ DECLARE
26448
26819
  v_types public.doc_layout_type[];
26449
26820
  v_layout public.document_layouts%ROWTYPE;
26450
26821
  BEGIN
26822
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_document_layout_v2');
26451
26823
  v_types := public.logistics_document_type_map(lower(btrim(coalesce(_document_code, ''))));
26452
26824
  IF array_length(v_types, 1) IS NULL THEN RETURN NULL; END IF;
26453
- SELECT * INTO v_layout
26454
- FROM public.document_layouts
26825
+ SELECT * INTO v_layout FROM public.document_layouts
26455
26826
  WHERE actief IS TRUE AND documenttype = ANY (v_types)
26456
- ORDER BY array_position(v_types, documenttype),
26457
- (coalesce(bron, 'eigen') = 'eigen') DESC,
26827
+ ORDER BY array_position(v_types, documenttype), (coalesce(bron, 'eigen') = 'eigen') DESC,
26458
26828
  is_standaard DESC NULLS LAST, updated_at DESC
26459
26829
  LIMIT 1;
26460
26830
  IF v_layout.id IS NULL THEN RETURN NULL; END IF;
@@ -26486,8 +26856,12 @@ $function$;
26486
26856
  -- 4. Centrale beslisregel.
26487
26857
  -- 5. Eigen stickers (HO/MO/AO): één per klant+product, aantal = planten van regels met needs_sticker.
26488
26858
  CREATE OR REPLACE FUNCTION public.logistics_own_sticker_count(p_unit text, p_quantity numeric, p_ppc_regel numeric, p_ppc_product numeric)
26489
- RETURNS integer LANGUAGE sql IMMUTABLE SET search_path = public AS $cnt$
26490
- -- stuks/planten = aantal planten; fust = aantal x planten per fust (regel, anders product); onbekend = NULL (tegenhouden).
26859
+ RETURNS integer
26860
+ LANGUAGE sql
26861
+ IMMUTABLE
26862
+ SET search_path TO 'public'
26863
+ AS $function$
26864
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_own_sticker_count');
26491
26865
  SELECT CASE
26492
26866
  WHEN p_quantity IS NULL THEN NULL
26493
26867
  WHEN lower(coalesce(p_unit, '')) = 'fust' THEN
@@ -26495,7 +26869,7 @@ RETURNS integer LANGUAGE sql IMMUTABLE SET search_path = public AS $cnt$
26495
26869
  ELSE (p_quantity * coalesce(nullif(p_ppc_regel, 0), nullif(p_ppc_product, 0)))::int END
26496
26870
  ELSE p_quantity::int
26497
26871
  END
26498
- $cnt$;
26872
+ $function$;
26499
26873
 
26500
26874
  CREATE OR REPLACE FUNCTION public.logistics_own_sticker_sync(p_limit integer DEFAULT 200)
26501
26875
  RETURNS jsonb
@@ -26514,6 +26888,7 @@ DECLARE
26514
26888
  v_vrij int := 0;
26515
26889
  v_uit int := 0;
26516
26890
  BEGIN
26891
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_own_sticker_sync');
26517
26892
  FOR r IN
26518
26893
  SELECT o.id AS order_id, o.order_number, o.customer_id, oi.product_id,
26519
26894
  sum(public.logistics_own_sticker_count(oi.unit, oi.quantity, oi.plants_per_crate, prd.plants_per_crate))::int AS planten,
@@ -26566,7 +26941,6 @@ BEGIN
26566
26941
  v_bijgewerkt := v_bijgewerkt + 1;
26567
26942
  END LOOP;
26568
26943
 
26569
- -- Vinkje uitgezet (of order vervallen) vóór het printen: niet printen.
26570
26944
  UPDATE public.logistics_sticker_prints p
26571
26945
  SET status = 'niet_printen', reden = 'Sticker uitgezet op de orderregel of order vervallen.', updated_at = now()
26572
26946
  WHERE p.soort = 'eigen_sticker' AND p.status IN ('wacht_op_moment', 'geblokkeerd', 'klaar')
@@ -26577,7 +26951,6 @@ BEGIN
26577
26951
  AND o.deleted_at IS NULL AND o.cancelled_at IS NULL AND coalesce(o.status, '') <> 'geannuleerd');
26578
26952
  GET DIAGNOSTICS v_uit = ROW_COUNT;
26579
26953
 
26580
- -- Vrijgeven met de pakbon: kar en printplek van de geprinte pakbonrij, formaat uit sticker of layout.
26581
26954
  WITH vrij AS (
26582
26955
  SELECT p.id,
26583
26956
  (SELECT public.logistics_try_uuid(q.payload->>'cartId')
@@ -26646,6 +27019,7 @@ DECLARE
26646
27019
  v_freeze boolean := public.logistics_plan_setting('verdeling_bevriezen_actief', 0) = 1;
26647
27020
  v_frozen_ids uuid[]; v_line_ids uuid[];
26648
27021
  BEGIN
27022
+ PERFORM public.logistics_acc_guard('server', 'logistics_recompute_reserved_targeted');
26649
27023
  IF p_product_id IS NULL THEN RETURN jsonb_build_object('status', 'geen_product'); END IF;
26650
27024
  IF current_setting('app.recomputing_reserved', true) = 'on' THEN RETURN jsonb_build_object('status', 'al_bezig'); END IF;
26651
27025
  PERFORM set_config('app.recomputing_reserved', 'on', true);
@@ -26846,7 +27220,8 @@ BEGIN
26846
27220
  JOIN public.orders ord ON ord.id = op.order_id
26847
27221
  WHERE r.trade_item_key = d.trade_item_key AND r.qty > 0
26848
27222
  AND NOT (public.normalize_order_source(ord.order_source) = 'FO'
26849
- AND COALESCE(public.voorraad_floriday_leads_key(d.trade_item_key), false))), 0);
27223
+ AND COALESCE(public.voorraad_floriday_leads_key(d.trade_item_key), false))), 0)
27224
+ WHERE d.trade_item_key IS NOT NULL; -- safeupdate: sleutel van _rt_demand (altijd gevuld)
26850
27225
  ELSE
26851
27226
  PERFORM public.logistics_trace(jsonb_build_object(
26852
27227
  'phase', 'reservering', 'step', 'reservering herberekenen', 'status', 'waarschuwing',
@@ -26937,6 +27312,7 @@ DECLARE
26937
27312
  v_ok boolean := true;
26938
27313
  v_reden text;
26939
27314
  BEGIN
27315
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_resolve_pick_document');
26940
27316
  SELECT * INTO item FROM public.pick_queue WHERE id = _queue_item_id;
26941
27317
  IF NOT FOUND THEN
26942
27318
  RAISE EXCEPTION 'Dit document bestaat niet meer.' USING ERRCODE = 'P0002';
@@ -27106,6 +27482,7 @@ declare
27106
27482
  doc jsonb; target_printer uuid; job_id uuid; v_cart_id uuid;
27107
27483
  v_doc_code text; v_plan jsonb; v_cart jsonb; v_last uuid; v_row_cart text;
27108
27484
  begin
27485
+ PERFORM public.logistics_acc_guard('ingelogd', 'pick_enqueue_print_job');
27109
27486
  select lower(btrim(coalesce(nullif(q.payload->>'documentType',''), nullif(t.code,''), ''))),
27110
27487
  nullif(q.payload->>'cartId','')
27111
27488
  into v_doc_code, v_row_cart
@@ -27198,6 +27575,7 @@ DECLARE
27198
27575
  v_sleutel text;
27199
27576
  v_order uuid;
27200
27577
  BEGIN
27578
+ PERFORM public.logistics_acc_guard('ingelogd', 'pick_enqueue_print_job');
27201
27579
  SELECT * INTO item FROM public.pick_queue WHERE id = _queue_item_id;
27202
27580
  IF NOT FOUND THEN RAISE EXCEPTION 'Dit document bestaat niet meer.'; END IF;
27203
27581
  SELECT * INTO dt FROM public.pick_document_types WHERE id = item.document_type_id;
@@ -27366,7 +27744,6 @@ BEGIN
27366
27744
  RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'reden', 'Geen documentsoort opgegeven.');
27367
27745
  END IF;
27368
27746
 
27369
- -- 1.0.176: 'verzenddocument' wordt hier vertaald naar het echte document van de order.
27370
27747
  IF v_soort IN ('verzenddocument', 'verzendbrief') THEN
27371
27748
  SELECT o.order_source = 'floriday' INTO v_floriday FROM public.orders o WHERE o.id = p_order_id;
27372
27749
  IF NOT FOUND THEN
@@ -27466,12 +27843,16 @@ RETURNS integer LANGUAGE sql IMMUTABLE SET search_path = public AS $tp$
27466
27843
  $tp$;
27467
27844
 
27468
27845
  CREATE OR REPLACE FUNCTION public.logistics_own_traysticker_payload(p_id uuid)
27469
- RETURNS jsonb LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
27846
+ RETURNS jsonb
27847
+ LANGUAGE plpgsql
27848
+ STABLE SECURITY DEFINER
27849
+ SET search_path TO 'public'
27470
27850
  AS $function$
27471
27851
  DECLARE
27472
27852
  p record; o record; c record; v_ci uuid; v_k int; v_nr int; v_tot int; v_loc text;
27473
27853
  v_ppc int; v_regel_tot int; v_item_voor int; v_item_fusten int; v_aantal int; v_prod jsonb;
27474
27854
  BEGIN
27855
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_own_traysticker_payload');
27475
27856
  SELECT * INTO p FROM public.logistics_sticker_prints WHERE id = p_id AND soort = 'eigen_traysticker';
27476
27857
  IF p.id IS NULL THEN RETURN jsonb_build_object('ok', false, 'reden', 'Traysticker niet gevonden.'); END IF;
27477
27858
  v_ci := public.logistics_try_uuid(split_part(p.bron_id, ':', 3));
@@ -27490,7 +27871,6 @@ BEGIN
27490
27871
  END IF;
27491
27872
  SELECT * INTO o FROM public.orders WHERE id = p.order_id;
27492
27873
 
27493
- -- Fustnummer x van y binnen de order (alle karren), volgorde kar, regel, fust.
27494
27874
  WITH alle AS (
27495
27875
  SELECT ci.id, ci.crates, row_number() OVER (ORDER BY ci.cart_id, ci.created_at, ci.id) AS rn
27496
27876
  FROM public.order_cart_items ci JOIN public.order_items oi ON oi.id = ci.order_item_id
@@ -27500,7 +27880,6 @@ BEGIN
27500
27880
  coalesce(sum(crates) FILTER (WHERE rn < (SELECT rn FROM alle WHERE id = v_ci)), 0)::int + v_k
27501
27881
  INTO v_tot, v_nr FROM alle;
27502
27882
 
27503
- -- Planten per fust: karregel, dan orderregel, dan product. Laatste fust van de regel: de rest.
27504
27883
  v_ppc := coalesce(nullif(c.plants_per_crate, 0), nullif(c.ppc_regel, 0), nullif(c.ppc_product, 0))::int;
27505
27884
  IF v_ppc IS NULL THEN
27506
27885
  RETURN jsonb_build_object('ok', false, 'reden', 'Planten per fust onbekend (niet op de regel en niet bij het product). Vul planten per fust in.');
@@ -27557,10 +27936,14 @@ DO $p$ BEGIN
27557
27936
  END IF;
27558
27937
  END $p$;
27559
27938
 
27560
- CREATE OR REPLACE FUNCTION public.logistics_belading_bevestig(p_order_id uuid, p_sleutel text, p_redenen text[] DEFAULT '{}')
27561
- RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
27939
+ CREATE OR REPLACE FUNCTION public.logistics_belading_bevestig(p_order_id uuid, p_sleutel text, p_redenen text[] DEFAULT '{}'::text[])
27940
+ RETURNS jsonb
27941
+ LANGUAGE plpgsql
27942
+ SECURITY DEFINER
27943
+ SET search_path TO 'public'
27562
27944
  AS $function$
27563
27945
  BEGIN
27946
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_belading_bevestig');
27564
27947
  IF NOT public.logistics_is_beheer() THEN
27565
27948
  RAISE EXCEPTION 'Alleen beheer mag een belading bevestigen.';
27566
27949
  END IF;
@@ -27578,9 +27961,13 @@ GRANT EXECUTE ON FUNCTION public.logistics_belading_bevestig(uuid, text, text[])
27578
27961
 
27579
27962
  -- 5. Lease bezet: opdracht blijft open en komt later terug (nooit 'done' zonder indeling).
27580
27963
  CREATE OR REPLACE FUNCTION public.logistics_plan_retry_later(p_id uuid, p_seconds integer DEFAULT 30)
27581
- RETURNS void LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
27964
+ RETURNS void
27965
+ LANGUAGE plpgsql
27966
+ SECURITY DEFINER
27967
+ SET search_path TO 'public'
27582
27968
  AS $function$
27583
27969
  BEGIN
27970
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_retry_later');
27584
27971
  UPDATE public.logistics_plan_queue
27585
27972
  SET status = 'pending', claimed_at = NULL,
27586
27973
  next_attempt_at = now() + make_interval(secs => greatest(5, least(coalesce(p_seconds, 30), 600))),
@@ -27617,10 +28004,13 @@ DO $c$ BEGIN
27617
28004
  END $c$;
27618
28005
 
27619
28006
  -- Dubbele kar-indexen per order (twee karren met hetzelfde volgnummer): alleen-lezen lijst.
27620
- CREATE OR REPLACE FUNCTION public.logistics_cart_seq_dubbel(p_order_uuid uuid DEFAULT NULL)
28007
+ CREATE OR REPLACE FUNCTION public.logistics_cart_seq_dubbel(p_order_uuid uuid DEFAULT NULL::uuid)
27621
28008
  RETURNS TABLE(order_uuid uuid, cart_index integer, cart_ids uuid[])
27622
- LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
28009
+ LANGUAGE sql
28010
+ STABLE SECURITY DEFINER
28011
+ SET search_path TO 'public'
27623
28012
  AS $function$
28013
+ SELECT public.logistics_acc_guard('server', 'logistics_cart_seq_dubbel');
27624
28014
  WITH ruw AS (
27625
28015
  SELECT oc.id AS cart_id, oc.cart_number AS cart_index, oc.order_id AS order_uuid
27626
28016
  FROM logistics_active.order_carts oc
@@ -27642,10 +28032,13 @@ GRANT EXECUTE ON FUNCTION public.logistics_cart_seq_dubbel(uuid) TO service_role
27642
28032
  -- Karnummer eerst via kar-id, anders via order + index (bestaande nummers).
27643
28033
  CREATE OR REPLACE FUNCTION public.logistics_cart_seq(p_order_uuid uuid DEFAULT NULL::uuid)
27644
28034
  RETURNS TABLE(order_uuid uuid, cart_id uuid, cart_index integer, cart_seq integer, cart_number text, cart_total integer)
27645
- LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
28035
+ LANGUAGE plpgsql
28036
+ STABLE SECURITY DEFINER
28037
+ SET search_path TO 'public'
27646
28038
  AS $function$
27647
28039
  DECLARE d record;
27648
28040
  BEGIN
28041
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_cart_seq');
27649
28042
  SELECT * INTO d FROM public.logistics_cart_seq_dubbel(p_order_uuid) LIMIT 1;
27650
28043
  IF d.order_uuid IS NOT NULL THEN
27651
28044
  RAISE EXCEPTION 'Karnummering ongeldig: order % heeft % karren met volgnummer %. Deel de order opnieuw in; er wordt geen kar weggelaten.',
@@ -27682,13 +28075,17 @@ GRANT EXECUTE ON FUNCTION public.logistics_cart_seq(uuid) TO authenticated, serv
27682
28075
 
27683
28076
  -- 8. Kar wisselen: eerst vergrendelen en pickup_locked controleren, dan pas verwijderen; geen stille 1.
27684
28077
  CREATE OR REPLACE FUNCTION public.logistics_apply_cart_swap(p_delete_ids uuid[], p_new_carts jsonb)
27685
- RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
28078
+ RETURNS jsonb
28079
+ LANGUAGE plpgsql
28080
+ SECURITY DEFINER
28081
+ SET search_path TO 'public'
27686
28082
  AS $function$
27687
28083
  DECLARE
27688
28084
  v_del uuid[] := COALESCE(p_delete_ids, ARRAY[]::uuid[]);
27689
28085
  v_cart jsonb; v_row jsonb; v_id uuid; v_map jsonb := '[]'::jsonb;
27690
28086
  v_jobs int := 0; v_carts int := 0; v_items int := 0; v_locked int;
27691
28087
  BEGIN
28088
+ PERFORM public.logistics_acc_guard('server', 'logistics_apply_cart_swap');
27692
28089
  IF jsonb_typeof(COALESCE(p_new_carts, '[]'::jsonb)) <> 'array' THEN
27693
28090
  RAISE EXCEPTION 'Nieuwe karren ontbreken of zijn ongeldig.';
27694
28091
  END IF;
@@ -27753,10 +28150,14 @@ GRANT EXECUTE ON FUNCTION public.logistics_apply_cart_swap(uuid[], jsonb) TO ser
27753
28150
 
27754
28151
  -- 1. Autofix schrijft alleen een volledige, positieve Floriday-verpakking weg (0 = onbekend).
27755
28152
  CREATE OR REPLACE FUNCTION public.logistics_packing_autofix(p_limit integer DEFAULT 100)
27756
- RETURNS integer LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
28153
+ RETURNS integer
28154
+ LANGUAGE plpgsql
28155
+ SECURITY DEFINER
28156
+ SET search_path TO 'public'
27757
28157
  AS $function$
27758
28158
  DECLARE r record; v_reden text; v_aantal integer := 0; v_ppc int; v_cpl int; v_lpc int;
27759
28159
  BEGIN
28160
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_packing_autofix');
27760
28161
  FOR r IN
27761
28162
  SELECT d.* FROM public.logistics_packing_deviations d
27762
28163
  WHERE d.resolved_at IS NULL AND d.scope = 'order_line' AND d.needs_human = false
@@ -27796,10 +28197,14 @@ $function$;
27796
28197
 
27797
28198
  -- 9. Reconcile alleen bij een echte wijziging sinds de laatste afgeronde of geblokkeerde opdracht; kleinere porties.
27798
28199
  CREATE OR REPLACE FUNCTION public.logistics_reconcile_missing_plan_queue()
27799
- RETURNS integer LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
28200
+ RETURNS integer
28201
+ LANGUAGE plpgsql
28202
+ SECURITY DEFINER
28203
+ SET search_path TO 'public'
27800
28204
  AS $function$
27801
28205
  DECLARE r record; n integer := 0;
27802
28206
  BEGIN
28207
+ PERFORM public.logistics_acc_guard('server', 'logistics_reconcile_missing_plan_queue');
27803
28208
  FOR r IN
27804
28209
  SELECT o.id FROM public.orders o
27805
28210
  WHERE o.deleted_at IS NULL
@@ -27842,9 +28247,12 @@ END $q$;
27842
28247
 
27843
28248
  -- Alleen-lezen lijst: orders met meer dan één open planopdracht.
27844
28249
  CREATE OR REPLACE FUNCTION public.logistics_plan_queue_dubbel()
27845
- RETURNS TABLE(order_id uuid, open_opdrachten bigint, oudste timestamptz, nieuwste timestamptz)
27846
- LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
28250
+ RETURNS TABLE(order_id uuid, open_opdrachten bigint, oudste timestamp with time zone, nieuwste timestamp with time zone)
28251
+ LANGUAGE sql
28252
+ STABLE SECURITY DEFINER
28253
+ SET search_path TO 'public'
27847
28254
  AS $function$
28255
+ SELECT public.logistics_acc_guard('server', 'logistics_plan_queue_dubbel');
27848
28256
  SELECT q.order_id, count(*), min(q.enqueued_at), max(q.enqueued_at)
27849
28257
  FROM public.logistics_plan_queue q
27850
28258
  WHERE q.status IN ('pending','running','geblokkeerd')
@@ -27855,13 +28263,17 @@ GRANT EXECUTE ON FUNCTION public.logistics_plan_queue_dubbel() TO service_role;
27855
28263
 
27856
28264
  -- 10. Buffer uit: elke order krijgt een eigen buffer (sleutel solo:<order-id>) en wordt dus per order ingedeeld.
27857
28265
  CREATE OR REPLACE FUNCTION public.logistics_apply_buffer_decision(p_order_id uuid)
27858
- RETURNS uuid LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
28266
+ RETURNS uuid
28267
+ LANGUAGE plpgsql
28268
+ SECURITY DEFINER
28269
+ SET search_path TO 'public'
27859
28270
  AS $function$
27860
28271
  DECLARE
27861
28272
  o public.orders%ROWTYPE;
27862
28273
  cf jsonb; d jsonb; v_ref text; v_close timestamptz; v_key text;
27863
28274
  v_buffer uuid; v_closed boolean; v_try int := 0; v_on_cart boolean; v_solo boolean := false;
27864
28275
  BEGIN
28276
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_apply_buffer_decision');
27865
28277
  SELECT * INTO o FROM public.orders WHERE id = p_order_id;
27866
28278
  IF NOT FOUND OR o.deleted_at IS NOT NULL THEN RETURN NULL; END IF;
27867
28279
  cf := COALESCE(o.custom_fields, '{}'::jsonb);
@@ -27951,13 +28363,17 @@ $function$;
27951
28363
  -- 13. Eigen traystickers: zolang bij één regel van de order het fustaantal onbekend is, wachten ALLE
27952
28364
  -- eigen traystickers van die order ("Fustaantal van regel X onbekend"), zodat x van y klopt.
27953
28365
  CREATE OR REPLACE FUNCTION public.logistics_own_traysticker_sync(p_limit integer DEFAULT 200)
27954
- RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
28366
+ RETURNS jsonb
28367
+ LANGUAGE plpgsql
28368
+ SECURITY DEFINER
28369
+ SET search_path TO 'public'
27955
28370
  AS $function$
27956
28371
  DECLARE
27957
28372
  s jsonb; v_tray text; v_rel text; v_station text;
27958
28373
  r record; v_bron text; v_keep text[] := '{}'; v_wacht_orders uuid[] := '{}';
27959
28374
  n int := 0; n_geblokkeerd int := 0; n_vrij int := 0; n_uit int := 0;
27960
28375
  BEGIN
28376
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_own_traysticker_sync');
27961
28377
  SELECT settings INTO s FROM public.logistics_rule_configs
27962
28378
  ORDER BY is_active DESC, (status = 'actief') DESC, updated_at DESC LIMIT 1;
27963
28379
  v_tray := public.logistics_rule_text(s, 'pickstations', 'traysticker_release', 'uit');
@@ -28006,7 +28422,6 @@ BEGIN
28006
28422
  VALUES ('eigen_traysticker', v_bron, r.order_id, r.order_number, r.cart_id, 1,
28007
28423
  public.logistics_sticker_cart_plek(r.cart_id, v_station), 'wacht_op_moment', 'Wacht op de pakbon van deze kar.')
28008
28424
  ON CONFLICT DO NOTHING;
28009
- -- Was hij eerder tegengehouden door een onbekend fustaantal: weer laten wachten op het moment.
28010
28425
  UPDATE public.logistics_sticker_prints
28011
28426
  SET status = 'wacht_op_moment', reden = 'Wacht op de pakbon van deze kar.', updated_at = now()
28012
28427
  WHERE soort = 'eigen_traysticker' AND bron_id = v_bron AND status = 'geblokkeerd'
@@ -28015,7 +28430,6 @@ BEGIN
28015
28430
  END LOOP;
28016
28431
  END LOOP;
28017
28432
 
28018
- -- Order met onbekend fustaantal: alle nog niet geprinte stickers wachten (niet vervallen).
28019
28433
  UPDATE public.logistics_sticker_prints p
28020
28434
  SET status = 'geblokkeerd',
28021
28435
  reden = (SELECT b.reden FROM public.logistics_sticker_prints b
@@ -28061,6 +28475,7 @@ CREATE OR REPLACE FUNCTION public.logistics_sticker_order_counts(p_order uuid, p
28061
28475
  STABLE SECURITY DEFINER
28062
28476
  SET search_path TO 'public'
28063
28477
  AS $function$
28478
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_sticker_order_counts');
28064
28479
  WITH ci AS (
28065
28480
  SELECT ci.* FROM logistics_active.order_cart_items ci
28066
28481
  JOIN public.order_items oi ON oi.id = ci.order_item_id
@@ -28087,6 +28502,7 @@ CREATE OR REPLACE FUNCTION public.logistics_sticker_copies(p_order uuid, p_stick
28087
28502
  AS $function$
28088
28503
  DECLARE v int; c jsonb; t text := upper(coalesce(p_type,''));
28089
28504
  BEGIN
28505
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sticker_copies');
28090
28506
  IF (p_fi->>'numberOfCopies') ~ '^\d+$' AND (p_fi->>'numberOfCopies')::int > 0 THEN
28091
28507
  RETURN jsonb_build_object('aantal', (p_fi->>'numberOfCopies')::int, 'bron', 'numberOfCopies');
28092
28508
  END IF;
@@ -28123,6 +28539,7 @@ DECLARE
28123
28539
  v_crates_tot int; v_pieces_tot int; r record; v_rows int; v_cp jsonb; v_bron text; v_ncarts int; sv record;
28124
28540
  n_st int := 0; n_tray int := 0;
28125
28541
  BEGIN
28542
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_sticker_sync');
28126
28543
  SELECT settings INTO s FROM public.logistics_rule_configs
28127
28544
  ORDER BY is_active DESC, (status = 'actief') DESC, updated_at DESC LIMIT 1;
28128
28545
  v_rel := public.logistics_rule_text(s, 'pickstations', 'sticker_release', 'with_pick_release');
@@ -28334,6 +28751,7 @@ CREATE OR REPLACE FUNCTION public.logistics_sticker_etiket_status()
28334
28751
  STABLE SECURITY DEFINER
28335
28752
  SET search_path TO 'public'
28336
28753
  AS $function$
28754
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_sticker_etiket_status');
28337
28755
  SELECT jsonb_build_object(
28338
28756
  'wachtend', (SELECT count(*) FROM public.logistics_sticker_prints
28339
28757
  WHERE status IN ('klaar','geblokkeerd') AND reden LIKE 'Stel bij je labelprinter in welk etiket erin zit%'),
@@ -28407,10 +28825,14 @@ END $fs$;
28407
28825
  -- Eén rij per Shell; gegevens gaan niet mee met kloon of schemasync, dus de rij wordt
28408
28826
  -- bij gebruik aangemaakt (standaard "uit"). installed_at = moment van eerste gebruik in deze Shell.
28409
28827
  CREATE OR REPLACE FUNCTION public.logistics_carrier_settings_ensure()
28410
- RETURNS public.logistics_carrier_settings LANGUAGE plpgsql VOLATILE SECURITY DEFINER SET search_path TO 'public'
28828
+ RETURNS logistics_carrier_settings
28829
+ LANGUAGE plpgsql
28830
+ SECURITY DEFINER
28831
+ SET search_path TO 'public'
28411
28832
  AS $function$
28412
28833
  DECLARE r public.logistics_carrier_settings;
28413
28834
  BEGIN
28835
+ PERFORM public.logistics_acc_guard('server', 'logistics_carrier_settings_ensure');
28414
28836
  SELECT * INTO r FROM public.logistics_carrier_settings WHERE id;
28415
28837
  IF NOT FOUND THEN
28416
28838
  INSERT INTO public.logistics_carrier_settings (id, backfill_existing) VALUES (true, false)
@@ -28454,10 +28876,14 @@ CREATE INDEX IF NOT EXISTS logistics_carrier_recalc_queue_open_idx
28454
28876
 
28455
28877
  -- Waarom een vervoerder niet bruikbaar is (NULL = bruikbaar).
28456
28878
  CREATE OR REPLACE FUNCTION public.logistics_carrier_skip_reason(p_carrier_id uuid)
28457
- RETURNS text LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
28879
+ RETURNS text
28880
+ LANGUAGE plpgsql
28881
+ STABLE SECURITY DEFINER
28882
+ SET search_path TO 'public'
28458
28883
  AS $function$
28459
28884
  DECLARE c jsonb;
28460
28885
  BEGIN
28886
+ PERFORM public.logistics_acc_guard('server', 'logistics_carrier_skip_reason');
28461
28887
  IF p_carrier_id IS NULL THEN RETURN 'is leeg'; END IF;
28462
28888
  SELECT to_jsonb(ca) INTO c FROM public.carriers ca WHERE ca.id = p_carrier_id;
28463
28889
  IF c IS NULL THEN RETURN 'bestaat niet (meer)'; END IF;
@@ -28476,8 +28902,12 @@ END $function$;
28476
28902
 
28477
28903
  -- Heeft de vervoerder een ophaalmoment voor deze leverdag?
28478
28904
  CREATE OR REPLACE FUNCTION public.logistics_carrier_picks_up_for(p_carrier_id uuid, p_delivery_date date)
28479
- RETURNS boolean LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
28905
+ RETURNS boolean
28906
+ LANGUAGE sql
28907
+ STABLE SECURITY DEFINER
28908
+ SET search_path TO 'public'
28480
28909
  AS $function$
28910
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_carrier_picks_up_for');
28481
28911
  SELECT EXISTS (
28482
28912
  SELECT 1 FROM public.carriers ca
28483
28913
  CROSS JOIN LATERAL jsonb_array_elements(CASE WHEN jsonb_typeof(ca.pickup_moments) = 'array' THEN ca.pickup_moments ELSE '[]'::jsonb END) m
@@ -28488,10 +28918,14 @@ $function$;
28488
28918
 
28489
28919
  -- Opgemaakt resultaat volgens het contract.
28490
28920
  CREATE OR REPLACE FUNCTION public.logistics_carrier_result(p_carrier_id uuid, p_bron text, p_reden text, p_skips text[])
28491
- RETURNS jsonb LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
28921
+ RETURNS jsonb
28922
+ LANGUAGE plpgsql
28923
+ STABLE SECURITY DEFINER
28924
+ SET search_path TO 'public'
28492
28925
  AS $function$
28493
28926
  DECLARE c jsonb; v_kind text; v_name text; v_reden text := p_reden;
28494
28927
  BEGIN
28928
+ PERFORM public.logistics_acc_guard('server', 'logistics_carrier_result');
28495
28929
  IF p_carrier_id IS NOT NULL THEN
28496
28930
  SELECT to_jsonb(ca) INTO c FROM public.carriers ca WHERE ca.id = p_carrier_id;
28497
28931
  v_kind := c->>'carrier_kind';
@@ -28506,10 +28940,14 @@ END $function$;
28506
28940
 
28507
28941
  -- Favoriet van Afhandeling op id (afh_favorite_carrier() geeft een rij met carrier_id).
28508
28942
  CREATE OR REPLACE FUNCTION public.logistics_carrier_favorite_id()
28509
- RETURNS uuid LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
28943
+ RETURNS uuid
28944
+ LANGUAGE plpgsql
28945
+ STABLE SECURITY DEFINER
28946
+ SET search_path TO 'public'
28510
28947
  AS $function$
28511
28948
  DECLARE j jsonb;
28512
28949
  BEGIN
28950
+ PERFORM public.logistics_acc_guard('server', 'logistics_carrier_favorite_id');
28513
28951
  IF to_regprocedure('public.afh_favorite_carrier()') IS NULL THEN RETURN NULL; END IF;
28514
28952
  EXECUTE 'SELECT to_jsonb(f) FROM public.afh_favorite_carrier() f LIMIT 1' INTO j;
28515
28953
  RETURN public.logistics_try_uuid(CASE jsonb_typeof(j) WHEN 'object' THEN coalesce(j->>'carrier_id', j->>'id')
@@ -28521,7 +28959,10 @@ END $function$;
28521
28959
  -- -> 3 GLN-lijst per vervoerder -> 4 standaard van de klant -> 5 werkgebied
28522
28960
  -- (plaats > provincie > land, ophaalmoment op de leverdag) -> 6 favoriet.
28523
28961
  CREATE OR REPLACE FUNCTION public.logistics_resolve_carrier_core(p_order jsonb, p_skip_manual boolean DEFAULT false)
28524
- RETURNS jsonb LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
28962
+ RETURNS jsonb
28963
+ LANGUAGE plpgsql
28964
+ STABLE SECURITY DEFINER
28965
+ SET search_path TO 'public'
28525
28966
  AS $function$
28526
28967
  DECLARE
28527
28968
  cf jsonb := CASE WHEN jsonb_typeof(p_order->'custom_fields') = 'object' THEN p_order->'custom_fields' ELSE '{}'::jsonb END;
@@ -28531,11 +28972,11 @@ DECLARE
28531
28972
  l jsonb; cu jsonb; v_id uuid; v_skip text; v_skips text[] := '{}'::text[];
28532
28973
  v_country text; v_prov text; v_city text; v_lvl int; v_any boolean; r record; v_fav text;
28533
28974
  BEGIN
28975
+ PERFORM public.logistics_acc_guard('server', 'logistics_resolve_carrier_core');
28534
28976
  IF coalesce(p_order->>'delivery_date', '') ~ '^\d{4}-\d{2}-\d{2}' THEN
28535
28977
  v_date := left(p_order->>'delivery_date', 10)::date;
28536
28978
  END IF;
28537
28979
 
28538
- -- 1. Handmatig gekozen op de order (alleen via logistics_set_order_carrier).
28539
28980
  IF NOT p_skip_manual AND p_order->>'carrier_source' = 'handmatig' THEN
28540
28981
  v_id := public.logistics_try_uuid(p_order->>'carrier_id');
28541
28982
  v_skip := public.logistics_carrier_skip_reason(v_id);
@@ -28544,7 +28985,6 @@ BEGIN
28544
28985
  END IF;
28545
28986
  v_skips := v_skips || ('handmatige keuze: ' || v_skip);
28546
28987
  END IF;
28547
- -- 1b. Overgenomen uit een bestaande custom_fields.carrier (bron 'oud').
28548
28988
  v_id := public.logistics_try_uuid(cf->>'carrier');
28549
28989
  IF v_id IS NOT NULL THEN
28550
28990
  v_skip := public.logistics_carrier_skip_reason(v_id);
@@ -28554,7 +28994,6 @@ BEGIN
28554
28994
  v_skips := v_skips || ('bestaande vervoerder op de order: ' || v_skip);
28555
28995
  END IF;
28556
28996
 
28557
- -- 2. Afleverlocatie (op id, anders op GLN).
28558
28997
  v_loc_raw := coalesce(nullif(btrim(cf->>'delivery_location_id'), ''), nullif(btrim(cf->>'delivery_location'), ''));
28559
28998
  v_loc_id := public.logistics_try_uuid(v_loc_raw);
28560
28999
  v_gln := coalesce(nullif(btrim(cf->>'delivery_location_gln'), ''), CASE WHEN v_loc_id IS NULL THEN v_loc_raw END);
@@ -28589,7 +29028,6 @@ BEGIN
28589
29028
  END IF;
28590
29029
  END IF;
28591
29030
 
28592
- -- 3. Vervoerder die deze afleverlocatie-GLN bedient (lijst van Afhandeling).
28593
29031
  IF v_gln IS NOT NULL THEN
28594
29032
  IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'carriers' AND column_name = 'delivery_location_glns') THEN
28595
29033
  FOR r IN SELECT ca.id FROM public.carriers ca
@@ -28606,7 +29044,6 @@ BEGIN
28606
29044
  END IF;
28607
29045
  END IF;
28608
29046
 
28609
- -- 4. Standaardvervoerder van de klant (veld van Klanten).
28610
29047
  IF v_cust IS NOT NULL THEN
28611
29048
  SELECT to_jsonb(x) INTO cu FROM public.customers x WHERE x.id = v_cust;
28612
29049
  IF cu IS NOT NULL AND NOT (cu ? 'default_carrier_id') THEN
@@ -28623,7 +29060,6 @@ BEGIN
28623
29060
  END IF;
28624
29061
  END IF;
28625
29062
 
28626
- -- 5. Werkgebied: plaats > provincie > land, met een ophaalmoment op de leverdag.
28627
29063
  IF v_date IS NULL AND NOT v_zonder_datum THEN
28628
29064
  v_skips := v_skips || 'werkgebied: leverdatum onbekend'::text;
28629
29065
  ELSE
@@ -28656,7 +29092,6 @@ BEGIN
28656
29092
  END LOOP;
28657
29093
  END IF;
28658
29094
 
28659
- -- 6. Favoriete vervoerder van de Shell (Afhandeling).
28660
29095
  IF to_regprocedure('public.afh_favorite_carrier()') IS NULL THEN
28661
29096
  v_skips := v_skips || 'favoriete vervoerder bestaat nog niet (Afhandeling)'::text;
28662
29097
  ELSE
@@ -28687,10 +29122,14 @@ END $function$;
28687
29122
  -- "Aangemeld" = vastlegging van Afhandeling in carrier_signup_dispatches (sent_at gevuld,
28688
29123
  -- order_ids bevat de order), gelezen via to_jsonb.
28689
29124
  CREATE OR REPLACE FUNCTION public.logistics_carrier_frozen_reason(p_order_id uuid)
28690
- RETURNS text LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
29125
+ RETURNS text
29126
+ LANGUAGE plpgsql
29127
+ STABLE SECURITY DEFINER
29128
+ SET search_path TO 'public'
28691
29129
  AS $function$
28692
29130
  DECLARE v_locked timestamptz; v_hit boolean;
28693
29131
  BEGIN
29132
+ PERFORM public.logistics_acc_guard('server', 'logistics_carrier_frozen_reason');
28694
29133
  SELECT plan_locked_at INTO v_locked FROM public.orders WHERE id = p_order_id;
28695
29134
  IF v_locked IS NOT NULL THEN RETURN 'de planning is vastgezet'; END IF;
28696
29135
  BEGIN
@@ -28713,10 +29152,14 @@ END $function$;
28713
29152
 
28714
29153
  -- Vervoerder van een order volgens het contract (alleen lezen).
28715
29154
  CREATE OR REPLACE FUNCTION public.logistics_resolve_carrier(p_order_id uuid)
28716
- RETURNS jsonb LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
29155
+ RETURNS jsonb
29156
+ LANGUAGE plpgsql
29157
+ STABLE SECURITY DEFINER
29158
+ SET search_path TO 'public'
28717
29159
  AS $function$
28718
29160
  DECLARE o jsonb; r jsonb; v_fr text;
28719
29161
  BEGIN
29162
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_resolve_carrier');
28720
29163
  SELECT to_jsonb(x) INTO o FROM public.orders x WHERE x.id = p_order_id;
28721
29164
  IF o IS NULL THEN
28722
29165
  RETURN jsonb_build_object('carrier_id', NULL, 'carrier_name', NULL, 'carrier_kind', NULL, 'bron', 'geen',
@@ -28733,15 +29176,23 @@ BEGIN
28733
29176
  END $function$;
28734
29177
 
28735
29178
  CREATE OR REPLACE FUNCTION public.logistics_resolve_carrier_many(p_order_ids uuid[])
28736
- RETURNS TABLE(order_id uuid, resultaat jsonb) LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
29179
+ RETURNS TABLE(order_id uuid, resultaat jsonb)
29180
+ LANGUAGE sql
29181
+ STABLE SECURITY DEFINER
29182
+ SET search_path TO 'public'
28737
29183
  AS $function$
29184
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_resolve_carrier_many');
28738
29185
  SELECT x.id, public.logistics_resolve_carrier(x.id) FROM unnest(coalesce(p_order_ids, '{}'::uuid[])) AS x(id)
28739
29186
  $function$;
28740
29187
 
28741
29188
  -- Voor Klanten: dezelfde volgorde zonder stap 1 (geen order, dus geen leverdag).
28742
29189
  CREATE OR REPLACE FUNCTION public.logistics_resolve_carrier_for_location(p_location_id uuid, p_customer_id uuid)
28743
- RETURNS jsonb LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
29190
+ RETURNS jsonb
29191
+ LANGUAGE sql
29192
+ STABLE SECURITY DEFINER
29193
+ SET search_path TO 'public'
28744
29194
  AS $function$
29195
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_resolve_carrier_for_location');
28745
29196
  SELECT public.logistics_resolve_carrier_core(jsonb_build_object(
28746
29197
  'customer_id', coalesce(p_customer_id, (SELECT l.customer_id FROM public.customer_delivery_locations l WHERE l.id = p_location_id)),
28747
29198
  'custom_fields', jsonb_build_object('delivery_location_id', p_location_id),
@@ -28749,20 +29200,26 @@ AS $function$
28749
29200
  $function$;
28750
29201
 
28751
29202
  CREATE OR REPLACE FUNCTION public.logistics_resolve_carrier_for_location_many(p_location_ids uuid[], p_customer_id uuid)
28752
- RETURNS TABLE(location_id uuid, resultaat jsonb) LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
29203
+ RETURNS TABLE(location_id uuid, resultaat jsonb)
29204
+ LANGUAGE sql
29205
+ STABLE SECURITY DEFINER
29206
+ SET search_path TO 'public'
28753
29207
  AS $function$
29208
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_resolve_carrier_for_location_many');
28754
29209
  SELECT x.id, public.logistics_resolve_carrier_for_location(x.id, p_customer_id)
28755
29210
  FROM unnest(coalesce(p_location_ids, '{}'::uuid[])) AS x(id)
28756
29211
  $function$;
28757
29212
 
28758
29213
  -- Variant voor een hele klantenlijst: [{location_id, customer_id}, ...] (max. 1000 regels).
28759
29214
  CREATE OR REPLACE FUNCTION public.logistics_resolve_carrier_for_location_many(p_items jsonb)
28760
- RETURNS TABLE(location_id uuid, customer_id uuid, carrier_id uuid, carrier_name text, carrier_kind text,
28761
- bron text, reden text, waarschuwing text)
28762
- LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
29215
+ RETURNS TABLE(location_id uuid, customer_id uuid, carrier_id uuid, carrier_name text, carrier_kind text, bron text, reden text, waarschuwing text)
29216
+ LANGUAGE plpgsql
29217
+ STABLE SECURITY DEFINER
29218
+ SET search_path TO 'public'
28763
29219
  AS $function$
28764
29220
  DECLARE it jsonb; r jsonb; v_loc uuid; v_cust uuid;
28765
29221
  BEGIN
29222
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_resolve_carrier_for_location_many');
28766
29223
  IF auth.uid() IS NULL AND coalesce(auth.role(), '') <> 'service_role' THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
28767
29224
  IF p_items IS NULL OR jsonb_typeof(p_items) <> 'array' THEN RAISE EXCEPTION 'p_items moet een lijst zijn: [{location_id, customer_id}, ...]'; END IF;
28768
29225
  IF jsonb_array_length(p_items) > 1000 THEN RAISE EXCEPTION 'Te veel regels (%); maximaal 1000 per aanroep.', jsonb_array_length(p_items); END IF;
@@ -28784,10 +29241,14 @@ END $function$;
28784
29241
 
28785
29242
  -- Opgeslagen vervoerder (of, zolang nog niet opgeslagen, de regel live; niets schrijven).
28786
29243
  CREATE OR REPLACE FUNCTION public.logistics_order_carrier_info(p_order_id uuid)
28787
- RETURNS jsonb LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
29244
+ RETURNS jsonb
29245
+ LANGUAGE plpgsql
29246
+ STABLE SECURITY DEFINER
29247
+ SET search_path TO 'public'
28788
29248
  AS $function$
28789
29249
  DECLARE o jsonb;
28790
29250
  BEGIN
29251
+ PERFORM public.logistics_acc_guard('server', 'logistics_order_carrier_info');
28791
29252
  SELECT to_jsonb(x) INTO o FROM public.orders x WHERE x.id = p_order_id;
28792
29253
  IF o IS NULL THEN RETURN jsonb_build_object('carrier_id', NULL, 'bron', 'geen', 'reden', 'Order niet gevonden.'); END IF;
28793
29254
  IF o->>'carrier_source' IS NOT NULL THEN
@@ -28806,22 +29267,34 @@ BEGIN
28806
29267
  END $function$;
28807
29268
 
28808
29269
  CREATE OR REPLACE FUNCTION public.logistics_order_carrier_label(p_order_id uuid)
28809
- RETURNS text LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
29270
+ RETURNS text
29271
+ LANGUAGE sql
29272
+ STABLE SECURITY DEFINER
29273
+ SET search_path TO 'public'
28810
29274
  AS $function$
29275
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_order_carrier_label');
28811
29276
  SELECT public.logistics_order_carrier_info(p_order_id)->>'carrier_name'
28812
29277
  $function$;
28813
29278
 
28814
29279
  -- Bestaande functie: nu volgens dezelfde regel.
28815
29280
  CREATE OR REPLACE FUNCTION public.logistics_order_carrier_id(p_order_id uuid)
28816
- RETURNS uuid LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
29281
+ RETURNS uuid
29282
+ LANGUAGE sql
29283
+ STABLE SECURITY DEFINER
29284
+ SET search_path TO 'public'
28817
29285
  AS $function$
29286
+ SELECT public.logistics_acc_guard('server', 'logistics_order_carrier_id');
28818
29287
  SELECT public.logistics_try_uuid(public.logistics_order_carrier_info(p_order_id)->>'carrier_id')
28819
29288
  $function$;
28820
29289
 
28821
29290
  -- Bestaande functie blijft; dezelfde regel (locatie op id of GLN).
28822
29291
  CREATE OR REPLACE FUNCTION public.logistics_carrier_for_location(p_location text, p_customer_id uuid)
28823
- RETURNS uuid LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
29292
+ RETURNS uuid
29293
+ LANGUAGE sql
29294
+ STABLE SECURITY DEFINER
29295
+ SET search_path TO 'public'
28824
29296
  AS $function$
29297
+ SELECT public.logistics_acc_guard('server', 'logistics_carrier_for_location');
28825
29298
  SELECT public.logistics_try_uuid(public.logistics_resolve_carrier_core(jsonb_build_object(
28826
29299
  'customer_id', p_customer_id,
28827
29300
  'custom_fields', jsonb_build_object('delivery_location', nullif(btrim(coalesce(p_location, '')), '')),
@@ -28832,7 +29305,10 @@ $function$;
28832
29305
  -- Geen lus: deze trigger zet nooit iets op de herberekenlijst en schrijft
28833
29306
  -- niets anders weg. Engine-schrijvers zetten logistics.carrier_writer = 'engine'.
28834
29307
  CREATE OR REPLACE FUNCTION public.logistics_orders_carrier_fill()
28835
- RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
29308
+ RETURNS trigger
29309
+ LANGUAGE plpgsql
29310
+ SECURITY DEFINER
29311
+ SET search_path TO 'public'
28836
29312
  AS $function$
28837
29313
  DECLARE r jsonb; s record;
28838
29314
  BEGIN
@@ -28852,10 +29328,10 @@ BEGIN
28852
29328
  SELECT * INTO s FROM public.logistics_carrier_settings_ensure();
28853
29329
  IF OLD.carrier_source IS NULL AND NOT coalesce(s.backfill_existing, false)
28854
29330
  AND OLD.created_at < coalesce(s.installed_at, now()) THEN
28855
- RETURN NEW; -- bestaande order: pas na akkoord (schakelaar in Beheer)
29331
+ RETURN NEW;
28856
29332
  END IF;
28857
29333
  IF NEW.plan_locked_at IS NOT NULL OR public.logistics_carrier_frozen_reason(NEW.id) IS NOT NULL THEN
28858
- RETURN NEW; -- bevroren: alleen waarschuwing bij het lezen
29334
+ RETURN NEW;
28859
29335
  END IF;
28860
29336
  END IF;
28861
29337
  BEGIN
@@ -28924,10 +29400,14 @@ CREATE TRIGGER trg_logistics_orders_carrier_changed AFTER UPDATE OF carrier_id O
28924
29400
 
28925
29401
  -- Herberekenlijst vullen: alleen open orders, nooit handmatig, bestaande orders pas na de schakelaar.
28926
29402
  CREATE OR REPLACE FUNCTION public.logistics_carrier_enqueue(p_order_ids uuid[], p_reden text)
28927
- RETURNS integer LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
29403
+ RETURNS integer
29404
+ LANGUAGE plpgsql
29405
+ SECURITY DEFINER
29406
+ SET search_path TO 'public'
28928
29407
  AS $function$
28929
29408
  DECLARE n int;
28930
29409
  BEGIN
29410
+ PERFORM public.logistics_acc_guard('server', 'logistics_carrier_enqueue');
28931
29411
  PERFORM public.logistics_carrier_settings_ensure();
28932
29412
  INSERT INTO public.logistics_carrier_recalc_queue AS q (order_id, reden)
28933
29413
  SELECT o.id, p_reden FROM public.orders o
@@ -28997,11 +29477,15 @@ END $fs$;
28997
29477
  -- langer dan 24 uur niet gecontroleerd zijn). Hooguit p_limit (200) orders per
28998
29478
  -- ronde. Schrijft ALLEEN als carrier_id, bron of reden verschilt.
28999
29479
  CREATE OR REPLACE FUNCTION public.logistics_carrier_recalc_run(p_limit integer DEFAULT 200)
29000
- RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
29480
+ RETURNS jsonb
29481
+ LANGUAGE plpgsql
29482
+ SECURITY DEFINER
29483
+ SET search_path TO 'public'
29001
29484
  AS $function$
29002
29485
  DECLARE s record; r record; o jsonb; v jsonb; v_fr text;
29003
29486
  n_chk int := 0; n_upd int := 0; n_frozen int := 0; n_hand int := 0; n_err int := 0;
29004
29487
  BEGIN
29488
+ PERFORM public.logistics_acc_guard('server', 'logistics_carrier_recalc_run');
29005
29489
  SELECT * INTO s FROM public.logistics_carrier_settings_ensure();
29006
29490
  IF NOT FOUND THEN RETURN jsonb_build_object('overgeslagen', 'instellingen vervoerder ontbreken'); END IF;
29007
29491
  FOR r IN
@@ -29063,11 +29547,13 @@ END $function$;
29063
29547
  -- Handmatig kiezen: de enige manier. NULL = terug naar automatisch. Verstuurt nooit een mail.
29064
29548
  -- Lijst F: wat de regel per bestaande open order zou opslaan (alleen lezen).
29065
29549
  CREATE OR REPLACE FUNCTION public.logistics_carrier_preview_existing(p_limit integer DEFAULT 1000)
29066
- RETURNS TABLE(order_id uuid, order_number text, order_source text, delivery_date text, huidig_custom_carrier text,
29067
- carrier_id uuid, carrier_name text, carrier_kind text, bron text, reden text, bevroren text)
29068
- LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO 'public'
29550
+ RETURNS TABLE(order_id uuid, order_number text, order_source text, delivery_date text, huidig_custom_carrier text, carrier_id uuid, carrier_name text, carrier_kind text, bron text, reden text, bevroren text)
29551
+ LANGUAGE plpgsql
29552
+ STABLE SECURITY DEFINER
29553
+ SET search_path TO 'public'
29069
29554
  AS $function$
29070
29555
  BEGIN
29556
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_carrier_preview_existing');
29071
29557
  IF auth.uid() IS NOT NULL AND NOT public.logistics_is_beheer() THEN
29072
29558
  RAISE EXCEPTION 'Alleen beheer mag deze lijst bekijken.';
29073
29559
  END IF;
@@ -29085,9 +29571,13 @@ END $function$;
29085
29571
 
29086
29572
  -- Schakelaar "Vervoerder berekenen voor bestaande orders" (alleen beheer).
29087
29573
  CREATE OR REPLACE FUNCTION public.logistics_carrier_set_backfill(p_on boolean)
29088
- RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
29574
+ RETURNS jsonb
29575
+ LANGUAGE plpgsql
29576
+ SECURITY DEFINER
29577
+ SET search_path TO 'public'
29089
29578
  AS $function$
29090
29579
  BEGIN
29580
+ PERFORM public.logistics_acc_guard('beheer', 'logistics_carrier_set_backfill');
29091
29581
  IF auth.uid() IS NULL OR NOT public.logistics_is_beheer() THEN
29092
29582
  RAISE EXCEPTION 'Alleen beheer mag deze schakelaar wijzigen.';
29093
29583
  END IF;
@@ -29100,10 +29590,14 @@ END $function$;
29100
29590
 
29101
29591
  -- 'oud' -> 'handmatig', alleen na akkoord en met exact aantal (alleen beheer).
29102
29592
  CREATE OR REPLACE FUNCTION public.logistics_carrier_promote_oud(p_order_ids uuid[], p_confirm_count integer)
29103
- RETURNS integer LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
29593
+ RETURNS integer
29594
+ LANGUAGE plpgsql
29595
+ SECURITY DEFINER
29596
+ SET search_path TO 'public'
29104
29597
  AS $function$
29105
29598
  DECLARE n int;
29106
29599
  BEGIN
29600
+ PERFORM public.logistics_acc_guard('beheer', 'logistics_carrier_promote_oud');
29107
29601
  IF auth.uid() IS NULL OR NOT public.logistics_is_beheer() THEN
29108
29602
  RAISE EXCEPTION 'Alleen beheer mag dit doen.';
29109
29603
  END IF;
@@ -29121,10 +29615,14 @@ END $function$;
29121
29615
 
29122
29616
  -- Bewaking in Beheer (alleen lezen).
29123
29617
  CREATE OR REPLACE FUNCTION public.logistics_carrier_status()
29124
- RETURNS jsonb LANGUAGE plpgsql VOLATILE SECURITY DEFINER SET search_path TO 'public'
29618
+ RETURNS jsonb
29619
+ LANGUAGE plpgsql
29620
+ SECURITY DEFINER
29621
+ SET search_path TO 'public'
29125
29622
  AS $function$
29126
29623
  DECLARE s record; v jsonb;
29127
29624
  BEGIN
29625
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_carrier_status');
29128
29626
  IF auth.uid() IS NULL AND coalesce(auth.role(), '') <> 'service_role' THEN RAISE EXCEPTION 'Niet ingelogd'; END IF;
29129
29627
  SELECT * INTO s FROM public.logistics_carrier_settings_ensure();
29130
29628
  WITH open_orders AS (
@@ -29152,11 +29650,13 @@ END $function$;
29152
29650
  -- Installatiecontrole voor de vervoerder-onderdelen (alleen lezen).
29153
29651
  CREATE OR REPLACE FUNCTION public.logistics_install_check()
29154
29652
  RETURNS TABLE(onderdeel text, ok boolean, toelichting text)
29155
- LANGUAGE plpgsql VOLATILE SECURITY DEFINER SET search_path TO 'public'
29653
+ LANGUAGE plpgsql
29654
+ SECURITY DEFINER
29655
+ SET search_path TO 'public'
29156
29656
  AS $function$
29157
29657
  DECLARE c text; f text; t text; v_fav text; n bigint; s record;
29158
29658
  BEGIN
29159
- -- Engine-onderdelen waar de vervoerder van afhangt + 1.0.179/1.0.182 (functie of tabel op naam).
29659
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_install_check');
29160
29660
  FOREACH f IN ARRAY ARRAY[
29161
29661
  'f:logistics_try_uuid','f:logistics_tz','f:logistics_is_beheer','f:logistics_buffer_payload','f:logistics_apply_order_buffer',
29162
29662
  'f:logistics_apply_buffer_decision','f:logistics_rebuffer_pending','f:logistics_departure_calc','f:logistics_own_transport_departure',
@@ -29168,7 +29668,8 @@ BEGIN
29168
29668
  'f:logistics_sticker_copies','f:logistics_sticker_etiket_status','f:logistics_sticker_order_counts','f:logistics_sticker_sync',
29169
29669
  'c:logistics_sticker_prints.kopieen_bron',
29170
29670
  'f:logistics_carrier_settings_ensure','t:logistics_carrier_settings','t:logistics_carrier_recalc_queue','t:logistics_carrier_events',
29171
- 'f:logistics_carrier_status','f:logistics_carrier_set_backfill','f:logistics_carrier_preview_existing','c:control_get_todays_carts.carrier_name'] LOOP
29671
+ 'f:logistics_carrier_status','f:logistics_carrier_set_backfill','f:logistics_carrier_preview_existing','c:control_get_todays_carts.carrier_name',
29672
+ 'f:logistics_plan_fail_log'] LOOP
29172
29673
  onderdeel := 'Engine: ' || substr(f, 3);
29173
29674
  ok := CASE left(f, 1)
29174
29675
  WHEN 'f' THEN EXISTS (SELECT 1 FROM pg_proc p WHERE p.pronamespace = 'public'::regnamespace AND p.proname = substr(f, 3))
@@ -29178,7 +29679,7 @@ BEGIN
29178
29679
  ELSE EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='public'
29179
29680
  AND table_name = split_part(substr(f, 3), '.', 1) AND column_name = split_part(substr(f, 3), '.', 2)) END
29180
29681
  END;
29181
- toelichting := CASE WHEN ok THEN 'aanwezig' ELSE 'ontbreekt: Engine-migratie (1.0.182 t/m 1.0.184) in dev uitvoeren en via schemasync verspreiden' END;
29682
+ toelichting := CASE WHEN ok THEN 'aanwezig' ELSE 'ontbreekt: Engine-migratie (1.0.182 t/m 1.0.188) in dev uitvoeren en via schemasync verspreiden' END;
29182
29683
  RETURN NEXT;
29183
29684
  END LOOP;
29184
29685
  FOREACH c IN ARRAY ARRAY['carrier_id','carrier_source','carrier_reason','carrier_resolved_at','carrier_set_by','carrier_set_at'] LOOP
@@ -29236,6 +29737,16 @@ BEGIN
29236
29737
  onderdeel := 'Schakelaar bestaande orders'; ok := true;
29237
29738
  toelichting := CASE WHEN coalesce(s.backfill_existing, false) THEN 'aan' ELSE 'uit (bestaande orders wachten op akkoord)' END; RETURN NEXT;
29238
29739
  END IF;
29740
+ -- 1.0.188: mislukte aanmelding voor (her)planning vanuit de ordertriggers.
29741
+ SELECT count(*) INTO n FROM public.logistics_trace_events e
29742
+ WHERE e.actor IN ('trg_logistics_plan_order_items', 'trg_logistics_plan_orders')
29743
+ AND e.status = 'mislukt' AND e.created_at > now() - interval '24 hours';
29744
+ onderdeel := 'Mislukte herplanning (laatste 24 uur)'; ok := n = 0;
29745
+ toelichting := CASE WHEN n = 0 THEN 'geen' ELSE n || ' keer; laatste: ' || coalesce((SELECT coalesce(e.order_ref, '?') || ': ' || coalesce(e.error, '') FROM public.logistics_trace_events e
29746
+ WHERE e.actor IN ('trg_logistics_plan_order_items', 'trg_logistics_plan_orders') AND e.status = 'mislukt'
29747
+ ORDER BY e.created_at DESC LIMIT 1), '') END;
29748
+ RETURN NEXT;
29749
+ RETURN QUERY SELECT * FROM public.logistics_access_check();
29239
29750
  END $function$;
29240
29751
 
29241
29752
  -- Buffergegevens: vervoerder van de order (kolom) gaat voor custom_fields.
@@ -29245,6 +29756,7 @@ CREATE OR REPLACE FUNCTION public.logistics_buffer_payload(p_order_id uuid)
29245
29756
  STABLE SECURITY DEFINER
29246
29757
  SET search_path TO 'public'
29247
29758
  AS $function$
29759
+ SELECT public.logistics_acc_guard('ingelogd', 'logistics_buffer_payload');
29248
29760
  SELECT jsonb_build_object(
29249
29761
  'orderRef', COALESCE(o.order_number, o.id::text),
29250
29762
  'checkinAt', COALESCE(cf ->> 'checkin_at', cf ->> 'checkin_moment', cf ->> 'pickup_moment', cf ->> 'pickup_datetime'),
@@ -29276,6 +29788,7 @@ CREATE OR REPLACE FUNCTION public.logistics_order_departure(p_order_id uuid)
29276
29788
  AS $function$
29277
29789
  DECLARE o record; v jsonb; v_own jsonb; v_txt text; v_at timestamptz; v_info jsonb;
29278
29790
  BEGIN
29791
+ PERFORM public.logistics_acc_guard('ingelogd', 'logistics_order_departure');
29279
29792
  IF public.logistics_tz() IS NULL THEN
29280
29793
  RETURN jsonb_build_object('ok', false, 'reason', 'De tijdzone van de vestiging ontbreekt. Stel die in bij Werktijden.');
29281
29794
  END IF;
@@ -29329,6 +29842,7 @@ DECLARE
29329
29842
  v_naam text; v_code text; v_date date; v_time time; n int;
29330
29843
  v_wens text; onbekend text[] := '{}'::text[]; uit jsonb := '{}'::jsonb;
29331
29844
  BEGIN
29845
+ PERFORM public.logistics_acc_guard('server', 'logistics_brief_transport');
29332
29846
  SELECT id, custom_fields, floriday_sales_order_id, delivery_date INTO o FROM public.orders WHERE id = p_order_id AND deleted_at IS NULL;
29333
29847
  IF o.id IS NULL THEN
29334
29848
  RETURN jsonb_build_object('onbekend', jsonb_build_array('order'));
@@ -29410,6 +29924,7 @@ CREATE OR REPLACE FUNCTION public.logistics_tick()
29410
29924
  AS $function$
29411
29925
  DECLARE v_result jsonb := '{}'::jsonb; v_start timestamptz := clock_timestamp(); v_t timestamptz; v_err boolean := false;
29412
29926
  BEGIN
29927
+ PERFORM public.logistics_acc_guard('server', 'logistics_tick');
29413
29928
  v_t := clock_timestamp();
29414
29929
  BEGIN
29415
29930
  PERFORM set_config('statement_timeout', '10000', true);
@@ -29498,8 +30013,11 @@ END $m$;
29498
30013
 
29499
30014
  CREATE OR REPLACE FUNCTION public.control_get_todays_carts()
29500
30015
  RETURNS TABLE(cart_number_id uuid, cart_number text, order_source text, order_id text, cart_index integer, order_number text, pick_date date, status text, printed_at timestamp with time zone, printed_today boolean, crates_on_cart integer, country_code text, carrier_name text)
29501
- LANGUAGE sql STABLE SECURITY DEFINER SET search_path TO 'public'
30016
+ LANGUAGE sql
30017
+ STABLE SECURITY DEFINER
30018
+ SET search_path TO 'public'
29502
30019
  AS $function$
30020
+ SELECT public.logistics_acc_guard('ingelogd', 'control_get_todays_carts');
29503
30021
  WITH vandaag AS (
29504
30022
  SELECT (now() AT TIME ZONE public.logistics_tz())::date AS d
29505
30023
  ),
@@ -29607,9 +30125,12 @@ REVOKE ALL ON FUNCTION public.logistics_acc_is_server() FROM PUBLIC, anon;
29607
30125
  GRANT EXECUTE ON FUNCTION public.logistics_acc_is_server() TO authenticated, service_role;
29608
30126
 
29609
30127
  CREATE OR REPLACE FUNCTION public.logistics_acc_levels()
29610
- RETURNS TABLE(functie text, niveau text) LANGUAGE sql IMMUTABLE SET search_path TO 'public'
30128
+ RETURNS TABLE(functie text, niveau text)
30129
+ LANGUAGE sql
30130
+ IMMUTABLE
30131
+ SET search_path TO 'public'
29611
30132
  AS $function$
29612
- SELECT * FROM (
30133
+ SELECT v.functie, CASE WHEN v.niveau = 'wacht op pickschermlijst' THEN CASE WHEN v.functie = ANY (ARRAY['logistics_auto_send_status','logistics_barcode_lookup','logistics_cart_plan_status','logistics_cart_slip_plan','logistics_cart_sticker_state','logistics_complete_task','logistics_document_for_order','logistics_is_pick_workday','logistics_order_released','logistics_order_sticker_meldingen','logistics_pick_mode','logistics_scan_resolve','logistics_shipping_note_from_barcode','logistics_shipping_note_status','logistics_working_hours_status','pick_queue_cart_plan']) THEN 'open (pickscherm/scanner zonder inlog)' ELSE 'ingelogd' END ELSE v.niveau END AS niveau FROM (
29613
30134
  SELECT unnest(ARRAY['claim_logistics_tasks','control_get_todays_carts','control_mark_carts_delivered','control_mark_carts_delivered_detail','logistics_allowed_load_carriers','logistics_apply_buffer_decision','logistics_apply_document_layouts','logistics_apply_order_buffer','logistics_approve_delay_reschedule','logistics_archived_orders','logistics_backorder_allowed','logistics_belading_bevestig','logistics_belading_verstuurder','logistics_blocked_orders','logistics_blocked_overview','logistics_buffer_decision','logistics_buffer_detach_late_orders','logistics_buffer_frozen_order','logistics_buffer_handled','logistics_buffer_notify','logistics_buffer_open_key','logistics_buffer_payload','logistics_buffer_simulate','logistics_cancel_order','logistics_cancel_orphan_tasks','logistics_capacity_day_check','logistics_carrier_preview_existing','logistics_carrier_status','logistics_cart_archive','logistics_cart_archive_preview','logistics_cart_checkin_at','logistics_cart_fixed_numbering','logistics_cart_handled','logistics_cart_index','logistics_cart_is_archived','logistics_cart_is_full','logistics_cart_json_fixed','logistics_cart_layout_method','logistics_cart_order_ids','logistics_cart_order_refs','logistics_cart_plan_overview','logistics_cart_plan_status_core','logistics_cart_release_reason','logistics_cart_seq','logistics_cart_unarchive','logistics_cart_units','logistics_cart_wait_until','logistics_check_order_allowed','logistics_check_order_stock','logistics_claim_next_task','logistics_cleanup_duplicate_order_lines','logistics_cleanup_history','logistics_cleanup_tasks','logistics_consistency_check','logistics_control_complete_cart','logistics_control_settings','logistics_cron_health','logistics_day_windows','logistics_delivery_agenda','logistics_departure_preview','logistics_document_layout','logistics_document_layout_v2','logistics_emit_event','logistics_external_fulfillment_key_report','logistics_floriday_cart_plan','logistics_floriday_claim_pushes','logistics_floriday_finish_push','logistics_floriday_finish_push_v2','logistics_floriday_finish_push_v3','logistics_floriday_is_read_only','logistics_floriday_log_refusal','logistics_floriday_log_send','logistics_floriday_order_approved','logistics_floriday_prune_pushes','logistics_floriday_queue_push','logistics_full_cart_min_layers','logistics_full_cart_min_percentage','logistics_install_check','logistics_is_beheer','logistics_item_external_fulfilled','logistics_layout_method_status','logistics_link_order_items','logistics_local_hhmi','logistics_local_today','logistics_merge_decision','logistics_merge_floriday_lines','logistics_merge_lines_enabled','logistics_merge_partial_carts','logistics_opening_timezone','logistics_order_backlog_info','logistics_order_cart_approval','logistics_order_cart_ids','logistics_order_changed','logistics_order_definitively_blocked','logistics_order_departure','logistics_order_departure_list','logistics_order_documents_ready','logistics_order_documents_ready_bool','logistics_order_external_state','logistics_order_finalize_enqueue','logistics_order_finalize_overview','logistics_order_finalize_prune','logistics_order_finalize_reconcile','logistics_order_finalize_retry','logistics_order_finalize_run','logistics_order_frozen','logistics_order_handled','logistics_order_is_archived','logistics_order_is_backlog','logistics_order_is_frozen','logistics_order_line_duplicates','logistics_order_mergeable','logistics_order_overview','logistics_order_plan_coverage','logistics_order_plan_coverage_list','logistics_orphan_carts_list','logistics_orphan_carts_summary','logistics_own_transport_departure','logistics_packing_autofix','logistics_packing_block_reason','logistics_packing_dismiss','logistics_packing_overview','logistics_packing_reconcile','logistics_packing_set_manual','logistics_partial_wait_minutes','logistics_payload_is_floriday','logistics_plan_block','logistics_plan_defer','logistics_plan_enqueue','logistics_plan_finish','logistics_plan_floriday_order','logistics_plan_lock_acquire','logistics_plan_lock_release','logistics_plan_progress','logistics_plan_progress_pct','logistics_plan_queue_list','logistics_plan_reset_queue','logistics_plan_retry','logistics_plan_state_for','logistics_plan_timeout_running','logistics_plan_unarchive','logistics_prune_buffer_member_queue','logistics_queue_capacity_email','logistics_queue_stock_email','logistics_reapply_buffer_decisions','logistics_rebuffer_open_orders','logistics_rebuffer_orders','logistics_rebuffer_pending','logistics_rebuffer_report','logistics_refresh_plan_state','logistics_replan_all','logistics_replan_all_force','logistics_replan_order_journey','logistics_replan_preview','logistics_replan_selected','logistics_report_delay','logistics_reschedule_order','logistics_reschedule_preview','logistics_resolve_carrier','logistics_resolve_carrier_for_location','logistics_resolve_carrier_for_location_many','logistics_resolve_carrier_many','logistics_resolve_settings','logistics_sales_order_external_fulfilled','logistics_schedule_tasks','logistics_set_order_priority','logistics_subtract_working_minutes','logistics_supersede_stale_tasks','logistics_sync_task_carriers','logistics_task_open_counts','logistics_tasks_prune','logistics_tick_health','logistics_tick_ping','logistics_timezone_options','logistics_trace','logistics_trace_all_orders','logistics_trace_archive_order','logistics_trace_batch','logistics_trace_derive','logistics_trace_order_journey_start','logistics_trace_order_origin','logistics_trace_order_overview','logistics_trace_order_state','logistics_trace_order_step','logistics_trace_orders','logistics_trace_progress','logistics_trace_progress_order','logistics_trace_step_once','logistics_trace_stock_check','logistics_trace_timeline','logistics_trace_version_events','logistics_trace_versions','logistics_tz','logistics_unit_order_ids','logistics_upsert_task','logistics_valid_timezone','logistics_write_buffer_layer_positions','logistics_write_cart_layer_positions']), 'ingelogd'
29614
30135
  UNION ALL
29615
30136
  SELECT unnest(ARRAY['logistics_active_layout_method','logistics_address_key','logistics_block_reason_code','logistics_buffer_criteria','logistics_buffer_decision_for_settings','logistics_buffer_value','logistics_capacity_plan_day','logistics_carrier_minutes','logistics_delay_customer_email','logistics_document_selection_status','logistics_document_type_map','logistics_floriday_delivery_note_create_enabled','logistics_floriday_gate_status','logistics_floriday_shipping_document','logistics_floriday_status_updates_enabled','logistics_floriday_stock_updates_enabled','logistics_floriday_write_allowed','logistics_is_engine_response','logistics_live_carriers','logistics_live_cart_count','logistics_next_workday_date','logistics_next_workday_not_past','logistics_nl_date','logistics_nl_moment','logistics_not_past','logistics_order_cart_count','logistics_order_is_shipped_status','logistics_order_merge_key','logistics_plan_error_class','logistics_plan_error_text','logistics_resolve_product_id','logistics_resolve_product_match','logistics_retention_days','logistics_rule_bool','logistics_rule_num','logistics_rule_text','logistics_rule_value','logistics_shift_to_workday','logistics_status_after_shipping','logistics_task_owner','logistics_task_retention_days','logistics_trace_node','logistics_trace_redact','logistics_trace_source_node','logistics_tray_plants','logistics_try_uuid']), 'open (rekenhulp/rechten aanroeper)'
@@ -29816,3 +30337,30 @@ BEGIN
29816
30337
  END $acc$;
29817
30338
 
29818
30339
  ALTER FUNCTION public.logistics_cart_barcode_value(uuid) SET search_path TO 'public';
30340
+
30341
+ -- 1.0.188: mislukte aanmelding voor (her)planning zichtbaar maken.
30342
+ CREATE OR REPLACE FUNCTION public.logistics_plan_fail_log(p_actor text, p_order_id uuid, p_state text, p_msg text)
30343
+ RETURNS void LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public'
30344
+ AS $function$
30345
+ DECLARE v_num text;
30346
+ BEGIN
30347
+ PERFORM public.logistics_acc_guard('server', 'logistics_plan_fail_log');
30348
+ BEGIN
30349
+ SELECT o.order_number INTO v_num FROM public.orders o WHERE o.id = p_order_id;
30350
+ PERFORM public.logistics_trace(jsonb_build_object(
30351
+ 'orderRef', coalesce(v_num, p_order_id::text), 'phase', 'planning', 'step', 'aanmelden voor indeling',
30352
+ 'status', 'mislukt', 'actor', p_actor, 'errorClass', 'technisch', 'nodeId', 'stap:orders_combineren',
30353
+ 'error', p_state || ': ' || coalesce(p_msg, ''),
30354
+ 'reason', 'De wijziging is opgeslagen, maar de order kon niet voor (her)indeling worden aangemeld. De planwachtrij probeert het opnieuw.'));
30355
+ EXCEPTION WHEN OTHERS THEN
30356
+ RAISE WARNING 'logistiek-engine: fout niet vastgelegd voor order %: %', p_order_id, SQLERRM;
30357
+ END;
30358
+ -- Vangnet: alsnog in de planwachtrij, in een eigen subblok.
30359
+ BEGIN
30360
+ PERFORM public.logistics_plan_enqueue(p_order_id, 'herplanning mislukt');
30361
+ EXCEPTION WHEN OTHERS THEN NULL;
30362
+ END;
30363
+ END $function$;
30364
+ REVOKE ALL ON FUNCTION public.logistics_plan_fail_log(text, uuid, text, text) FROM PUBLIC, anon, authenticated;
30365
+ GRANT EXECUTE ON FUNCTION public.logistics_plan_fail_log(text, uuid, text, text) TO service_role;
30366
+ COMMENT ON FUNCTION public.logistics_plan_fail_log(text, uuid, text, text) IS 'Logistiek Engine: legt een mislukte aanmelding voor (her)planning vast in het logboek en zet de order alsnog in de planwachtrij.';