@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.
- package/dist-lib/components/FormaatOrientatieBar.d.ts.map +1 -1
- package/dist-lib/components/FormaatOrientatieBar.js +10 -7
- package/dist-lib/components/GeladenEtiketTab.d.ts.map +1 -1
- package/dist-lib/components/GeladenEtiketTab.js +3 -1
- package/dist-lib/components/InstelOverzichtKaart.d.ts +12 -0
- package/dist-lib/components/InstelOverzichtKaart.d.ts.map +1 -0
- package/dist-lib/components/InstelOverzichtKaart.js +78 -0
- package/dist-lib/components/KlaarOmTePrintenBlok.d.ts.map +1 -1
- package/dist-lib/components/KlaarOmTePrintenBlok.js +2 -1
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +29 -5
- package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/PakbonBuilderPage.js +9 -1
- package/dist-lib/components/PrintersPage.d.ts.map +1 -1
- package/dist-lib/components/PrintersPage.js +3 -2
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +5 -9
- package/dist-lib/components/RolKeuze.d.ts +9 -0
- package/dist-lib/components/RolKeuze.d.ts.map +1 -0
- package/dist-lib/components/RolKeuze.js +91 -0
- package/dist-lib/components/StickerOntwerpPage.d.ts +4 -0
- package/dist-lib/components/StickerOntwerpPage.d.ts.map +1 -0
- package/dist-lib/components/StickerOntwerpPage.js +77 -0
- package/dist-lib/components/SysteemLayoutMelding.d.ts +1 -1
- package/dist-lib/components/SysteemLayoutMelding.d.ts.map +1 -1
- package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
- package/dist-lib/components/WerkplekConfiguratiePage.js +15 -7
- package/dist-lib/index.d.ts +5 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +5 -0
- package/dist-lib/integrations/supabase/types.d.ts +621 -120
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/directPrint.d.ts.map +1 -1
- package/dist-lib/lib/directPrint.js +19 -0
- package/dist-lib/lib/etiketRollen.d.ts +41 -0
- package/dist-lib/lib/etiketRollen.d.ts.map +1 -0
- package/dist-lib/lib/etiketRollen.js +64 -0
- package/dist-lib/lib/formaatWeergave.d.ts +24 -0
- package/dist-lib/lib/formaatWeergave.d.ts.map +1 -0
- package/dist-lib/lib/formaatWeergave.js +24 -0
- package/dist-lib/lib/instelOverzicht.d.ts +45 -0
- package/dist-lib/lib/instelOverzicht.d.ts.map +1 -0
- package/dist-lib/lib/instelOverzicht.js +106 -0
- package/dist-lib/lib/ontwerpKeuze.d.ts +80 -0
- package/dist-lib/lib/ontwerpKeuze.d.ts.map +1 -0
- package/dist-lib/lib/ontwerpKeuze.js +193 -0
- package/dist-lib/lib/pakbonBuilder.d.ts +6 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +15 -0
- package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
- package/dist-lib/lib/pakbonContent.js +2 -1
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +3 -1
- package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
- package/dist-lib/lib/pakbonPresentation.js +3 -0
- package/dist-lib/lib/printQueue.server.d.ts +4 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +274 -5
- package/dist-lib/lib/stickerOntwerp.d.ts +67 -0
- package/dist-lib/lib/stickerOntwerp.d.ts.map +1 -0
- package/dist-lib/lib/stickerOntwerp.js +109 -0
- package/dist-lib/lib/stickerRoute.d.ts +3 -0
- package/dist-lib/lib/stickerRoute.d.ts.map +1 -0
- package/dist-lib/lib/stickerRoute.js +5 -0
- package/dist-lib/lib/stickerUitwijk.d.ts +5 -0
- package/dist-lib/lib/stickerUitwijk.d.ts.map +1 -1
- package/dist-lib/lib/stickerUitwijk.js +12 -1
- package/dist-lib/lib/testpagina.d.ts +7 -1
- package/dist-lib/lib/testpagina.d.ts.map +1 -1
- package/dist-lib/lib/testpagina.js +39 -5
- package/dist-lib/lib/useNetwerkPrinters.d.ts +1 -0
- package/dist-lib/lib/useNetwerkPrinters.d.ts.map +1 -1
- package/dist-lib/lib/useNetwerkPrinters.js +11 -3
- package/dist-lib/lib/versie.generated.d.ts +1 -1
- package/dist-lib/lib/versie.generated.js +1 -1
- package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
- package/dist-lib/lib/voorbeeldPrint.js +53 -3
- package/dist-lib/lib/werkplekken.d.ts +5 -1
- package/dist-lib/lib/werkplekken.d.ts.map +1 -1
- package/dist-lib/lib/werkplekken.js +1 -1
- package/package.json +6 -1
- package/sql/print-schema.sql +320 -162
- package/sql/print-schema.verslag.md +5 -2
package/sql/print-schema.sql
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
-- ============================================================================
|
|
2
|
-
-- layout-maker 1.69.
|
|
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
|
-
|
|
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.
|
|
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 (
|
|
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)
|