@flowselections/floriday-voorraad 1.0.150 → 1.0.152

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 (100) hide show
  1. package/dist-lib/components/fs-ui/DataTable.d.ts +42 -0
  2. package/dist-lib/components/fs-ui/DataTable.d.ts.map +1 -0
  3. package/dist-lib/components/fs-ui/DataTable.js +68 -0
  4. package/dist-lib/components/fs-ui/EmptyState.d.ts +9 -0
  5. package/dist-lib/components/fs-ui/EmptyState.d.ts.map +1 -0
  6. package/dist-lib/components/fs-ui/EmptyState.js +5 -0
  7. package/dist-lib/components/fs-ui/FilterChips.d.ts +13 -0
  8. package/dist-lib/components/fs-ui/FilterChips.d.ts.map +1 -0
  9. package/dist-lib/components/fs-ui/FilterChips.js +8 -0
  10. package/dist-lib/components/fs-ui/HoverTip.d.ts +15 -0
  11. package/dist-lib/components/fs-ui/HoverTip.d.ts.map +1 -0
  12. package/dist-lib/components/fs-ui/HoverTip.js +24 -0
  13. package/dist-lib/components/fs-ui/InlineAlert.d.ts +12 -0
  14. package/dist-lib/components/fs-ui/InlineAlert.d.ts.map +1 -0
  15. package/dist-lib/components/fs-ui/InlineAlert.js +15 -0
  16. package/dist-lib/components/fs-ui/KpiRow.d.ts +10 -0
  17. package/dist-lib/components/fs-ui/KpiRow.d.ts.map +1 -0
  18. package/dist-lib/components/fs-ui/KpiRow.js +8 -0
  19. package/dist-lib/components/fs-ui/KpiTile.d.ts +21 -0
  20. package/dist-lib/components/fs-ui/KpiTile.d.ts.map +1 -0
  21. package/dist-lib/components/fs-ui/KpiTile.js +40 -0
  22. package/dist-lib/components/fs-ui/MobilePrimaryAction.d.ts +13 -0
  23. package/dist-lib/components/fs-ui/MobilePrimaryAction.d.ts.map +1 -0
  24. package/dist-lib/components/fs-ui/MobilePrimaryAction.js +10 -0
  25. package/dist-lib/components/fs-ui/PageHeader.d.ts +18 -0
  26. package/dist-lib/components/fs-ui/PageHeader.d.ts.map +1 -0
  27. package/dist-lib/components/fs-ui/PageHeader.js +8 -0
  28. package/dist-lib/components/fs-ui/PillTabs.d.ts +19 -0
  29. package/dist-lib/components/fs-ui/PillTabs.d.ts.map +1 -0
  30. package/dist-lib/components/fs-ui/PillTabs.js +18 -0
  31. package/dist-lib/components/fs-ui/SearchInput.d.ts +14 -0
  32. package/dist-lib/components/fs-ui/SearchInput.d.ts.map +1 -0
  33. package/dist-lib/components/fs-ui/SearchInput.js +51 -0
  34. package/dist-lib/components/fs-ui/StatusIcon.d.ts +13 -0
  35. package/dist-lib/components/fs-ui/StatusIcon.d.ts.map +1 -0
  36. package/dist-lib/components/fs-ui/StatusIcon.js +15 -0
  37. package/dist-lib/components/fs-ui/TableSkeleton.d.ts +7 -0
  38. package/dist-lib/components/fs-ui/TableSkeleton.d.ts.map +1 -0
  39. package/dist-lib/components/fs-ui/TableSkeleton.js +6 -0
  40. package/dist-lib/components/fs-ui/Toolbar.d.ts +8 -0
  41. package/dist-lib/components/fs-ui/Toolbar.d.ts.map +1 -0
  42. package/dist-lib/components/fs-ui/Toolbar.js +5 -0
  43. package/dist-lib/components/fs-ui/UpdatedAt.d.ts +6 -0
  44. package/dist-lib/components/fs-ui/UpdatedAt.d.ts.map +1 -0
  45. package/dist-lib/components/fs-ui/UpdatedAt.js +10 -0
  46. package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts.map +1 -1
  47. package/dist-lib/components/voorraad/ArtikelCompositionCard.js +46 -15
  48. package/dist-lib/components/voorraad/ArtikelWizard.js +4 -4
  49. package/dist-lib/components/voorraad/FloridayConnectionNotice.d.ts +6 -6
  50. package/dist-lib/components/voorraad/FloridayConnectionNotice.d.ts.map +1 -1
  51. package/dist-lib/components/voorraad/FloridayConnectionNotice.js +10 -12
  52. package/dist-lib/components/voorraad/FustenPage.d.ts.map +1 -1
  53. package/dist-lib/components/voorraad/FustenPage.js +4 -2
  54. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts.map +1 -1
  55. package/dist-lib/components/voorraad/NieuwArtikelPage.js +2 -1
  56. package/dist-lib/components/voorraad/PublicatiesPage.d.ts.map +1 -1
  57. package/dist-lib/components/voorraad/PublicatiesPage.js +2 -1
  58. package/dist-lib/components/voorraad/Sneltoetsen.d.ts +14 -0
  59. package/dist-lib/components/voorraad/Sneltoetsen.d.ts.map +1 -0
  60. package/dist-lib/components/voorraad/Sneltoetsen.js +45 -0
  61. package/dist-lib/components/voorraad/StockIntegrityAlert.d.ts.map +1 -1
  62. package/dist-lib/components/voorraad/StockIntegrityAlert.js +9 -2
  63. package/dist-lib/components/voorraad/StockPushMonitor.js +2 -2
  64. package/dist-lib/components/voorraad/TelmomentButton.d.ts +5 -1
  65. package/dist-lib/components/voorraad/TelmomentButton.d.ts.map +1 -1
  66. package/dist-lib/components/voorraad/TelmomentButton.js +13 -6
  67. package/dist-lib/components/voorraad/ValidationOverviewTable.js +9 -7
  68. package/dist-lib/components/voorraad/ValidationPage.d.ts +1 -0
  69. package/dist-lib/components/voorraad/ValidationPage.d.ts.map +1 -1
  70. package/dist-lib/components/voorraad/ValidationPage.js +33 -5
  71. package/dist-lib/components/voorraad/VoorraadBeheerCard.d.ts +4 -1
  72. package/dist-lib/components/voorraad/VoorraadBeheerCard.d.ts.map +1 -1
  73. package/dist-lib/components/voorraad/VoorraadBeheerCard.js +26 -5
  74. package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
  75. package/dist-lib/components/voorraad/VoorraadPage.js +48 -34
  76. package/dist-lib/components/voorraad/VoorraadSturingCard.js +1 -1
  77. package/dist-lib/components/voorraad/artikel/ArtikelPagina.d.ts.map +1 -1
  78. package/dist-lib/components/voorraad/artikel/ArtikelPagina.js +28 -18
  79. package/dist-lib/components/voorraad/lijst/VoorraadLijstTabel.d.ts +8 -2
  80. package/dist-lib/components/voorraad/lijst/VoorraadLijstTabel.d.ts.map +1 -1
  81. package/dist-lib/components/voorraad/lijst/VoorraadLijstTabel.js +62 -27
  82. package/dist-lib/hooks/useLocalTradeItems.d.ts +14 -0
  83. package/dist-lib/hooks/useLocalTradeItems.d.ts.map +1 -1
  84. package/dist-lib/hooks/useLocalTradeItems.js +5 -3
  85. package/dist-lib/hooks/useTradeItemStock.d.ts.map +1 -1
  86. package/dist-lib/hooks/useTradeItemStock.js +6 -3
  87. package/dist-lib/hooks/useVoorraadData.d.ts.map +1 -1
  88. package/dist-lib/hooks/useVoorraadData.js +16 -8
  89. package/dist-lib/hooks/useVoorraadLijst.d.ts +10 -0
  90. package/dist-lib/hooks/useVoorraadLijst.d.ts.map +1 -1
  91. package/dist-lib/hooks/useVoorraadLijst.js +22 -4
  92. package/dist-lib/integrations/supabase/types.d.ts +59 -0
  93. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  94. package/dist-lib/lib/alle-rijen.d.ts +15 -0
  95. package/dist-lib/lib/alle-rijen.d.ts.map +1 -0
  96. package/dist-lib/lib/alle-rijen.js +17 -0
  97. package/dist-lib/lib/db-error-message.d.ts.map +1 -1
  98. package/dist-lib/lib/db-error-message.js +3 -1
  99. package/package.json +2 -1
  100. package/sql/floriday-voorraad-schema.sql +315 -39
@@ -1,5 +1,5 @@
1
- -- @flowselections/floriday-voorraad 1.0.148 – volledig schema (idempotent, geen gegevens).
2
- -- Laatste migratie: 20261104132044_b849caf0-1e96-4514-99da-94e4074d56b0.sql
1
+ -- @flowselections/floriday-voorraad 1.0.151 – volledig schema (idempotent, geen gegevens).
2
+ -- Laatste migratie: 20261104151458_f69413fa-b317-46e8-866e-041ed860baac.sql
3
3
  -- Gegenereerd uit de database met scripts/generate-voorraad-schema.py. Niet met de hand wijzigen.
4
4
  -- Volgorde 20. Ontbrekende tabellen van andere modules worden overgeslagen met een NOTICE; draai opnieuw na die module.
5
5
  -- De statuscontrole van floriday_continuous_stock_queue is van Voorraad en wordt hier opnieuw gemaakt.
@@ -10671,6 +10671,45 @@ END $function$
10671
10671
  REVOKE ALL ON FUNCTION voorraad_gateway_routes_check() FROM PUBLIC;
10672
10672
  REVOKE ALL ON FUNCTION voorraad_gateway_routes_check() FROM anon;
10673
10673
  GRANT EXECUTE ON FUNCTION voorraad_gateway_routes_check() TO service_role;
10674
+ CREATE OR REPLACE FUNCTION public.voorraad_groep_volgorde_opslaan(p_group_id uuid, p_oud jsonb, p_nieuw jsonb)
10675
+ RETURNS jsonb
10676
+ LANGUAGE plpgsql
10677
+ SECURITY DEFINER
10678
+ SET search_path TO 'public'
10679
+ AS $function$
10680
+ DECLARE v_huidig uuid[]; v_oud uuid[]; v_nieuw uuid[];
10681
+ BEGIN
10682
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_groep_volgorde_opslaan');
10683
+ IF NOT public.voorraad_can_write() THEN
10684
+ RAISE EXCEPTION 'Je hebt geen rechten om de volgorde te wijzigen.' USING ERRCODE = '42501';
10685
+ END IF;
10686
+ IF jsonb_typeof(p_oud) <> 'array' OR jsonb_typeof(p_nieuw) <> 'array' THEN
10687
+ RAISE EXCEPTION 'Volgorde ontbreekt.' USING ERRCODE = '22023';
10688
+ END IF;
10689
+ SELECT array_agg(x::uuid ORDER BY o) INTO v_oud FROM jsonb_array_elements_text(p_oud) WITH ORDINALITY e(x, o);
10690
+ SELECT array_agg(x::uuid ORDER BY o) INTO v_nieuw FROM jsonb_array_elements_text(p_nieuw) WITH ORDINALITY e(x, o);
10691
+ PERFORM 1 FROM public.product_group_items WHERE product_group_id = p_group_id FOR UPDATE;
10692
+ SELECT array_agg(i.id ORDER BY i.sort_order NULLS LAST, i.created_at, i.id) INTO v_huidig
10693
+ FROM public.product_group_items i WHERE i.product_group_id = p_group_id;
10694
+ IF v_huidig IS DISTINCT FROM v_oud THEN
10695
+ RETURN jsonb_build_object('ok', false, 'conflict', true,
10696
+ 'melding', 'Iemand anders heeft de volgorde intussen gewijzigd. Er is niets opgeslagen.',
10697
+ 'huidig', to_jsonb(COALESCE(v_huidig, '{}'::uuid[])));
10698
+ END IF;
10699
+ IF cardinality(v_nieuw) <> cardinality(v_huidig)
10700
+ OR EXISTS (SELECT unnest(v_huidig) EXCEPT SELECT unnest(v_nieuw)) THEN
10701
+ RAISE EXCEPTION 'De nieuwe volgorde past niet bij de leden van deze groep.' USING ERRCODE = '22023';
10702
+ END IF;
10703
+ UPDATE public.product_group_items i SET sort_order = n.o - 1
10704
+ FROM unnest(v_nieuw) WITH ORDINALITY n(id, o)
10705
+ WHERE i.id = n.id AND i.product_group_id = p_group_id AND i.sort_order IS DISTINCT FROM (n.o - 1)::int;
10706
+ RETURN jsonb_build_object('ok', true);
10707
+ END $function$
10708
+ ;
10709
+ REVOKE ALL ON FUNCTION voorraad_groep_volgorde_opslaan(uuid,jsonb,jsonb) FROM PUBLIC;
10710
+ REVOKE ALL ON FUNCTION voorraad_groep_volgorde_opslaan(uuid,jsonb,jsonb) FROM anon;
10711
+ GRANT EXECUTE ON FUNCTION voorraad_groep_volgorde_opslaan(uuid,jsonb,jsonb) TO authenticated;
10712
+ GRANT EXECUTE ON FUNCTION voorraad_groep_volgorde_opslaan(uuid,jsonb,jsonb) TO service_role;
10674
10713
  CREATE OR REPLACE FUNCTION public.voorraad_hook_base_url()
10675
10714
  RETURNS text
10676
10715
  LANGUAGE plpgsql
@@ -10788,7 +10827,7 @@ CREATE OR REPLACE FUNCTION public.voorraad_install_check()
10788
10827
  STABLE SECURITY DEFINER
10789
10828
  SET search_path TO 'public'
10790
10829
  AS $function$
10791
- DECLARE v_f text[] := ARRAY['voorraad_floriday_versieronde_geslaagd','voorraad_is_beheerder','voorraad_floriday_versieronde_volgende','voorraad_floriday_versieronde_portie','run_floriday_versieronde','voorraad_floriday_versieronde_inplannen','voorraad_floriday_versieronde_melding','voorraad_floriday_versieronde_status','voorraad_floriday_product_van','voorraad_floriday_vervallen_verwerken','voorraad_floriday_versies_vastleggen','voorraad_fust_historisch_vervallen','voorraad_correctie_1148','voorraad_instellingen_lezen','voorraad_twijfel_nieuw_artikel','voorraad_eigen_velden_opslaan','voorraad_traysticker_opslaan','voorraad_floriday_volgt','voorraad_artikel_archiveren','voorraad_orders_gearchiveerd','voorraad_twijfel_kiezen','voorraad_twijfel_lijst','voorraad_voorraad_instellingen_opslaan','voorraad_artikel_detail','voorraad_artikel_opslaan','voorraad_voorraad_corrigeren','voorraad_lijst','voorraad_floriday_artikelen_aanmaken','voorraad_floriday_artikelen_vangnet','voorraad_orderregel_trade_item','voorraad_orderregel_trade_item_bron','voorraad_correctie_1144','voorraad_telmoment_lijst','voorraad_telmoment_opslaan','voorraad_order_vertrokken_voor','voorraad_fust_startmoment_opslaan','voorraad_fust_startmoment_auto','voorraad_fust_instellingen_opslaan','voorraad_koppeling_check','voorraad_instellingen_opslaan','voorraad_ensure_defaults','voorraad_defaults_check','voorraad_defaults_versie','voorraad_canoniek_artikel','voorraad_canoniek_sleutel','voorraad_artikel_prijs','voorraad_dubbele_voorraadregels','voorraad_correctie_1131','voorraad_correctie_1132','voorraad_gateway_routes_check','voorraad_placeholder_code_reason','trg_products_placeholder_code','voorraad_fust_juist','voorraad_correctie_1121','voorraad_correctie_1121_regels','voorraad_correctie_1123','voorraad_correctie_1124','voorraad_load_carriers','voorraad_packing_from_floriday','voorraad_packing_missing','voorraad_correctie_1126','voorraad_correctie_1127','trg_voorraad_link_primary_packing','voorraad_order_geannuleerd','voorraad_article_vbn','voorraad_correctie_1112','voorraad_reverse_order_mutations','voorraad_withdraw_stock_row','voorraad_floriday_klaarzetten_toegestaan','voorraad_afboeken','voorraad_voorraad_opslaan','voorraad_correctie_1140','voorraad_overzicht_orderregel_koppeling','voorraad_orderregel_sleutel','ensure_voorraad_local_context','get_stock_context','voorraad_stock_context_status','voorraad_fcsq_local_guard','_floriday_queue_cleanup_batch','_migrate_rewrite_stock_key','_stock_import_caller','apply_fust_stock_mutation','apply_stock_consumption','apply_stock_reservation','autolink_product_to_floriday','backfill_open_order_reservations','calculate_floriday_desired_stock','calculate_structure_available','canonicalize_trade_item_stock_key','check_product_structure','claim_floriday_base_supply','claim_floriday_stock_queue','cleanup_floriday_stock_queue','cleanup_voorraad_module_history','complete_floriday_base_supply','complete_floriday_stock_queue','complete_floriday_stock_queue_outcome','consume_bom_for_production','consume_order_item','drain_inventory_recompute_queue','enqueue_floriday_continuous_stock','enqueue_floriday_continuous_stock_after_warehouse_preference','enqueue_structure_recompute','ensure_inventory_recompute_drain','ensure_trade_item_stock_row','ensure_trade_item_stock_row_key','fcsq_block_disabled','fcsq_fallback_supersede','fcsq_wake_base_supply','find_trade_item_key','floriday_adopt_connection','floriday_autoheal_connections','floriday_capture_stock_snapshot','floriday_cleanup_stock_queue_v2','floriday_compact_stock_snapshots','floriday_default_owner','floriday_desired_stock_regression_check','floriday_ensure_inventory_settings','floriday_erp_leading_preview','floriday_fill_publish_horizon','floriday_follow_apply','floriday_ingest_sales_orders','floriday_leading_summary','floriday_make_erp_leading','floriday_norm_offer_forms','floriday_orphan_settings_count','floriday_publish_horizon_weeks','floriday_queue_erp_guard','floriday_queue_first_positive','floriday_recompute_inventory','floriday_relink_products','floriday_requeue_dead_letters','floriday_settings_change_recompute','floriday_settings_change_recompute_stmt','floriday_stock_change_recompute','floriday_stock_queue_supersede','floriday_takeover_apply','floriday_takeover_fetch_state','floriday_takeover_store_forms','floriday_takeover_undo','fust_negative_stock_report','fust_types_duplicate_guard','get_active_floriday_context','get_group_allocation_keys','get_group_head_key','get_product_stock','get_product_structure_totals','get_product_structure_totals_batch','inventory_inline_budget_ok','merge_products','normalize_order_source','process_inventory_recompute_queue','produce_designed_product','product_active_group_id','product_id_from_ref','product_is_set','product_label','product_member_group_ids','product_own_available','product_packings_derive','product_packings_replace','product_packings_sync_from_floriday','product_primary_pieces','product_set_depth_above','product_set_depth_below','product_structure_ancestors','product_structure_max_depth','product_structure_path','product_tray_stickers_touch','product_type','promote_trade_item_key','recompute_all_reserved_stock','recompute_order_status','recompute_reserved_for_order','recompute_reserved_stock','requeue_skipped_stock_rows','reset_stalled_floriday_stock_queue','resolve_group_allocation','resolve_group_member_stock_key','resolve_product_id_for_item','resolve_stock_trade_item_key','reverse_production','run_floriday_base_supply_process','run_floriday_continuous_stock_sync','run_floriday_follow','run_floriday_stock_queue_process','run_floriday_stock_reconcile','run_logistics_tasks_dispatch','self_heal_floriday_links','set_module_runtime_config_updated_at','set_product_bom_tenant','set_product_stock','set_updated_at_order_fust_bookings','stock_import_cleanup','stock_import_create','stock_import_process_chunk','stock_import_stop','stock_import_undo_chunk','sync_order_item_fusten','sync_products_quantity_from_stock','touch_fust_types_updated_at','trade_item_drafts_readonly','trade_item_prices_touch_updated_at','trade_item_stock_duplicates','trg_cart_numbers_sync_order_status_fn','trg_cart_session_consume_fn','trg_check_product_structure','trg_floriday_cache_relink_fn','trg_floriday_trade_items_autolink_fn','trg_order_items_autolink_fn','trg_order_items_fusten','trg_order_items_reserve_fn','trg_orders_cancel_release_fn','trg_orders_consume_on_complete_fn','trg_orders_default_phase_fn','trg_orders_external_fulfilled_fn','trg_orders_recompute_reserved_fn','trg_pgi_assign_sort_order','trg_pgi_order_taken_check','trg_process_recompute_on_commit','trg_product_packings_derive_fn','trg_products_autolink_fn','trg_products_floriday_link_enqueue','trg_products_seed_stock_fn','trg_requeue_no_warehouse_cache','trg_requeue_no_warehouse_connection','trg_requeue_no_warehouse_item_pref','trg_requeue_skipped_no_price','trg_stock_structure_recompute_ins','trg_stock_structure_recompute_upd','trg_structure_change_recompute','trg_trade_item_drafts_autolink_fn','trg_trade_item_stock_auto_bom','trg_trade_item_stock_auto_bom_reverse','trg_trade_item_stock_log_change','trg_trade_item_stock_reserve_fn','trg_trade_item_stock_zero_watch','trg_trade_items_cache_autolink_fn','update_updated_at_column','voorraad_alert_floriday_not_updated','voorraad_can_write','voorraad_cleanup_old_rows','voorraad_consume_external_fulfilled','voorraad_correctie_1098','voorraad_correctie_status','voorraad_external_fulfilled_ids','voorraad_floriday_leads_key','voorraad_fust_dimensions','voorraad_hook_base_url','voorraad_hook_on','voorraad_hook_post','voorraad_hook_switch_jobs','voorraad_install_check','voorraad_is_server','voorraad_mark_floriday_sold_before_switch','voorraad_production_enabled','voorraad_schema_ddl','voorraad_touch_updated_at','voorraad_vereis','voorraad_week_is_past'];
10830
+ DECLARE v_f text[] := ARRAY['voorraad_lijst_v2','voorraad_lijst_v2_rijen','voorraad_kpi','voorraad_validatie_pagina','voorraad_groep_volgorde_opslaan','voorraad_floriday_versieronde_geslaagd','voorraad_is_beheerder','voorraad_floriday_versieronde_volgende','voorraad_floriday_versieronde_portie','run_floriday_versieronde','voorraad_floriday_versieronde_inplannen','voorraad_floriday_versieronde_melding','voorraad_floriday_versieronde_status','voorraad_floriday_product_van','voorraad_floriday_vervallen_verwerken','voorraad_floriday_versies_vastleggen','voorraad_fust_historisch_vervallen','voorraad_correctie_1148','voorraad_instellingen_lezen','voorraad_twijfel_nieuw_artikel','voorraad_eigen_velden_opslaan','voorraad_traysticker_opslaan','voorraad_floriday_volgt','voorraad_artikel_archiveren','voorraad_orders_gearchiveerd','voorraad_twijfel_kiezen','voorraad_twijfel_lijst','voorraad_voorraad_instellingen_opslaan','voorraad_artikel_detail','voorraad_artikel_opslaan','voorraad_voorraad_corrigeren','voorraad_lijst','voorraad_floriday_artikelen_aanmaken','voorraad_floriday_artikelen_vangnet','voorraad_orderregel_trade_item','voorraad_orderregel_trade_item_bron','voorraad_correctie_1144','voorraad_telmoment_lijst','voorraad_telmoment_opslaan','voorraad_order_vertrokken_voor','voorraad_fust_startmoment_opslaan','voorraad_fust_startmoment_auto','voorraad_fust_instellingen_opslaan','voorraad_koppeling_check','voorraad_instellingen_opslaan','voorraad_ensure_defaults','voorraad_defaults_check','voorraad_defaults_versie','voorraad_canoniek_artikel','voorraad_canoniek_sleutel','voorraad_artikel_prijs','voorraad_dubbele_voorraadregels','voorraad_correctie_1131','voorraad_correctie_1132','voorraad_gateway_routes_check','voorraad_placeholder_code_reason','trg_products_placeholder_code','voorraad_fust_juist','voorraad_correctie_1121','voorraad_correctie_1121_regels','voorraad_correctie_1123','voorraad_correctie_1124','voorraad_load_carriers','voorraad_packing_from_floriday','voorraad_packing_missing','voorraad_correctie_1126','voorraad_correctie_1127','trg_voorraad_link_primary_packing','voorraad_order_geannuleerd','voorraad_article_vbn','voorraad_correctie_1112','voorraad_reverse_order_mutations','voorraad_withdraw_stock_row','voorraad_floriday_klaarzetten_toegestaan','voorraad_afboeken','voorraad_voorraad_opslaan','voorraad_correctie_1140','voorraad_overzicht_orderregel_koppeling','voorraad_orderregel_sleutel','ensure_voorraad_local_context','get_stock_context','voorraad_stock_context_status','voorraad_fcsq_local_guard','_floriday_queue_cleanup_batch','_migrate_rewrite_stock_key','_stock_import_caller','apply_fust_stock_mutation','apply_stock_consumption','apply_stock_reservation','autolink_product_to_floriday','backfill_open_order_reservations','calculate_floriday_desired_stock','calculate_structure_available','canonicalize_trade_item_stock_key','check_product_structure','claim_floriday_base_supply','claim_floriday_stock_queue','cleanup_floriday_stock_queue','cleanup_voorraad_module_history','complete_floriday_base_supply','complete_floriday_stock_queue','complete_floriday_stock_queue_outcome','consume_bom_for_production','consume_order_item','drain_inventory_recompute_queue','enqueue_floriday_continuous_stock','enqueue_floriday_continuous_stock_after_warehouse_preference','enqueue_structure_recompute','ensure_inventory_recompute_drain','ensure_trade_item_stock_row','ensure_trade_item_stock_row_key','fcsq_block_disabled','fcsq_fallback_supersede','fcsq_wake_base_supply','find_trade_item_key','floriday_adopt_connection','floriday_autoheal_connections','floriday_capture_stock_snapshot','floriday_cleanup_stock_queue_v2','floriday_compact_stock_snapshots','floriday_default_owner','floriday_desired_stock_regression_check','floriday_ensure_inventory_settings','floriday_erp_leading_preview','floriday_fill_publish_horizon','floriday_follow_apply','floriday_ingest_sales_orders','floriday_leading_summary','floriday_make_erp_leading','floriday_norm_offer_forms','floriday_orphan_settings_count','floriday_publish_horizon_weeks','floriday_queue_erp_guard','floriday_queue_first_positive','floriday_recompute_inventory','floriday_relink_products','floriday_requeue_dead_letters','floriday_settings_change_recompute','floriday_settings_change_recompute_stmt','floriday_stock_change_recompute','floriday_stock_queue_supersede','floriday_takeover_apply','floriday_takeover_fetch_state','floriday_takeover_store_forms','floriday_takeover_undo','fust_negative_stock_report','fust_types_duplicate_guard','get_active_floriday_context','get_group_allocation_keys','get_group_head_key','get_product_stock','get_product_structure_totals','get_product_structure_totals_batch','inventory_inline_budget_ok','merge_products','normalize_order_source','process_inventory_recompute_queue','produce_designed_product','product_active_group_id','product_id_from_ref','product_is_set','product_label','product_member_group_ids','product_own_available','product_packings_derive','product_packings_replace','product_packings_sync_from_floriday','product_primary_pieces','product_set_depth_above','product_set_depth_below','product_structure_ancestors','product_structure_max_depth','product_structure_path','product_tray_stickers_touch','product_type','promote_trade_item_key','recompute_all_reserved_stock','recompute_order_status','recompute_reserved_for_order','recompute_reserved_stock','requeue_skipped_stock_rows','reset_stalled_floriday_stock_queue','resolve_group_allocation','resolve_group_member_stock_key','resolve_product_id_for_item','resolve_stock_trade_item_key','reverse_production','run_floriday_base_supply_process','run_floriday_continuous_stock_sync','run_floriday_follow','run_floriday_stock_queue_process','run_floriday_stock_reconcile','run_logistics_tasks_dispatch','self_heal_floriday_links','set_module_runtime_config_updated_at','set_product_bom_tenant','set_product_stock','set_updated_at_order_fust_bookings','stock_import_cleanup','stock_import_create','stock_import_process_chunk','stock_import_stop','stock_import_undo_chunk','sync_order_item_fusten','sync_products_quantity_from_stock','touch_fust_types_updated_at','trade_item_drafts_readonly','trade_item_prices_touch_updated_at','trade_item_stock_duplicates','trg_cart_numbers_sync_order_status_fn','trg_cart_session_consume_fn','trg_check_product_structure','trg_floriday_cache_relink_fn','trg_floriday_trade_items_autolink_fn','trg_order_items_autolink_fn','trg_order_items_fusten','trg_order_items_reserve_fn','trg_orders_cancel_release_fn','trg_orders_consume_on_complete_fn','trg_orders_default_phase_fn','trg_orders_external_fulfilled_fn','trg_orders_recompute_reserved_fn','trg_pgi_assign_sort_order','trg_pgi_order_taken_check','trg_process_recompute_on_commit','trg_product_packings_derive_fn','trg_products_autolink_fn','trg_products_floriday_link_enqueue','trg_products_seed_stock_fn','trg_requeue_no_warehouse_cache','trg_requeue_no_warehouse_connection','trg_requeue_no_warehouse_item_pref','trg_requeue_skipped_no_price','trg_stock_structure_recompute_ins','trg_stock_structure_recompute_upd','trg_structure_change_recompute','trg_trade_item_drafts_autolink_fn','trg_trade_item_stock_auto_bom','trg_trade_item_stock_auto_bom_reverse','trg_trade_item_stock_log_change','trg_trade_item_stock_reserve_fn','trg_trade_item_stock_zero_watch','trg_trade_items_cache_autolink_fn','update_updated_at_column','voorraad_alert_floriday_not_updated','voorraad_can_write','voorraad_cleanup_old_rows','voorraad_consume_external_fulfilled','voorraad_correctie_1098','voorraad_correctie_status','voorraad_external_fulfilled_ids','voorraad_floriday_leads_key','voorraad_fust_dimensions','voorraad_hook_base_url','voorraad_hook_on','voorraad_hook_post','voorraad_hook_switch_jobs','voorraad_install_check','voorraad_is_server','voorraad_mark_floriday_sold_before_switch','voorraad_production_enabled','voorraad_schema_ddl','voorraad_touch_updated_at','voorraad_vereis','voorraad_week_is_past'];
10792
10831
  v_t text[] := ARRAY['trg_voorraad_link_primary_packing@products','aa0_fcsq_local_context_guard@floriday_continuous_stock_queue','aa_fcsq_erp_leading_guard@floriday_continuous_stock_queue','aa_fis_norm_offer_forms@floriday_inventory_settings','aa_pgi_assign_sort_order@product_group_items','fcsq_block_disabled@floriday_continuous_stock_queue','fcsq_wake_base_supply_ins@floriday_continuous_stock_queue','fcsq_wake_base_supply_upd@floriday_continuous_stock_queue','fust_stock_mutations_apply@fust_stock_mutations','fust_types_duplicate_guard@fust_types','fust_types_touch@fust_types','product_packings_derive_trg@product_packings','product_packings_updated_at@product_packings','set_product_bom_tenant_trigger@product_bom_items','trade_item_prices_set_updated_at@trade_item_prices','trg_cart_numbers_sync_order_status@cart_numbers','trg_cart_session_consume@cart_control_sessions','trg_check_product_structure@product_bom_items','trg_check_product_structure@product_group_items','trg_check_product_structure@product_groups','trg_fcs_queue_updated_at@floriday_continuous_stock_queue','trg_fcsq_fallback_supersede@floriday_continuous_stock_queue','trg_fcsq_supersede@floriday_continuous_stock_queue','trg_floriday_cache_relink@floriday_trade_items_cache','trg_floriday_ensure_inventory_settings@products','trg_floriday_gate_stock_queue@floriday_continuous_stock_queue','trg_floriday_settings_change_recompute_ins@floriday_inventory_settings','trg_floriday_settings_change_recompute_upd@floriday_inventory_settings','trg_floriday_stock_change_recompute@trade_item_stock','trg_floriday_takeover_runs_updated_at@floriday_takeover_runs','trg_floriday_trade_items_autolink@floriday_trade_items_cache','trg_fust_types_requeue_blocked@fust_types','trg_module_runtime_config_updated_at@module_runtime_config','trg_order_fust_bookings_updated_at@order_fust_bookings','trg_order_items_autolink@order_items','trg_order_items_fusten_aiud@order_items','trg_order_items_reserve@order_items','trg_orders_cancel_release@orders','trg_orders_consume_on_complete@orders','trg_orders_default_phase@orders','trg_orders_external_fulfilled@orders','trg_orders_recompute_reserved@orders','trg_prevent_duplicate_product_draft@trade_item_drafts','trg_product_tray_stickers_touch@product_tray_stickers','trg_products_autolink@products','trg_products_floriday_link_enqueue@products','trg_products_seed_stock@products','trg_requeue_no_warehouse_cache@floriday_trade_items_cache','trg_requeue_no_warehouse_connection@floriday_connections','trg_requeue_no_warehouse_item_pref@trade_item_warehouse_preferences','trg_requeue_skipped_no_price@products','trg_stock_mutation_alert@stock_mutation_log','trg_stock_structure_recompute_ins@trade_item_stock','trg_stock_structure_recompute_upd@trade_item_stock','trg_structure_change_recompute@product_bom_items','trg_structure_change_recompute@product_group_items','trg_structure_change_recompute@product_groups','trg_sync_layer_stock_from_trade_stock@trade_item_stock','trg_sync_products_quantity_from_stock_del@trade_item_stock','trg_sync_products_quantity_from_stock_iu@trade_item_stock','trg_trade_item_drafts_autolink@trade_item_drafts','trg_trade_item_drafts_readonly@trade_item_drafts','trg_trade_item_stock_canonical_key@trade_item_stock','trg_trade_item_stock_publish@trade_item_stock','trg_trade_item_stock_reserve@trade_item_stock','trg_trade_item_stock_updated_at@trade_item_stock','trg_trade_item_stock_zero_watch@trade_item_stock','trg_trade_item_supply_lines_touch@trade_item_supply_lines','trg_trade_item_warehouse_preference_enqueue_stock@trade_item_warehouse_preferences','trg_trade_items_cache_autolink@floriday_trade_items_cache','trg_voorraad_buffer_state_updated_at@voorraad_buffer_state','trg_voorraad_event_log_updated_at@voorraad_logistics_event_log','update_trade_item_drafts_updated_at@trade_item_drafts','update_trade_item_warehouse_preferences_updated_at@trade_item_warehouse_preferences','update_voorraad_custom_fields_updated_at@voorraad_custom_fields','update_voorraad_publish_jobs_updated_at@voorraad_publish_jobs','update_voorraad_publish_learnings_updated_at@voorraad_publish_learnings','update_voorraad_publish_steps_updated_at@voorraad_publish_steps','voorraad_hook_switch_jobs@module_runtime_config','zz_fcsq_first_positive@floriday_continuous_stock_queue'];
10793
10832
  v_p text[] := ARRAY['Authenticated can add learnings@voorraad_publish_learnings','Authenticated can delete voorraad custom fields@voorraad_custom_fields','Authenticated can insert vbn required characteristics@floriday_vbn_required_characteristics','Authenticated can insert voorraad custom fields@voorraad_custom_fields','Authenticated can read continuous stock cache@floriday_continuous_stock_cache','Authenticated can read learnings@voorraad_publish_learnings','Authenticated can read vbn required characteristics@floriday_vbn_required_characteristics','Authenticated can read voorraad custom fields@voorraad_custom_fields','Authenticated can update learnings@voorraad_publish_learnings','Authenticated can update vbn required characteristics@floriday_vbn_required_characteristics','Authenticated can update voorraad custom fields@voorraad_custom_fields','Authenticated delete trade_item_warehouse_preferences@trade_item_warehouse_preferences','Authenticated insert trade_item_warehouse_preferences@trade_item_warehouse_preferences','Authenticated select trade_item_warehouse_preferences@trade_item_warehouse_preferences','Authenticated update trade_item_warehouse_preferences@trade_item_warehouse_preferences','Eigen momentopnamen lezen@inventory_stock_snapshots','Eigen voorraadinstellingen beheren@floriday_inventory_settings','Eigenaar leest importporties@stock_import_chunks','Eigenaar leest importregels@stock_import_rows','Fust mutations delete@fust_stock_mutations','Fust mutations insert@fust_stock_mutations','Fust mutations read@fust_stock_mutations','Fust mutations update@fust_stock_mutations','Fust types delete@fust_types','Fust types insert@fust_types','Fust types read@fust_types','Fust types update@fust_types','Ingelogde gebruikers kunnen bufferstatus lezen@voorraad_buffer_state','Ingelogde gebruikers kunnen de eventlog lezen@voorraad_logistics_event_log','Ingelogde gebruikers kunnen fustboekingen lezen@order_fust_bookings','Ingelogde gebruikers lezen drempels@inventory_recompute_limits','Ingelogd mag standaardstatus lezen@voorraad_defaults_state','Ingelogde gebruikers lezen opruimlogboek@structure_cleanup_log','Ingelogde gebruikers lezen opruimruns@floriday_queue_cleanup_runs','Ingelogden beheren traystickers@product_tray_stickers','Ingelogden lezen herberekenwachtrij@inventory_recompute_queue','Ingelogden lezen voorraadmeldingen@stock_integrity_alerts','Ingelogden markeren voorraadmeldingen als gezien@stock_integrity_alerts','Own queue rows select@floriday_continuous_stock_queue','Owner delete trade_item_drafts@trade_item_drafts','Owner insert trade_item_drafts@trade_item_drafts','Owner select trade_item_drafts@trade_item_drafts','Owner update trade_item_drafts@trade_item_drafts','Signed-in users read reconcile runs@floriday_reconcile_runs','Stock delete@trade_item_stock','Stock insert@trade_item_stock','Stock read@trade_item_stock','Stock update@trade_item_stock','Synchronisatieposities lezen@floriday_sync_cursors','Users can insert own publish attempts@voorraad_publish_attempts','Users can read own publish attempts@voorraad_publish_attempts','Users can read own stock mutations@stock_mutation_log','Users manage own import runs@stock_import_runs','Users manage own supply lines@trade_item_supply_lines','Users manage own trade item prices@trade_item_prices','Users manage their own publish jobs@voorraad_publish_jobs','Users manage their own publish steps@voorraad_publish_steps','Verwerkte orders lezen@floriday_sales_order_ingest','Voorraadschrijvers lezen overnameregels@floriday_takeover_items','Voorraadschrijvers lezen overnames@floriday_takeover_runs','authenticated can insert merge log@product_merge_log','authenticated can read merge log@product_merge_log','service role only@voorraad_media_upload_failures','product_packings_read@product_packings','product_packings_write@product_packings'];
10794
10833
  v_open text[] := ARRAY['voorraad_is_server','voorraad_vereis'];
@@ -10934,6 +10973,30 @@ REVOKE ALL ON FUNCTION voorraad_koppeling_check() FROM PUBLIC;
10934
10973
  REVOKE ALL ON FUNCTION voorraad_koppeling_check() FROM anon;
10935
10974
  GRANT EXECUTE ON FUNCTION voorraad_koppeling_check() TO authenticated;
10936
10975
  GRANT EXECUTE ON FUNCTION voorraad_koppeling_check() TO service_role;
10976
+ CREATE OR REPLACE FUNCTION public.voorraad_kpi()
10977
+ RETURNS jsonb
10978
+ LANGUAGE plpgsql
10979
+ STABLE SECURITY DEFINER
10980
+ SET search_path TO 'public'
10981
+ AS $function$
10982
+ DECLARE v jsonb;
10983
+ BEGIN
10984
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_kpi');
10985
+ SELECT jsonb_build_object(
10986
+ 'artikelen', count(*),
10987
+ 'onder_minimum', count(*) FILTER (WHERE f_onder_minimum),
10988
+ 'vrij', COALESCE(sum(vrij) FILTER (WHERE soort = 'NORMAL'), 0),
10989
+ 'inkomend', COALESCE(sum(inkomend), 0),
10990
+ 'bijgewerkt', now())
10991
+ INTO v
10992
+ FROM public.voorraad_lijst_v2_rijen(NULL) WHERE gearchiveerd_at IS NULL;
10993
+ RETURN v;
10994
+ END $function$
10995
+ ;
10996
+ REVOKE ALL ON FUNCTION voorraad_kpi() FROM PUBLIC;
10997
+ REVOKE ALL ON FUNCTION voorraad_kpi() FROM anon;
10998
+ GRANT EXECUTE ON FUNCTION voorraad_kpi() TO authenticated;
10999
+ GRANT EXECUTE ON FUNCTION voorraad_kpi() TO service_role;
10937
11000
  CREATE OR REPLACE FUNCTION public.voorraad_lever_datum(p text)
10938
11001
  RETURNS date
10939
11002
  LANGUAGE plpgsql
@@ -11111,6 +11174,182 @@ REVOKE ALL ON FUNCTION voorraad_lijst(text,text,text,boolean,integer,integer) FR
11111
11174
  REVOKE ALL ON FUNCTION voorraad_lijst(text,text,text,boolean,integer,integer) FROM anon;
11112
11175
  GRANT EXECUTE ON FUNCTION voorraad_lijst(text,text,text,boolean,integer,integer) TO authenticated;
11113
11176
  GRANT EXECUTE ON FUNCTION voorraad_lijst(text,text,text,boolean,integer,integer) TO service_role;
11177
+ CREATE OR REPLACE FUNCTION public.voorraad_lijst_v2(p_zoek text DEFAULT NULL::text, p_filter text DEFAULT 'alles'::text, p_sort text DEFAULT 'naam'::text, p_oplopend boolean DEFAULT true, p_pagina integer DEFAULT 1, p_grootte integer DEFAULT 25)
11178
+ RETURNS jsonb
11179
+ LANGUAGE plpgsql
11180
+ STABLE SECURITY DEFINER
11181
+ SET search_path TO 'public'
11182
+ AS $function$
11183
+ DECLARE
11184
+ v_conn uuid; v_kop boolean; v_gr int; v_off int;
11185
+ v_tel jsonb; v_totaal int; v_rijen jsonb; v_meld jsonb; v_twijfel int; v_twijfel_rijen jsonb := '[]'::jsonb;
11186
+ BEGIN
11187
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_lijst_v2');
11188
+ IF COALESCE(p_filter,'alles') NOT IN ('alles','onder_minimum','verpakking','niet_gekoppeld','verwijderd_floriday','prijs','twijfel','gearchiveerd') THEN
11189
+ RAISE EXCEPTION 'Onbekend filter "%"', p_filter USING ERRCODE = '22023';
11190
+ END IF;
11191
+ IF COALESCE(p_sort,'naam') NOT IN ('naam','artikelnummer','liggend','gereserveerd','vrij','inkomend','prijs') THEN
11192
+ RAISE EXCEPTION 'Onbekende sortering "%"', p_sort USING ERRCODE = '22023';
11193
+ END IF;
11194
+ v_gr := LEAST(GREATEST(COALESCE(p_grootte,25),1),500);
11195
+ v_off := (GREATEST(COALESCE(p_pagina,1),1) - 1) * v_gr;
11196
+ BEGIN SELECT x.connection_id INTO v_conn FROM public.get_active_floriday_context() x LIMIT 1;
11197
+ EXCEPTION WHEN others THEN v_conn := NULL; END;
11198
+ v_kop := v_conn IS NOT NULL;
11199
+
11200
+ WITH gemarkeerd AS (SELECT * FROM public.voorraad_lijst_v2_rijen(p_zoek)
11201
+ ), tel AS (
11202
+ SELECT jsonb_build_object(
11203
+ 'alles', count(*) FILTER (WHERE gearchiveerd_at IS NULL),
11204
+ 'onder_minimum', count(*) FILTER (WHERE gearchiveerd_at IS NULL AND f_onder_minimum),
11205
+ 'verpakking', count(*) FILTER (WHERE gearchiveerd_at IS NULL AND f_verpakking),
11206
+ 'niet_gekoppeld', count(*) FILTER (WHERE gearchiveerd_at IS NULL AND f_niet_gekoppeld),
11207
+ 'verwijderd_floriday', count(*) FILTER (WHERE gearchiveerd_at IS NULL AND f_verwijderd_floriday),
11208
+ 'prijs', count(*) FILTER (WHERE gearchiveerd_at IS NULL AND f_prijs),
11209
+ 'gearchiveerd', count(*) FILTER (WHERE gearchiveerd_at IS NOT NULL),
11210
+ 'onderdelen_zonder_prijs', count(*) FILTER (WHERE gearchiveerd_at IS NULL AND is_onderdeel AND f_prijs)) AS t
11211
+ FROM gemarkeerd
11212
+ ), gefilterd AS (
11213
+ SELECT * FROM gemarkeerd g
11214
+ WHERE CASE COALESCE(p_filter,'alles')
11215
+ WHEN 'gearchiveerd' THEN g.gearchiveerd_at IS NOT NULL
11216
+ WHEN 'twijfel' THEN false
11217
+ ELSE g.gearchiveerd_at IS NULL AND CASE p_filter
11218
+ WHEN 'onder_minimum' THEN g.f_onder_minimum
11219
+ WHEN 'verpakking' THEN g.f_verpakking
11220
+ WHEN 'niet_gekoppeld' THEN g.f_niet_gekoppeld
11221
+ WHEN 'verwijderd_floriday' THEN g.f_verwijderd_floriday
11222
+ WHEN 'prijs' THEN g.f_prijs
11223
+ ELSE true END
11224
+ END
11225
+ ), pagina AS (
11226
+ SELECT * FROM gefilterd
11227
+ ORDER BY
11228
+ CASE WHEN p_oplopend AND p_sort = 'naam' THEN lower(naam) END ASC,
11229
+ CASE WHEN NOT p_oplopend AND p_sort = 'naam' THEN lower(naam) END DESC,
11230
+ CASE WHEN p_oplopend AND p_sort = 'artikelnummer' THEN lower(artikelnummer) END ASC NULLS LAST,
11231
+ CASE WHEN NOT p_oplopend AND p_sort = 'artikelnummer' THEN lower(artikelnummer) END DESC NULLS LAST,
11232
+ CASE WHEN p_sort NOT IN ('naam','artikelnummer') THEN
11233
+ (CASE p_sort WHEN 'liggend' THEN liggend WHEN 'gereserveerd' THEN gereserveerd WHEN 'vrij' THEN vrij
11234
+ WHEN 'inkomend' THEN inkomend ELSE prijs END)::numeric * CASE WHEN p_oplopend THEN 1 ELSE -1 END
11235
+ END ASC NULLS LAST,
11236
+ lower(naam), id
11237
+ LIMIT v_gr OFFSET v_off
11238
+ )
11239
+ SELECT (SELECT t FROM tel), (SELECT count(*) FROM gefilterd),
11240
+ (SELECT COALESCE(jsonb_agg(jsonb_build_object(
11241
+ 'id', pg.id, 'naam', pg.naam, 'artikelnummer', pg.artikelnummer,
11242
+ 'foto', COALESCE(NULLIF(p.image_url,''), NULLIF(p.custom_fields#>>'{floriday_payload,images,0,url}',''), NULLIF(p.custom_fields#>>'{floriday_payload,images,0,previewUrl}','')),
11243
+ 'floriday_id', pg.floriday_id,
11244
+ 'prijs', pg.prijs, 'eenheid', pg.eenheid, 'soort', pg.soort, 'is_onderdeel', pg.is_onderdeel,
11245
+ 'liggend', pg.liggend, 'gereserveerd', pg.gereserveerd, 'minimum', pg.minimum, 'inkomend', pg.inkomend, 'vrij', pg.vrij,
11246
+ 'voorraad_sleutel', pg.voorraad_sleutel, 'gearchiveerd_at', pg.gearchiveerd_at,
11247
+ 'onder_minimum', pg.f_onder_minimum,
11248
+ 'status', CASE WHEN pg.gearchiveerd_at IS NOT NULL THEN 'gearchiveerd'
11249
+ WHEN pg.f_verwijderd_floriday THEN 'verwijderd_floriday'
11250
+ WHEN pg.f_verpakking THEN 'verpakking' WHEN pg.f_niet_gekoppeld THEN 'niet_gekoppeld'
11251
+ WHEN pg.f_prijs THEN 'prijs' ELSE 'ok' END)
11252
+ ORDER BY pg.rn), '[]'::jsonb)
11253
+ FROM (SELECT pagina.*, row_number() OVER () AS rn FROM pagina) pg JOIN public.products p ON p.id = pg.id)
11254
+ INTO v_tel, v_totaal, v_rijen;
11255
+
11256
+ SELECT count(*) INTO v_twijfel FROM public.voorraad_koppel_twijfel WHERE opgelost_at IS NULL;
11257
+ IF p_filter = 'twijfel' THEN
11258
+ v_totaal := v_twijfel;
11259
+ SELECT COALESCE(jsonb_agg(jsonb_build_object('floriday_id', t.floriday_id, 'naam', t.naam, 'reden', t.reden,
11260
+ 'kandidaten', COALESCE(jsonb_array_length(CASE WHEN jsonb_typeof(t.kandidaten)='array' THEN t.kandidaten END),0),
11261
+ 'laatst_gezien', t.laatst_gezien) ORDER BY t.laatst_gezien DESC), '[]'::jsonb)
11262
+ INTO v_twijfel_rijen
11263
+ FROM (SELECT * FROM public.voorraad_koppel_twijfel WHERE opgelost_at IS NULL
11264
+ ORDER BY laatst_gezien DESC LIMIT v_gr OFFSET v_off) t;
11265
+ END IF;
11266
+
11267
+ v_meld := jsonb_build_object(
11268
+ 'telmoment_ontbreekt', NOT EXISTS (SELECT 1 FROM public.voorraad_telmoment),
11269
+ 'versieronde_mislukt', public.voorraad_floriday_versieronde_melding(),
11270
+ 'onderdelen_zonder_prijs', COALESCE((v_tel->>'onderdelen_zonder_prijs')::int, 0),
11271
+ 'orders_gearchiveerd', public.voorraad_orders_gearchiveerd(NULL));
11272
+
11273
+ RETURN jsonb_build_object('tellers', v_tel || jsonb_build_object('twijfel', v_twijfel),
11274
+ 'totaal', v_totaal, 'rijen', v_rijen, 'twijfel_rijen', v_twijfel_rijen,
11275
+ 'meldingen', v_meld, 'heeft_koppeling', v_kop, 'pagina', GREATEST(COALESCE(p_pagina,1),1), 'grootte', v_gr,
11276
+ 'bijgewerkt', now());
11277
+ END $function$
11278
+ ;
11279
+ REVOKE ALL ON FUNCTION voorraad_lijst_v2(text,text,text,boolean,integer,integer) FROM PUBLIC;
11280
+ REVOKE ALL ON FUNCTION voorraad_lijst_v2(text,text,text,boolean,integer,integer) FROM anon;
11281
+ GRANT EXECUTE ON FUNCTION voorraad_lijst_v2(text,text,text,boolean,integer,integer) TO authenticated;
11282
+ GRANT EXECUTE ON FUNCTION voorraad_lijst_v2(text,text,text,boolean,integer,integer) TO service_role;
11283
+ CREATE OR REPLACE FUNCTION public.voorraad_lijst_v2_rijen(p_zoek text DEFAULT NULL::text)
11284
+ RETURNS TABLE(id uuid, naam text, artikelnummer text, floriday_id text, prijs numeric, eenheid text, gearchiveerd_at timestamp with time zone, barcode text, floriday_verwijderd_at timestamp with time zone, liggend numeric, gereserveerd numeric, minimum numeric, inkomend numeric, voorraad_sleutel text, soort text, is_onderdeel boolean, vrij numeric, f_onder_minimum boolean, f_verpakking boolean, f_niet_gekoppeld boolean, f_verwijderd_floriday boolean, f_prijs boolean)
11285
+ LANGUAGE plpgsql
11286
+ STABLE SECURITY DEFINER
11287
+ SET search_path TO 'public'
11288
+ AS $function$
11289
+ #variable_conflict use_column
11290
+ DECLARE v_conn uuid; v_ctx uuid; v_kop boolean; v_q text;
11291
+ BEGIN
11292
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_lijst_v2_rijen');
11293
+ v_q := NULLIF(btrim(COALESCE(p_zoek,'')),'');
11294
+ BEGIN SELECT x.connection_id INTO v_conn FROM public.get_active_floriday_context() x LIMIT 1;
11295
+ EXCEPTION WHEN others THEN v_conn := NULL; END;
11296
+ v_kop := v_conn IS NOT NULL;
11297
+ BEGIN SELECT c.connection_id INTO v_ctx FROM public.get_stock_context() c LIMIT 1;
11298
+ EXCEPTION WHEN others THEN v_ctx := NULL; END;
11299
+
11300
+ RETURN QUERY
11301
+ WITH st AS (
11302
+ SELECT DISTINCT ON (x.trade_item_key) x.trade_item_key, x.physical_stock, x.reserved_stock, x.minimum_stock, x.incoming_stock
11303
+ FROM public.trade_item_stock x WHERE x.archived_at IS NULL
11304
+ ORDER BY x.trade_item_key, (x.connection_id IS NOT DISTINCT FROM v_ctx) DESC, x.updated_at DESC
11305
+ ), basis AS (
11306
+ SELECT p.id AS b_id,
11307
+ COALESCE(NULLIF(btrim(p.product),''), NULLIF(p.custom_fields#>>'{floriday_payload,name}',''), '(naamloos)') AS b_naam,
11308
+ COALESCE(NULLIF(btrim(p.article_number),''), NULLIF(p.custom_fields#>>'{floriday_payload,articleCode}','')) AS b_nr,
11309
+ NULLIF(btrim(COALESCE(p.floriday_trade_item_id,'')),'') AS b_fid,
11310
+ p.sale_price AS b_prijs, p.unit AS b_eenheid, p.gearchiveerd_at AS b_arch, p.barcode AS b_barcode, p.floriday_verwijderd_at AS b_verw,
11311
+ COALESCE(s1.physical_stock, s2.physical_stock, s3.physical_stock, 0)::numeric AS b_liggend,
11312
+ COALESCE(s1.reserved_stock, s2.reserved_stock, s3.reserved_stock, 0)::numeric AS b_gereserveerd,
11313
+ COALESCE(s1.minimum_stock, s2.minimum_stock, s3.minimum_stock, 0)::numeric AS b_minimum,
11314
+ COALESCE(s1.incoming_stock, s2.incoming_stock, s3.incoming_stock, 0)::numeric AS b_inkomend,
11315
+ COALESCE(s1.trade_item_key, s2.trade_item_key, s3.trade_item_key) AS b_sleutel,
11316
+ CASE WHEN EXISTS (SELECT 1 FROM public.product_groups g WHERE g.head_product_id = p.id AND g.is_active) THEN 'GROUP'
11317
+ WHEN EXISTS (SELECT 1 FROM public.product_bom_items b WHERE b.parent_product_id = p.id) THEN 'SET'
11318
+ ELSE 'NORMAL' END AS b_soort,
11319
+ EXISTS (SELECT 1 FROM public.product_bom_items b WHERE b.component_product_id = p.id) AS b_onderdeel,
11320
+ EXISTS (SELECT 1 FROM public.product_packings k WHERE k.product_id = p.id AND k.is_primary) AS b_verpakking,
11321
+ COALESCE((p.custom_fields#>>'{voorraad_packing_link,ok}')::boolean, true) AS b_verpakking_ok
11322
+ FROM public.products p
11323
+ LEFT JOIN st s1 ON s1.trade_item_key = NULLIF(btrim(COALESCE(p.trade_item_key,'')),'')
11324
+ LEFT JOIN st s2 ON s2.trade_item_key = NULLIF(btrim(COALESCE(p.floriday_trade_item_id,'')),'')
11325
+ LEFT JOIN st s3 ON s3.trade_item_key = 'product:' || p.id::text
11326
+ WHERE NOT EXISTS (SELECT 1 FROM public.products q
11327
+ WHERE q.id <> p.id AND NULLIF(btrim(COALESCE(q.floriday_trade_item_id,'')),'') IS NOT NULL
11328
+ AND lower(btrim(q.floriday_trade_item_id)) = lower(p.id::text))
11329
+ ), gezocht AS (
11330
+ SELECT b.*,
11331
+ CASE WHEN b.b_soort IN ('SET','GROUP') AND v_ctx IS NOT NULL
11332
+ THEN COALESCE((public.calculate_structure_available(v_ctx, b.b_id)->>'available')::numeric, 0)
11333
+ ELSE GREATEST(b.b_liggend - b.b_gereserveerd, 0) END AS b_vrij
11334
+ FROM basis b
11335
+ WHERE v_q IS NULL
11336
+ OR b.b_naam ILIKE '%' || v_q || '%' OR COALESCE(b.b_nr,'') ILIKE '%' || v_q || '%'
11337
+ OR COALESCE(b.b_barcode,'') ILIKE '%' || v_q || '%' OR COALESCE(b.b_fid,'') ILIKE v_q || '%'
11338
+ )
11339
+ SELECT g.b_id, g.b_naam, g.b_nr, g.b_fid, g.b_prijs, g.b_eenheid, g.b_arch, g.b_barcode, g.b_verw,
11340
+ g.b_liggend, g.b_gereserveerd, g.b_minimum, g.b_inkomend, g.b_sleutel, g.b_soort, g.b_onderdeel, g.b_vrij,
11341
+ (g.b_minimum > 0 AND g.b_vrij < g.b_minimum),
11342
+ (g.b_soort <> 'GROUP' AND (NOT g.b_verpakking OR NOT g.b_verpakking_ok)),
11343
+ (v_kop AND g.b_fid IS NULL AND g.b_verw IS NULL),
11344
+ (v_kop AND g.b_verw IS NOT NULL),
11345
+ (lower(btrim(COALESCE(g.b_eenheid,''))) <> 'stuks' OR g.b_prijs IS NULL OR g.b_prijs <= 0)
11346
+ FROM gezocht g;
11347
+ END $function$
11348
+ ;
11349
+ REVOKE ALL ON FUNCTION voorraad_lijst_v2_rijen(text) FROM PUBLIC;
11350
+ REVOKE ALL ON FUNCTION voorraad_lijst_v2_rijen(text) FROM anon;
11351
+ GRANT EXECUTE ON FUNCTION voorraad_lijst_v2_rijen(text) TO authenticated;
11352
+ GRANT EXECUTE ON FUNCTION voorraad_lijst_v2_rijen(text) TO service_role;
11114
11353
  CREATE OR REPLACE FUNCTION public.voorraad_load_carriers()
11115
11354
  RETURNS TABLE(code text, naam text, volgorde integer)
11116
11355
  LANGUAGE plpgsql
@@ -11942,6 +12181,41 @@ REVOKE ALL ON FUNCTION voorraad_twijfel_nieuw_artikel(text) FROM PUBLIC;
11942
12181
  REVOKE ALL ON FUNCTION voorraad_twijfel_nieuw_artikel(text) FROM anon;
11943
12182
  GRANT EXECUTE ON FUNCTION voorraad_twijfel_nieuw_artikel(text) TO authenticated;
11944
12183
  GRANT EXECUTE ON FUNCTION voorraad_twijfel_nieuw_artikel(text) TO service_role;
12184
+ CREATE OR REPLACE FUNCTION public.voorraad_validatie_pagina(p_pagina integer DEFAULT 1, p_grootte integer DEFAULT 50)
12185
+ RETURNS jsonb
12186
+ LANGUAGE plpgsql
12187
+ STABLE SECURITY DEFINER
12188
+ SET search_path TO 'public'
12189
+ AS $function$
12190
+ DECLARE v_gr int; v_off int; v_tot int; v_rijen jsonb;
12191
+ BEGIN
12192
+ PERFORM public.voorraad_vereis('ingelogd', 'voorraad_validatie_pagina');
12193
+ v_gr := LEAST(GREATEST(COALESCE(p_grootte,50),1),500);
12194
+ v_off := (GREATEST(COALESCE(p_pagina,1),1) - 1) * v_gr;
12195
+ WITH k AS (
12196
+ SELECT p.*, COALESCE(NULLIF(p.floriday_trade_item_id,''),
12197
+ CASE WHEN jsonb_typeof(p.custom_fields->'floriday_id') = 'string' THEN NULLIF(p.custom_fields->>'floriday_id','') END,
12198
+ CASE WHEN COALESCE(p.trade_item_key,'') <> '' AND p.trade_item_key NOT LIKE 'product:%' THEN p.trade_item_key END) AS fid
12199
+ FROM public.products p
12200
+ ), zonder AS (
12201
+ SELECT k.* FROM k
12202
+ WHERE k.fid IS NULL
12203
+ AND NOT EXISTS (SELECT 1 FROM k o WHERE o.fid IS NOT NULL AND o.fid <> o.id::text AND o.fid = k.id::text)
12204
+ )
12205
+ SELECT (SELECT count(*) FROM zonder),
12206
+ (SELECT COALESCE(jsonb_agg(jsonb_build_object('id', z.id, 'product', z.product, 'article_number', z.article_number,
12207
+ 'barcode', z.barcode, 'image_url', z.image_url, 'trade_item_key', z.trade_item_key,
12208
+ 'floriday_trade_item_id', z.floriday_trade_item_id, 'custom_fields', z.custom_fields,
12209
+ 'updated_at', z.updated_at, 'created_at', z.created_at) ORDER BY z.updated_at DESC, z.id), '[]'::jsonb)
12210
+ FROM (SELECT * FROM zonder ORDER BY updated_at DESC, id LIMIT v_gr OFFSET v_off) z)
12211
+ INTO v_tot, v_rijen;
12212
+ RETURN jsonb_build_object('totaal', v_tot, 'rijen', v_rijen, 'pagina', GREATEST(COALESCE(p_pagina,1),1), 'grootte', v_gr);
12213
+ END $function$
12214
+ ;
12215
+ REVOKE ALL ON FUNCTION voorraad_validatie_pagina(integer,integer) FROM PUBLIC;
12216
+ REVOKE ALL ON FUNCTION voorraad_validatie_pagina(integer,integer) FROM anon;
12217
+ GRANT EXECUTE ON FUNCTION voorraad_validatie_pagina(integer,integer) TO authenticated;
12218
+ GRANT EXECUTE ON FUNCTION voorraad_validatie_pagina(integer,integer) TO service_role;
11945
12219
  CREATE OR REPLACE FUNCTION public.voorraad_vereis(p_niveau text, p_functie text)
11946
12220
  RETURNS void
11947
12221
  LANGUAGE plpgsql
@@ -12779,9 +13053,9 @@ DROP POLICY IF EXISTS voorraad_telmoment_regels_lezen ON public.voorraad_telmome
12779
13053
  CREATE POLICY voorraad_telmoment_regels_lezen ON public.voorraad_telmoment_regels AS PERMISSIVE FOR SELECT TO authenticated USING (true);
12780
13054
 
12781
13055
  -- triggers
12782
- DO $g$ BEGIN IF to_regclass('public.cart_control_sessions') IS NULL THEN RAISE NOTICE 'Voorraad: cart_control_sessions (andere module) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_cart_session_consume AFTER UPDATE OF stock_consumed_at ON public.cart_control_sessions FOR EACH ROW EXECUTE FUNCTION trg_cart_session_consume_fn()$q$; END IF; END $g$;
12783
- DO $g$ BEGIN IF to_regclass('public.cart_numbers') IS NULL THEN RAISE NOTICE 'Voorraad: cart_numbers (andere module) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_cart_numbers_sync_order_status AFTER INSERT OR DELETE OR UPDATE OF status ON public.cart_numbers FOR EACH ROW EXECUTE FUNCTION trg_cart_numbers_sync_order_status_fn()$q$; END IF; END $g$;
12784
- DO $g$ BEGIN IF to_regclass('public.floriday_connections') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_connections (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_requeue_no_warehouse_connection AFTER UPDATE OF preferred_warehouse_id ON public.floriday_connections FOR EACH ROW EXECUTE FUNCTION trg_requeue_no_warehouse_connection()$q$; END IF; END $g$;
13056
+ DO $g$ BEGIN IF to_regclass('public.cart_control_sessions') IS NULL THEN RAISE NOTICE 'Voorraad: cart_control_sessions (andere module) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_cart_session_consume ON public.cart_control_sessions$q$; EXECUTE $q$CREATE TRIGGER trg_cart_session_consume AFTER UPDATE OF stock_consumed_at ON public.cart_control_sessions FOR EACH ROW EXECUTE FUNCTION trg_cart_session_consume_fn()$q$; END IF; END $g$;
13057
+ DO $g$ BEGIN IF to_regclass('public.cart_numbers') IS NULL THEN RAISE NOTICE 'Voorraad: cart_numbers (andere module) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_cart_numbers_sync_order_status ON public.cart_numbers$q$; EXECUTE $q$CREATE TRIGGER trg_cart_numbers_sync_order_status AFTER INSERT OR DELETE OR UPDATE OF status ON public.cart_numbers FOR EACH ROW EXECUTE FUNCTION trg_cart_numbers_sync_order_status_fn()$q$; END IF; END $g$;
13058
+ DO $g$ BEGIN IF to_regclass('public.floriday_connections') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_connections (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_requeue_no_warehouse_connection ON public.floriday_connections$q$; EXECUTE $q$CREATE TRIGGER trg_requeue_no_warehouse_connection AFTER UPDATE OF preferred_warehouse_id ON public.floriday_connections FOR EACH ROW EXECUTE FUNCTION trg_requeue_no_warehouse_connection()$q$; END IF; END $g$;
12785
13059
  DROP TRIGGER IF EXISTS aa0_fcsq_local_context_guard ON public.floriday_continuous_stock_queue;
12786
13060
  CREATE TRIGGER aa0_fcsq_local_context_guard BEFORE INSERT ON public.floriday_continuous_stock_queue FOR EACH ROW EXECUTE FUNCTION voorraad_fcsq_local_guard();
12787
13061
  DROP TRIGGER IF EXISTS aa_fcsq_erp_leading_guard ON public.floriday_continuous_stock_queue;
@@ -12810,10 +13084,10 @@ DROP TRIGGER IF EXISTS trg_floriday_settings_change_recompute_upd ON public.flor
12810
13084
  CREATE TRIGGER trg_floriday_settings_change_recompute_upd AFTER UPDATE ON public.floriday_inventory_settings REFERENCING OLD TABLE AS old_rows NEW TABLE AS new_rows FOR EACH STATEMENT EXECUTE FUNCTION floriday_settings_change_recompute_stmt();
12811
13085
  DROP TRIGGER IF EXISTS trg_floriday_takeover_runs_updated_at ON public.floriday_takeover_runs;
12812
13086
  CREATE TRIGGER trg_floriday_takeover_runs_updated_at BEFORE UPDATE ON public.floriday_takeover_runs FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
12813
- DO $g$ BEGIN IF to_regclass('public.floriday_trade_items_cache') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_trade_items_cache (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_floriday_cache_relink AFTER INSERT OR UPDATE ON public.floriday_trade_items_cache FOR EACH STATEMENT EXECUTE FUNCTION trg_floriday_cache_relink_fn()$q$; END IF; END $g$;
12814
- DO $g$ BEGIN IF to_regclass('public.floriday_trade_items_cache') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_trade_items_cache (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_floriday_trade_items_autolink AFTER INSERT OR UPDATE ON public.floriday_trade_items_cache FOR EACH ROW EXECUTE FUNCTION trg_floriday_trade_items_autolink_fn()$q$; END IF; END $g$;
12815
- DO $g$ BEGIN IF to_regclass('public.floriday_trade_items_cache') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_trade_items_cache (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_requeue_no_warehouse_cache AFTER INSERT OR UPDATE OF data ON public.floriday_trade_items_cache FOR EACH ROW EXECUTE FUNCTION trg_requeue_no_warehouse_cache()$q$; END IF; END $g$;
12816
- DO $g$ BEGIN IF to_regclass('public.floriday_trade_items_cache') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_trade_items_cache (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_trade_items_cache_autolink AFTER INSERT OR UPDATE OF data, is_deleted ON public.floriday_trade_items_cache FOR EACH ROW EXECUTE FUNCTION trg_trade_items_cache_autolink_fn()$q$; END IF; END $g$;
13087
+ DO $g$ BEGIN IF to_regclass('public.floriday_trade_items_cache') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_trade_items_cache (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_floriday_cache_relink ON public.floriday_trade_items_cache$q$; EXECUTE $q$CREATE TRIGGER trg_floriday_cache_relink AFTER INSERT OR UPDATE ON public.floriday_trade_items_cache FOR EACH STATEMENT EXECUTE FUNCTION trg_floriday_cache_relink_fn()$q$; END IF; END $g$;
13088
+ DO $g$ BEGIN IF to_regclass('public.floriday_trade_items_cache') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_trade_items_cache (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_floriday_trade_items_autolink ON public.floriday_trade_items_cache$q$; EXECUTE $q$CREATE TRIGGER trg_floriday_trade_items_autolink AFTER INSERT OR UPDATE ON public.floriday_trade_items_cache FOR EACH ROW EXECUTE FUNCTION trg_floriday_trade_items_autolink_fn()$q$; END IF; END $g$;
13089
+ DO $g$ BEGIN IF to_regclass('public.floriday_trade_items_cache') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_trade_items_cache (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_requeue_no_warehouse_cache ON public.floriday_trade_items_cache$q$; EXECUTE $q$CREATE TRIGGER trg_requeue_no_warehouse_cache AFTER INSERT OR UPDATE OF data ON public.floriday_trade_items_cache FOR EACH ROW EXECUTE FUNCTION trg_requeue_no_warehouse_cache()$q$; END IF; END $g$;
13090
+ DO $g$ BEGIN IF to_regclass('public.floriday_trade_items_cache') IS NULL THEN RAISE NOTICE 'Voorraad: floriday_trade_items_cache (Floriday-auth) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_trade_items_cache_autolink ON public.floriday_trade_items_cache$q$; EXECUTE $q$CREATE TRIGGER trg_trade_items_cache_autolink AFTER INSERT OR UPDATE OF data, is_deleted ON public.floriday_trade_items_cache FOR EACH ROW EXECUTE FUNCTION trg_trade_items_cache_autolink_fn()$q$; END IF; END $g$;
12817
13091
  DROP TRIGGER IF EXISTS fust_stock_mutations_apply ON public.fust_stock_mutations;
12818
13092
  CREATE TRIGGER fust_stock_mutations_apply AFTER INSERT ON public.fust_stock_mutations FOR EACH ROW EXECUTE FUNCTION apply_fust_stock_mutation();
12819
13093
  DROP TRIGGER IF EXISTS fust_types_duplicate_guard ON public.fust_types;
@@ -12822,44 +13096,45 @@ DROP TRIGGER IF EXISTS fust_types_touch ON public.fust_types;
12822
13096
  CREATE TRIGGER fust_types_touch BEFORE UPDATE ON public.fust_types FOR EACH ROW EXECUTE FUNCTION touch_fust_types_updated_at();
12823
13097
  DROP TRIGGER IF EXISTS trg_fust_types_requeue_blocked ON public.fust_types;
12824
13098
  CREATE TRIGGER trg_fust_types_requeue_blocked AFTER UPDATE OF in_use ON public.fust_types FOR EACH ROW EXECUTE FUNCTION logistics_requeue_blocked_on_setting_change();
13099
+ DROP TRIGGER IF EXISTS trg_process_recompute_on_commit ON public.inventory_recompute_queue;
12825
13100
  CREATE CONSTRAINT TRIGGER trg_process_recompute_on_commit AFTER INSERT OR UPDATE OF enqueued_at ON public.inventory_recompute_queue DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION trg_process_recompute_on_commit();
12826
- DO $g$ BEGIN IF to_regclass('public.module_runtime_config') IS NULL THEN RAISE NOTICE 'Voorraad: module_runtime_config (andere module) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_module_runtime_config_updated_at BEFORE UPDATE ON public.module_runtime_config FOR EACH ROW EXECUTE FUNCTION set_module_runtime_config_updated_at()$q$; END IF; END $g$;
12827
- DO $g$ BEGIN IF to_regclass('public.module_runtime_config') IS NULL THEN RAISE NOTICE 'Voorraad: module_runtime_config (andere module) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER voorraad_hook_switch_jobs AFTER INSERT OR UPDATE OF value ON public.module_runtime_config FOR EACH ROW WHEN ((new.key ~~ 'voorraad_hook_enabled.%'::text)) EXECUTE FUNCTION voorraad_hook_switch_jobs()$q$; END IF; END $g$;
13101
+ DO $g$ BEGIN IF to_regclass('public.module_runtime_config') IS NULL THEN RAISE NOTICE 'Voorraad: module_runtime_config (andere module) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_module_runtime_config_updated_at ON public.module_runtime_config$q$; EXECUTE $q$CREATE TRIGGER trg_module_runtime_config_updated_at BEFORE UPDATE ON public.module_runtime_config FOR EACH ROW EXECUTE FUNCTION set_module_runtime_config_updated_at()$q$; END IF; END $g$;
13102
+ DO $g$ BEGIN IF to_regclass('public.module_runtime_config') IS NULL THEN RAISE NOTICE 'Voorraad: module_runtime_config (andere module) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS voorraad_hook_switch_jobs ON public.module_runtime_config$q$; EXECUTE $q$CREATE TRIGGER voorraad_hook_switch_jobs AFTER INSERT OR UPDATE OF value ON public.module_runtime_config FOR EACH ROW WHEN ((new.key ~~ 'voorraad_hook_enabled.%'::text)) EXECUTE FUNCTION voorraad_hook_switch_jobs()$q$; END IF; END $g$;
12828
13103
  DROP TRIGGER IF EXISTS trg_order_fust_bookings_updated_at ON public.order_fust_bookings;
12829
13104
  CREATE TRIGGER trg_order_fust_bookings_updated_at BEFORE UPDATE ON public.order_fust_bookings FOR EACH ROW EXECUTE FUNCTION set_updated_at_order_fust_bookings();
12830
- DO $g$ BEGIN IF to_regclass('public.order_items') IS NULL THEN RAISE NOTICE 'Voorraad: order_items (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_order_items_autolink BEFORE INSERT ON public.order_items FOR EACH ROW EXECUTE FUNCTION trg_order_items_autolink_fn()$q$; END IF; END $g$;
12831
- DO $g$ BEGIN IF to_regclass('public.order_items') IS NULL THEN RAISE NOTICE 'Voorraad: order_items (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_order_items_fusten_aid AFTER INSERT OR DELETE ON public.order_items FOR EACH ROW EXECUTE FUNCTION trg_order_items_fusten()$q$; END IF; END $g$;
12832
- DO $g$ BEGIN IF to_regclass('public.order_items') IS NULL THEN RAISE NOTICE 'Voorraad: order_items (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_order_items_fusten_au AFTER UPDATE OF quantity, product_id, plants_per_crate, quantity_crates, vbn_package_code, packing_source, quarantined_at ON public.order_items FOR EACH ROW WHEN (((old.quantity IS DISTINCT FROM new.quantity) OR (old.product_id IS DISTINCT FROM new.product_id) OR (old.plants_per_crate IS DISTINCT FROM new.plants_per_crate) OR (old.quantity_crates IS DISTINCT FROM new.quantity_crates) OR (old.vbn_package_code IS DISTINCT FROM new.vbn_package_code) OR (old.packing_source IS DISTINCT FROM new.packing_source) OR ((old.quarantined_at IS NULL) IS DISTINCT FROM (new.quarantined_at IS NULL)))) EXECUTE FUNCTION trg_order_items_fusten()$q$; END IF; END $g$;
12833
- DO $g$ BEGIN IF to_regclass('public.order_items') IS NULL THEN RAISE NOTICE 'Voorraad: order_items (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_order_items_reserve AFTER INSERT OR DELETE OR UPDATE OF quantity, product_id, order_id, quarantined_at, source_line_key ON public.order_items FOR EACH ROW EXECUTE FUNCTION trg_order_items_reserve_fn()$q$; END IF; END $g$;
12834
- DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_orders_cancel_release AFTER UPDATE OF status ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_cancel_release_fn()$q$; END IF; END $g$;
12835
- DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_orders_consume_on_complete AFTER UPDATE OF status ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_consume_on_complete_fn()$q$; END IF; END $g$;
12836
- DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_orders_default_phase BEFORE INSERT ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_default_phase_fn()$q$; END IF; END $g$;
12837
- DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_orders_external_fulfilled AFTER UPDATE OF custom_fields ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_external_fulfilled_fn()$q$; END IF; END $g$;
12838
- DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_orders_fusten_au AFTER UPDATE OF status, cancelled_at, deleted_at ON public.orders FOR EACH ROW WHEN (((old.status IS DISTINCT FROM new.status) OR (old.cancelled_at IS DISTINCT FROM new.cancelled_at) OR (old.deleted_at IS DISTINCT FROM new.deleted_at))) EXECUTE FUNCTION trg_orders_fusten()$q$; END IF; END $g$;
12839
- DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_orders_recompute_reserved AFTER DELETE OR UPDATE ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_recompute_reserved_fn()$q$; END IF; END $g$;
12840
- DO $g$ BEGIN IF to_regclass('public.product_bom_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_bom_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER set_product_bom_tenant_trigger BEFORE INSERT ON public.product_bom_items FOR EACH ROW EXECUTE FUNCTION set_product_bom_tenant()$q$; END IF; END $g$;
12841
- DO $g$ BEGIN IF to_regclass('public.product_bom_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_bom_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_check_product_structure BEFORE INSERT OR UPDATE ON public.product_bom_items FOR EACH ROW EXECUTE FUNCTION trg_check_product_structure()$q$; END IF; END $g$;
12842
- DO $g$ BEGIN IF to_regclass('public.product_bom_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_bom_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_structure_change_recompute AFTER INSERT OR DELETE OR UPDATE ON public.product_bom_items FOR EACH ROW EXECUTE FUNCTION trg_structure_change_recompute()$q$; END IF; END $g$;
12843
- DO $g$ BEGIN IF to_regclass('public.product_group_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_group_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE CONSTRAINT TRIGGER "AA_pgi_order_taken_check" AFTER INSERT OR UPDATE OF sort_order, product_group_id ON public.product_group_items DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION trg_pgi_order_taken_check()$q$; END IF; END $g$;
12844
- DO $g$ BEGIN IF to_regclass('public.product_group_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_group_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER aa_pgi_assign_sort_order BEFORE INSERT ON public.product_group_items FOR EACH ROW EXECUTE FUNCTION trg_pgi_assign_sort_order()$q$; END IF; END $g$;
12845
- DO $g$ BEGIN IF to_regclass('public.product_group_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_group_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_check_product_structure BEFORE INSERT OR UPDATE ON public.product_group_items FOR EACH ROW EXECUTE FUNCTION trg_check_product_structure()$q$; END IF; END $g$;
12846
- DO $g$ BEGIN IF to_regclass('public.product_group_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_group_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_structure_change_recompute AFTER INSERT OR DELETE OR UPDATE ON public.product_group_items FOR EACH ROW EXECUTE FUNCTION trg_structure_change_recompute()$q$; END IF; END $g$;
12847
- DO $g$ BEGIN IF to_regclass('public.product_groups') IS NULL THEN RAISE NOTICE 'Voorraad: product_groups (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_check_product_structure BEFORE INSERT OR UPDATE ON public.product_groups FOR EACH ROW EXECUTE FUNCTION trg_check_product_structure()$q$; END IF; END $g$;
12848
- DO $g$ BEGIN IF to_regclass('public.product_groups') IS NULL THEN RAISE NOTICE 'Voorraad: product_groups (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_structure_change_recompute AFTER INSERT OR DELETE OR UPDATE OF is_active, head_product_id, head_trade_item_floriday_id ON public.product_groups FOR EACH ROW EXECUTE FUNCTION trg_structure_change_recompute()$q$; END IF; END $g$;
13105
+ DO $g$ BEGIN IF to_regclass('public.order_items') IS NULL THEN RAISE NOTICE 'Voorraad: order_items (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_order_items_autolink ON public.order_items$q$; EXECUTE $q$CREATE TRIGGER trg_order_items_autolink BEFORE INSERT ON public.order_items FOR EACH ROW EXECUTE FUNCTION trg_order_items_autolink_fn()$q$; END IF; END $g$;
13106
+ DO $g$ BEGIN IF to_regclass('public.order_items') IS NULL THEN RAISE NOTICE 'Voorraad: order_items (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_order_items_fusten_aid ON public.order_items$q$; EXECUTE $q$CREATE TRIGGER trg_order_items_fusten_aid AFTER INSERT OR DELETE ON public.order_items FOR EACH ROW EXECUTE FUNCTION trg_order_items_fusten()$q$; END IF; END $g$;
13107
+ DO $g$ BEGIN IF to_regclass('public.order_items') IS NULL THEN RAISE NOTICE 'Voorraad: order_items (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_order_items_fusten_au ON public.order_items$q$; EXECUTE $q$CREATE TRIGGER trg_order_items_fusten_au AFTER UPDATE OF quantity, product_id, plants_per_crate, quantity_crates, vbn_package_code, packing_source, quarantined_at ON public.order_items FOR EACH ROW WHEN (((old.quantity IS DISTINCT FROM new.quantity) OR (old.product_id IS DISTINCT FROM new.product_id) OR (old.plants_per_crate IS DISTINCT FROM new.plants_per_crate) OR (old.quantity_crates IS DISTINCT FROM new.quantity_crates) OR (old.vbn_package_code IS DISTINCT FROM new.vbn_package_code) OR (old.packing_source IS DISTINCT FROM new.packing_source) OR ((old.quarantined_at IS NULL) IS DISTINCT FROM (new.quarantined_at IS NULL)))) EXECUTE FUNCTION trg_order_items_fusten()$q$; END IF; END $g$;
13108
+ DO $g$ BEGIN IF to_regclass('public.order_items') IS NULL THEN RAISE NOTICE 'Voorraad: order_items (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_order_items_reserve ON public.order_items$q$; EXECUTE $q$CREATE TRIGGER trg_order_items_reserve AFTER INSERT OR DELETE OR UPDATE OF quantity, product_id, order_id, quarantined_at, source_line_key ON public.order_items FOR EACH ROW EXECUTE FUNCTION trg_order_items_reserve_fn()$q$; END IF; END $g$;
13109
+ DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_orders_cancel_release ON public.orders$q$; EXECUTE $q$CREATE TRIGGER trg_orders_cancel_release AFTER UPDATE OF status ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_cancel_release_fn()$q$; END IF; END $g$;
13110
+ DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_orders_consume_on_complete ON public.orders$q$; EXECUTE $q$CREATE TRIGGER trg_orders_consume_on_complete AFTER UPDATE OF status ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_consume_on_complete_fn()$q$; END IF; END $g$;
13111
+ DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_orders_default_phase ON public.orders$q$; EXECUTE $q$CREATE TRIGGER trg_orders_default_phase BEFORE INSERT ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_default_phase_fn()$q$; END IF; END $g$;
13112
+ DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_orders_external_fulfilled ON public.orders$q$; EXECUTE $q$CREATE TRIGGER trg_orders_external_fulfilled AFTER UPDATE OF custom_fields ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_external_fulfilled_fn()$q$; END IF; END $g$;
13113
+ DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_orders_fusten_au ON public.orders$q$; EXECUTE $q$CREATE TRIGGER trg_orders_fusten_au AFTER UPDATE OF status, cancelled_at, deleted_at ON public.orders FOR EACH ROW WHEN (((old.status IS DISTINCT FROM new.status) OR (old.cancelled_at IS DISTINCT FROM new.cancelled_at) OR (old.deleted_at IS DISTINCT FROM new.deleted_at))) EXECUTE FUNCTION trg_orders_fusten()$q$; END IF; END $g$;
13114
+ DO $g$ BEGIN IF to_regclass('public.orders') IS NULL THEN RAISE NOTICE 'Voorraad: orders (Verkoop) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_orders_recompute_reserved ON public.orders$q$; EXECUTE $q$CREATE TRIGGER trg_orders_recompute_reserved AFTER DELETE OR UPDATE ON public.orders FOR EACH ROW EXECUTE FUNCTION trg_orders_recompute_reserved_fn()$q$; END IF; END $g$;
13115
+ DO $g$ BEGIN IF to_regclass('public.product_bom_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_bom_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS set_product_bom_tenant_trigger ON public.product_bom_items$q$; EXECUTE $q$CREATE TRIGGER set_product_bom_tenant_trigger BEFORE INSERT ON public.product_bom_items FOR EACH ROW EXECUTE FUNCTION set_product_bom_tenant()$q$; END IF; END $g$;
13116
+ DO $g$ BEGIN IF to_regclass('public.product_bom_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_bom_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_check_product_structure ON public.product_bom_items$q$; EXECUTE $q$CREATE TRIGGER trg_check_product_structure BEFORE INSERT OR UPDATE ON public.product_bom_items FOR EACH ROW EXECUTE FUNCTION trg_check_product_structure()$q$; END IF; END $g$;
13117
+ DO $g$ BEGIN IF to_regclass('public.product_bom_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_bom_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_structure_change_recompute ON public.product_bom_items$q$; EXECUTE $q$CREATE TRIGGER trg_structure_change_recompute AFTER INSERT OR DELETE OR UPDATE ON public.product_bom_items FOR EACH ROW EXECUTE FUNCTION trg_structure_change_recompute()$q$; END IF; END $g$;
13118
+ DO $g$ BEGIN IF to_regclass('public.product_group_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_group_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS "AA_pgi_order_taken_check" ON public.product_group_items$q$; EXECUTE $q$CREATE CONSTRAINT TRIGGER "AA_pgi_order_taken_check" AFTER INSERT OR UPDATE OF sort_order, product_group_id ON public.product_group_items DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION trg_pgi_order_taken_check()$q$; END IF; END $g$;
13119
+ DO $g$ BEGIN IF to_regclass('public.product_group_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_group_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS aa_pgi_assign_sort_order ON public.product_group_items$q$; EXECUTE $q$CREATE TRIGGER aa_pgi_assign_sort_order BEFORE INSERT ON public.product_group_items FOR EACH ROW EXECUTE FUNCTION trg_pgi_assign_sort_order()$q$; END IF; END $g$;
13120
+ DO $g$ BEGIN IF to_regclass('public.product_group_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_group_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_check_product_structure ON public.product_group_items$q$; EXECUTE $q$CREATE TRIGGER trg_check_product_structure BEFORE INSERT OR UPDATE ON public.product_group_items FOR EACH ROW EXECUTE FUNCTION trg_check_product_structure()$q$; END IF; END $g$;
13121
+ DO $g$ BEGIN IF to_regclass('public.product_group_items') IS NULL THEN RAISE NOTICE 'Voorraad: product_group_items (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_structure_change_recompute ON public.product_group_items$q$; EXECUTE $q$CREATE TRIGGER trg_structure_change_recompute AFTER INSERT OR DELETE OR UPDATE ON public.product_group_items FOR EACH ROW EXECUTE FUNCTION trg_structure_change_recompute()$q$; END IF; END $g$;
13122
+ DO $g$ BEGIN IF to_regclass('public.product_groups') IS NULL THEN RAISE NOTICE 'Voorraad: product_groups (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_check_product_structure ON public.product_groups$q$; EXECUTE $q$CREATE TRIGGER trg_check_product_structure BEFORE INSERT OR UPDATE ON public.product_groups FOR EACH ROW EXECUTE FUNCTION trg_check_product_structure()$q$; END IF; END $g$;
13123
+ DO $g$ BEGIN IF to_regclass('public.product_groups') IS NULL THEN RAISE NOTICE 'Voorraad: product_groups (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_structure_change_recompute ON public.product_groups$q$; EXECUTE $q$CREATE TRIGGER trg_structure_change_recompute AFTER INSERT OR DELETE OR UPDATE OF is_active, head_product_id, head_trade_item_floriday_id ON public.product_groups FOR EACH ROW EXECUTE FUNCTION trg_structure_change_recompute()$q$; END IF; END $g$;
12849
13124
  DROP TRIGGER IF EXISTS product_packings_derive_trg ON public.product_packings;
12850
13125
  CREATE TRIGGER product_packings_derive_trg AFTER INSERT OR DELETE OR UPDATE ON public.product_packings FOR EACH ROW EXECUTE FUNCTION trg_product_packings_derive_fn();
12851
13126
  DROP TRIGGER IF EXISTS product_packings_updated_at ON public.product_packings;
12852
13127
  CREATE TRIGGER product_packings_updated_at BEFORE UPDATE ON public.product_packings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
12853
13128
  DROP TRIGGER IF EXISTS trg_product_tray_stickers_touch ON public.product_tray_stickers;
12854
13129
  CREATE TRIGGER trg_product_tray_stickers_touch BEFORE UPDATE ON public.product_tray_stickers FOR EACH ROW EXECUTE FUNCTION product_tray_stickers_touch();
12855
- DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_floriday_ensure_inventory_settings AFTER INSERT ON public.products FOR EACH ROW EXECUTE FUNCTION floriday_ensure_inventory_settings()$q$; END IF; END $g$;
12856
- DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_products_autolink BEFORE INSERT OR UPDATE OF product, trade_item_key ON public.products FOR EACH ROW EXECUTE FUNCTION trg_products_autolink_fn()$q$; END IF; END $g$;
12857
- DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_products_floriday_link_enqueue AFTER UPDATE ON public.products REFERENCING OLD TABLE AS old_rows NEW TABLE AS new_rows FOR EACH STATEMENT EXECUTE FUNCTION trg_products_floriday_link_enqueue()$q$; END IF; END $g$;
12858
- DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_products_floriday_velden_aangepast BEFORE UPDATE OF product, image_url, barcode ON public.products FOR EACH ROW EXECUTE FUNCTION trg_products_floriday_velden_aangepast()$q$; END IF; END $g$;
12859
- DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_products_placeholder_code BEFORE INSERT OR UPDATE OF article_number ON public.products FOR EACH ROW EXECUTE FUNCTION trg_products_placeholder_code()$q$; END IF; END $g$;
12860
- DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_products_seed_stock AFTER INSERT OR UPDATE OF trade_item_key ON public.products FOR EACH ROW EXECUTE FUNCTION trg_products_seed_stock_fn()$q$; END IF; END $g$;
12861
- DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_requeue_skipped_no_price AFTER UPDATE OF sale_price, unit ON public.products FOR EACH ROW EXECUTE FUNCTION trg_requeue_skipped_no_price()$q$; END IF; END $g$;
12862
- DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$CREATE TRIGGER trg_voorraad_link_primary_packing AFTER INSERT OR UPDATE OF floriday_trade_item_id ON public.products FOR EACH ROW EXECUTE FUNCTION trg_voorraad_link_primary_packing()$q$; END IF; END $g$;
13130
+ DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_floriday_ensure_inventory_settings ON public.products$q$; EXECUTE $q$CREATE TRIGGER trg_floriday_ensure_inventory_settings AFTER INSERT ON public.products FOR EACH ROW EXECUTE FUNCTION floriday_ensure_inventory_settings()$q$; END IF; END $g$;
13131
+ DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_products_autolink ON public.products$q$; EXECUTE $q$CREATE TRIGGER trg_products_autolink BEFORE INSERT OR UPDATE OF product, trade_item_key ON public.products FOR EACH ROW EXECUTE FUNCTION trg_products_autolink_fn()$q$; END IF; END $g$;
13132
+ DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_products_floriday_link_enqueue ON public.products$q$; EXECUTE $q$CREATE TRIGGER trg_products_floriday_link_enqueue AFTER UPDATE ON public.products REFERENCING OLD TABLE AS old_rows NEW TABLE AS new_rows FOR EACH STATEMENT EXECUTE FUNCTION trg_products_floriday_link_enqueue()$q$; END IF; END $g$;
13133
+ DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_products_floriday_velden_aangepast ON public.products$q$; EXECUTE $q$CREATE TRIGGER trg_products_floriday_velden_aangepast BEFORE UPDATE OF product, image_url, barcode ON public.products FOR EACH ROW EXECUTE FUNCTION trg_products_floriday_velden_aangepast()$q$; END IF; END $g$;
13134
+ DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_products_placeholder_code ON public.products$q$; EXECUTE $q$CREATE TRIGGER trg_products_placeholder_code BEFORE INSERT OR UPDATE OF article_number ON public.products FOR EACH ROW EXECUTE FUNCTION trg_products_placeholder_code()$q$; END IF; END $g$;
13135
+ DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_products_seed_stock ON public.products$q$; EXECUTE $q$CREATE TRIGGER trg_products_seed_stock AFTER INSERT OR UPDATE OF trade_item_key ON public.products FOR EACH ROW EXECUTE FUNCTION trg_products_seed_stock_fn()$q$; END IF; END $g$;
13136
+ DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_requeue_skipped_no_price ON public.products$q$; EXECUTE $q$CREATE TRIGGER trg_requeue_skipped_no_price AFTER UPDATE OF sale_price, unit ON public.products FOR EACH ROW EXECUTE FUNCTION trg_requeue_skipped_no_price()$q$; END IF; END $g$;
13137
+ DO $g$ BEGIN IF to_regclass('public.products') IS NULL THEN RAISE NOTICE 'Voorraad: products (core) ontbreekt, triggers overgeslagen; draai de schema-update opnieuw na die module'; ELSE EXECUTE $q$DROP TRIGGER IF EXISTS trg_voorraad_link_primary_packing ON public.products$q$; EXECUTE $q$CREATE TRIGGER trg_voorraad_link_primary_packing AFTER INSERT OR UPDATE OF floriday_trade_item_id ON public.products FOR EACH ROW EXECUTE FUNCTION trg_voorraad_link_primary_packing()$q$; END IF; END $g$;
12863
13138
  DROP TRIGGER IF EXISTS trg_stock_mutation_alert ON public.stock_mutation_log;
12864
13139
  CREATE TRIGGER trg_stock_mutation_alert AFTER INSERT ON public.stock_mutation_log FOR EACH ROW EXECUTE FUNCTION trg_stock_mutation_alert_fn();
12865
13140
  DROP TRIGGER IF EXISTS trg_prevent_duplicate_product_draft ON public.trade_item_drafts;
@@ -12886,6 +13161,7 @@ DROP TRIGGER IF EXISTS trg_sync_products_quantity_from_stock_iu ON public.trade_
12886
13161
  CREATE TRIGGER trg_sync_products_quantity_from_stock_iu AFTER INSERT OR UPDATE OF physical_stock, trade_item_key ON public.trade_item_stock FOR EACH ROW EXECUTE FUNCTION sync_products_quantity_from_stock();
12887
13162
  DROP TRIGGER IF EXISTS trg_trade_item_stock_canonical_key ON public.trade_item_stock;
12888
13163
  CREATE TRIGGER trg_trade_item_stock_canonical_key BEFORE INSERT OR UPDATE ON public.trade_item_stock FOR EACH ROW EXECUTE FUNCTION canonicalize_trade_item_stock_key();
13164
+ DROP TRIGGER IF EXISTS trg_trade_item_stock_log_change ON public.trade_item_stock;
12889
13165
  CREATE CONSTRAINT TRIGGER trg_trade_item_stock_log_change AFTER INSERT OR UPDATE ON public.trade_item_stock DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION trg_trade_item_stock_log_change();
12890
13166
  DROP TRIGGER IF EXISTS trg_trade_item_stock_publish ON public.trade_item_stock;
12891
13167
  CREATE TRIGGER trg_trade_item_stock_publish AFTER INSERT OR UPDATE OF physical_stock ON public.trade_item_stock FOR EACH ROW EXECUTE FUNCTION enqueue_floriday_continuous_stock();