Skip to content

Instantly share code, notes, and snippets.

@Tyralion
Created January 23, 2020 06:17
Show Gist options
  • Save Tyralion/f4bf683a75dd9d78bd4d985fce6fc696 to your computer and use it in GitHub Desktop.
Save Tyralion/f4bf683a75dd9d78bd4d985fce6fc696 to your computer and use it in GitHub Desktop.
CREATE OR REPLACE FUNCTION item_price(
uid integer, -- ид клиента
item items, -- товары
markup numeric -- пользовательская наценка на товары
) RETURNS numeric
AS $BODY$
DECLARE
val numeric;
fix_val numeric;
max_price numeric;
prid varchar(255);
iprice varchar(255);
i numeric;
BEGIN
--
-- По заданным у товара критериям:
-- 1. ID-товара в 1С
-- 2. ID-номеклатурной группы
-- 3. ID-ценовой группы
-- 4. Общая цена
-- выбираем цену из списка цен
--
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_price_group,
item.va_nom_group,
''
)
ORDER BY prices.price_type DESC
LIMIT 1;
-- Если ничего не найдено то, возвращаем 0
IF NOT FOUND THEN
RETURN 0;
ELSE
-- Если у правила цен указано фиксированная цена то, возвращаем ее
-- (с учетом пользовательской наценки)
IF fix_val > 0 THEN
RETURN (fix_val * (1 + markup/100));
ELSE
-- иначе выбираем из списка цен у товара нужную цену...
iprice := item.prices->>prid;
-- если ничего не выбрано то, вовзращаем 0
IF iprice IS NULL THEN
RETURN 0;
ELSE
-- если выбрана базовая цена, выбран % то, вычисляем итоговую цену
-- (с учетом пользовательской наценки)
RETURN (
iprice::numeric * (1 + val/100 + markup/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