@flowselections/layout-maker 1.67.1 → 1.69.1

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.
@@ -3006,9 +3006,10 @@ CREATE POLICY "Automatische acties lezen" ON public.layout_auto_acties FOR SELEC
3006
3006
  -- Referentiedata: vaste Flow Selections-standaarden (klant-onafhankelijk). Alleen een hogere versie vervangt.
3007
3007
  INSERT INTO public.layout_standaarden AS s (sleutel, versie, documenttype, naam, omschrijving, papierformaat, breedte_mm, hoogte_mm, config)
3008
3008
  VALUES
3009
- ('fs.pakbon', 2, 'pakbon', 'Pakbon', 'Standaarddocument voor eigen orders, met kolom Sticker. Volledig aanpasbaar — aanpassen kan per klant.', 'A4', 210, 297, '{"pakbon": {"secties": [{"id": "logo-std", "type": "logo", "titel": "Logo", "zichtbaar": true, "opties": {"uitlijning": "left", "hoogte": 18}, "condities": []}, {"id": "bedrijfsgegevens-std", "type": "bedrijfsgegevens", "titel": "Bedrijfsgegevens", "zichtbaar": true, "opties": {"toonNaam": true, "toonAdres": true, "toonContact": true, "toonKvk": false}, "condities": []}, {"id": "klantgegevens-std", "type": "klantgegevens", "titel": "Klantgegevens", "zichtbaar": true, "opties": {"toonKlantnummer": true, "toonContact": true, "toonReferentie": true}, "condities": []}, {"id": "afleveradres-std", "type": "afleveradres", "titel": "Afleveradres", "zichtbaar": true, "opties": {"toonLand": true}, "condities": []}, {"id": "orderinformatie-std", "type": "orderinformatie", "titel": "Orderinformatie", "zichtbaar": true, "opties": {"toonOrdernummer": true, "toonDatum": true, "toonLeverdatum": true, "toonReferentie": true}, "condities": []}, {"id": "pickmethode-std", "type": "pickmethode", "titel": "Pickmethode", "zichtbaar": true, "opties": {"methode": "kar", "kop": "Te verzamelen fusten \u2014 karindeling zelf bepalen", "velden": ["artikelnummer", "artikelnaam", "potmaat", "kleur", "locatie", "fustsoort", "planten_per_fust", "fust_aantal", "aantal"], "toonFusthoogte": true, "toonTotaal": true, "toonBarcode": true, "barcodeHoogte": 15}, "condities": []}, {"id": "karren-std", "type": "karren", "titel": "Karren", "zichtbaar": true, "opties": {"modus": "pagina", "bundel_identiek": true, "velden": ["karnummer", "lagen", "producten"], "scheiding": "kop", "koptekst": "KAR {kar}", "kleur": "#e8eef7"}, "condities": []}, {"id": "lagen-std", "type": "lagen", "titel": "Lagen", "zichtbaar": true, "opties": {"modus": "apart", "velden": ["laagnummer", "belading", "producten"], "koptekst": "Laag {laag}"}, "condities": []}, {"id": "producten-std", "type": "producten", "titel": "Producten op een laag", "zichtbaar": true, "opties": {"weergave": "tabel", "velden": ["artikelnummer", "artikelnaam", "potmaat", "aantal", "sticker"], "toonSamenstelling": true, "onderdeelVelden": ["artikelnaam", "kleur", "potmaat", "aantal"], "groeperen": false, "kop_eenmalig": true, "sortering": "eigen"}, "condities": []}, {"id": "fusten-std", "type": "fusten", "titel": "Fusten", "zichtbaar": true, "opties": {"modus": "totaal", "velden": ["fusttype", "aantal"]}, "condities": []}, {"id": "totalen-std", "type": "totalen", "titel": "Totalen", "zichtbaar": true, "opties": {"velden": ["producten", "karren", "lagen"], "uitlijning": "right", "elke_pagina": false, "toon_paginanummer": false}, "condities": []}, {"id": "handtekening-std", "type": "handtekening", "titel": "Handtekening", "zichtbaar": true, "opties": {"label": "Voor ontvangst getekend", "toonNaam": true, "toonDatum": true, "toonBarcode": true}, "condities": []}]}}'::jsonb),
3009
+ ('fs.pakbon', 2, 'pakbon', 'Pakbon', 'Standaarddocument voor eigen orders, met kolom Sticker. Volledig aanpasbaar — aanpassen kan per klant.', 'A4', 210, 297, '{"pakbon":{"secties":[{"id":"logo-std","type":"logo","titel":"Logo","zichtbaar":true,"opties":{"uitlijning":"left","hoogte":18},"condities":[]},{"id":"bedrijfsgegevens-std","type":"bedrijfsgegevens","titel":"Bedrijfsgegevens","zichtbaar":true,"opties":{"toonNaam":true,"toonAdres":true,"toonContact":true,"toonKvk":false},"condities":[]},{"id":"klantgegevens-std","type":"klantgegevens","titel":"Klantgegevens","zichtbaar":true,"opties":{"toonKlantnummer":true,"toonContact":true,"toonReferentie":true},"condities":[]},{"id":"afleveradres-std","type":"afleveradres","titel":"Afleveradres","zichtbaar":true,"opties":{"toonLand":true},"condities":[]},{"id":"orderinformatie-std","type":"orderinformatie","titel":"Orderinformatie","zichtbaar":true,"opties":{"toonOrdernummer":true,"toonDatum":true,"toonLeverdatum":true,"toonReferentie":true},"condities":[]},{"id":"pickmethode-std","type":"pickmethode","titel":"Pickmethode","zichtbaar":true,"opties":{"methode":"kar","kop":"Te verzamelen fusten — karindeling zelf bepalen","velden":["artikelnummer","artikelnaam","potmaat","kleur","locatie","fustsoort","planten_per_fust","fust_aantal","aantal"],"toonFusthoogte":true,"toonTotaal":true,"toonBarcode":true,"barcodeHoogte":15},"condities":[]},{"id":"karren-std","type":"karren","titel":"Karren","zichtbaar":true,"opties":{"modus":"pagina","bundel_identiek":true,"velden":["karnummer","lagen","producten"],"scheiding":"kop","koptekst":"KAR {kar}","kleur":"#e8eef7"},"condities":[]},{"id":"lagen-std","type":"lagen","titel":"Lagen","zichtbaar":true,"opties":{"modus":"apart","velden":["laagnummer","belading","producten"],"koptekst":"Laag {laag}"},"condities":[]},{"id":"producten-std","type":"producten","titel":"Producten op een laag","zichtbaar":true,"opties":{"weergave":"tabel","velden":["artikelnummer","artikelnaam","potmaat","aantal","sticker"],"toonSamenstelling":true,"onderdeelVelden":["artikelnaam","kleur","potmaat","aantal"],"groeperen":false,"kop_eenmalig":true,"sortering":"eigen"},"condities":[]},{"id":"fusten-std","type":"fusten","titel":"Fusten","zichtbaar":true,"opties":{"modus":"totaal","velden":["fusttype","aantal"]},"condities":[]},{"id":"totalen-std","type":"totalen","titel":"Totalen","zichtbaar":true,"opties":{"velden":["producten","karren","lagen"],"uitlijning":"right","elke_pagina":false,"toon_paginanummer":false},"condities":[]},{"id":"handtekening-std","type":"handtekening","titel":"Handtekening","zichtbaar":true,"opties":{"label":"Voor ontvangst getekend","toonNaam":true,"toonDatum":true,"toonBarcode":true},"condities":[]}]}}'::jsonb),
3010
3010
  ('fs.afleverbrief_bvo', 1, 'afleverbrief', 'Afleverbrief (BVO)', 'Verzendbrief voor eigen (niet-Floriday) orders. Volledig aanpasbaar.', 'A4', 210, 297, '{}'::jsonb),
3011
- ('fs.productiebon', 1, 'productiebon', 'Productiebon', 'Standaard productiebon met de vaste blokindeling. Volledig aanpasbaar.', 'A4', 210, 297, '{}'::jsonb)
3011
+ ('fs.productiebon', 1, 'productiebon', 'Productiebon', 'Standaard productiebon met de vaste blokindeling. Volledig aanpasbaar.', 'A4', 210, 297, '{}'::jsonb),
3012
+ ('fs.eigen_sticker', 1, 'sticker', 'Eigen sticker', 'Sticker voor eigen orders: drukt de stickerafbeelding van de klant (payload.sticker_afbeelding) op ware grootte af. Volledig aanpasbaar.', 'LABEL_100x62', 100, 62, '{"eigen_sticker":{"afbeelding":"payload.sticker_afbeelding","passend":"ware_grootte"}}'::jsonb)
3012
3013
  ON CONFLICT (sleutel) DO UPDATE SET
3013
3014
  versie = EXCLUDED.versie, documenttype = EXCLUDED.documenttype, naam = EXCLUDED.naam,
3014
3015
  omschrijving = EXCLUDED.omschrijving, papierformaat = EXCLUDED.papierformaat,
@@ -3203,3 +3204,103 @@ do $$ begin
3203
3204
  if to_regclass('public.invoice_branding_settings') is null then raise notice 'layout-maker: invoice_branding_settings ontbreekt; voorinvullen uit factuurgegevens overgeslagen'; end if;
3204
3205
  if to_regprocedure('public.floriday_eigen_organisatie()') is null then raise notice 'layout-maker: floriday_eigen_organisatie() ontbreekt; voorinvullen uit Floriday overgeslagen'; end if;
3205
3206
  end $$;
3207
+
3208
+ -- 1.69.0: automatische documentkeuze voor alle modules
3209
+ CREATE OR REPLACE FUNCTION public.layout_voor_document(p_order_id uuid, p_documenttype text)
3210
+ RETURNS jsonb
3211
+ LANGUAGE plpgsql
3212
+ STABLE SECURITY DEFINER
3213
+ SET search_path TO 'public'
3214
+ AS $function$
3215
+ DECLARE
3216
+ v_soort text := lower(btrim(coalesce(p_documenttype, '')));
3217
+ v_bestaat boolean;
3218
+ v_floriday boolean;
3219
+ v_type text;
3220
+ v_bron text;
3221
+ v_n int;
3222
+ v_l public.document_layouts%ROWTYPE;
3223
+ v_naam text;
3224
+ BEGIN
3225
+ IF v_soort NOT IN ('pakbon','productiebon','verzenddocument','afleverbrief','veilingbrief','sticker','traysticker','eigen_sticker') THEN
3226
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', NULL, 'documenttype', nullif(v_soort,''),
3227
+ 'breedte_mm', NULL, 'hoogte_mm', NULL, 'reden', 'Onbekende documentsoort: ' || coalesce(nullif(v_soort,''), '(leeg)') || '.');
3228
+ END IF;
3229
+ SELECT true, coalesce(o.order_source = 'floriday', false) INTO v_bestaat, v_floriday
3230
+ FROM public.orders o WHERE o.id = p_order_id;
3231
+ IF v_bestaat IS NULL THEN
3232
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', NULL, 'documenttype', v_soort,
3233
+ 'breedte_mm', NULL, 'hoogte_mm', NULL, 'reden', 'Order niet gevonden.');
3234
+ END IF;
3235
+
3236
+ IF v_soort IN ('pakbon','productiebon') THEN
3237
+ v_type := v_soort; v_bron := 'eigen';
3238
+ ELSIF v_soort = 'verzenddocument' THEN
3239
+ IF v_floriday THEN
3240
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', 'floriday', 'documenttype', 'verzenddocument',
3241
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3242
+ 'reden', 'Layouts kan niet eenduidig zien of Floriday een afleverbrief of een veilingbrief aan deze order heeft gekoppeld. Vraag het document op als afleverbrief of veilingbrief.');
3243
+ END IF;
3244
+ v_type := 'afleverbrief'; v_bron := 'eigen';
3245
+ ELSIF v_soort = 'afleverbrief' THEN
3246
+ v_type := 'afleverbrief'; v_bron := CASE WHEN v_floriday THEN 'floriday' ELSE 'eigen' END;
3247
+ ELSIF v_soort = 'veilingbrief' THEN
3248
+ IF NOT v_floriday THEN
3249
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', 'eigen', 'documenttype', 'veilingbrief',
3250
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3251
+ 'reden', 'Een veilingbrief hoort alleen bij een Floriday-order; voor een eigen order wordt de afleverbrief gebruikt.');
3252
+ END IF;
3253
+ v_type := 'veilingbrief'; v_bron := 'floriday';
3254
+ ELSIF v_soort = 'sticker' THEN
3255
+ IF NOT v_floriday THEN
3256
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', 'eigen', 'documenttype', 'sticker',
3257
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3258
+ 'reden', 'Dit is een eigen order; vraag een eigen sticker op (eigen_sticker).');
3259
+ END IF;
3260
+ v_type := 'sticker'; v_bron := 'floriday';
3261
+ ELSIF v_soort = 'eigen_sticker' THEN
3262
+ IF v_floriday THEN
3263
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', 'floriday', 'documenttype', 'sticker',
3264
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3265
+ 'reden', 'Dit is een Floriday-order; vraag de Floriday-sticker op (sticker).');
3266
+ END IF;
3267
+ v_type := 'sticker'; v_bron := 'eigen';
3268
+ ELSE -- traysticker
3269
+ v_type := 'traysticker'; v_bron := CASE WHEN v_floriday THEN 'floriday' ELSE 'eigen' END;
3270
+ END IF;
3271
+
3272
+ IF v_bron = 'floriday' THEN
3273
+ SELECT count(*) INTO v_n FROM public.document_layouts
3274
+ WHERE actief IS TRUE AND bron = 'floriday' AND documenttype::text = v_type;
3275
+ IF v_n = 1 THEN
3276
+ SELECT * INTO v_l FROM public.document_layouts
3277
+ WHERE actief IS TRUE AND bron = 'floriday' AND documenttype::text = v_type;
3278
+ END IF;
3279
+ ELSE
3280
+ SELECT count(*) INTO v_n FROM public.document_layouts
3281
+ WHERE actief IS TRUE AND is_standaard IS TRUE AND coalesce(bron,'eigen') = 'eigen' AND documenttype::text = v_type;
3282
+ IF v_n = 1 THEN
3283
+ SELECT * INTO v_l FROM public.document_layouts
3284
+ WHERE actief IS TRUE AND is_standaard IS TRUE AND coalesce(bron,'eigen') = 'eigen' AND documenttype::text = v_type;
3285
+ END IF;
3286
+ END IF;
3287
+
3288
+ IF v_l.id IS NULL THEN
3289
+ v_naam := CASE v_type WHEN 'afleverbrief' THEN 'afleverbrief' WHEN 'veilingbrief' THEN 'veilingbrief'
3290
+ WHEN 'productiebon' THEN 'productiebon' WHEN 'pakbon' THEN 'pakbon' WHEN 'traysticker' THEN 'traysticker' ELSE 'sticker' END;
3291
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', v_bron, 'documenttype', v_type,
3292
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3293
+ 'reden', CASE
3294
+ WHEN v_type = 'traysticker' AND v_bron = 'eigen' AND v_n = 0 THEN 'Voor eigen orders is geen traysticker ingesteld.'
3295
+ WHEN v_bron = 'floriday' AND v_n > 1 THEN 'Er zijn meerdere actieve Floriday-layouts voor ' || v_naam || '. Zet er één uit in Layouts en printers.'
3296
+ WHEN v_bron = 'floriday' THEN 'Geen actieve Floriday-layout voor ' || v_naam || '. Activeer de Floriday-systeemlayout in Layouts en printers.'
3297
+ WHEN v_n > 1 THEN 'Er zijn meerdere standaardlayouts voor ' || v_naam || '. Kies er één in Layouts en printers.'
3298
+ ELSE 'Maak of activeer een ' || v_naam || 'layout in Layouts en printers en maak deze standaard.' END);
3299
+ END IF;
3300
+
3301
+ RETURN jsonb_build_object('ok', true, 'layout_id', v_l.id, 'bron', v_bron, 'documenttype', v_type,
3302
+ 'breedte_mm', v_l.breedte_mm, 'hoogte_mm', v_l.hoogte_mm, 'reden', NULL);
3303
+ END;
3304
+ $function$;
3305
+ REVOKE ALL ON FUNCTION public.layout_voor_document(uuid, text) FROM PUBLIC, anon;
3306
+ GRANT EXECUTE ON FUNCTION public.layout_voor_document(uuid, text) TO authenticated, service_role;