💪 Написали триггер для базы данных Mysql

У вас цена обновляется с внешнего источника типа 1C, если есть скидка на товар ее нужно сохранять и пересчитывать, дорабатывать выгрузку сложно?

Именно с таким кейсом пришел к нам клиент :sweat_smile:

Задача

При обновлении цены с 1С логика должна быть такой:
Товар стоил 900 рублей в 1С и на сайте.
На сайте сделали скидку 10%, товар начал стоить на сайте 810,
в 1С поставили цену на товар 700р, сайт должен сам сделать на него старую скидку 10% и новая цена должна быть 630 рублей.

Как вам такое? :grinning:

Реализация

Для решения подобной задачи хорошо подходит функционал триггеров в базе данных.

Перед обновлением данных в таблице сделали с помощью ИИ триггер, он следит за изменением поля и обслуживает нужную логику.

Выложим код, возможно кому то будет полезен наш опыт.

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
Оплатить можно по счету от юр. лица.

1 лайк