75 lines
1.8 KiB
PL/PgSQL
75 lines
1.8 KiB
PL/PgSQL
-- Магазин: списки и покупки.
|
|
|
|
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;
|
|
$$;
|