@flowselections/layout-maker 1.68.1 → 1.69.3

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.
@@ -3008,7 +3008,10 @@ INSERT INTO public.layout_standaarden AS s (sleutel, versie, documenttype, naam,
3008
3008
  VALUES
3009
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),
3013
+ ('fs.eigen_traysticker', 2, 'traysticker', 'Eigen traysticker', 'Eén sticker per fust voor eigen orders: logo/bedrijfsnaam, klant, order, leverdatum, afleverlocatie, fust x van y, product met aantal planten per fust (en onderdelen) en barcode. Elk veld aan/uit te zetten.', 'LABEL_100x62', 100, 62, '{"eigen_traysticker":{"velden":{"logo":true,"bedrijfsnaam":true,"klantnaam":true,"ordernummer":true,"leverdatum":true,"afleverlocatie":true,"tray":true,"producten":true,"barcode":true}}}'::jsonb),
3014
+ ('fs.controlelijst', 1, 'controlelijst', 'Controlelijst karren', 'Controlelijst van de karren (Afhandeling). Kop met datum en aantal karren, tabel per kar en een voet om af te tekenen. Kolommen aan/uit te zetten.', 'A4', 210, 297, '{"controlelijst":{"kop":"Controlelijst karren","kolommen":["karnummer","klaarzetten_tekst","klantnaam","ordernummers","status_tekst"],"voet":["Gecontroleerd door","Datum en tijd","Handtekening"]}}'::jsonb)
3012
3015
  ON CONFLICT (sleutel) DO UPDATE SET
3013
3016
  versie = EXCLUDED.versie, documenttype = EXCLUDED.documenttype, naam = EXCLUDED.naam,
3014
3017
  omschrijving = EXCLUDED.omschrijving, papierformaat = EXCLUDED.papierformaat,
@@ -3203,3 +3206,108 @@ do $$ begin
3203
3206
  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
3207
  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
3208
  end $$;
3209
+
3210
+ -- 1.69.0: automatische documentkeuze voor alle modules
3211
+ CREATE OR REPLACE FUNCTION public.layout_voor_document(p_order_id uuid, p_documenttype text)
3212
+ RETURNS jsonb
3213
+ LANGUAGE plpgsql
3214
+ STABLE SECURITY DEFINER
3215
+ SET search_path TO 'public'
3216
+ AS $function$
3217
+ DECLARE
3218
+ v_soort text := lower(btrim(coalesce(p_documenttype, '')));
3219
+ v_bestaat boolean;
3220
+ v_floriday boolean;
3221
+ v_type text;
3222
+ v_bron text;
3223
+ v_n int;
3224
+ v_l public.document_layouts%ROWTYPE;
3225
+ v_naam text;
3226
+ BEGIN
3227
+ IF v_soort NOT IN ('pakbon','productiebon','verzenddocument','afleverbrief','veilingbrief','sticker','traysticker','eigen_sticker','controlelijst') THEN
3228
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', NULL, 'documenttype', nullif(v_soort,''),
3229
+ 'breedte_mm', NULL, 'hoogte_mm', NULL, 'reden', 'Onbekende documentsoort: ' || coalesce(nullif(v_soort,''), '(leeg)') || '.');
3230
+ END IF;
3231
+ -- 1.69.2: de controlelijst hoort niet bij één order; p_order_id mag leeg zijn.
3232
+ IF v_soort = 'controlelijst' THEN
3233
+ v_bestaat := true; v_floriday := false;
3234
+ ELSE
3235
+ SELECT true, coalesce(o.order_source = 'floriday', false) INTO v_bestaat, v_floriday
3236
+ FROM public.orders o WHERE o.id = p_order_id;
3237
+ END IF;
3238
+ IF v_bestaat IS NULL THEN
3239
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', NULL, 'documenttype', v_soort,
3240
+ 'breedte_mm', NULL, 'hoogte_mm', NULL, 'reden', 'Order niet gevonden.');
3241
+ END IF;
3242
+
3243
+ IF v_soort IN ('pakbon','productiebon','controlelijst') THEN
3244
+ v_type := v_soort; v_bron := 'eigen';
3245
+ ELSIF v_soort = 'verzenddocument' THEN
3246
+ IF v_floriday THEN
3247
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', 'floriday', 'documenttype', 'verzenddocument',
3248
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3249
+ '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.');
3250
+ END IF;
3251
+ v_type := 'afleverbrief'; v_bron := 'eigen';
3252
+ ELSIF v_soort = 'afleverbrief' THEN
3253
+ v_type := 'afleverbrief'; v_bron := CASE WHEN v_floriday THEN 'floriday' ELSE 'eigen' END;
3254
+ ELSIF v_soort = 'veilingbrief' THEN
3255
+ IF NOT v_floriday THEN
3256
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', 'eigen', 'documenttype', 'veilingbrief',
3257
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3258
+ 'reden', 'Een veilingbrief hoort alleen bij een Floriday-order; voor een eigen order wordt de afleverbrief gebruikt.');
3259
+ END IF;
3260
+ v_type := 'veilingbrief'; v_bron := 'floriday';
3261
+ ELSIF v_soort = 'sticker' THEN
3262
+ IF NOT v_floriday THEN
3263
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', 'eigen', 'documenttype', 'sticker',
3264
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3265
+ 'reden', 'Dit is een eigen order; vraag een eigen sticker op (eigen_sticker).');
3266
+ END IF;
3267
+ v_type := 'sticker'; v_bron := 'floriday';
3268
+ ELSIF v_soort = 'eigen_sticker' THEN
3269
+ IF v_floriday THEN
3270
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', 'floriday', 'documenttype', 'sticker',
3271
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3272
+ 'reden', 'Dit is een Floriday-order; vraag de Floriday-sticker op (sticker).');
3273
+ END IF;
3274
+ v_type := 'sticker'; v_bron := 'eigen';
3275
+ ELSE -- traysticker
3276
+ v_type := 'traysticker'; v_bron := CASE WHEN v_floriday THEN 'floriday' ELSE 'eigen' END;
3277
+ END IF;
3278
+
3279
+ IF v_bron = 'floriday' THEN
3280
+ SELECT count(*) INTO v_n FROM public.document_layouts
3281
+ WHERE actief IS TRUE AND bron = 'floriday' 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 bron = 'floriday' AND documenttype::text = v_type;
3285
+ END IF;
3286
+ ELSE
3287
+ SELECT count(*) INTO v_n FROM public.document_layouts
3288
+ WHERE actief IS TRUE AND is_standaard IS TRUE AND coalesce(bron,'eigen') = 'eigen' AND documenttype::text = v_type;
3289
+ IF v_n = 1 THEN
3290
+ SELECT * INTO v_l FROM public.document_layouts
3291
+ WHERE actief IS TRUE AND is_standaard IS TRUE AND coalesce(bron,'eigen') = 'eigen' AND documenttype::text = v_type;
3292
+ END IF;
3293
+ END IF;
3294
+
3295
+ IF v_l.id IS NULL THEN
3296
+ v_naam := CASE v_type WHEN 'afleverbrief' THEN 'afleverbrief' WHEN 'veilingbrief' THEN 'veilingbrief'
3297
+ WHEN 'productiebon' THEN 'productiebon' WHEN 'pakbon' THEN 'pakbon' WHEN 'traysticker' THEN 'traysticker' WHEN 'controlelijst' THEN 'controlelijst' ELSE 'sticker' END;
3298
+ RETURN jsonb_build_object('ok', false, 'layout_id', NULL, 'bron', v_bron, 'documenttype', v_type,
3299
+ 'breedte_mm', NULL, 'hoogte_mm', NULL,
3300
+ 'reden', CASE
3301
+ WHEN v_type = 'traysticker' AND v_bron = 'eigen' AND v_n = 0 THEN 'Voor eigen orders is geen traysticker ingesteld.'
3302
+ 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.'
3303
+ WHEN v_bron = 'floriday' THEN 'Geen actieve Floriday-layout voor ' || v_naam || '. Activeer de Floriday-systeemlayout in Layouts en printers.'
3304
+ WHEN v_n > 1 THEN 'Er zijn meerdere standaardlayouts voor ' || v_naam || '. Kies er één in Layouts en printers.'
3305
+ ELSE 'Maak of activeer een ' || v_naam || 'layout in Layouts en printers en maak deze standaard.' END);
3306
+ END IF;
3307
+
3308
+ RETURN jsonb_build_object('ok', true, 'layout_id', v_l.id, 'bron', v_bron, 'documenttype', v_type,
3309
+ 'breedte_mm', v_l.breedte_mm, 'hoogte_mm', v_l.hoogte_mm, 'reden', NULL);
3310
+ END;
3311
+ $function$;
3312
+ REVOKE ALL ON FUNCTION public.layout_voor_document(uuid, text) FROM PUBLIC, anon;
3313
+ GRANT EXECUTE ON FUNCTION public.layout_voor_document(uuid, text) TO authenticated, service_role;