@flowselections/pick-schermen-kwekers 1.0.82 → 1.0.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist-lib/components/fs-ui/DataTable.js +2 -2
  2. package/dist-lib/components/fs-ui/TableSkeleton.js +1 -1
  3. package/dist-lib/components/pick/PickScherm.d.ts.map +1 -1
  4. package/dist-lib/components/pick/PickScherm.js +377 -159
  5. package/dist-lib/components/pick/werkvloer/Werkvloer.d.ts +52 -0
  6. package/dist-lib/components/pick/werkvloer/Werkvloer.d.ts.map +1 -0
  7. package/dist-lib/components/pick/werkvloer/Werkvloer.js +33 -0
  8. package/dist-lib/components/settings/ReferentiedataPickdocumentenCard.d.ts.map +1 -1
  9. package/dist-lib/components/settings/ReferentiedataPickdocumentenCard.js +10 -3
  10. package/dist-lib/hooks/usePickPrintStatus.d.ts +1 -1
  11. package/dist-lib/hooks/usePickPrintStatus.d.ts.map +1 -1
  12. package/dist-lib/hooks/usePickPrintStatus.js +4 -4
  13. package/dist-lib/hooks/useShippingNoteStatus.d.ts +1 -1
  14. package/dist-lib/hooks/useShippingNoteStatus.d.ts.map +1 -1
  15. package/dist-lib/hooks/useShippingNoteStatus.js +11 -9
  16. package/dist-lib/hooks/useWerkvloer.d.ts +20 -0
  17. package/dist-lib/hooks/useWerkvloer.d.ts.map +1 -0
  18. package/dist-lib/hooks/useWerkvloer.js +98 -0
  19. package/dist-lib/integrations/supabase/types.d.ts +69 -0
  20. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  21. package/dist-lib/lib/__tests__/pickPublicStatus.test.d.ts +2 -0
  22. package/dist-lib/lib/__tests__/pickPublicStatus.test.d.ts.map +1 -0
  23. package/dist-lib/lib/__tests__/pickPublicStatus.test.js +48 -0
  24. package/dist-lib/lib/labels.d.ts +2 -0
  25. package/dist-lib/lib/labels.d.ts.map +1 -1
  26. package/dist-lib/lib/labels.js +41 -0
  27. package/dist-lib/lib/pick142.d.ts.map +1 -1
  28. package/dist-lib/lib/pick142.js +7 -10
  29. package/dist-lib/lib/pick156.d.ts.map +1 -1
  30. package/dist-lib/lib/pick156.js +6 -20
  31. package/dist-lib/lib/pick159.js +1 -1
  32. package/dist-lib/lib/pickApi.d.ts +20 -0
  33. package/dist-lib/lib/pickApi.d.ts.map +1 -1
  34. package/dist-lib/lib/pickApi.js +27 -0
  35. package/dist-lib/lib/shippingNoteStatus.d.ts +1 -1
  36. package/dist-lib/lib/shippingNoteStatus.d.ts.map +1 -1
  37. package/dist-lib/lib/shippingNoteStatus.js +5 -2
  38. package/dist-lib/lib/werkvloer.d.ts +40 -0
  39. package/dist-lib/lib/werkvloer.d.ts.map +1 -0
  40. package/dist-lib/lib/werkvloer.js +121 -0
  41. package/dist-lib/lib/werkvloer.test.d.ts +2 -0
  42. package/dist-lib/lib/werkvloer.test.d.ts.map +1 -0
  43. package/dist-lib/lib/werkvloer.test.js +49 -0
  44. package/package.json +2 -2
  45. package/schema/pickschermen.sql +176 -0
@@ -5836,3 +5836,179 @@ REVOKE ALL ON FUNCTION public._pick_defaults_apply(text, text[], jsonb) FROM PUB
5836
5836
  GRANT EXECUTE ON FUNCTION public._pick_defaults_apply(text, text[], jsonb) TO service_role;
5837
5837
  REVOKE ALL ON FUNCTION public.pick_ensure_defaults() FROM PUBLIC, anon;
5838
5838
  GRANT EXECUTE ON FUNCTION public.pick_ensure_defaults() TO authenticated, service_role;
5839
+
5840
+ -- 1.0.85: "Print volgende order" / "Print" zet een hele order (of gezamenlijke levering) in één stap vast.
5841
+ CREATE TABLE IF NOT EXISTS public.pick_order_claims (
5842
+ idempotency_key text PRIMARY KEY,
5843
+ station_id uuid NOT NULL,
5844
+ session_id text NOT NULL,
5845
+ unit_ref text NOT NULL,
5846
+ queue_item_ids uuid[] NOT NULL DEFAULT '{}'::uuid[],
5847
+ created_at timestamptz NOT NULL DEFAULT now()
5848
+ );
5849
+ CREATE INDEX IF NOT EXISTS idx_pick_order_claims_created ON public.pick_order_claims(created_at);
5850
+ GRANT ALL ON public.pick_order_claims TO service_role;
5851
+ ALTER TABLE public.pick_order_claims ENABLE ROW LEVEL SECURITY;
5852
+
5853
+ CREATE OR REPLACE FUNCTION public._pick_claim_order_core(_station_id uuid, _session_id text, _unit_refs text[], _idempotency_key text, _pick_day date, _timeout_seconds integer)
5854
+ RETURNS jsonb
5855
+ LANGUAGE plpgsql
5856
+ VOLATILE SECURITY DEFINER
5857
+ SET search_path TO 'public'
5858
+ AS $function$
5859
+ DECLARE
5860
+ v_path text := nullif(current_setting('request.path', true), '');
5861
+ v_prev public.pick_order_claims;
5862
+ v_ref text;
5863
+ v_cand uuid[];
5864
+ v_total int;
5865
+ v_timeout int := LEAST(GREATEST(COALESCE(_timeout_seconds, 120), 30), 120);
5866
+ v_printing uuid;
5867
+ BEGIN
5868
+ -- Interne controle: server, of geneste aanroep vanuit een eigen functie (ketenregel via request.path).
5869
+ IF NOT (public.pick_is_server() OR (v_path IS NOT NULL AND v_path NOT ILIKE '%/rpc/_pick_claim_order_core%')) THEN
5870
+ RAISE EXCEPTION 'Deze interne functie mag niet rechtstreeks aangeroepen worden.' USING ERRCODE = '42501';
5871
+ END IF;
5872
+ IF _station_id IS NULL THEN RAISE EXCEPTION 'Kies eerst een pickstation.'; END IF;
5873
+ IF nullif(_session_id, '') IS NULL OR nullif(_idempotency_key, '') IS NULL THEN
5874
+ RAISE EXCEPTION 'De printopdracht mist een sleutel. Ververs het scherm.';
5875
+ END IF;
5876
+ IF NOT EXISTS (SELECT 1 FROM public.pick_stations s WHERE s.id = _station_id AND s.active) THEN
5877
+ RAISE EXCEPTION 'Dit pickstation is niet actief.';
5878
+ END IF;
5879
+
5880
+ PERFORM public.pick_release_expired_locks();
5881
+ -- Bewaartermijn: sleutels zijn alleen nodig zolang een herhaling kan binnenkomen.
5882
+ DELETE FROM public.pick_order_claims WHERE created_at < now() - interval '1 day';
5883
+
5884
+ -- Zelfde sleutel opnieuw (haperende verbinding): zelfde uitkomst, geen tweede claim.
5885
+ SELECT * INTO v_prev FROM public.pick_order_claims WHERE idempotency_key = _idempotency_key FOR UPDATE;
5886
+ IF FOUND THEN
5887
+ IF v_prev.session_id <> _session_id OR v_prev.station_id <> _station_id THEN
5888
+ RAISE EXCEPTION 'Deze printopdracht hoort bij een ander scherm.' USING ERRCODE = '42501';
5889
+ END IF;
5890
+ RETURN jsonb_build_object('ok', true, 'herhaald', true, 'unitRef', v_prev.unit_ref,
5891
+ 'queueItemIds', to_jsonb(v_prev.queue_item_ids));
5892
+ END IF;
5893
+
5894
+ SELECT id INTO v_printing FROM public.pick_document_statuses WHERE code = 'printing' LIMIT 1;
5895
+
5896
+ FOREACH v_ref IN ARRAY COALESCE(_unit_refs, '{}'::text[]) LOOP
5897
+ CONTINUE WHEN nullif(v_ref, '') IS NULL;
5898
+
5899
+ SELECT count(*) INTO v_total
5900
+ FROM public.pick_queue q
5901
+ WHERE q.station_id = _station_id
5902
+ AND q.printed_at IS NULL AND q.cancelled_at IS NULL AND q.completed_at IS NULL
5903
+ AND COALESCE(q.payload->>'printbaar', 'true') <> 'false'
5904
+ AND COALESCE(nullif(q.payload->>'unitRef', ''), nullif(q.payload->>'unit_ref', ''), q.order_number, q.id::text) = v_ref
5905
+ AND (_pick_day IS NULL OR nullif(q.payload->>'pickDate', '') IS NULL OR (nullif(q.payload->>'pickDate', ''))::date = _pick_day);
5906
+ CONTINUE WHEN v_total = 0;
5907
+
5908
+ -- Rijen die een ander op dit moment vastzet, worden overgeslagen (SKIP LOCKED).
5909
+ SELECT array_agg(c.id) INTO v_cand FROM (
5910
+ SELECT q.id
5911
+ FROM public.pick_queue q
5912
+ WHERE q.station_id = _station_id
5913
+ AND q.printed_at IS NULL AND q.cancelled_at IS NULL AND q.completed_at IS NULL
5914
+ AND COALESCE(q.payload->>'printbaar', 'true') <> 'false'
5915
+ AND COALESCE(nullif(q.payload->>'unitRef', ''), nullif(q.payload->>'unit_ref', ''), q.order_number, q.id::text) = v_ref
5916
+ AND (_pick_day IS NULL OR nullif(q.payload->>'pickDate', '') IS NULL OR (nullif(q.payload->>'pickDate', ''))::date = _pick_day)
5917
+ FOR UPDATE OF q SKIP LOCKED
5918
+ ) c;
5919
+ -- Alleen de hele order: is een deel al bij iemand anders, dan de volgende order.
5920
+ CONTINUE WHEN v_cand IS NULL OR cardinality(v_cand) < v_total;
5921
+ CONTINUE WHEN EXISTS (
5922
+ SELECT 1 FROM public.pick_queue_locks l
5923
+ WHERE l.queue_item_id = ANY(v_cand)
5924
+ AND l.session_id IS DISTINCT FROM _session_id
5925
+ AND l.expires_at > now());
5926
+
5927
+ INSERT INTO public.pick_queue_locks(queue_item_id, station_id, session_id, locked_by, expires_at)
5928
+ SELECT x, _station_id, _session_id, auth.uid(), now() + make_interval(secs => v_timeout)
5929
+ FROM unnest(v_cand) AS x
5930
+ ON CONFLICT (queue_item_id) DO UPDATE
5931
+ SET expires_at = EXCLUDED.expires_at
5932
+ WHERE public.pick_queue_locks.session_id = EXCLUDED.session_id;
5933
+
5934
+ UPDATE public.pick_queue
5935
+ SET status_id = COALESCE(v_printing, status_id),
5936
+ assigned_user_id = auth.uid()
5937
+ WHERE id = ANY(v_cand);
5938
+
5939
+ INSERT INTO public.pick_station_logs(station_id, queue_item_id, user_id, session_id, action, detail)
5940
+ SELECT _station_id, x, auth.uid(), _session_id, 'claim',
5941
+ jsonb_build_object('soort', 'order', 'unitRef', v_ref, 'sleutel', _idempotency_key)
5942
+ FROM unnest(v_cand) AS x;
5943
+
5944
+ INSERT INTO public.pick_order_claims(idempotency_key, station_id, session_id, unit_ref, queue_item_ids)
5945
+ VALUES (_idempotency_key, _station_id, _session_id, v_ref, v_cand);
5946
+
5947
+ RETURN jsonb_build_object('ok', true, 'herhaald', false, 'unitRef', v_ref, 'queueItemIds', to_jsonb(v_cand));
5948
+ END LOOP;
5949
+
5950
+ RETURN jsonb_build_object('ok', false, 'herhaald', false,
5951
+ 'reden', CASE WHEN cardinality(COALESCE(_unit_refs, '{}'::text[])) = 1
5952
+ THEN 'Deze order wordt al door iemand anders geprint.'
5953
+ ELSE 'Er is nu geen order vrij om te printen.' END);
5954
+ END $function$;
5955
+
5956
+ CREATE OR REPLACE FUNCTION public.pick_claim_order_v1(p_device_key text, _station_id uuid, _session_id text, _unit_refs text[], _idempotency_key text, _pick_day date, _timeout_seconds integer)
5957
+ RETURNS jsonb
5958
+ LANGUAGE plpgsql
5959
+ VOLATILE SECURITY DEFINER
5960
+ SET search_path TO 'public'
5961
+ AS $function$ BEGIN PERFORM public.pick_device_check(p_device_key, _station_id, NULL, NULL, NULL, NULL); RETURN public._pick_claim_order_core(_station_id, _session_id, _unit_refs, _idempotency_key, _pick_day, _timeout_seconds); END $function$;
5962
+
5963
+ CREATE OR REPLACE FUNCTION public.pick_claim_order_v1(_station_id uuid, _session_id text, _unit_refs text[], _idempotency_key text, _pick_day date, _timeout_seconds integer)
5964
+ RETURNS jsonb
5965
+ LANGUAGE plpgsql
5966
+ VOLATILE SECURITY DEFINER
5967
+ SET search_path TO 'public'
5968
+ AS $function$ BEGIN PERFORM public.pick_device_check(NULL, _station_id, NULL, NULL, NULL, NULL); RETURN public._pick_claim_order_core(_station_id, _session_id, _unit_refs, _idempotency_key, _pick_day, _timeout_seconds); END $function$;
5969
+
5970
+ REVOKE ALL ON FUNCTION public._pick_claim_order_core(uuid, text, text[], text, date, integer) FROM PUBLIC, anon, authenticated;
5971
+ GRANT EXECUTE ON FUNCTION public._pick_claim_order_core(uuid, text, text[], text, date, integer) TO service_role;
5972
+ REVOKE ALL ON FUNCTION public.pick_claim_order_v1(text, uuid, text, text[], text, date, integer) FROM PUBLIC;
5973
+ GRANT EXECUTE ON FUNCTION public.pick_claim_order_v1(text, uuid, text, text[], text, date, integer) TO anon, authenticated, service_role;
5974
+ REVOKE ALL ON FUNCTION public.pick_claim_order_v1(uuid, text, text[], text, date, integer) FROM PUBLIC;
5975
+ GRANT EXECUTE ON FUNCTION public.pick_claim_order_v1(uuid, text, text[], text, date, integer) TO anon, authenticated, service_role;
5976
+
5977
+ -- 1.0.86: openbare verzendbriefstatus, beperkt tot eigen station.
5978
+ CREATE OR REPLACE FUNCTION public.pickstation_shipping_note_status(p_slug text, p_slip_job_id uuid DEFAULT NULL, p_cart_id uuid DEFAULT NULL, p_device_key text DEFAULT NULL)
5979
+ RETURNS jsonb
5980
+ LANGUAGE plpgsql
5981
+ STABLE SECURITY DEFINER
5982
+ SET search_path TO 'public'
5983
+ AS $function$
5984
+ DECLARE
5985
+ v_station uuid;
5986
+ v_job uuid;
5987
+ BEGIN
5988
+ SELECT s.id INTO v_station FROM public.pick_stations s
5989
+ WHERE s.slug = p_slug AND s.active IS TRUE AND nullif(btrim(p_slug), '') IS NOT NULL
5990
+ LIMIT 1;
5991
+ IF v_station IS NULL THEN
5992
+ RAISE EXCEPTION 'Dit pickstation is onbekend of niet actief.' USING ERRCODE = '42501';
5993
+ END IF;
5994
+ PERFORM public.pick_device_check(p_device_key, v_station, NULL, NULL, p_slug, NULL);
5995
+ IF p_slip_job_id IS NULL AND p_cart_id IS NULL THEN
5996
+ RAISE EXCEPTION 'De pakbon of kar ontbreekt.' USING ERRCODE = '22023';
5997
+ END IF;
5998
+
5999
+ -- Ook bij een batch/herprint: de opdracht moet bij een echte rij van dit station horen.
6000
+ -- De kar-terugval kiest alleen een pakbon van dit station, nooit een globale Engine-terugval.
6001
+ SELECT j.id INTO v_job FROM public.print_jobs j
6002
+ WHERE (p_slip_job_id IS NULL OR j.id = p_slip_job_id)
6003
+ AND (p_cart_id IS NULL OR nullif(coalesce(j.payload->>'cart_id', j.payload->'cart'->>'cartId'), '') = p_cart_id::text)
6004
+ AND lower(coalesce(j.payload->>'document_type_code', j.payload->>'documentType', j.documenttype::text, '')) LIKE '%pakbon%'
6005
+ AND EXISTS (SELECT 1 FROM public.pick_queue q WHERE q.station_id = v_station
6006
+ AND (q.print_job_id = j.id OR q.id::text = j.payload->>'queue_item_id'))
6007
+ ORDER BY j.created_at DESC, j.id DESC LIMIT 1;
6008
+ IF v_job IS NULL THEN
6009
+ RAISE EXCEPTION 'Deze pakbon of kar hoort niet bij dit pickstation.' USING ERRCODE = '42501';
6010
+ END IF;
6011
+ RETURN public.logistics_shipping_note_status(p_slip_job_id => v_job, p_cart_id => NULL);
6012
+ END $function$;
6013
+ REVOKE ALL ON FUNCTION public.pickstation_shipping_note_status(text, uuid, uuid, text) FROM PUBLIC;
6014
+ GRANT EXECUTE ON FUNCTION public.pickstation_shipping_note_status(text, uuid, uuid, text) TO anon, authenticated, service_role;