Дробное количество и единицы измерения товаров в Shop-Script

В версии Shop-Script 9.0.0 мы планируем добавить поддержку новых возможностей:

  • дробное количество товаров;
  • единицы измерения количества товаров;
  • минимальное количество товаров для заказа;
  • шаг добавления товаров в корзину;
  • размер изменения количества товаров в корзине кнопками «+/-».

Расскажем, как это устроено, чтобы вы могли подготовить свои плагины к работе с новой версией Shop-Script.

Можно посмотреть работу Shop-Script с новыми возможностями в демоверсии:

Для использования новых возможностей в своих продуктах вам потребуется обновлённый исходный код продуктов Webasyst — мы опубликовали его на «ГитХабе»:

Дробное количество товаров

Дробное количество может быть полезно для того, чтобы было удобно продавать, например, 1,35 кг или 2,9 л товара, а не только целые штуки или одинаковые упаковки.

После обновления интернет-магазины пользователей продолжат работать, как обычно, — для них автоматически ничего не изменится, и количество товаров везде будет считаться, как и прежде, в виде целых чисел — штук.

Чтобы что-то изменилось, нужно включить общую поддержку дробного количества товаров в настройках магазина.

В этот момент приложение покажет предупреждение о том, что нужно проверить поддержку дробного количества товаров установленными плагинами и темами дизайна — в специальном разделе настроек магазина. У пользователя есть возможность (на свой страх и риск) включить общую поддержку дробного количества товаров в магазине, даже если есть темы и плагины, не поддерживающие эту возможность, или если нет информации о такой поддержке.

После этого можно включить поддержку дробного количества для отдельных типов товаров. Когда поддержка дробного количества включена для какого-то типа товаров, можно включать или выключать её при редактировании каждого из товаров этого типа.

Шаг добавления товаров в корзину

Доступность поддержки дробного количества товара определяется указанным в настройках значением шага добавления в корзину. Это то минимальное количество, которому всегда должно быть кратно количество товара в корзине и в заказе. Количество каждого товара при этом округляется до ближайшего числа, кратного шагу, заданному для этого товара. Если шаг дробный, то для товара появляется возможность заказа дробного количества.

Например, если шаг добавления в корзину установить равным 0,15, то покупатели смогут добавлять в корзину такие количества, как, например, 0,15, 0,3, 0,45, 0,9, 1,5 и т. п. и не смогут добавлять количества вроде 1,01, 2,35 или 9,99 — потому что эти значения не кратны установленному шагу 0,15.

Степень точности складских остатков

В остатках на складе администратор магазина может указать число, необязательно кратное указанному шагу. Достаточно только, чтобы точность остатков не превышала точность шага добавления в корзину.

Степень точности шага добавления в корзину соответствует количеству знаков после запятой в его значении. Например, у шага 0,5 точность равна 0,1, у шага 0,015 — 0,001, а у шага 10 — 1.

Если шаг установлен равным 0,15, то складские остатки могут быть равны, например, 0,01, 0,1 или 1, но не 0,009 или 0,0009, потому что у этих значений большая точность (количество знаков после запятой), чем у шага добавления в корзину.

Если шаг добавления в корзину выражен любым целым числом, то его точность равна 1. Например, если шаг равен 1, 2, 5, 20 или 100, то его точность во всех этих случаях одинаковая — 1, поэтому в таком случае в остатках на складе можно ввести любое целое число.

Минимальное количество в заказе и размер изменения количества в корзине кнопками «+/-»

Пользователю доступны ещё две настройки, связанные с дробным количеством товаров:

  • минимальное количество товара в заказе;
  • размер изменения количества товара в корзине кнопками «+/-».

Их можно задать в свойствах типов товаров. А в свойствах отдельных товаров этих типов можно при необходимости указать индивидуальные значения для этих товаров.

Значения этих двух настроек могут быть только кратными шагу добавления товара в корзину. Поэтому, если шаг добавления в корзину является целым числом, то и минимальное количество в заказе, и размер изменения количества в корзине тоже могут быть только целочисленными.

Поля таблиц базы данных для поддержки дробного количества

Для поддержки дробного количества товаров изменится тип нескольких полей в таблицах базы данных и будут добавлены новые поля. В эти поля можно будет сохранять и целочисленные, и дробные количества товаров.

Таблица Поле Версия 8 Версия 9 Описание
shop_product count int, NULL DECIMAL(15,3), NULL

Сумма складских остатков всех артикулов товара на всех складах.

shop_product_skus count int, NULL DECIMAL(15,3), NULL

Сумма складских остатков артикула на всех складах.

shop_product_stocks count int, NOT NULL DECIMAL(15,3), NOT NULL

Остатки артикула на конкретном складе, если ведётся складской учёт по складам. Пустое значение означает бесконечные остатки на этом складе.

shop_product_stocks_log before_count
after_count
diff_count
int, NULL DECIMAL(15,3), NULL

История изменения складских остатков.

shop_transfer_products count int, NOT NULL DECIMAL(15,3), NOT NULL

Трансфер со склада на склад.

shop_cart_items quantity int, NOT NULL DECIMAL(15,3), NOT NULL

Количество товара в корзине.

shop_order_items quantity int, NOT NULL DECIMAL(15,3), NOT NULL

Количество отдельной позиции в заказе.

shop_product count_denominator

-

int, NOT NULL

Доступная точность указания складских остатков товара. Возможные значения: 1 (целые штуки), 10 (точность до десятых), 100 (точность до сотых), 1000 (точность до тысячных). Минимальное доступное значение для поля count представляет собой число, обратное значению поля count_denominator.

shop_order_items quantity_denominator

-

int, NOT NULL

Доступная точность количества позиции заказа, которую можно указать в поле quantity. Список доступных значений см. в описании поля count_denominator. Значение в этом поле сохраняется для истории на случай, если свойства товара в заказе изменятся или если товар будет удалён.

shop_product order_multiplicity_factor

-

DECIMAL(9,3), NOT NULL

Шаг добавления товара в корзину. Количество товара во всех заказах, оформленных покупателями на витрине, всегда принудительно округляется вверх — так, чтобы быть кратным значению шага в этом поле.

shop_product_skus order_count_min*

-

DECIMAL(15,3), NULL

Минимальное количество товара в заказе. Покупатель на витрине не может оформить заказ с меньшим количеством этого товара. Должно быть кратным значению поля order_multiplicity_factor.

shop_product_skus order_count_step*

-

DECIMAL(15,3), NULL

Шаг добавления товара в корзину. При нажатии на кнопки «+» и «-» на витрине в корзину добавляется или из корзины удаляется количество, указанное в этом поле. Должно быть кратным значению поля order_multiplicity_factor.

* Поля order_count_min и order_count_step не связаны с поддержкой дробного количества. Их можно заполнять и использовать, даже когда поддержка дробного количества выключена.

В таблицу shop_type также добавлены несколько новых — парных — полей. В каждой паре значение в поле с суффиксом _fixed указывает то, можно ли изменять соответствующее значение в отдельных товарах этого типа или оно включено сразу для всех товаров этого типа.

order_multiplicity_factor
order_multiplicity_factor_fixed

См. описание поля shop_product.order_multiplicity_factor.

count_denominator
count_denominator_fixed

См. описание поля shop_product.count_denominator.

order_count_min
order_count_min_fixed

См. описание поля shop_product_skus.order_count_min.

order_count_step
order_count_step_fixed

См. описание поля shop_product_skus.order_count_step.

Смысл значений в полях с суффиксом _fixed:

  • 0: значение можно изменять отдельно в каждом товаре.
  • 1: значение включено сразу для всех товаров этого типа, и его нельзя изменять отдельно для каждого товара этого типа.
  • 2: значение выключено для всех товаров этого типа, и его нельзя включить отдельно для каждого товара этого типа.

Единицы измерения товаров

Вместо стандартных штук можно будет продавать товары также в метрах, литрах, килограммах или в любых собственных единицах.

Так же, как и поддержку дробного количества, поддержку единиц измерения товаров нужно включить на разных уровнях:

  1. Для всех товаров магазина.
  2. Для выбранных типов товаров.
  3. Для отдельных товаров выбранных типов.

Каждый из вышестоящих уровней влияет на доступность нижестоящего.

Складская и базовая единицы измерения

Для измерения количества товаров используются два вида единиц:

  • Складская — это та единица измерения, в которой владелец магазина сохраняет количество товаров на складе. Например, для обоев такой единицей будет рулон.
  • Базовая — это дополнительная единица измерения, заданная пользователем для более удобного отображения цены товара. Например, если покупатель хочет сравнить цены разных видов обоев, ему удобнее сравнивать цены за квадратный метр, а не за рулон, потому что в разных рулонах может быть разное количество квадратных метров. В этом примере квадратный метр — базовая единица измерения.

Оба вида единиц могут использоваться покупателями на витрине:

  • для просмотра цен товаров в каждой из единиц — на странице товара, в списках товаров, в корзине;
  • для фильтрации, сортировки и сравнения товаров.

Как проверить в PHP-коде, разрешено ли включать для типов товаров базовые и складские единицы:

// Базовые
wa()->getSetting('base_units_enabled', '', 'shop')

// Складские
wa()->getSetting('stock_units_enabled', '', 'shop')

По умолчанию Shop-Script использует целочисленную единицу измерения штуки. Если необходимо добавить другие единицы, то администратор магазина может выбрать в настройках одну из доступных в списке стандартных единиц или добавить свои собственные.

Информация о единицах измерения хранится в таблице shop_unit.

Поля base_unit_id и stock_unit_id в таблицах shop_product и shop_type связаны со значением поля id таблицы shop_unit (кроме значения 0, которое означает системную единицу измерения по умолчанию — штуки).

Поля таблиц базы данных для поддержки единиц измерения

Таблица Поле Описание
shop_product stock_unit_id

Информация о складской единице измерения товара — значение поля id из таблицы shop_unit. Значение 0 означает штуки.

В полях со складскими остатками (shop_product.count, shop_product_stocks.count и других) должно храниться количество именно в этой единице. В корзину и в заказ товар добавляется в этой единицах, она указываются в печатных формах документов.

Например, если магазин продаёт обои рулонами, то на складе будет указано количество рулонов, и купить можно только целое количество рулонов. Нельзя купить любое количество квадратных метров обоев — только какое-то количество целых рулонов.

shop_product base_unit_id

Информация о базовой единице измерения товара — значение поля id из таблицы shop_unit. Значение 0 означает штуки.

В этих единицах может более удобно сравнивать товары на витрине. Базовые единицы используются только для удобства пользователей — они не сохраняются в свойствах корзины и заказа и не используются для формирования печатных форм документов.

В примере с обоями базовая единица измерения — квадратный метр. Покупателю на витрине удобнее сравнивать разные по размеру рулоны по цене за квадратный метр, а не за рулон.

shop_product_skus stock_base_ratio

Соотношение между складской и базовой единицами для артикула (сколько базовых в одной складской). В примере с обоями это количество квадратных метров в одном рулоне.

shop_product base_price

Базовая цена главного артикула товара в основной валюте магазина. Используется для оптимизации сортировки по базовой цене, когда в запросе не используется JOIN с таблицей артикулов.

shop_product min_base_price
max_base_price

Границы базовой цены артикулов товара в основной валюте магазина. Используются для фильтрации по базовой цене, когда в запросе не используется JOIN с таблицей артикулов.

shop_order_items stock_unit_id

Складская единица позиции заказа, id из таблицы shop_unit. 0 означает штуки.

Сохраняется в заказе для истории — на случай, если товар удалят или отредактируют после создания заказа.

В таблицу shop_type добавлено несколько новых — парных — полей; в каждой паре есть поле с суффиксом _fixed.

Смысл значений в полях с суффиксом _fixed:

  • 0: значение можно изменять отдельно в каждом товаре.
  • 1: значение включено сразу для всех товаров этого типа, и его нельзя изменять отдельно для каждого товара этого типа.
  • 2: значение выключено для всех товаров этого типа, и его нельзя включить отдельно для каждого товара этого типа.
stock_unit_id
stock_unit_fixed

Складская единица для типа товаров.

См. описание поля shop_product.stock_unit_id.

base_unit_id
base_unit_fixed

Базовая единица для типа товаров.

См. описание поля shop_product.base_unit_id.

stock_base_ratio
stock_base_ratio_fixed

Коэффициент конвертации единиц измерения: количество базовых единиц в одной складской единице.

См. описание поля shop_product_skus.stock_base_ratio.

Проверка поддержки дробного количества и единиц измерения товаров в установленных приложениях, плагинах, виджетах и темах дизайна

При каждом включении поддержки новых возможностей магазин проверяет, есть ли среди установленных программных продуктов те, которые потенциально могли бы использовать эти возможности, но для которых эта поддержка пока не подтверждена их разработчиками. Разработчики должны будут маркировать поддержку новых возможностей в своих продуктах — о том, как именно это нужно будет делать, мы объявим позднее.

Если установлены продукты без заявленной поддержки дробного количества и единиц измерения, то пользователь увидит их список и ему будет предложено либо отказаться от включения новых возможностей, либо подтвердить их включение — на свой страх и риск.

5 ответов

  • 1
    Ярослав Указов 10 декабря 2021 16:42 #

    Мы так долго этого ждали, и вот дождались! Ура! Ура! Ура!

  • 1
    Anton F 10 декабря 2021 17:47 #

    ? надеюсь вы предусмотрели поддержку старых плагинов не заточенных под дробное кол-во?

    • +1
      Михаил Ушенин Михаил Ушенин Webasyst 13 декабря 2021 17:18 #

      Если плагин не поддерживает новые возможности, он с какой-то вероятностью станет работать с ошибками. Это обычная судьба плагинов, разработчики которых не адаптировали свои продукты к обновлённой системе.

      В интерфейсе пользователя Shop-Script мы добавим раздел для пользователей, который позволит им проверять, насколько хорошо каждый из установленных плагинов поддерживает новые возможности.

  • 1
    Евгений 11 декабря 2021 21:36 #

    когда планируется релиз, хотя бы примерный месяц

    • +1
      Михаил Ушенин Михаил Ушенин Webasyst 13 декабря 2021 17:19 #

      Такой информации пока нет. Сроки будут зависеть от того, как быстро разработчики плагинов и тем дизайна будут адаптировать свои продукты к обновлённому Shop-Script.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите