Last active
March 24, 2017 10:33
-
-
Save Tyralion/1f188d18b440ad55b738ff67bb426ab7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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