Перейти к содержанию
Официальный форум поддержки Simpla

Бонусная система (нашёл модуль в просторах)


Рекомендуемые сообщения

 

Может сделать вот так?

            $order = $this->get_order(intval($order_id));
            
            if($order->user_id) {
            $user = $this->users->get_user(intval($order->user_id));
            if(!empty($user))
            if ($order->status_id == 3)
            $this->users->update_user($user->id, array('balance' => ($user->balance + $order->total_price * $this->settings->bonus_order / 100)));
            }
 

 

я же написал, вся ф-я close выполняется до обновления статуса заказа, толку что вы выбираете еще раз заказ в этой ф-и. нужно передавать в нее новый статус

$this->orders->close($order->id, 3); 

 

где 2 - статус новый. и меняем саму ф-ю

 

public function close($order_id)

на

public function close($order_id, $new_status) 

и дальше уже не

if ($order->status_id == 3)

 

 

а

if ($new_status == 3)
Ссылка на сообщение
Поделиться на другие сайты

 

я же написал, вся ф-я close выполняется до обновления статуса заказа, толку что вы выбираете еще раз заказ в этой ф-и. нужно передавать в нее новый статус

$this->orders->close($order->id, 3); 

 

где 2 - статус новый. и меняем саму ф-ю

 

public function close($order_id)

на

public function close($order_id, $new_status) 

и дальше уже не

if ($order->status_id == 3)

 

 

а

if ($new_status == 3)

 

Не совсем понял куда необходимо поместить код

$this->orders->close($order->id, 3); 

И теперь ошибка

 

Warning: Missing argument 2 for Orders::close(), called in OrderAdmin.php on line 82 and defined in Orders.php

 

Ругается на public function close($order_id, $new_status) 

Изменено пользователем Julius123
Ссылка на сообщение
Поделиться на другие сайты

 

Не совсем понял куда необходимо поместить код

$this->orders->close($order->id, 3); 

И теперь ошибка

 

Warning: Missing argument 2 for Orders::close(), called in OrderAdmin.php on line 82 and defined in Orders.php

 

Ругается на public function close($order_id, $new_status)

 

замените public function close($order_id, $new_status)

на

public function close($order_id, $new_status=0)

 

смотрите в OrderAdmin там есть $this->orders->close($order->id);  нужно менять на

 

$this->orders->close($order->id, СТАТУС); 

ф-я вызывается несколько раз, обратите внимание что там разные статусы

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

замените public function close($order_id, $new_status)

на

public function close($order_id, $new_status=0)

 

смотрите в OrderAdmin там есть $this->orders->close($order->id);  нужно менять на

 

$this->orders->close($order->id, СТАТУС); 

ф-я вызывается несколько раз, обратите внимание что там разные статусы

а куда тогда необходимо вставить строчку

 

$this->orders->close($order->id, 3); 
Ссылка на сообщение
Поделиться на другие сайты

 

а куда тогда необходимо вставить строчку

 

$this->orders->close($order->id, 3); 

 

издеваетесь? прочтите выше еще раз. я же написал

 

смотрите в OrderAdmin там есть $this->orders->close($order->id);  нужно менять на

 

$this->orders->close($order->id, СТАТУС); 

ф-я вызывается несколько раз, обратите внимание что там разные статусы

Ссылка на сообщение
Поделиться на другие сайты

только минус что бонусы начисляются сразу после того как списывается товар и даже получается если статус "Принят" то бонус уже начислялся. Подскажите как сделать чтобы начислялись только при статусе "Выполнен" ?

 

То, что тут насоветовали, выглядит странно по ряду причин:

1. Почему-то обсуждается статус=3 (удален) вместо статуса "Выполнен"

2. Сама идея - добавить параметр к функции close() - довольно примитивна и несет риск ошибок. Хотя бы потому, что если несколько раз менять статусы - новый на выполнен и обратно, то бонусы начислятся НЕСКОЛЬКО раз. Про это mishsnya написал в #22, но потом почему-то этот момент игнорирует.

 

Вместо изобретательства кривого велосипеда надо использовать хорошие примеры, которые, кстати говоря, перед глазами - функционал open-close.  По образцу этого функционала надо бы

1. Написать функции close_bonus и open_bonus

2. Применять их по аналогии при нужном изменении статуса рядом с функциями close и open.

Все станет просто и прозрачно.

Изменено пользователем miltonmors
Ссылка на сообщение
Поделиться на другие сайты

То, что тут насоветовали, выглядит странно по ряду причин:

1. Почему-то обсуждается статус=3 (удален) вместо статуса "Выполнен"

2. Сама идея - добавить параметр к функции close() - довольно примитивна и несет риск ошибок. Хотя бы потому, что если несколько раз менять статусы - новый на выполнен и обратно, то бонусы начислятся НЕСКОЛЬКО раз. Про это mishsnya написал в #22, но потом почему-то этот момент игнорирует.

 

Вместо изобретательства кривого велосипеда надо использовать хорошие примеры, которые, кстати говоря, перед глазами - функционал open-close.  По образцу этого функционала надо бы

1. Написать функции close_bonus и open_bonus

2. Применять их по аналогии при нужном изменении статуса рядом с функциями close и open.

Все станет просто и прозрачно.

1. У меня добавлены статусы заказа и они имею уже другой id

 

2. Вы натолкнули на нужные мысли и решил сделать с помощью функции как вы сказали.

В OderAdmin.php идет проверка на статус и если статус "Выполнен" то срабатывает функция в api/Orders.php

 

if ($order->status_id == 4) {
   $this->orders->bonus_close($order->id);
}

 

/* Начисление бонусов */
    public function bonus_close($order_id) {
        $order = $this->get_order(intval($order_id));
        
        if($order->closed) {
            /*Начисление бонусов*/
            if($order->user_id) {
            $user = $this->users->get_user(intval($order->user_id));
            if(!empty($user))
            $this->users->update_user($user->id, array('balance' => ($user->balance + $order->total_price * $this->settings->bonus_order / 100)));
            }
        }
        return $order->id;
    }

 

По поводу несколько раз менять статус заказа, то тут работает вроде как все четко. 

При статусе заказа "Выполнен" идет начисление бонусов, а если изменить статус например на "Новый" то идет списание этих бонусов т.к. списание происходит в функции public function open() когда не списывается товар.

Ссылка на сообщение
Поделиться на другие сайты

То, что тут насоветовали, выглядит странно по ряду причин:

1. Почему-то обсуждается статус=3 (удален) вместо статуса "Выполнен"

2. Сама идея - добавить параметр к функции close() - довольно примитивна и несет риск ошибок. Хотя бы потому, что если несколько раз менять статусы - новый на выполнен и обратно, то бонусы начислятся НЕСКОЛЬКО раз. Про это mishsnya написал в #22, но потом почему-то этот момент игнорирует.

 

Вместо изобретательства кривого велосипеда надо использовать хорошие примеры, которые, кстати говоря, перед глазами - функционал open-close.  По образцу этого функционала надо бы

1. Написать функции close_bonus и open_bonus

2. Применять их по аналогии при нужном изменении статуса рядом с функциями close и open.

Все станет просто и прозрачно.

Только вот не пойму как списывать бонусы при удалении заказа, учитывая что нужно списывать бонусы при удалении заказа только со статусом id==4

Ссылка на сообщение
Поделиться на другие сайты

Только вот не пойму как списывать бонусы при удалении заказа, учитывая что нужно списывать бонусы при удалении заказа только со статусом id==4

 

В Simpla стандартно, вообще говоря, НЕТ удаления заказа. Если только удаление заказа со статусом Удален.

 

Надо бы вызывать close_bonus/open_bonus  не иногда, а при ЛЮБОМ изменении статуса - Ваш вопрос решится проще и надежнее. А если хотите непременно по-своему, то обрабатывайте свое дополнительное условие. Вам ведь ранее в теме mishanya продемонстрировал, насколько этот подход сложнее и какие ошибки дает...

Ссылка на сообщение
Поделиться на другие сайты

В Simpla стандартно, вообще говоря, НЕТ удаления заказа. Если только удаление заказа со статусом Удален.

 

Надо бы вызывать close_bonus/open_bonus  не иногда, а при ЛЮБОМ изменении статуса - Ваш вопрос решится проще и надежнее. А если хотите непременно по-своему, то обрабатывайте свое дополнительное условие. Вам ведь ранее в теме mishanya продемонстрировал, насколько этот подход сложнее и какие ошибки дает...

Но опять же если списывать и начислять бонусы при КАЖДОМ изменении статусе заказа с помощью функций close_bonus/open_bonus то как быть со статусом "Новый"? В этот статус попадаю новые заказы, и списывать бонусы при нем не нужно, а если поставить статус Выполнен, а потом Новый бонусы не пишутся, + при каждом обновлении товара будет выполняться начисление или списание бонусов - с этим тоже не пойму как быть в вашем предложении. Поэтому я и оставил списание бонусов в функции которая отвечает за возвращение количества товара на склад.

Ссылка на сообщение
Поделиться на другие сайты

Но опять же если списывать и начислять бонусы при КАЖДОМ изменении статусе заказа с помощью функций close_bonus/open_bonus то как быть со статусом "Новый"? В этот статус попадаю новые заказы, и списывать бонусы при нем не нужно, а если поставить статус Выполнен, а потом Новый бонусы не пишутся, + при каждом обновлении товара будет выполняться начисление или списание бонусов - с этим тоже не пойму как быть в вашем предложении. Поэтому я и оставил списание бонусов в функции которая отвечает за возвращение количества товара на склад.

 

Ответ на Ваши многочисленные вопросы все тот же: по аналогии с open/close.

По той же аналогии в таблице заказов создать поле closed_bonus, которое использовать по аналогии, чтобы как раз следить за тем, чтобы все списывалось правильно.

Ссылка на сообщение
Поделиться на другие сайты

Ответ на Ваши многочисленные вопросы все тот же: по аналогии с open/close.

По той же аналогии в таблице заказов создать поле closed_bonus, которое использовать по аналогии, чтобы как раз следить за тем, чтобы все списывалось правильно.

 

Я сделал 2 функции как Вы посоветовали в api/Orders.php

 

    // Начисление бонусов
    public function bonus_close($order_id) {
        $order = $this->get_order(intval($order_id));
        
        if(!$order->closed_bonus) {
        // Начисляем бонусы
        if($order->user_id) {
            $user = $this->users->get_user(intval($order->user_id));
        if(!empty($user))
            $this->users->update_user($user->id, array('balance' => ($user->balance + $order->total_price * $this->settings->bonus_order / 100)));
        }
        // Меняем closed_bonus на 1
        $query = $this->db->placehold("UPDATE __orders SET closed_bonus=1", $order->id);
        $this->db->query($query);
        }
        return $order->id;
    }
    
    // Снимаем бонусы
    public function bonus_open($order_id) {
        $order = $this->get_order(intval($order_id));
        
        if($order->closed_bonus) {
            
        if($order->user_id) {
            $user = $this->users->get_user(intval($order->user_id));
        if(!empty($user))
            $this->users->update_user($user->id, array('balance' => max(0, $user->balance - $order->total_price * $this->settings->bonus_order / 100)));
        }
        // Меняем closed_bonus на 0
        $query = $this->db->placehold("UPDATE __orders SET closed_bonus=0", $order->id);
        $this->db->query($query);
        }
        return $order->id;
    }

и в OrderAdmin.php

 

// Начисляем или списываем бонусы в зависимости от стутуса
                if ($order->status_id == 1) { // Новый
                $this->orders->bonus_open($order->id); } 
                
                if ($order->status_id == 2) { // Принят
                $this->orders->bonus_open($order->id); } 
                
                if ($order->status_id == 8) { // Комплектуется
                $this->orders->bonus_open($order->id); } 
                
                if ($order->status_id == 6) { // Отправлен
                $this->orders->bonus_open($order->id); } 
                
                if ($order->status_id == 4) { // Выполнен
                $this->orders->bonus_close($order->id); }
                
                if ($order->status_id == 9) { // Недозвон
                $this->orders->bonus_open($order->id); } 
                
                if ($order->status_id == 5) { // Удален
                $this->orders->bonus_open($order->id); }

 

Но неправильно работает, при статусе 4 "Выполнен" ставится closed_bonus == 1 и начисляются бонусы, а вот обратно при смене заказа на любой другой не ставится  closed_bonus == 0 и бонусы не списываются. Никак не могу найти в чем ошибся. Может Вы подскажите?

Ссылка на сообщение
Поделиться на другие сайты

Эта часть

 

// Меняем closed_bonus на 1
        $query = $this->db->placehold("UPDATE __orders SET closed_bonus=1", $order->id);
        $this->db->query($query);

 

ну очевидно совсем неправильная.

Ссылка на сообщение
Поделиться на другие сайты

Эта часть

 

// Меняем closed_bonus на 1

        $query = $this->db->placehold("UPDATE __orders SET closed_bonus=1", $order->id);

        $this->db->query($query);

 

ну очевидно совсем неправильная.

 

Сейчас вот так:

// Меняем closed_bonus на 1
        $query = $this->db->placehold("UPDATE __orders SET closed_bonus=1, modified=NOW() WHERE id=? LIMIT 1", $order->id);
        $this->db->query($query);
        }

но как я писал выше вот эта проблем:

Но неправильно работает, при статусе 4 "Выполнен" ставится closed_bonus == 1 и начисляются бонусы, а вот обратно при смене заказа на любой другой не ставится  closed_bonus == 0 и бонусы не списываются.

 

то есть на 1 значение меняется, а обратно на 0 уже нет.

Изменено пользователем Julius123
Ссылка на сообщение
Поделиться на другие сайты

Ошибка может быть в любом месте. Надо честно проверять все детали.

Возможно, например, что Вы поле в базе не создали...

Ссылка на сообщение
Поделиться на другие сайты

Ошибка может быть в любом месте. Надо честно проверять все детали.

Возможно, например, что Вы поле в базе не создали...

Все, разобрался. Просто забыл добавить в выборку новое поле closed_bonus.

 

Но все таки еще хочется как-то удалять бонусы при удалении заказа. Вы говорили что нельзя удалять заказы, так вот, их можно удалять, отменить нужный заказ чекбоксом и внизу выбрать удалить выбранные заказы

 

public function delete_order($id)
    {
        if(!empty($id))
        {
            $query = $this->db->placehold("DELETE FROM __purchases WHERE order_id=?", $id);
            $this->db->query($query);


            $query = $this->db->placehold("DELETE FROM __orders_labels WHERE order_id=?", $id);
            $this->db->query($query);
             
            $query = $this->db->placehold("DELETE FROM __orders WHERE id=? LIMIT 1", $id);
            $this->db->query($query);
        }
    }
Изменено пользователем Julius123
Ссылка на сообщение
Поделиться на другие сайты

В стандартной Simpla,  если попробовать так удалить заказ, например, из категории Новые, то реально он не удаляется, а меняет статус на Удаленные.

 

У Вас, видимо, в связи с переделкой статусов работает иначе...

Ссылка на сообщение
Поделиться на другие сайты

В стандартной Simpla,  если попробовать так удалить заказ, например, из категории Новые, то реально он не удаляется, а меняет статус на Удаленные.

 

У Вас, видимо, в связи с переделкой статусов работает иначе...

Да, но если удалить заказ из категории "Удалены" заказ удаляется полностью.

Ссылка на сообщение
Поделиться на другие сайты

Да, но если удалить заказ из категории "Удалены" заказ удаляется полностью.

Что хотите этим сказать?

Еще в #34 было про это:

В Simpla стандартно, вообще говоря, НЕТ удаления заказа. Если только удаление заказа со статусом Удален.

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...