mishanya Posted November 2, 2017 Report Share Posted November 2, 2017 Может сделать вот так? $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) Quote Link to post Share on other sites
Julius123 Posted November 2, 2017 Report Share Posted November 2, 2017 (edited) я же написал, вся ф-я 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 November 2, 2017 by Julius123 Quote Link to post Share on other sites
mishanya Posted November 2, 2017 Report Share Posted November 2, 2017 (edited) Не совсем понял куда необходимо поместить код $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 November 2, 2017 by mishanya Quote Link to post Share on other sites
Julius123 Posted November 2, 2017 Report Share Posted November 2, 2017 замените 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); Quote Link to post Share on other sites
mishanya Posted November 2, 2017 Report Share Posted November 2, 2017 а куда тогда необходимо вставить строчку $this->orders->close($order->id, 3); издеваетесь? прочтите выше еще раз. я же написал смотрите в OrderAdmin там есть $this->orders->close($order->id); нужно менять на $this->orders->close($order->id, СТАТУС); ф-я вызывается несколько раз, обратите внимание что там разные статусы Quote Link to post Share on other sites
miltonmors Posted November 3, 2017 Report Share Posted November 3, 2017 (edited) только минус что бонусы начисляются сразу после того как списывается товар и даже получается если статус "Принят" то бонус уже начислялся. Подскажите как сделать чтобы начислялись только при статусе "Выполнен" ? То, что тут насоветовали, выглядит странно по ряду причин:1. Почему-то обсуждается статус=3 (удален) вместо статуса "Выполнен"2. Сама идея - добавить параметр к функции close() - довольно примитивна и несет риск ошибок. Хотя бы потому, что если несколько раз менять статусы - новый на выполнен и обратно, то бонусы начислятся НЕСКОЛЬКО раз. Про это mishsnya написал в #22, но потом почему-то этот момент игнорирует. Вместо изобретательства кривого велосипеда надо использовать хорошие примеры, которые, кстати говоря, перед глазами - функционал open-close. По образцу этого функционала надо бы1. Написать функции close_bonus и open_bonus2. Применять их по аналогии при нужном изменении статуса рядом с функциями close и open.Все станет просто и прозрачно. Edited November 3, 2017 by miltonmors Quote Link to post Share on other sites
Julius123 Posted November 3, 2017 Report Share Posted November 3, 2017 То, что тут насоветовали, выглядит странно по ряду причин:1. Почему-то обсуждается статус=3 (удален) вместо статуса "Выполнен"2. Сама идея - добавить параметр к функции close() - довольно примитивна и несет риск ошибок. Хотя бы потому, что если несколько раз менять статусы - новый на выполнен и обратно, то бонусы начислятся НЕСКОЛЬКО раз. Про это mishsnya написал в #22, но потом почему-то этот момент игнорирует. Вместо изобретательства кривого велосипеда надо использовать хорошие примеры, которые, кстати говоря, перед глазами - функционал open-close. По образцу этого функционала надо бы1. Написать функции close_bonus и open_bonus2. Применять их по аналогии при нужном изменении статуса рядом с функциями 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() когда не списывается товар. Quote Link to post Share on other sites
Julius123 Posted November 3, 2017 Report Share Posted November 3, 2017 То, что тут насоветовали, выглядит странно по ряду причин:1. Почему-то обсуждается статус=3 (удален) вместо статуса "Выполнен"2. Сама идея - добавить параметр к функции close() - довольно примитивна и несет риск ошибок. Хотя бы потому, что если несколько раз менять статусы - новый на выполнен и обратно, то бонусы начислятся НЕСКОЛЬКО раз. Про это mishsnya написал в #22, но потом почему-то этот момент игнорирует. Вместо изобретательства кривого велосипеда надо использовать хорошие примеры, которые, кстати говоря, перед глазами - функционал open-close. По образцу этого функционала надо бы1. Написать функции close_bonus и open_bonus2. Применять их по аналогии при нужном изменении статуса рядом с функциями close и open.Все станет просто и прозрачно.Только вот не пойму как списывать бонусы при удалении заказа, учитывая что нужно списывать бонусы при удалении заказа только со статусом id==4 Quote Link to post Share on other sites
miltonmors Posted November 4, 2017 Report Share Posted November 4, 2017 Только вот не пойму как списывать бонусы при удалении заказа, учитывая что нужно списывать бонусы при удалении заказа только со статусом id==4 В Simpla стандартно, вообще говоря, НЕТ удаления заказа. Если только удаление заказа со статусом Удален. Надо бы вызывать close_bonus/open_bonus не иногда, а при ЛЮБОМ изменении статуса - Ваш вопрос решится проще и надежнее. А если хотите непременно по-своему, то обрабатывайте свое дополнительное условие. Вам ведь ранее в теме mishanya продемонстрировал, насколько этот подход сложнее и какие ошибки дает... Quote Link to post Share on other sites
Julius123 Posted November 4, 2017 Report Share Posted November 4, 2017 В Simpla стандартно, вообще говоря, НЕТ удаления заказа. Если только удаление заказа со статусом Удален. Надо бы вызывать close_bonus/open_bonus не иногда, а при ЛЮБОМ изменении статуса - Ваш вопрос решится проще и надежнее. А если хотите непременно по-своему, то обрабатывайте свое дополнительное условие. Вам ведь ранее в теме mishanya продемонстрировал, насколько этот подход сложнее и какие ошибки дает...Но опять же если списывать и начислять бонусы при КАЖДОМ изменении статусе заказа с помощью функций close_bonus/open_bonus то как быть со статусом "Новый"? В этот статус попадаю новые заказы, и списывать бонусы при нем не нужно, а если поставить статус Выполнен, а потом Новый бонусы не пишутся, + при каждом обновлении товара будет выполняться начисление или списание бонусов - с этим тоже не пойму как быть в вашем предложении. Поэтому я и оставил списание бонусов в функции которая отвечает за возвращение количества товара на склад. Quote Link to post Share on other sites
miltonmors Posted November 4, 2017 Report Share Posted November 4, 2017 Но опять же если списывать и начислять бонусы при КАЖДОМ изменении статусе заказа с помощью функций close_bonus/open_bonus то как быть со статусом "Новый"? В этот статус попадаю новые заказы, и списывать бонусы при нем не нужно, а если поставить статус Выполнен, а потом Новый бонусы не пишутся, + при каждом обновлении товара будет выполняться начисление или списание бонусов - с этим тоже не пойму как быть в вашем предложении. Поэтому я и оставил списание бонусов в функции которая отвечает за возвращение количества товара на склад. Ответ на Ваши многочисленные вопросы все тот же: по аналогии с open/close.По той же аналогии в таблице заказов создать поле closed_bonus, которое использовать по аналогии, чтобы как раз следить за тем, чтобы все списывалось правильно. Quote Link to post Share on other sites
Julius123 Posted November 4, 2017 Report Share Posted November 4, 2017 Ответ на Ваши многочисленные вопросы все тот же: по аналогии с 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 и бонусы не списываются. Никак не могу найти в чем ошибся. Может Вы подскажите? Quote Link to post Share on other sites
miltonmors Posted November 4, 2017 Report Share Posted November 4, 2017 Эта часть // Меняем closed_bonus на 1 $query = $this->db->placehold("UPDATE __orders SET closed_bonus=1", $order->id); $this->db->query($query); ну очевидно совсем неправильная. Quote Link to post Share on other sites
Julius123 Posted November 4, 2017 Report Share Posted November 4, 2017 (edited) Эта часть // Меняем 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 November 4, 2017 by Julius123 Quote Link to post Share on other sites
miltonmors Posted November 4, 2017 Report Share Posted November 4, 2017 Ошибка может быть в любом месте. Надо честно проверять все детали.Возможно, например, что Вы поле в базе не создали... Quote Link to post Share on other sites
Julius123 Posted November 4, 2017 Report Share Posted November 4, 2017 (edited) Ошибка может быть в любом месте. Надо честно проверять все детали.Возможно, например, что Вы поле в базе не создали...Все, разобрался. Просто забыл добавить в выборку новое поле 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 November 4, 2017 by Julius123 Quote Link to post Share on other sites
miltonmors Posted November 5, 2017 Report Share Posted November 5, 2017 В стандартной Simpla, если попробовать так удалить заказ, например, из категории Новые, то реально он не удаляется, а меняет статус на Удаленные. У Вас, видимо, в связи с переделкой статусов работает иначе... Quote Link to post Share on other sites
Julius123 Posted November 5, 2017 Report Share Posted November 5, 2017 В стандартной Simpla, если попробовать так удалить заказ, например, из категории Новые, то реально он не удаляется, а меняет статус на Удаленные. У Вас, видимо, в связи с переделкой статусов работает иначе...Да, но если удалить заказ из категории "Удалены" заказ удаляется полностью. Quote Link to post Share on other sites
miltonmors Posted November 5, 2017 Report Share Posted November 5, 2017 Да, но если удалить заказ из категории "Удалены" заказ удаляется полностью.Что хотите этим сказать? Еще в #34 было про это:В Simpla стандартно, вообще говоря, НЕТ удаления заказа. Если только удаление заказа со статусом Удален. Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.