Skip to content

Instantly share code, notes, and snippets.

@Tyralion
Last active March 24, 2017 10:33
Show Gist options
  • Save Tyralion/1f188d18b440ad55b738ff67bb426ab7 to your computer and use it in GitHub Desktop.
Save Tyralion/1f188d18b440ad55b738ff67bb426ab7 to your computer and use it in GitHub Desktop.
CREATE OR REPLACE FUNCTION item_price(
uid integer,
item items
) RETURNS numeric
AS $BODY$
DECLARE
val numeric;
fix_val numeric;
max_price numeric;
prid varchar(255);
iprice varchar(255);
i numeric;
BEGIN
max_price := 0;
-- Выбираем максимальную цену и списка цен у товара
FOR i IN (SELECT value FROM jsonb_each(item.prices)) LOOP
IF i > max_price THEN
max_price := i;
END IF;
END LOOP;
--
-- По заданным у товара критериям:
-- 1. ID-товара в 1С
-- 2. ID-номеклатурной группы
-- 3. ID-ценовой группы
-- выбираем цену из списка цен
--
SELECT prices.value, prices.fix_value, prices.price_id
INTO val, fix_val, prid
FROM prices
WHERE prices.user_id = uid AND
prices.price_rule_id IN (
item.va_item_id,
item.va_nom_group,
item.va_price_group
)
ORDER BY prices.price_type DESC
LIMIT 1;
-- Если ничего не найдено то, возвращаем максимальную цену
-- у товара (выбранную ранее)
IF NOT FOUND THEN
RETURN max_price;
ELSE
-- Если у правила цен указано фиксированная цена то, возвращаем ее
IF fix_val > 0 THEN
RETURN fix_val;
ELSE
-- иначе выбираем из списка цен у товара нужную цену...
iprice := item.prices->>prid;
-- если ничего не выбрано то, вовзращаем максимальную цену у
-- товара (выбранную ранее)
IF iprice IS NULL THEN
RETURN max_price;
ELSE
-- если выбрана базовая цена, выбран % то, вычисляем итоговую цену
RETURN (
iprice::numeric * (1 + val/100)
);
END IF;
END IF;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment