ms3Remains - Остатки товаров по комбинациям опций для MiniShop3
Есть решение
Расскажу про ms3Remains: дополнение для MiniShop3, которое считает остатки по комбинациям опций, а не только одной цифрой на весь товар. Кому нужны отдельные количества по цвету и размеру, по вариантам из ms3Variants или по базовой строке без опций, тот сценарий как раз здесь.
Каждая строка в базе отвечает на вопрос, сколько единиц лежит на остатке при заданном наборе опций. Вы задаёте, какие опции участвуют в комбинации, через настройку ms3remains_option_keys. Если ключ пустой, в расчёт попадут все опции, которые покупатель передаёт с товаром.
На странице товара появляется вкладка «Остатки». В ней базовая строка, варианты ms3Variants с артикулом в подписи и сочетания значений отслеживаемых опций, которые реально заполнены у товара. Сверху вкладка пишет итог: поле «Остаток» в свойствах товара равно сумме всех строк. Каждую строку сохраняете отдельно, а общее сохранение останавливается на первой ошибке, и уже записанные строки не откатываются.

Пока вы не сохранили ни одной строки, товар не отслеживается и продаётся без ограничения, даже если в полях уже стоят числа. Ноль в сохранённой строке означает «нет в наличии», и такую комбинацию в корзину добавить нельзя. Если значений опций слишком много, сетка обрезается после 200 комбинаций. Тогда сузьте список ключей или правьте остаток через CSV.
Раздел «Остатки» собирает все товары в один список: товар, артикул варианта, опции, количество и статус «В наличии» или «Нет в наличии». Список фильтруется по наличию и ищется по товару. Количество правится прямо из списка, диалогом «Изменить остаток»: выбираете товар и вариант, задаёте новое количество и комментарий.
Массовая загрузка идёт через импорт CSV в том же разделе. Файлу нужны колонки remain_id и quantity. Сначала файл проверяется, и применить импорт можно только после проверки без ошибок. Рядом есть экспорт CSV и сервисный API для своего скрипта.

История правок внутри компонента не ведётся. Когда меняли число, видно по полю updatedon строки, а кто менял, пишется своим плагином на событие ms3remainsOnAfterRemainChange. Плагин может и отменить изменение: достаточно вернуть непустую строку, и запись откатится.
Корзина проверяет выбранные опции и хватает ли остатка ещё до оформления. Списание срабатывает, когда заказ переходит в один из статусов из ms3remains_deduct_statuses. Возврат на остаток идёт при статусе из ms3remains_refund_statuses или при удалении заказа. Повторный перевод в тот же статус списания не дублирует операцию. Если остатка меньше, чем количество в строке заказа, смена статуса откатывается.
Статусы задаются в разделе «Настройки». Там же включается сам компонент, перечисляются отслеживаемые опции и остаток по умолчанию. От него зависит кнопка «Заполнить пустые по умолчанию» на вкладке товара: она появляется, когда значение больше нуля. Отдельными переключателями включаются проверка остатка в корзине, проверка перед созданием заказа и требование выбрать все опции из списка ключей.

Менять статус заказа для проверки нужно штатными средствами MiniShop3, не через сохранение объекта заказа вручную. Пока не заданы статусы списания, остатки по заказам не уменьшаются, и раздел «Настройки» об этом предупреждает.
Компонент суммирует остатки в поле stock товара и при включённой синхронизации пишет остаток варианта в count таблицы ms3Variants. Витрина и mFilter читают готовое поле, а не пересчитывают остаток на каждом запросе. Фильтр «только в наличии» в mFilter строится по проекции stock, отдельный тип фильтра пакет не поставляет.
Сниппет ms3Remains показывает число, подписи «В наличии / Нет в наличии», порог «Много», JSON для скриптов или остатки по значениям опций. Точное число от покупателя прячется настройкой ms3remains_hide_quantity, а порог «Много» задаёт ms3remains_moreless_count. На витрине сниппет вызывают некэшируемым вызовом, иначе кэш шаблона держит старое число. Счётчики комбинаций в mFilter компонент не переписывает.
Проекция включается и перестраивается там же, в «Настройках»: отдельно для stock товара и для count вариантов. Кнопка «Перестроить» пересчитывает оба поля для всех товаров с остатками. Товар без сохранённых строк обычная проекция не обнуляет, а перестроение при включённой синхронизации stock пишет таким товарам 0.

Пока работает ms3Remains, встроенный inventory MiniShop3 держите выключенным: настройка ms3_inventory_enabled в нуле, иначе резерв по суммарному stock конфликтует с остатками по комбинациям. Не включайте одновременно списание здесь и ms3variants_deduct_stock_status в ms3Variants, иначе остаток спишется дважды. В «Настройках» есть предупреждение и кнопка отключить списание в ms3Variants. После установки компонент выключен, таблицы пустые.
Остаток на комбинацию опций
Каждая строка в базе отвечает на вопрос, сколько единиц лежит на остатке при заданном наборе опций. Вы задаёте, какие опции участвуют в комбинации, через настройку ms3remains_option_keys. Если ключ пустой, в расчёт попадут все опции, которые покупатель передаёт с товаром.
Остатки в manager
На странице товара появляется вкладка «Остатки». В ней базовая строка, варианты ms3Variants с артикулом в подписи и сочетания значений отслеживаемых опций, которые реально заполнены у товара. Сверху вкладка пишет итог: поле «Остаток» в свойствах товара равно сумме всех строк. Каждую строку сохраняете отдельно, а общее сохранение останавливается на первой ошибке, и уже записанные строки не откатываются.

Пока вы не сохранили ни одной строки, товар не отслеживается и продаётся без ограничения, даже если в полях уже стоят числа. Ноль в сохранённой строке означает «нет в наличии», и такую комбинацию в корзину добавить нельзя. Если значений опций слишком много, сетка обрезается после 200 комбинаций. Тогда сузьте список ключей или правьте остаток через CSV.
Раздел «Остатки» собирает все товары в один список: товар, артикул варианта, опции, количество и статус «В наличии» или «Нет в наличии». Список фильтруется по наличию и ищется по товару. Количество правится прямо из списка, диалогом «Изменить остаток»: выбираете товар и вариант, задаёте новое количество и комментарий.
Массовая загрузка идёт через импорт CSV в том же разделе. Файлу нужны колонки remain_id и quantity. Сначала файл проверяется, и применить импорт можно только после проверки без ошибок. Рядом есть экспорт CSV и сервисный API для своего скрипта.

История правок внутри компонента не ведётся. Когда меняли число, видно по полю updatedon строки, а кто менял, пишется своим плагином на событие ms3remainsOnAfterRemainChange. Плагин может и отменить изменение: достаточно вернуть непустую строку, и запись откатится.
Заказы: корзина, списание, возврат
Корзина проверяет выбранные опции и хватает ли остатка ещё до оформления. Списание срабатывает, когда заказ переходит в один из статусов из ms3remains_deduct_statuses. Возврат на остаток идёт при статусе из ms3remains_refund_statuses или при удалении заказа. Повторный перевод в тот же статус списания не дублирует операцию. Если остатка меньше, чем количество в строке заказа, смена статуса откатывается.
Статусы задаются в разделе «Настройки». Там же включается сам компонент, перечисляются отслеживаемые опции и остаток по умолчанию. От него зависит кнопка «Заполнить пустые по умолчанию» на вкладке товара: она появляется, когда значение больше нуля. Отдельными переключателями включаются проверка остатка в корзине, проверка перед созданием заказа и требование выбрать все опции из списка ключей.

Менять статус заказа для проверки нужно штатными средствами MiniShop3, не через сохранение объекта заказа вручную. Пока не заданы статусы списания, остатки по заказам не уменьшаются, и раздел «Настройки» об этом предупреждает.
Витрина, проекция и каталог
Компонент суммирует остатки в поле stock товара и при включённой синхронизации пишет остаток варианта в count таблицы ms3Variants. Витрина и mFilter читают готовое поле, а не пересчитывают остаток на каждом запросе. Фильтр «только в наличии» в mFilter строится по проекции stock, отдельный тип фильтра пакет не поставляет.
Сниппет ms3Remains показывает число, подписи «В наличии / Нет в наличии», порог «Много», JSON для скриптов или остатки по значениям опций. Точное число от покупателя прячется настройкой ms3remains_hide_quantity, а порог «Много» задаёт ms3remains_moreless_count. На витрине сниппет вызывают некэшируемым вызовом, иначе кэш шаблона держит старое число. Счётчики комбинаций в mFilter компонент не переписывает.
Проекция включается и перестраивается там же, в «Настройках»: отдельно для stock товара и для count вариантов. Кнопка «Перестроить» пересчитывает оба поля для всех товаров с остатками. Товар без сохранённых строк обычная проекция не обнуляет, а перестроение при включённой синхронизации stock пишет таким товарам 0.

Требования и ограничения
- Нужны MODX Revolution 3.0.0 и новее,
- PHP 8.2+,
- MiniShop3 1.13.0+,
- VueTools 1.2.0+,
- pdoTools 3.0.0+.
Пока работает ms3Remains, встроенный inventory MiniShop3 держите выключенным: настройка ms3_inventory_enabled в нуле, иначе резерв по суммарному stock конфликтует с остатками по комбинациям. Не включайте одновременно списание здесь и ms3variants_deduct_stock_status в ms3Variants, иначе остаток спишется дважды. В «Настройках» есть предупреждение и кнопка отключить списание в ms3Variants. После установки компонент выключен, таблицы пустые.
Что дальше
- ms3Remains в Modstore.
- Документация, с быстрым стартом, разделом по остаткам и FAQ по типовым сбоям.
Комментарии: 2
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.


Её стоит использовать, когда количество не зависит от цвета, размера и других опций.
Это не запас «на все варианты сразу». Если в ms3remains_option_keys указаны ключи, у каждой комбинации своя строка. Покупатель должен выбрать эти опции, и проверка идёт по строке комбинации, а не по базовой. Базовая строка при этом остаётся отдельным остатком.