Я из тех, для кого пока в обновлении больше болезни мозга, чем пользы. Спрашиваю у таких же как я и у знающих, а возможно также ведет себя и обновленная новая версия.
Начал писать, и вспомнил, что когда-то давно уже задавал подобный вопрос, и ТП не смогла воспроизвести проблему, я же тогда не совсем понимал как сам добился подобного результата. Сейчас понимание пришло.
Если установлено отслеживание количества на складе и запрет заказа отсутствующего товара - то при оформлении заказа покупателем или через админку - просто не удастся положить товар в корзину или в заказ.
Но.
Преамбула: изменение количества для статусов Открыт и Отложен - Уменьшение.
Есть интеграции с другими площадками, и не всегда обмен количеством с ними идет в реальном времени. Может сложиться ситуация, когда в ИМ осталась 1 штука, а на сторонней площадке пока еще 2. Там заказывают эти две штуки, заказ приходит через веб хук и размещается через функцию fn_place_order, в результате статус у него Отложен, количество товара в базе не изменилось.
Теперь работаем с заказом.
Позвонили покупателю, договорились, он согласен купить одну штуку.
Меняем количество в заказе со статусом Отложен с 2 на 1 - и товара в базе становится 2. Теперь безболезненно меняем статус заказа с Отложен на Открыт - изменения количества не происходит, так как у обоих статусов количество на уменьшение.
Встречался кто-нибудь с подобной ситуацией?
Может возникнуть также например при отслеживании количества на складе и синхронизации количества с 1с: пришел заказ на товар, он разместился в статус открыт, затем из 1С пришел 0 на его количество, и при любой попытке изменить статус заказа - он попадет в Отложен. Правда тут не знаю как поведет себя количество при смене статуса из Открыт в Отложен, но скорее всего также, так как уменьшение и уменьшение. Поэтому количество останется без изменений.
Поэтому та же схема: сделали заказ на товары, он в статусе Открыт. После этого произошла выгрузка количества из 1С - и один товар например в результате инвентаризации, или его купили оффлайн - стал 0. Менеджер же не в курсе этого, он просто пообщался с клиентом и пытается перевести заказ в статус В Работе - а заказ падает в Отложен. Менеджер разбирается в чем дело, снова звонит покупателю, и тот дает согласие что согласен получить заказ без этого товара. Менеджер удаляет нулевой товар из заказа - и(!) в базе этого артикула становится 1 штука! Вот тут хорошо бы проверять что если статус заказа Отложен - ведь это не просто статус, а статус со специфичным смыслом и константой STATUS_BACKORDERED_ORDER - при изменении количества товара в заказе - количество этого товара в базе не менялось.
PS кстати, товары, которых хватает в наличии, но из за того отсутсвующего - лежа в заказе со статусом Отложен - тоже в итоге не отнимались от общего числа из базы. И не будут уменьшены при переводе в статус Открыт потом, после редактирования “неугодного” количества. А значит по факту после перевода в статус Открыт таких товаров в базе будет числиться больше чем имеется.
Вижу пока решение в лоб. В функции fn_change_order_status
вместо условия
if ($order_statuses[$status_to]['params']['inventory'] == 'D'
&& $order_statuses[$status_from]['params']['inventory'] == 'I') {
// decrease amount
прописать
if (
($order_statuses[$status_to]['params']['inventory'] == 'D'
&&
($order_statuses[$status_from]['params']['inventory'] == 'I'
|| $status_from == STATUS_BACKORDERED_ORDER)
) {
// decrease amount
Если в новых версиях та же фигня - переложу в баг трекер.
Отыскал прежнюю тему
а также