-- Магазин: списки и покупки. CREATE OR REPLACE FUNCTION bot.get_titles_list() RETURNS TABLE(i integer, n character varying, p bigint) LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT id_title, title, price FROM bot.titles WHERE visible = true ORDER BY price DESC; END; $$; CREATE OR REPLACE FUNCTION bot.get_donats_list() RETURNS TABLE(i integer, n character varying, p bigint) LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT id_donat, title, price FROM bot.donats WHERE visible = true ORDER BY price DESC; END; $$; CREATE OR REPLACE FUNCTION bot.buy_title(p_id_user bigint, p_id_title integer) RETURNS integer LANGUAGE plpgsql AS $$ DECLARE v_money bigint; v_price bigint; BEGIN SELECT sum(amount) INTO v_money FROM bot.money WHERE id_user = p_id_user; SELECT price INTO v_price FROM bot.titles WHERE id_title = p_id_title; IF v_money IS NULL OR v_money < v_price THEN RETURN -1; END IF; CALL bot.money_action(p_id_user, -1 * v_price, 2); UPDATE bot.de_users SET id_title = p_id_title WHERE id_user = p_id_user; RETURN 1; END; $$; CREATE OR REPLACE FUNCTION bot.buy_donat(p_id_user bigint, p_id_donat integer) RETURNS character varying LANGUAGE plpgsql AS $$ DECLARE v_money bigint; v_price bigint; v_promo varchar; BEGIN SELECT sum(amount) INTO v_money FROM bot.money WHERE id_user = p_id_user; SELECT price INTO v_price FROM bot.donats WHERE id_donat = p_id_donat; IF v_money IS NULL OR v_money < v_price THEN RETURN '-1'; END IF; CALL bot.money_action(p_id_user, -1 * v_price, 2); v_promo := md5(random()::text); INSERT INTO bot.user_donats (id_user, id_donat, promo, stat) VALUES (p_id_user, p_id_donat, v_promo, false); RETURN v_promo; END; $$;