@flowselections/layout-maker 1.69.19 → 1.69.23

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 (83) hide show
  1. package/dist-lib/components/FormaatOrientatieBar.d.ts.map +1 -1
  2. package/dist-lib/components/FormaatOrientatieBar.js +10 -7
  3. package/dist-lib/components/GeladenEtiketTab.d.ts.map +1 -1
  4. package/dist-lib/components/GeladenEtiketTab.js +3 -1
  5. package/dist-lib/components/InstelOverzichtKaart.d.ts +12 -0
  6. package/dist-lib/components/InstelOverzichtKaart.d.ts.map +1 -0
  7. package/dist-lib/components/InstelOverzichtKaart.js +78 -0
  8. package/dist-lib/components/KlaarOmTePrintenBlok.d.ts.map +1 -1
  9. package/dist-lib/components/KlaarOmTePrintenBlok.js +2 -1
  10. package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
  11. package/dist-lib/components/LayoutsPage.js +29 -5
  12. package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
  13. package/dist-lib/components/PakbonBuilderPage.js +9 -1
  14. package/dist-lib/components/PrintersPage.d.ts.map +1 -1
  15. package/dist-lib/components/PrintersPage.js +3 -2
  16. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  17. package/dist-lib/components/PrintplekDetailPage.js +5 -9
  18. package/dist-lib/components/RolKeuze.d.ts +9 -0
  19. package/dist-lib/components/RolKeuze.d.ts.map +1 -0
  20. package/dist-lib/components/RolKeuze.js +91 -0
  21. package/dist-lib/components/StickerOntwerpPage.d.ts +4 -0
  22. package/dist-lib/components/StickerOntwerpPage.d.ts.map +1 -0
  23. package/dist-lib/components/StickerOntwerpPage.js +77 -0
  24. package/dist-lib/components/SysteemLayoutMelding.d.ts +1 -1
  25. package/dist-lib/components/SysteemLayoutMelding.d.ts.map +1 -1
  26. package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
  27. package/dist-lib/components/WerkplekConfiguratiePage.js +15 -7
  28. package/dist-lib/index.d.ts +5 -0
  29. package/dist-lib/index.d.ts.map +1 -1
  30. package/dist-lib/index.js +5 -0
  31. package/dist-lib/integrations/supabase/types.d.ts +621 -120
  32. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  33. package/dist-lib/lib/directPrint.d.ts.map +1 -1
  34. package/dist-lib/lib/directPrint.js +19 -0
  35. package/dist-lib/lib/etiketRollen.d.ts +41 -0
  36. package/dist-lib/lib/etiketRollen.d.ts.map +1 -0
  37. package/dist-lib/lib/etiketRollen.js +64 -0
  38. package/dist-lib/lib/formaatWeergave.d.ts +24 -0
  39. package/dist-lib/lib/formaatWeergave.d.ts.map +1 -0
  40. package/dist-lib/lib/formaatWeergave.js +24 -0
  41. package/dist-lib/lib/instelOverzicht.d.ts +45 -0
  42. package/dist-lib/lib/instelOverzicht.d.ts.map +1 -0
  43. package/dist-lib/lib/instelOverzicht.js +106 -0
  44. package/dist-lib/lib/ontwerpKeuze.d.ts +80 -0
  45. package/dist-lib/lib/ontwerpKeuze.d.ts.map +1 -0
  46. package/dist-lib/lib/ontwerpKeuze.js +193 -0
  47. package/dist-lib/lib/pakbonBuilder.d.ts +6 -0
  48. package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
  49. package/dist-lib/lib/pakbonBuilder.js +15 -0
  50. package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
  51. package/dist-lib/lib/pakbonContent.js +2 -1
  52. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  53. package/dist-lib/lib/pakbonHtml.js +3 -1
  54. package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
  55. package/dist-lib/lib/pakbonPresentation.js +3 -0
  56. package/dist-lib/lib/printQueue.server.d.ts +4 -0
  57. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  58. package/dist-lib/lib/printQueue.server.js +274 -5
  59. package/dist-lib/lib/stickerOntwerp.d.ts +67 -0
  60. package/dist-lib/lib/stickerOntwerp.d.ts.map +1 -0
  61. package/dist-lib/lib/stickerOntwerp.js +109 -0
  62. package/dist-lib/lib/stickerRoute.d.ts +3 -0
  63. package/dist-lib/lib/stickerRoute.d.ts.map +1 -0
  64. package/dist-lib/lib/stickerRoute.js +5 -0
  65. package/dist-lib/lib/stickerUitwijk.d.ts +5 -0
  66. package/dist-lib/lib/stickerUitwijk.d.ts.map +1 -1
  67. package/dist-lib/lib/stickerUitwijk.js +12 -1
  68. package/dist-lib/lib/testpagina.d.ts +7 -1
  69. package/dist-lib/lib/testpagina.d.ts.map +1 -1
  70. package/dist-lib/lib/testpagina.js +39 -5
  71. package/dist-lib/lib/useNetwerkPrinters.d.ts +1 -0
  72. package/dist-lib/lib/useNetwerkPrinters.d.ts.map +1 -1
  73. package/dist-lib/lib/useNetwerkPrinters.js +11 -3
  74. package/dist-lib/lib/versie.generated.d.ts +1 -1
  75. package/dist-lib/lib/versie.generated.js +1 -1
  76. package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
  77. package/dist-lib/lib/voorbeeldPrint.js +53 -3
  78. package/dist-lib/lib/werkplekken.d.ts +5 -1
  79. package/dist-lib/lib/werkplekken.d.ts.map +1 -1
  80. package/dist-lib/lib/werkplekken.js +1 -1
  81. package/package.json +6 -1
  82. package/sql/print-schema.sql +320 -162
  83. package/sql/print-schema.verslag.md +5 -2
@@ -1,5 +1,5 @@
1
1
  -- ============================================================================
2
- -- layout-maker 1.69.18 — volledig database-schema (idempotent)
2
+ -- layout-maker 1.69.22 — volledig database-schema (idempotent)
3
3
  -- Gegenereerd door scripts/bouw-schema.ts uit supabase/migrations. Mag zo vaak
4
4
  -- worden gedraaid als je wilt. Alleen structuur: geen adressen, sleutels of
5
5
  -- klantgegevens. Geen DROP, geen intrekken van rechten, geen cron-planning (functies controleren zelf de toegang).
@@ -544,6 +544,23 @@ CREATE TABLE IF NOT EXISTS public.layout_auto_acties (
544
544
  detail text NOT NULL DEFAULT '',
545
545
  created_at timestamptz NOT NULL DEFAULT now()
546
546
  );
547
+ -- 1.69.20: rol per printer, ontwerpen in meerdere formaten, één keuzeregel.
548
+ -- Additief: geen DROP, geen REVOKE, geen cron. Geen omgevingswaarden.
549
+
550
+ -- A. Rollenlijst (data, geen code) ------------------------------------------
551
+ CREATE TABLE IF NOT EXISTS public.print_etiketrollen (
552
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
553
+ sleutel text NOT NULL,
554
+ naam text NOT NULL,
555
+ breedte_mm numeric NOT NULL,
556
+ hoogte_mm numeric NOT NULL,
557
+ doorlopend boolean NOT NULL DEFAULT false,
558
+ is_a4 boolean NOT NULL DEFAULT false,
559
+ volgorde integer NOT NULL DEFAULT 100,
560
+ actief boolean NOT NULL DEFAULT true,
561
+ created_at timestamptz NOT NULL DEFAULT now(),
562
+ updated_at timestamptz NOT NULL DEFAULT now()
563
+ );
547
564
 
548
565
  -- ---------------------------------------------------------------- Kolommen en constraints
549
566
  ALTER TABLE public.document_layout_elements
@@ -697,6 +714,14 @@ alter table public.print_queue_settings ADD COLUMN IF NOT EXISTS tick_timeout_ms
697
714
  alter table public.print_jobs ADD COLUMN IF NOT EXISTS uitwijk jsonb;
698
715
  alter table public.print_jobs ADD COLUMN IF NOT EXISTS printer_keuze jsonb;
699
716
  alter table public.print_jobs ADD COLUMN IF NOT EXISTS fase_gestart_op timestamptz;
717
+ -- Rol per printer: breedte/hoogte blijven in printers.geladen_etiket (één bron).
718
+ ALTER TABLE public.printers ADD COLUMN IF NOT EXISTS rol_id uuid;
719
+ ALTER TABLE public.printers ADD COLUMN IF NOT EXISTS rol_invoerrichting text;
720
+ ALTER TABLE public.printers ADD COLUMN IF NOT EXISTS rol_marge_mm numeric;
721
+ ALTER TABLE public.printers ADD COLUMN IF NOT EXISTS rol_doorlopend boolean;
722
+ -- C. A4-terugval per printplek (bestaand gedrag = aan) en vastgelegde keuze.
723
+ ALTER TABLE public.print_plekken ADD COLUMN IF NOT EXISTS a4_terugval boolean NOT NULL DEFAULT true;
724
+ ALTER TABLE public.print_jobs ADD COLUMN IF NOT EXISTS ontwerp_keuze jsonb;
700
725
  -- Objecten die in zeta bestaan maar in geen enkele migratie van deze module
701
726
  -- staan (gevonden bij de vergelijking van 1.69.16). Alleen additief.
702
727
  ALTER TABLE public.print_agents ADD COLUMN IF NOT EXISTS pairing_code_hash text;
@@ -1834,133 +1859,6 @@ BEGIN
1834
1859
  PERFORM public._layouts_toegang_server_of_ingelogd(false);
1835
1860
  RETURN public.layouts_zorg_voor_sticker_verkleinen();
1836
1861
  END $$;
1837
- -- 5. Stickerroute: zelfde regels als kiesUitwijkroute (JS). Geen standaardwaarden op parameters.
1838
- CREATE OR REPLACE FUNCTION public.layouts_kies_sticker_route(
1839
- p_sticker_breedte_mm numeric, p_sticker_hoogte_mm numeric, p_etiketten jsonb,
1840
- p_instelling jsonb, p_heeft_barcode boolean, p_a4_printer text, p_a4_vel jsonb)
1841
- RETURNS jsonb
1842
- LANGUAGE plpgsql IMMUTABLE SET search_path TO 'public'
1843
- AS $$
1844
- DECLARE
1845
- b numeric := p_sticker_breedte_mm; h numeric := p_sticker_hoogte_mm;
1846
- st text := round(b)::text || '×' || round(h)::text;
1847
- liggend boolean := b > h;
1848
- e jsonb; eb numeric; eh numeric; ebr numeric; ehr numeric; papier text; f jsonb; x record;
1849
- k numeric; l numeric; dk numeric; dl numeric; beste numeric;
1850
- bruik jsonb := '[]'::jsonb; zonder text[] := ARRAY[]::text[];
1851
- rot int; af numeric; s numeric; dpi numeric;
1852
- g_beste numeric; g_uit jsonb; v_beste numeric; v_uit jsonb;
1853
- toegestaan boolean; grens numeric; instelling_ok boolean := p_instelling IS NOT NULL AND jsonb_typeof(p_instelling) = 'object';
1854
- vel_b numeric; vel_h numeric; kol int; rij int; mb numeric; ml numeric; th numeric; tv numeric; vooraf text; vel_ok boolean := false;
1855
- BEGIN
1856
- IF instelling_ok THEN
1857
- toegestaan := coalesce((p_instelling ->> 'toegestaan')::boolean, false);
1858
- grens := (p_instelling ->> 'ondergrens_pct')::numeric;
1859
- IF grens IS NULL OR grens <= 0 OR grens > 100 THEN instelling_ok := false; END IF;
1860
- END IF;
1861
-
1862
- -- Papiermaat op afmeting (±1 mm); zonder passende maat telt het etiket niet.
1863
- FOR e IN SELECT value FROM jsonb_array_elements(coalesce(p_etiketten, '[]'::jsonb)) LOOP
1864
- eb := (e ->> 'breedte_mm')::numeric; eh := (e ->> 'hoogte_mm')::numeric;
1865
- IF NOT (e ? 'formaten') THEN
1866
- bruik := bruik || jsonb_build_array(e || jsonb_build_object('gekozen', coalesce(e ->> 'paper', '')));
1867
- CONTINUE;
1868
- END IF;
1869
- f := e -> 'formaten'; papier := NULL; beste := NULL;
1870
- IF jsonb_typeof(f) = 'object' THEN
1871
- FOR x IN SELECT key, value FROM jsonb_each(f) LOOP
1872
- IF jsonb_typeof(x.value) <> 'array' OR jsonb_array_length(x.value) < 2 THEN CONTINUE; END IF;
1873
- k := least((x.value ->> 0)::numeric, (x.value ->> 1)::numeric) / 10;
1874
- l := greatest((x.value ->> 0)::numeric, (x.value ->> 1)::numeric) / 10;
1875
- dk := abs(k - least(eb, eh)); dl := abs(l - greatest(eb, eh));
1876
- IF dk <= 1.000000001 AND dl <= 1.000000001 AND (beste IS NULL OR dk + dl < beste) THEN papier := x.key; beste := dk + dl; END IF;
1877
- END LOOP;
1878
- END IF;
1879
- IF papier IS NULL THEN
1880
- zonder := zonder || format('Printer %s heeft geen papiermaat %s×%s ingesteld', e ->> 'printerNaam', round(eb), round(eh));
1881
- ELSE
1882
- bruik := bruik || jsonb_build_array(e || jsonb_build_object('gekozen', papier));
1883
- END IF;
1884
- END LOOP;
1885
-
1886
- -- 1. precies
1887
- FOR e IN SELECT value FROM jsonb_array_elements(bruik) LOOP
1888
- eb := (e ->> 'breedte_mm')::numeric; eh := (e ->> 'hoogte_mm')::numeric;
1889
- IF abs(b - eb) <= 2 AND abs(h - eh) <= 2 THEN
1890
- RETURN jsonb_build_object('uitwijkroute', 'precies', 'printerNaam', e ->> 'printerNaam', 'schaal', 1, 'paper', e ->> 'gekozen',
1891
- 'rotate', CASE WHEN liggend <> (eb > eh) THEN 90 ELSE 0 END,
1892
- 'reden', format('Geprint op %s×%s, precies passend', round(eb), round(eh)), 'pagina_breedte_mm', eb, 'pagina_hoogte_mm', eh);
1893
- END IF;
1894
- END LOOP;
1895
- -- 2. gedraaid
1896
- FOR e IN SELECT value FROM jsonb_array_elements(bruik) LOOP
1897
- eb := (e ->> 'breedte_mm')::numeric; eh := (e ->> 'hoogte_mm')::numeric;
1898
- IF abs(b - eh) <= 2 AND abs(h - eb) <= 2 THEN
1899
- RETURN jsonb_build_object('uitwijkroute', 'gedraaid', 'printerNaam', e ->> 'printerNaam', 'schaal', 1, 'paper', e ->> 'gekozen', 'rotate', 90,
1900
- 'reden', format('Geprint op %s×%s in plaats van %s, 90° gedraaid', round(eb), round(eh), st), 'pagina_breedte_mm', eb, 'pagina_hoogte_mm', eh);
1901
- END IF;
1902
- END LOOP;
1903
- -- 3. groter etiket 1-op-1, daarna pas verkleinen
1904
- FOR e IN SELECT value FROM jsonb_array_elements(bruik) LOOP
1905
- eb := (e ->> 'breedte_mm')::numeric; eh := (e ->> 'hoogte_mm')::numeric;
1906
- dpi := nullif((e ->> 'dpi')::numeric, 0);
1907
- FOREACH rot IN ARRAY ARRAY[0, 90] LOOP
1908
- ebr := CASE WHEN rot = 90 THEN eh ELSE eb END; ehr := CASE WHEN rot = 90 THEN eb ELSE eh END;
1909
- IF b <= ebr + 2 AND h <= ehr + 2 THEN
1910
- af := (ebr * ehr - b * h) / (b * h);
1911
- IF g_beste IS NULL OR af < g_beste THEN
1912
- g_beste := af;
1913
- g_uit := jsonb_build_object('uitwijkroute', 'groter_etiket', 'printerNaam', e ->> 'printerNaam', 'schaal', 1, 'paper', e ->> 'gekozen', 'rotate', rot,
1914
- 'reden', format('Geprint op %s×%s in plaats van %s, 1-op-1 gecentreerd%s', round(eb), round(eh), st, CASE WHEN rot = 90 THEN ' en 90° gedraaid' ELSE '' END),
1915
- 'pagina_breedte_mm', eb, 'pagina_hoogte_mm', eh);
1916
- END IF;
1917
- ELSIF instelling_ok AND toegestaan THEN
1918
- s := least(ebr / b, ehr / h, 1);
1919
- IF s * 100 >= grens - 0.000000001
1920
- AND (p_heeft_barcode IS FALSE OR 0.33 * s >= 2 * (25.4 / coalesce(dpi, 203)) - 0.000000001)
1921
- AND (v_beste IS NULL OR 1 - s < v_beste) THEN
1922
- v_beste := 1 - s;
1923
- v_uit := jsonb_build_object('uitwijkroute', 'verkleind', 'printerNaam', e ->> 'printerNaam', 'schaal', round(s, 2), 'paper', e ->> 'gekozen', 'rotate', rot,
1924
- 'reden', format('Geprint op %s×%s in plaats van %s, verkleind tot %s%%', round(eb), round(eh), st, round(s * 100)),
1925
- 'pagina_breedte_mm', eb, 'pagina_hoogte_mm', eh);
1926
- END IF;
1927
- END IF;
1928
- END LOOP;
1929
- END LOOP;
1930
- IF g_uit IS NOT NULL THEN RETURN g_uit; END IF;
1931
- IF v_uit IS NOT NULL THEN RETURN v_uit; END IF;
1932
-
1933
- -- 4 + 5: A4. Eigen velindeling van de printplek gaat vóór de standaardlijst.
1934
- IF p_a4_printer IS NULL THEN RETURN NULL; END IF;
1935
- IF NOT instelling_ok AND jsonb_array_length(bruik) > 0 THEN zonder := zonder || 'Instelling verkleinen niet leesbaar'::text; END IF;
1936
- vooraf := CASE WHEN array_length(zonder, 1) > 0 THEN array_to_string(zonder, '; ') || ' – ' ELSE '' END;
1937
- IF coalesce((p_a4_vel ->> 'aanwezig')::boolean, false) THEN
1938
- vel_b := (p_a4_vel ->> 'breedte_mm')::numeric; vel_h := (p_a4_vel ->> 'hoogte_mm')::numeric;
1939
- IF vel_b > 0 AND vel_h > 0 THEN
1940
- IF abs(vel_b - b) <= 1 AND abs(vel_h - h) <= 1 THEN
1941
- mb := coalesce((p_a4_vel ->> 'marge_boven_mm')::numeric, 0); ml := coalesce((p_a4_vel ->> 'marge_links_mm')::numeric, 0);
1942
- th := coalesce((p_a4_vel ->> 'tussen_h_mm')::numeric, 0); tv := coalesce((p_a4_vel ->> 'tussen_v_mm')::numeric, 0);
1943
- kol := greatest(1, floor((210 - 2 * ml + th + 0.000000001) / (vel_b + th))::int);
1944
- rij := greatest(1, floor((297 - 2 * mb + tv + 0.000000001) / (vel_h + tv))::int);
1945
- vel_ok := true;
1946
- END IF;
1947
- ELSE
1948
- SELECT v.breedte_mm, v.hoogte_mm, v.kolommen, v.rijen INTO vel_b, vel_h, kol, rij
1949
- FROM public.layouts_a4_velindelingen() v
1950
- WHERE (abs(v.breedte_mm - b) <= 1 AND abs(v.hoogte_mm - h) <= 1) OR (abs(v.breedte_mm - h) <= 1 AND abs(v.hoogte_mm - b) <= 1)
1951
- LIMIT 1;
1952
- vel_ok := kol IS NOT NULL;
1953
- END IF;
1954
- END IF;
1955
- IF vel_ok THEN
1956
- RETURN jsonb_build_object('uitwijkroute', 'a4_vel', 'printerNaam', p_a4_printer, 'schaal', 1, 'paper', 'A4', 'rotate', 0,
1957
- 'reden', format('%s%s op A4-stickervel (%s×%s van %s×%s) in plaats van %s, 1-op-1', vooraf, CASE WHEN vooraf = '' THEN 'Geprint' ELSE 'geprint' END, kol, rij, round(vel_b), round(vel_h), st),
1958
- 'pagina_breedte_mm', 210, 'pagina_hoogte_mm', 297);
1959
- END IF;
1960
- RETURN jsonb_build_object('uitwijkroute', 'a4_snijlijnen', 'printerNaam', p_a4_printer, 'schaal', 1, 'paper', 'A4', 'rotate', 0,
1961
- 'reden', format('%s%s op A4 met snijlijnen in plaats van %s, 1-op-1', vooraf, CASE WHEN vooraf = '' THEN 'Geprint' ELSE 'geprint' END, st),
1962
- 'pagina_breedte_mm', 210, 'pagina_hoogte_mm', 297);
1963
- END $$;
1964
1862
  -- 6. Vroege waarschuwing: zelfde route en bron. VOLATILE (leest instelling via ensure).
1965
1863
  CREATE OR REPLACE FUNCTION public.layouts_vroege_sticker_waarschuwing(p_van date, p_tot date)
1966
1864
  RETURNS jsonb
@@ -2319,39 +2217,6 @@ BEGIN
2319
2217
  RAISE EXCEPTION '%', v_fout USING ERRCODE = '42501';
2320
2218
  END IF;
2321
2219
  END $function$;
2322
- -- claim_print_jobs: niveau server
2323
- CREATE OR REPLACE FUNCTION public.claim_print_jobs(_agent_id uuid, _max integer DEFAULT 5)
2324
- RETURNS SETOF public.print_jobs
2325
- LANGUAGE plpgsql
2326
- SECURITY DEFINER
2327
- SET search_path = public
2328
- AS $$
2329
- BEGIN
2330
- PERFORM public._layouts_toegang_functie('claim_print_jobs', 'server');
2331
- RETURN QUERY
2332
- WITH kandidaten AS (
2333
- SELECT j.id
2334
- FROM public.print_jobs j
2335
- JOIN public.printers p ON p.id = j.printer_id
2336
- WHERE j.status = 'wachtend'
2337
- AND p.agent_id = _agent_id
2338
- AND p.actief = true
2339
- ORDER BY j.created_at
2340
- LIMIT GREATEST(_max, 1)
2341
- FOR UPDATE SKIP LOCKED
2342
- )
2343
- UPDATE public.print_jobs j
2344
- SET status = 'bezig',
2345
- agent_id = _agent_id,
2346
- opgepakt_op = now(),
2347
- gestart_op = COALESCE(j.gestart_op, now()),
2348
- pogingen = j.pogingen + 1,
2349
- updated_at = now()
2350
- FROM kandidaten k
2351
- WHERE j.id = k.id
2352
- RETURNING j.*;
2353
- END;
2354
- $$;
2355
2220
  -- claim_cloud_print_jobs: niveau server
2356
2221
  CREATE OR REPLACE FUNCTION public.claim_cloud_print_jobs(_max integer default 5)
2357
2222
  returns setof public.print_jobs
@@ -3054,7 +2919,189 @@ BEGIN
3054
2919
  END IF;
3055
2920
  RETURN greatest(1, least(v_max, v_n));
3056
2921
  END $$;
3057
- -- layouts_install_check: controle op de 13 functies
2922
+ CREATE OR REPLACE FUNCTION public.print_etiketrollen_bijgewerkt()
2923
+ RETURNS trigger LANGUAGE plpgsql SET search_path = public AS $$
2924
+ BEGIN NEW.updated_at := now(); RETURN NEW; END $$;
2925
+ -- Gangbare rollen; idempotent, bestaande rijen blijven ongemoeid.
2926
+ CREATE OR REPLACE FUNCTION public.layouts_zorg_voor_etiketrollen()
2927
+ RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path = public AS $$
2928
+ DECLARE n integer;
2929
+ BEGIN
2930
+ PERFORM public._layouts_toegang_server_of_ingelogd(false);
2931
+ INSERT INTO public.print_etiketrollen (sleutel, naam, breedte_mm, hoogte_mm, doorlopend, is_a4, volgorde) VALUES
2932
+ ('dymo_99010', 'DYMO 99010 adres', 89, 25, false, false, 10),
2933
+ ('dymo_99012', 'DYMO 99012 adres groot', 89, 36, false, false, 20),
2934
+ ('dymo_99014', 'DYMO 99014 verzend', 101, 54, false, false, 30),
2935
+ ('dymo_s0722430', 'DYMO S0722430 verzend', 102, 59, false, false, 40),
2936
+ ('dymo_4xl', 'DYMO 4XL verzendlabel', 104, 159, false, false, 50),
2937
+ ('etiket_100x62', 'Etiket 100 × 62', 100, 62, false, false, 60),
2938
+ ('etiket_100x100','Etiket 100 × 100', 100, 100, false, false, 70),
2939
+ ('etiket_100x150','Etiket 100 × 150', 100, 150, false, false, 80),
2940
+ ('a4', 'A4-vel', 210, 297, false, true, 90)
2941
+ ON CONFLICT (sleutel) DO NOTHING;
2942
+ GET DIAGNOSTICS n = ROW_COUNT;
2943
+ RETURN jsonb_build_object('toegevoegd', n, 'actief', (SELECT count(*) FROM public.print_etiketrollen WHERE actief));
2944
+ END $$;
2945
+ -- B. Standaardontwerpen per documentsoort in drie formaatklassen (bron flowselections).
2946
+ CREATE OR REPLACE FUNCTION public.layouts_zorg_voor_stickerformaten()
2947
+ RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path = public AS $$
2948
+ DECLARE r record; n integer := 0; v_id uuid;
2949
+ BEGIN
2950
+ PERFORM public._layouts_toegang_server_of_ingelogd(false);
2951
+ FOR r IN
2952
+ SELECT t.soort, t.label, k.klasse, k.b, k.h, k.velden
2953
+ FROM (VALUES ('sticker', 'Sticker'), ('traysticker', 'Traysticker'), ('eigen_sticker', 'Eigen sticker'), ('verzendlabel', 'Verzendlabel')) AS t(soort, label),
2954
+ (VALUES
2955
+ ('groot', 100::numeric, 150::numeric, '["logo","bedrijfsnaam","klantnaam","ordernummer","leverdatum","afleverlocatie","product","planten_per_fust","fust","barcode"]'::jsonb),
2956
+ ('middel', 100, 62, '["klantnaam","ordernummer","leverdatum","afleverlocatie","product","planten_per_fust","fust","barcode"]'::jsonb),
2957
+ ('klein', 89, 25, '["ordernummer","klantnaam","fust","barcode"]'::jsonb)) AS k(klasse, b, h, velden)
2958
+ LOOP
2959
+ INSERT INTO public.document_layouts
2960
+ (naam, documenttype, omschrijving, papierformaat, breedte_mm, hoogte_mm, orientatie, bron, systeem, actief,
2961
+ is_standaard, config, standaard_sleutel, standaard_versie)
2962
+ VALUES (r.label || ' ' || r.klasse || ' (Flow Selections)', r.soort::doc_layout_type,
2963
+ 'Standaardontwerp van Flow Selections; wordt opgemaakt op de maat van de rol in de printer.',
2964
+ 'VRIJ', least(r.b, r.h), greatest(r.b, r.h),
2965
+ CASE WHEN r.b > r.h THEN 'landscape' ELSE 'portrait' END::doc_orientation,
2966
+ 'flowselections', true, true, false,
2967
+ jsonb_build_object('fs_sticker', jsonb_build_object('klasse', r.klasse, 'velden', r.velden)),
2968
+ 'fs.formaat.' || r.soort || '.' || r.klasse, 1)
2969
+ ON CONFLICT (standaard_sleutel) WHERE standaard_sleutel IS NOT NULL DO NOTHING
2970
+ RETURNING id INTO v_id;
2971
+ IF v_id IS NOT NULL THEN n := n + 1; v_id := NULL; END IF;
2972
+ END LOOP;
2973
+ RETURN jsonb_build_object('toegevoegd', n);
2974
+ END $$;
2975
+ -- Ondergrens verkleinen 95 % (zelfde handtekening).
2976
+ CREATE OR REPLACE FUNCTION public.layouts_kies_sticker_route(p_sticker_breedte_mm numeric, p_sticker_hoogte_mm numeric, p_etiketten jsonb, p_instelling jsonb, p_heeft_barcode boolean, p_a4_printer text, p_a4_vel jsonb)
2977
+ RETURNS jsonb
2978
+ LANGUAGE plpgsql
2979
+ IMMUTABLE
2980
+ SET search_path TO 'public'
2981
+ AS $function$
2982
+ DECLARE
2983
+ b numeric := p_sticker_breedte_mm; h numeric := p_sticker_hoogte_mm;
2984
+ st text := round(b)::text || '×' || round(h)::text;
2985
+ liggend boolean := b > h;
2986
+ e jsonb; eb numeric; eh numeric; ebr numeric; ehr numeric; papier text; f jsonb; x record;
2987
+ k numeric; l numeric; dk numeric; dl numeric; beste numeric;
2988
+ bruik jsonb := '[]'::jsonb; zonder text[] := ARRAY[]::text[];
2989
+ rot int; af numeric; s numeric; dpi numeric;
2990
+ g_beste numeric; g_uit jsonb; v_beste numeric; v_uit jsonb;
2991
+ toegestaan boolean; grens numeric; instelling_ok boolean := p_instelling IS NOT NULL AND jsonb_typeof(p_instelling) = 'object';
2992
+ vel_b numeric; vel_h numeric; kol int; rij int; mb numeric; ml numeric; th numeric; tv numeric; vooraf text; vel_ok boolean := false;
2993
+ BEGIN
2994
+ IF instelling_ok THEN
2995
+ toegestaan := coalesce((p_instelling ->> 'toegestaan')::boolean, false);
2996
+ grens := (p_instelling ->> 'ondergrens_pct')::numeric;
2997
+ IF grens IS NULL OR grens <= 0 OR grens > 100 THEN instelling_ok := false; END IF;
2998
+ -- 1.69.20: 95 % is overal de ondergrens (barcode-leesbaarheid); een lagere opgeslagen waarde telt als 95 %.
2999
+ IF instelling_ok AND grens < 95 THEN grens := 95; END IF;
3000
+ END IF;
3001
+
3002
+ -- Papiermaat op afmeting (±1 mm); zonder passende maat telt het etiket niet.
3003
+ FOR e IN SELECT value FROM jsonb_array_elements(coalesce(p_etiketten, '[]'::jsonb)) LOOP
3004
+ eb := (e ->> 'breedte_mm')::numeric; eh := (e ->> 'hoogte_mm')::numeric;
3005
+ IF NOT (e ? 'formaten') THEN
3006
+ bruik := bruik || jsonb_build_array(e || jsonb_build_object('gekozen', coalesce(e ->> 'paper', '')));
3007
+ CONTINUE;
3008
+ END IF;
3009
+ f := e -> 'formaten'; papier := NULL; beste := NULL;
3010
+ IF jsonb_typeof(f) = 'object' THEN
3011
+ FOR x IN SELECT key, value FROM jsonb_each(f) LOOP
3012
+ IF jsonb_typeof(x.value) <> 'array' OR jsonb_array_length(x.value) < 2 THEN CONTINUE; END IF;
3013
+ k := least((x.value ->> 0)::numeric, (x.value ->> 1)::numeric) / 10;
3014
+ l := greatest((x.value ->> 0)::numeric, (x.value ->> 1)::numeric) / 10;
3015
+ dk := abs(k - least(eb, eh)); dl := abs(l - greatest(eb, eh));
3016
+ IF dk <= 1.000000001 AND dl <= 1.000000001 AND (beste IS NULL OR dk + dl < beste) THEN papier := x.key; beste := dk + dl; END IF;
3017
+ END LOOP;
3018
+ END IF;
3019
+ IF papier IS NULL THEN
3020
+ zonder := zonder || format('Printer %s heeft geen papiermaat %s×%s ingesteld', e ->> 'printerNaam', round(eb), round(eh));
3021
+ ELSE
3022
+ bruik := bruik || jsonb_build_array(e || jsonb_build_object('gekozen', papier));
3023
+ END IF;
3024
+ END LOOP;
3025
+
3026
+ -- 1. precies
3027
+ FOR e IN SELECT value FROM jsonb_array_elements(bruik) LOOP
3028
+ eb := (e ->> 'breedte_mm')::numeric; eh := (e ->> 'hoogte_mm')::numeric;
3029
+ IF abs(b - eb) <= 2 AND abs(h - eh) <= 2 THEN
3030
+ RETURN jsonb_build_object('uitwijkroute', 'precies', 'printerNaam', e ->> 'printerNaam', 'schaal', 1, 'paper', e ->> 'gekozen',
3031
+ 'rotate', CASE WHEN liggend <> (eb > eh) THEN 90 ELSE 0 END,
3032
+ 'reden', format('Geprint op %s×%s, precies passend', round(eb), round(eh)), 'pagina_breedte_mm', eb, 'pagina_hoogte_mm', eh);
3033
+ END IF;
3034
+ END LOOP;
3035
+ -- 2. gedraaid
3036
+ FOR e IN SELECT value FROM jsonb_array_elements(bruik) LOOP
3037
+ eb := (e ->> 'breedte_mm')::numeric; eh := (e ->> 'hoogte_mm')::numeric;
3038
+ IF abs(b - eh) <= 2 AND abs(h - eb) <= 2 THEN
3039
+ RETURN jsonb_build_object('uitwijkroute', 'gedraaid', 'printerNaam', e ->> 'printerNaam', 'schaal', 1, 'paper', e ->> 'gekozen', 'rotate', 90,
3040
+ 'reden', format('Geprint op %s×%s in plaats van %s, 90° gedraaid', round(eb), round(eh), st), 'pagina_breedte_mm', eb, 'pagina_hoogte_mm', eh);
3041
+ END IF;
3042
+ END LOOP;
3043
+ -- 3. groter etiket 1-op-1, daarna pas verkleinen
3044
+ FOR e IN SELECT value FROM jsonb_array_elements(bruik) LOOP
3045
+ eb := (e ->> 'breedte_mm')::numeric; eh := (e ->> 'hoogte_mm')::numeric;
3046
+ dpi := nullif((e ->> 'dpi')::numeric, 0);
3047
+ FOREACH rot IN ARRAY ARRAY[0, 90] LOOP
3048
+ ebr := CASE WHEN rot = 90 THEN eh ELSE eb END; ehr := CASE WHEN rot = 90 THEN eb ELSE eh END;
3049
+ IF b <= ebr + 2 AND h <= ehr + 2 THEN
3050
+ af := (ebr * ehr - b * h) / (b * h);
3051
+ IF g_beste IS NULL OR af < g_beste THEN
3052
+ g_beste := af;
3053
+ g_uit := jsonb_build_object('uitwijkroute', 'groter_etiket', 'printerNaam', e ->> 'printerNaam', 'schaal', 1, 'paper', e ->> 'gekozen', 'rotate', rot,
3054
+ 'reden', format('Geprint op %s×%s in plaats van %s, 1-op-1 gecentreerd%s', round(eb), round(eh), st, CASE WHEN rot = 90 THEN ' en 90° gedraaid' ELSE '' END),
3055
+ 'pagina_breedte_mm', eb, 'pagina_hoogte_mm', eh);
3056
+ END IF;
3057
+ ELSIF instelling_ok AND toegestaan THEN
3058
+ s := least(ebr / b, ehr / h, 1);
3059
+ IF s * 100 >= grens - 0.000000001
3060
+ AND (p_heeft_barcode IS FALSE OR 0.33 * s >= 2 * (25.4 / coalesce(dpi, 203)) - 0.000000001)
3061
+ AND (v_beste IS NULL OR 1 - s < v_beste) THEN
3062
+ v_beste := 1 - s;
3063
+ v_uit := jsonb_build_object('uitwijkroute', 'verkleind', 'printerNaam', e ->> 'printerNaam', 'schaal', round(s, 2), 'paper', e ->> 'gekozen', 'rotate', rot,
3064
+ 'reden', format('Geprint op %s×%s in plaats van %s, verkleind tot %s%%', round(eb), round(eh), st, round(s * 100)),
3065
+ 'pagina_breedte_mm', eb, 'pagina_hoogte_mm', eh);
3066
+ END IF;
3067
+ END IF;
3068
+ END LOOP;
3069
+ END LOOP;
3070
+ IF g_uit IS NOT NULL THEN RETURN g_uit; END IF;
3071
+ IF v_uit IS NOT NULL THEN RETURN v_uit; END IF;
3072
+
3073
+ -- 4 + 5: A4. Eigen velindeling van de printplek gaat vóór de standaardlijst.
3074
+ IF p_a4_printer IS NULL THEN RETURN NULL; END IF;
3075
+ IF NOT instelling_ok AND jsonb_array_length(bruik) > 0 THEN zonder := zonder || 'Instelling verkleinen niet leesbaar'::text; END IF;
3076
+ vooraf := CASE WHEN array_length(zonder, 1) > 0 THEN array_to_string(zonder, '; ') || ' – ' ELSE '' END;
3077
+ IF coalesce((p_a4_vel ->> 'aanwezig')::boolean, false) THEN
3078
+ vel_b := (p_a4_vel ->> 'breedte_mm')::numeric; vel_h := (p_a4_vel ->> 'hoogte_mm')::numeric;
3079
+ IF vel_b > 0 AND vel_h > 0 THEN
3080
+ IF abs(vel_b - b) <= 1 AND abs(vel_h - h) <= 1 THEN
3081
+ mb := coalesce((p_a4_vel ->> 'marge_boven_mm')::numeric, 0); ml := coalesce((p_a4_vel ->> 'marge_links_mm')::numeric, 0);
3082
+ th := coalesce((p_a4_vel ->> 'tussen_h_mm')::numeric, 0); tv := coalesce((p_a4_vel ->> 'tussen_v_mm')::numeric, 0);
3083
+ kol := greatest(1, floor((210 - 2 * ml + th + 0.000000001) / (vel_b + th))::int);
3084
+ rij := greatest(1, floor((297 - 2 * mb + tv + 0.000000001) / (vel_h + tv))::int);
3085
+ vel_ok := true;
3086
+ END IF;
3087
+ ELSE
3088
+ SELECT v.breedte_mm, v.hoogte_mm, v.kolommen, v.rijen INTO vel_b, vel_h, kol, rij
3089
+ FROM public.layouts_a4_velindelingen() v
3090
+ WHERE (abs(v.breedte_mm - b) <= 1 AND abs(v.hoogte_mm - h) <= 1) OR (abs(v.breedte_mm - h) <= 1 AND abs(v.hoogte_mm - b) <= 1)
3091
+ LIMIT 1;
3092
+ vel_ok := kol IS NOT NULL;
3093
+ END IF;
3094
+ END IF;
3095
+ IF vel_ok THEN
3096
+ RETURN jsonb_build_object('uitwijkroute', 'a4_vel', 'printerNaam', p_a4_printer, 'schaal', 1, 'paper', 'A4', 'rotate', 0,
3097
+ 'reden', format('%s%s op A4-stickervel (%s×%s van %s×%s) in plaats van %s, 1-op-1', vooraf, CASE WHEN vooraf = '' THEN 'Geprint' ELSE 'geprint' END, kol, rij, round(vel_b), round(vel_h), st),
3098
+ 'pagina_breedte_mm', 210, 'pagina_hoogte_mm', 297);
3099
+ END IF;
3100
+ RETURN jsonb_build_object('uitwijkroute', 'a4_snijlijnen', 'printerNaam', p_a4_printer, 'schaal', 1, 'paper', 'A4', 'rotate', 0,
3101
+ 'reden', format('%s%s op A4 met snijlijnen in plaats van %s, 1-op-1', vooraf, CASE WHEN vooraf = '' THEN 'Geprint' ELSE 'geprint' END, st),
3102
+ 'pagina_breedte_mm', 210, 'pagina_hoogte_mm', 297);
3103
+ END $function$;
3104
+ -- Install_check: rollenlijst, rol per labelprinter, standaardontwerpen, 95 %-waarschuwing (zelfde handtekening).
3058
3105
  CREATE OR REPLACE FUNCTION public.layouts_install_check()
3059
3106
  RETURNS jsonb
3060
3107
  LANGUAGE plpgsql
@@ -3079,6 +3126,8 @@ BEGIN
3079
3126
  ('layouts_zorg_voor_wachtrij_instellingen()', 'nodig'),
3080
3127
  ('layouts_vrijgeven_vastgelopen(uuid)', 'nodig'),
3081
3128
  ('layouts_origineel_bron(text,jsonb)', 'niet nodig'),
3129
+ ('layouts_zorg_voor_etiketrollen()', 'nodig'),
3130
+ ('layouts_zorg_voor_stickerformaten()', 'nodig'),
3082
3131
  ('layouts_install_check()', 'nodig')) AS n(naam, soort)
3083
3132
  LEFT JOIN pg_proc p ON p.oid = to_regprocedure('public.' || n.naam)
3084
3133
  LOOP
@@ -3174,8 +3223,79 @@ BEGIN
3174
3223
  'in_orde', to_regprocedure('public.layouts_origineel_bron(text,jsonb)') IS NOT NULL
3175
3224
  AND position('layouts_origineel_bron' IN coalesce((SELECT prosrc FROM pg_proc WHERE oid = to_regprocedure('public.print_jobs_origineel_controle()')), '')) > 0
3176
3225
  AND position('layouts_origineel_bron' IN coalesce((SELECT prosrc FROM pg_proc WHERE oid = to_regprocedure('public.print_jobs_dedupe()')), '')) > 0);
3226
+ -- 1.69.20: rollenlijst, rol per labelprinter, standaardontwerpen per formaatklasse, verkleinen ≥ 95 %.
3227
+ v := v || jsonb_build_object('functie', 'Layouts: rollenlijst etiketten',
3228
+ 'aanwezig', to_regclass('public.print_etiketrollen') IS NOT NULL,
3229
+ 'interne_controle', (SELECT count(*)::text || ' actieve rollen' FROM public.print_etiketrollen WHERE actief),
3230
+ 'in_orde', EXISTS (SELECT 1 FROM public.print_etiketrollen WHERE actief)
3231
+ AND to_regprocedure('public.layouts_zorg_voor_etiketrollen()') IS NOT NULL);
3232
+ v_mis := NULL;
3233
+ SELECT array_agg(DISTINCT coalesce(nullif(p.weergavenaam, ''), p.naam) ORDER BY coalesce(nullif(p.weergavenaam, ''), p.naam)) INTO v_mis
3234
+ FROM public.printers p
3235
+ WHERE p.actief IS DISTINCT FROM false AND p.geladen_etiket IS NULL
3236
+ AND EXISTS (SELECT 1 FROM public.document_printplek_printers d
3237
+ WHERE d.printer_id = p.id AND d.documenttype IN ('sticker', 'traysticker', 'eigen_sticker', 'verzendlabel'));
3238
+ v := v || jsonb_build_object('functie', 'Layouts: labelprinters met ingestelde rol',
3239
+ 'aanwezig', true,
3240
+ 'interne_controle', CASE WHEN v_mis IS NULL THEN 'alle labelprinters hebben een rol'
3241
+ ELSE 'formaat onbekend: ' || array_to_string(v_mis, ', ') END,
3242
+ 'in_orde', v_mis IS NULL);
3243
+ v_mis := NULL;
3244
+ SELECT array_agg(x.s ORDER BY x.s) INTO v_mis
3245
+ FROM (SELECT t || '.' || k AS s FROM unnest(ARRAY['sticker', 'traysticker', 'eigen_sticker', 'verzendlabel']) AS t,
3246
+ unnest(ARRAY['groot', 'middel', 'klein']) AS k) x
3247
+ WHERE NOT EXISTS (SELECT 1 FROM public.document_layouts l WHERE l.standaard_sleutel = 'fs.formaat.' || x.s AND l.actief);
3248
+ v := v || jsonb_build_object('functie', 'Layouts: standaardontwerpen groot/middel/klein',
3249
+ 'aanwezig', to_regprocedure('public.layouts_zorg_voor_stickerformaten()') IS NOT NULL,
3250
+ 'interne_controle', CASE WHEN v_mis IS NULL THEN 'alle 12 aanwezig' ELSE 'ontbreekt: ' || array_to_string(v_mis, ', ') END,
3251
+ 'in_orde', v_mis IS NULL);
3252
+ v_mis := NULL;
3253
+ SELECT array_agg(e.key || ' staat op ' || (e.value ->> 'ondergrens_pct') || ' %, wordt 95 % (barcode-leesbaarheid)' ORDER BY e.key) INTO v_mis
3254
+ FROM public.app_settings s, jsonb_each(CASE WHEN s.value ~ '^\s*\{' THEN s.value::jsonb ELSE '{}'::jsonb END) e
3255
+ WHERE s.key = 'layouts.sticker_verkleinen' AND jsonb_typeof(e.value) = 'object'
3256
+ AND (e.value ->> 'ondergrens_pct') ~ '^[0-9.]+$' AND (e.value ->> 'ondergrens_pct')::numeric < 95;
3257
+ v := v || jsonb_build_object('functie', 'Layouts: verkleinen niet onder 95 %',
3258
+ 'aanwezig', true,
3259
+ 'interne_controle', CASE WHEN v_mis IS NULL THEN 'alle stickersoorten ≥ 95 %' ELSE 'waarschuwing: ' || array_to_string(v_mis, '; ') END,
3260
+ 'waarschuwing', v_mis IS NOT NULL,
3261
+ 'in_orde', true);
3177
3262
  RETURN v;
3178
3263
  END $function$;
3264
+ CREATE OR REPLACE FUNCTION public.claim_print_jobs(_agent_id uuid, _max integer DEFAULT 5)
3265
+ RETURNS SETOF print_jobs
3266
+ LANGUAGE plpgsql
3267
+ SECURITY DEFINER
3268
+ SET search_path TO 'public'
3269
+ AS $function$
3270
+ BEGIN
3271
+ PERFORM public._layouts_toegang_functie('claim_print_jobs', 'server');
3272
+ -- 1.69.20: sticker-achtige documenten gaan altijd via de printwachtrij van de
3273
+ -- Shell (keuzeregel ontwerp + printer), nooit rechtstreeks via een lokale agent.
3274
+ RETURN QUERY
3275
+ WITH kandidaten AS (
3276
+ SELECT j.id
3277
+ FROM public.print_jobs j
3278
+ JOIN public.printers p ON p.id = j.printer_id
3279
+ WHERE j.status = 'wachtend'
3280
+ AND p.agent_id = _agent_id
3281
+ AND p.actief = true
3282
+ AND coalesce(j.documenttype::text, '') NOT IN ('sticker', 'traysticker', 'eigen_sticker', 'verzendlabel')
3283
+ ORDER BY j.created_at
3284
+ LIMIT GREATEST(_max, 1)
3285
+ FOR UPDATE SKIP LOCKED
3286
+ )
3287
+ UPDATE public.print_jobs j
3288
+ SET status = 'bezig',
3289
+ agent_id = _agent_id,
3290
+ opgepakt_op = now(),
3291
+ gestart_op = COALESCE(j.gestart_op, now()),
3292
+ pogingen = j.pogingen + 1,
3293
+ updated_at = now()
3294
+ FROM kandidaten k
3295
+ WHERE j.id = k.id
3296
+ RETURNING j.*;
3297
+ END;
3298
+ $function$;
3179
3299
 
3180
3300
  -- ---------------------------------------------------------------- Functie-eigenschappen
3181
3301
  DO $s169$ BEGIN
@@ -3265,6 +3385,7 @@ CREATE INDEX IF NOT EXISTS print_printer_verwijder_herstel_plek_idx
3265
3385
  ON public.print_printer_verwijder_herstel (print_plek_id, extern_printer_id) WHERE hersteld_op IS NULL;
3266
3386
  CREATE UNIQUE INDEX IF NOT EXISTS uniq_document_layout_standaard_sleutel
3267
3387
  ON public.document_layouts (standaard_sleutel) WHERE standaard_sleutel IS NOT NULL;
3388
+ CREATE UNIQUE INDEX IF NOT EXISTS print_etiketrollen_sleutel_uniek ON public.print_etiketrollen (sleutel);
3268
3389
 
3269
3390
  -- ---------------------------------------------------------------- Triggers
3270
3391
  CREATE OR REPLACE TRIGGER trg_document_layouts_updated before update on public.document_layouts for each row execute function public.update_updated_at_column();
@@ -3381,6 +3502,7 @@ alter table public.print_shell_stilstand enable row level security;
3381
3502
  ALTER TABLE public.print_printer_verwijder_herstel ENABLE ROW LEVEL SECURITY;
3382
3503
  ALTER TABLE public.layout_standaarden ENABLE ROW LEVEL SECURITY;
3383
3504
  ALTER TABLE public.layout_auto_acties ENABLE ROW LEVEL SECURITY;
3505
+ ALTER TABLE public.print_etiketrollen ENABLE ROW LEVEL SECURITY;
3384
3506
 
3385
3507
  -- ---------------------------------------------------------------- Policies
3386
3508
  DO $p9$ BEGIN
@@ -4352,6 +4474,14 @@ DO $s266$ BEGIN
4352
4474
  EXECUTE $q266$grant execute on function public.layouts_vrijgeven_vastgelopen(uuid) to service_role$q266$;
4353
4475
  EXCEPTION WHEN undefined_table OR undefined_function OR undefined_object THEN NULL;
4354
4476
  END $s266$;
4477
+ DO $s272$ BEGIN
4478
+ EXECUTE $q272$GRANT SELECT, INSERT, UPDATE ON public.print_etiketrollen TO authenticated$q272$;
4479
+ EXCEPTION WHEN undefined_table OR undefined_function OR undefined_object THEN NULL;
4480
+ END $s272$;
4481
+ DO $s273$ BEGIN
4482
+ EXECUTE $q273$GRANT ALL ON public.print_etiketrollen TO service_role$q273$;
4483
+ EXCEPTION WHEN undefined_table OR undefined_function OR undefined_object THEN NULL;
4484
+ END $s273$;
4355
4485
 
4356
4486
  -- ---------------------------------------------------------------- Commentaar
4357
4487
  DO $s94$ BEGIN
@@ -4488,6 +4618,28 @@ do $$ begin
4488
4618
  where not exists (select 1 from public.app_settings where key = 'layouts_printer_settings_path');
4489
4619
  end if;
4490
4620
  end $$;
4621
+ DO $$ BEGIN
4622
+ IF NOT EXISTS (SELECT 1 FROM pg_policy WHERE polrelid = 'public.print_etiketrollen'::regclass AND polname = 'print_etiketrollen_lezen') THEN
4623
+ CREATE POLICY print_etiketrollen_lezen ON public.print_etiketrollen FOR SELECT TO authenticated USING (true);
4624
+ END IF;
4625
+ IF NOT EXISTS (SELECT 1 FROM pg_policy WHERE polrelid = 'public.print_etiketrollen'::regclass AND polname = 'print_etiketrollen_beheer_toevoegen') THEN
4626
+ CREATE POLICY print_etiketrollen_beheer_toevoegen ON public.print_etiketrollen FOR INSERT TO authenticated WITH CHECK (public._layout_is_beheerder());
4627
+ END IF;
4628
+ IF NOT EXISTS (SELECT 1 FROM pg_policy WHERE polrelid = 'public.print_etiketrollen'::regclass AND polname = 'print_etiketrollen_beheer_wijzigen') THEN
4629
+ CREATE POLICY print_etiketrollen_beheer_wijzigen ON public.print_etiketrollen FOR UPDATE TO authenticated USING (public._layout_is_beheerder()) WITH CHECK (public._layout_is_beheerder());
4630
+ END IF;
4631
+ END $$;
4632
+ DO $$ BEGIN
4633
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgrelid = 'public.print_etiketrollen'::regclass AND tgname = 'print_etiketrollen_bijgewerkt') THEN
4634
+ CREATE TRIGGER print_etiketrollen_bijgewerkt BEFORE UPDATE ON public.print_etiketrollen
4635
+ FOR EACH ROW EXECUTE FUNCTION public.print_etiketrollen_bijgewerkt();
4636
+ END IF;
4637
+ END $$;
4638
+ DO $$ BEGIN
4639
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'printers_rol_id_fkey') THEN
4640
+ ALTER TABLE public.printers ADD CONSTRAINT printers_rol_id_fkey FOREIGN KEY (rol_id) REFERENCES public.print_etiketrollen(id) ON DELETE SET NULL;
4641
+ END IF;
4642
+ END $$;
4491
4643
 
4492
4644
  -- ---------------------------------------------------------------- Referentiegegevens (ON CONFLICT)
4493
4645
  INSERT INTO public.print_queue_settings (dubbel_venster_minuten)
@@ -4543,6 +4695,12 @@ WHERE EXCLUDED.versie > s.versie;
4543
4695
  DO $e$ BEGIN
4544
4696
  perform public.layout_zorg_systeemlayouts();
4545
4697
  END $e$;
4698
+ DO $e$ BEGIN
4699
+ perform public.layouts_zorg_voor_etiketrollen();
4700
+ END $e$;
4701
+ DO $e$ BEGIN
4702
+ perform public.layouts_zorg_voor_stickerformaten();
4703
+ END $e$;
4546
4704
  DO $o$ BEGIN
4547
4705
  IF to_regclass('public.module_runtime_config') IS NULL THEN RAISE NOTICE 'layout-maker: module_runtime_config ontbreekt (Shell); printen blijft dicht tot het Shell-adres er staat'; END IF;
4548
4706
  IF to_regclass('public.invoice_branding_settings') IS NULL THEN RAISE NOTICE 'layout-maker: invoice_branding_settings ontbreekt; voorinvullen uit factuurgegevens overgeslagen'; END IF;
@@ -1,4 +1,4 @@
1
- # Verslag opbouw schemabestand 1.69.18
1
+ # Verslag opbouw schemabestand 1.69.22
2
2
 
3
3
  Weggelaten of omgezet (met eindtoestand):
4
4
 
@@ -323,7 +323,7 @@ Weggelaten of omgezet (met eindtoestand):
323
323
  - 20261023131836_b4dc2e0b-7702-41c9-8289-432076a58d42.sql: REVOKE weggelaten (afspraak: functie controleert zelf de toegang)
324
324
  `REVOKE ALL ON FUNCTION public.layouts_install_check() FROM PUBLIC, anon`
325
325
 
326
- Functies (75):
326
+ Functies (78):
327
327
 
328
328
  - _jsonb_paden_met_waarde(jsonb,text,text[])
329
329
  - _layout_is_beheerder()
@@ -360,10 +360,13 @@ Functies (75):
360
360
  - layouts_vrijgeven_vastgelopen(uuid)
361
361
  - layouts_vroege_sticker_waarschuwing(date,date)
362
362
  - layouts_zorg_voor_a4_stickervel()
363
+ - layouts_zorg_voor_etiketrollen()
363
364
  - layouts_zorg_voor_sticker_verkleinen()
365
+ - layouts_zorg_voor_stickerformaten()
364
366
  - layouts_zorg_voor_wachtrij_instellingen()
365
367
  - markeer_ontbrekende_printer()
366
368
  - opruim_print_historie()
369
+ - print_etiketrollen_bijgewerkt()
367
370
  - print_formaat_klasse(text)
368
371
  - print_is_etiketsoort(text)
369
372
  - print_is_labelprinter(uuid)