У вас цена обновляется с внешнего источника типа 1C, если есть скидка на товар ее нужно сохранять и пересчитывать, дорабатывать выгрузку сложно?
Именно с таким кейсом пришел к нам клиент
Задача
При обновлении цены с 1С логика должна быть такой:
Товар стоил 900 рублей в 1С и на сайте.
На сайте сделали скидку 10%, товар начал стоить на сайте 810,
в 1С поставили цену на товар 700р, сайт должен сам сделать на него старую скидку 10% и новая цена должна быть 630 рублей.
Как вам такое?
Реализация
Для решения подобной задачи хорошо подходит функционал триггеров в базе данных.
Перед обновлением данных в таблице сделали с помощью ИИ триггер, он следит за изменением поля и обслуживает нужную логику.
Выложим код, возможно кому то будет полезен наш опыт.
BEGIN
DECLARE discount DECIMAL(10,4);
DECLARE new_discounted_price DECIMAL(10,2);
DECLARE has_special INT;
IF NEW.products_price <> OLD.products_price THEN
SELECT COUNT(*) INTO has_special FROM specials WHERE products_id = OLD.products_id;
IF has_special > 0 THEN
-- Получаем текущую скидку в процентах, если OLD.products_price > 0
IF OLD.products_price > 0 THEN
SELECT specials_new_products_price INTO @old_special_price FROM specials WHERE products_id = OLD.products_id;
SET discount = (OLD.products_price - @old_special_price) / OLD.products_price;
IF discount < 0 OR discount > 1 THEN
SET discount = 0; -- защита от некорректных значений
END IF;
ELSE
SET discount = 0;
END IF;
-- Рассчитываем новую цену со скидкой, применяя discount к NEW.products_price
SET new_discounted_price = ROUND(NEW.products_price * (1 - discount), 0);
-- Обновляем specials_new_products_price новой ценой со скидкой
UPDATE specials
SET specials_new_products_price = new_discounted_price
WHERE products_id = OLD.products_id;
-- Записываем в products.products_price цену из 1С (NEW.products_price)
SET NEW.products_price = NEW.products_price;
-- Обновляем products_price_sort на цену из 1С
SET NEW.products_price_sort = new_discounted_price;
ELSE
-- Если спецпредложения нет, просто обновляем products_price_sort
SET NEW.products_price_sort = NEW.products_price;
END IF;
END IF;
END
Что еще можно сделать триггером?
Еще мы делали триггеры которые следят за таблицей скидок, добавляют и удаляют товары в специальную категорию, так как скидок было много, в них нужны были фильтры и сео теги.
Если вам тоже нужно сделать подобный триггер мы будем рады его выполнить, по стоимости от 10к.
Связаться и обсудить детали можно написав в личные сообщения на форуме или написав на почту zakaz@nexoos.ru
Оплатить можно по счету от юр. лица.