Jump to content

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


Recommended Posts

 

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

            $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)
Link to post
Share on other sites

 

я же написал, вся ф-я 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) 

Edited by Julius123
Link to post
Share on other sites

 

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

$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, СТАТУС); 

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

Edited by mishanya
Link to post
Share on other sites

замените 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); 
Link to post
Share on other sites

 

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

 

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

 

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

 

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

 

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

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

Link to post
Share on other sites

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

 

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

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

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

 

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

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

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

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

Edited by miltonmors
Link to post
Share on other sites

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

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() когда не списывается товар.

Link to post
Share on other sites

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

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

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

 

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

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

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

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

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

Link to post
Share on other sites

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

 

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

 

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

Link to post
Share on other sites

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

 

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

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

Link to post
Share on other sites

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

 

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

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

Link to post
Share on other sites

Ответ на Ваши многочисленные вопросы все тот же: по аналогии с 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 и бонусы не списываются. Никак не могу найти в чем ошибся. Может Вы подскажите?

Link to post
Share on other sites

Эта часть

 

// Меняем 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 уже нет.

Edited by Julius123
Link to post
Share on other sites

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

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

Все, разобрался. Просто забыл добавить в выборку новое поле 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);
        }
    }
Edited by Julius123
Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

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

 

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

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

Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...