mishanya Опубликовано 2 ноября, 2017 Жалоба Поделиться Опубликовано 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) Цитата Ссылка на сообщение Поделиться на другие сайты
Julius123 Опубликовано 2 ноября, 2017 Жалоба Поделиться Опубликовано 2 ноября, 2017 (изменено) я же написал, вся ф-я 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) Изменено 2 ноября, 2017 пользователем Julius123 Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 2 ноября, 2017 Жалоба Поделиться Опубликовано 2 ноября, 2017 (изменено) Не совсем понял куда необходимо поместить код $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, СТАТУС); ф-я вызывается несколько раз, обратите внимание что там разные статусы Изменено 2 ноября, 2017 пользователем mishanya Цитата Ссылка на сообщение Поделиться на другие сайты
Julius123 Опубликовано 2 ноября, 2017 Жалоба Поделиться Опубликовано 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); Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 2 ноября, 2017 Жалоба Поделиться Опубликовано 2 ноября, 2017 а куда тогда необходимо вставить строчку $this->orders->close($order->id, 3); издеваетесь? прочтите выше еще раз. я же написал смотрите в OrderAdmin там есть $this->orders->close($order->id); нужно менять на $this->orders->close($order->id, СТАТУС); ф-я вызывается несколько раз, обратите внимание что там разные статусы Цитата Ссылка на сообщение Поделиться на другие сайты
miltonmors Опубликовано 3 ноября, 2017 Жалоба Поделиться Опубликовано 3 ноября, 2017 (изменено) только минус что бонусы начисляются сразу после того как списывается товар и даже получается если статус "Принят" то бонус уже начислялся. Подскажите как сделать чтобы начислялись только при статусе "Выполнен" ? То, что тут насоветовали, выглядит странно по ряду причин:1. Почему-то обсуждается статус=3 (удален) вместо статуса "Выполнен"2. Сама идея - добавить параметр к функции close() - довольно примитивна и несет риск ошибок. Хотя бы потому, что если несколько раз менять статусы - новый на выполнен и обратно, то бонусы начислятся НЕСКОЛЬКО раз. Про это mishsnya написал в #22, но потом почему-то этот момент игнорирует. Вместо изобретательства кривого велосипеда надо использовать хорошие примеры, которые, кстати говоря, перед глазами - функционал open-close. По образцу этого функционала надо бы1. Написать функции close_bonus и open_bonus2. Применять их по аналогии при нужном изменении статуса рядом с функциями close и open.Все станет просто и прозрачно. Изменено 3 ноября, 2017 пользователем miltonmors Цитата Ссылка на сообщение Поделиться на другие сайты
Julius123 Опубликовано 3 ноября, 2017 Жалоба Поделиться Опубликовано 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() когда не списывается товар. Цитата Ссылка на сообщение Поделиться на другие сайты
Julius123 Опубликовано 3 ноября, 2017 Жалоба Поделиться Опубликовано 3 ноября, 2017 То, что тут насоветовали, выглядит странно по ряду причин:1. Почему-то обсуждается статус=3 (удален) вместо статуса "Выполнен"2. Сама идея - добавить параметр к функции close() - довольно примитивна и несет риск ошибок. Хотя бы потому, что если несколько раз менять статусы - новый на выполнен и обратно, то бонусы начислятся НЕСКОЛЬКО раз. Про это mishsnya написал в #22, но потом почему-то этот момент игнорирует. Вместо изобретательства кривого велосипеда надо использовать хорошие примеры, которые, кстати говоря, перед глазами - функционал open-close. По образцу этого функционала надо бы1. Написать функции close_bonus и open_bonus2. Применять их по аналогии при нужном изменении статуса рядом с функциями close и open.Все станет просто и прозрачно.Только вот не пойму как списывать бонусы при удалении заказа, учитывая что нужно списывать бонусы при удалении заказа только со статусом id==4 Цитата Ссылка на сообщение Поделиться на другие сайты
miltonmors Опубликовано 4 ноября, 2017 Жалоба Поделиться Опубликовано 4 ноября, 2017 Только вот не пойму как списывать бонусы при удалении заказа, учитывая что нужно списывать бонусы при удалении заказа только со статусом id==4 В Simpla стандартно, вообще говоря, НЕТ удаления заказа. Если только удаление заказа со статусом Удален. Надо бы вызывать close_bonus/open_bonus не иногда, а при ЛЮБОМ изменении статуса - Ваш вопрос решится проще и надежнее. А если хотите непременно по-своему, то обрабатывайте свое дополнительное условие. Вам ведь ранее в теме mishanya продемонстрировал, насколько этот подход сложнее и какие ошибки дает... Цитата Ссылка на сообщение Поделиться на другие сайты
Julius123 Опубликовано 4 ноября, 2017 Жалоба Поделиться Опубликовано 4 ноября, 2017 В Simpla стандартно, вообще говоря, НЕТ удаления заказа. Если только удаление заказа со статусом Удален. Надо бы вызывать close_bonus/open_bonus не иногда, а при ЛЮБОМ изменении статуса - Ваш вопрос решится проще и надежнее. А если хотите непременно по-своему, то обрабатывайте свое дополнительное условие. Вам ведь ранее в теме mishanya продемонстрировал, насколько этот подход сложнее и какие ошибки дает...Но опять же если списывать и начислять бонусы при КАЖДОМ изменении статусе заказа с помощью функций close_bonus/open_bonus то как быть со статусом "Новый"? В этот статус попадаю новые заказы, и списывать бонусы при нем не нужно, а если поставить статус Выполнен, а потом Новый бонусы не пишутся, + при каждом обновлении товара будет выполняться начисление или списание бонусов - с этим тоже не пойму как быть в вашем предложении. Поэтому я и оставил списание бонусов в функции которая отвечает за возвращение количества товара на склад. Цитата Ссылка на сообщение Поделиться на другие сайты
miltonmors Опубликовано 4 ноября, 2017 Жалоба Поделиться Опубликовано 4 ноября, 2017 Но опять же если списывать и начислять бонусы при КАЖДОМ изменении статусе заказа с помощью функций close_bonus/open_bonus то как быть со статусом "Новый"? В этот статус попадаю новые заказы, и списывать бонусы при нем не нужно, а если поставить статус Выполнен, а потом Новый бонусы не пишутся, + при каждом обновлении товара будет выполняться начисление или списание бонусов - с этим тоже не пойму как быть в вашем предложении. Поэтому я и оставил списание бонусов в функции которая отвечает за возвращение количества товара на склад. Ответ на Ваши многочисленные вопросы все тот же: по аналогии с open/close.По той же аналогии в таблице заказов создать поле closed_bonus, которое использовать по аналогии, чтобы как раз следить за тем, чтобы все списывалось правильно. Цитата Ссылка на сообщение Поделиться на другие сайты
Julius123 Опубликовано 4 ноября, 2017 Жалоба Поделиться Опубликовано 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 и бонусы не списываются. Никак не могу найти в чем ошибся. Может Вы подскажите? Цитата Ссылка на сообщение Поделиться на другие сайты
miltonmors Опубликовано 4 ноября, 2017 Жалоба Поделиться Опубликовано 4 ноября, 2017 Эта часть // Меняем closed_bonus на 1 $query = $this->db->placehold("UPDATE __orders SET closed_bonus=1", $order->id); $this->db->query($query); ну очевидно совсем неправильная. Цитата Ссылка на сообщение Поделиться на другие сайты
Julius123 Опубликовано 4 ноября, 2017 Жалоба Поделиться Опубликовано 4 ноября, 2017 (изменено) Эта часть // Меняем 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 уже нет. Изменено 4 ноября, 2017 пользователем Julius123 Цитата Ссылка на сообщение Поделиться на другие сайты
miltonmors Опубликовано 4 ноября, 2017 Жалоба Поделиться Опубликовано 4 ноября, 2017 Ошибка может быть в любом месте. Надо честно проверять все детали.Возможно, например, что Вы поле в базе не создали... Цитата Ссылка на сообщение Поделиться на другие сайты
Julius123 Опубликовано 4 ноября, 2017 Жалоба Поделиться Опубликовано 4 ноября, 2017 (изменено) Ошибка может быть в любом месте. Надо честно проверять все детали.Возможно, например, что Вы поле в базе не создали...Все, разобрался. Просто забыл добавить в выборку новое поле 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); } } Изменено 4 ноября, 2017 пользователем Julius123 Цитата Ссылка на сообщение Поделиться на другие сайты
miltonmors Опубликовано 5 ноября, 2017 Жалоба Поделиться Опубликовано 5 ноября, 2017 В стандартной Simpla, если попробовать так удалить заказ, например, из категории Новые, то реально он не удаляется, а меняет статус на Удаленные. У Вас, видимо, в связи с переделкой статусов работает иначе... Цитата Ссылка на сообщение Поделиться на другие сайты
Julius123 Опубликовано 5 ноября, 2017 Жалоба Поделиться Опубликовано 5 ноября, 2017 В стандартной Simpla, если попробовать так удалить заказ, например, из категории Новые, то реально он не удаляется, а меняет статус на Удаленные. У Вас, видимо, в связи с переделкой статусов работает иначе...Да, но если удалить заказ из категории "Удалены" заказ удаляется полностью. Цитата Ссылка на сообщение Поделиться на другие сайты
miltonmors Опубликовано 5 ноября, 2017 Жалоба Поделиться Опубликовано 5 ноября, 2017 Да, но если удалить заказ из категории "Удалены" заказ удаляется полностью.Что хотите этим сказать? Еще в #34 было про это:В Simpla стандартно, вообще говоря, НЕТ удаления заказа. Если только удаление заказа со статусом Удален. Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.