Автор Тема: Двойной "отпуск" заказа  (Прочитано 326 раз)

30 Январь 2018, 16:16:53
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Здравствуйте
С некоторой периодичностью происходит такая ситуация:
При изменении статуса заказа в статус "отправлено" данное изменение происходит дважды:
1. в order_history заносятся 2 записи
2. в stock_mvt заносятся 2 записи для каждого товара
3. из количества в stock дважды вычитается количество для каждого товара
Фатальность последствий объяснять, наверное, необязательно: неверные остатки и отрицательное количество "свободно" + иногда "вываливается" исключение, когда физические остатки уходят в минус.
Предположение, что это двойной или тройной клик на кнопке "Обновить статус" не оправдалось:
Появляется сообщение "Этому заказу уже назначен этот статус"
Анализ id_stock_mvt показал: 2-й отпуск идет не после того как закончится первый, а одновременно с 1-м, т.е. в соответствии  с ростом id_stock_mvt записи идут так:
Товар 1
Товар 2
Товар 3
Товар 1 (повтор)
Товар 2 (повтор)
Товар 4
Товар 3 (повтор)
Как найти причину? 
З.Ы. Один комментарий: ИМ оптовый, заказ, в котором последний раз это произошло содержал 150 товаров. Может все-таки двойной клик "успел" сработать? Если так, то как можно его заблокировать?
30 Январь 2018, 18:06:37
Ответ #1
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
У меня самого есть одна идея, но проверять "боем" и потом опять править ручками сотню-другую таблиц БД в случае неудачи не очень хочется.
Поэтому спрошу здесь:
При проверке возможности изменения статуса в AdminOrdersController есть такой код
if ($current_order_state->id != $order_state->id) {
// Если текущий статус не равен новому, то происходит изменение
...
код смены статуса
...
} else {
      $this->errors[] = Tools::displayError('The order has already been assigned this status.');
}
пройдет ли такой фокус с объявлением собственной переменной в Context:
if (($current_order_state->id != $order_state->id)  && (!$this->context->Order_is_busy)) {
// Если текущий статус не равен новому и статус не меняется в данный момент, то происходит изменение
$this->context->Order_is_busy = true;
...
код смены статуса
...
$this->context->Order_is_busy = false;
} else {
      $this->errors[] = Tools::displayError('The order has already been assigned this status.');
}
Заранее спасибо!
30 Январь 2018, 18:35:12
Ответ #2
  • Ветеран
  • *****
  • Сообщений: 1614
  • Репутация: +32/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Всегда будет выдавать ошибку. Переменную нужно инициализировать перед проверкой.
30 Январь 2018, 18:40:29
Ответ #3
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Всегда будет выдавать ошибку. Переменную нужно инициализировать перед проверкой.
Спасибо за ответ
Эту проблему, наверное, можно решить прописав в config.inc.php следующее?
context->Order_is_busy = false;
А в принципе я правильно понимаю назначение context->?
30 Январь 2018, 18:47:22
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Если переменную нужно использовать во многих файлах, тогда имеет смысл выносить в конфиг. Если только в одном контроллере, тогда смысла нет. В этом случае лучше в самом контроллере.
30 Январь 2018, 18:53:29
Ответ #5
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если переменную нужно использовать во многих файлах, тогда имеет смысл выносить в конфиг. Если только в одном контроллере, тогда смысла нет. В этом случае лучше в самом контроллере.
Вы имеете в виду без использования Context? Т.е. в контроллере написать так?
public $Order_is_busy;

public function __construct()
{
    $this->Order_is_busy = false;
...
Ну и соответственно при проверке $this->Order_is_busy?
31 Январь 2018, 11:14:30
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
04 Февраль 2018, 14:02:46
Ответ #7
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Сдаюсь.
Все попытки изменить переменную
$this->context->Order_is_busy = true;
ни к чему не приводят - при последующей проверке
&& (!$this->context->Order_is_busy)
она инициализируется в false
Что делать? Проблема насущная