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

Shop-Script выпускается в двух лицензиях с различной функциональностью: «ПРО» и «ПРЕМИУМ». Поддержка дробного количества и единиц измерения количества товаров, описанная в этой статье, доступна только в лицензии «ПРЕМИУМ» начиная с версии 9.0.0.

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

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

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

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

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

Например, если шаг добавления в корзину установить равным 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, поэтому в таком случае в остатках на складе можно ввести любое целое число.

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

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

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

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

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

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

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

Таблица Поле ПРО ПРЕМИУМ Описание
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_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.