-- Generated by ops/demo/build-trial-banquet.mjs. Additive demo upgrade only. begin; create or replace function public.caterium_trial_banquet_seed_v1() returns jsonb language sql immutable security definer set search_path=public,pg_temp as $fn$ select $demo$__BANQUET_JSON__$demo$::jsonb $fn$; revoke all on function public.caterium_trial_banquet_seed_v1() from public,anon,authenticated; __STATUS_FUNCTION__ create or replace function public.caterium_install_trial_banquet(p_workspace uuid) returns jsonb language plpgsql security definer set search_path=public,pg_temp as $fn$ declare v_state public.sun_app_state%rowtype; v_status jsonb; v_storage jsonb; v_seed jsonb; v_key text; v_items jsonb; v_added jsonb; v_marker jsonb; begin if auth.uid() is null or public.sun_member_role(p_workspace) is distinct from 'admin' then raise exception 'Administrator membership required'; end if; perform 1 from public.sun_workspaces where id=p_workspace for update; v_status:=public.caterium_trial_demo_status(p_workspace); if not (v_status->>'eligible')::boolean then raise exception 'Демонстрационная база доступна в пробной или собственной тестовой компании разработчика'; end if; if not (v_status->>'installed')::boolean then raise exception 'Сначала установите демонстрационную базу'; end if; if not (v_status->>'canUpgrade')::boolean then return v_status; end if; select * into v_state from public.sun_app_state where workspace_id=p_workspace for update; v_storage:=v_state.payload->'storage'; v_seed:=public.caterium_trial_banquet_seed_v1(); foreach v_key in array array['sunBoxes','sunStock'] loop v_items:=coalesce(v_storage#>array[v_key,'v'],'[]'::jsonb); if jsonb_typeof(v_items)<>'array' then raise exception 'Неверный формат каталога или склада. Данные сохранены без изменений'; end if; -- Keep every existing row byte-for-byte, including edited demo prices and balances. select coalesce(jsonb_agg(n),'[]'::jsonb) into v_added from jsonb_array_elements(v_seed->case when v_key='sunBoxes' then 'banquet' else 'stock' end) n where not exists(select 1 from jsonb_array_elements(v_items) old where old->>'id'=n->>'id'); v_storage:=v_storage||jsonb_build_object(v_key,jsonb_build_object('t','j','v',v_items||v_added)); end loop; v_marker:=(v_storage#>'{sunTrialDemoV1,v}')||jsonb_build_object('banquetVersion',1,'banquetInstalledAt',now()); v_storage:=jsonb_set(v_storage,'{sunTrialDemoV1,v}',v_marker); perform public.sun_save_app_state_v17(p_workspace,jsonb_set(v_state.payload,'{storage}',v_storage),'trial-banquet-v1',v_state.revision); insert into public.sun_platform_audit_events(actor_user_id,action,target_workspace_id,details) values(auth.uid(),'trial_demo.banquet_install',p_workspace,jsonb_build_object('version',1,'dishes',18)); return public.caterium_trial_demo_status(p_workspace); end $fn$; revoke all on function public.caterium_install_trial_banquet(uuid) from public,anon; grant execute on function public.caterium_install_trial_banquet(uuid) to authenticated; -- Both onboarding's existing trigger and the install button use this entry point. __INSTALL_FUNCTION__ notify pgrst,'reload schema'; commit;