Дробное количество товаров и единицы измерения количества товаров
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 (точность до тысячных). Минимальное доступное значение для поля |
shop_order_items
|
quantity_denominator
|
- |
int, NOT NULL
|
Доступная точность количества позиции заказа, которую можно указать в поле |
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
|
См. описание поля |
count_denominator count_denominator_fixed
|
См. описание поля |
order_count_min order_count_min_fixed
|
См. описание поля |
order_count_step order_count_step_fixed
|
См. описание поля |
Смысл значений в полях с суффиксом _fixed
:
- 0: значение можно изменять отдельно в каждом товаре.
- 1: значение включено сразу для всех товаров этого типа, и его нельзя изменять отдельно для каждого товара этого типа.
- 2: значение выключено для всех товаров этого типа, и его нельзя включить отдельно для каждого товара этого типа.
Единицы измерения количества товаров
Вместо стандартных штук можно продавать товары также в метрах, литрах, килограммах или в любых собственных единицах.
Так же, как и поддержку дробного количества, поддержку единиц измерения товаров нужно включить на разных уровнях:
- Для всех товаров магазина.
- Для выбранных типов товаров.
- Для отдельных товаров выбранных типов.
Каждый из вышестоящих уровней влияет на доступность нижестоящего.
Складская и базовая единицы измерения
Для выражения количества товаров используются два вида единиц:
- Складская — это та единица измерения, в которой владелец магазина сохраняет количество товаров на складе. Например, для обоев такой единицей будет рулон.
- Базовая — это дополнительная единица измерения, заданная пользователем для более удобного отображения цены товара. Например, если покупатель хочет сравнить цены разных видов обоев, ему удобнее сравнивать цены за квадратный метр, а не за рулон, потому что в разных рулонах может быть разное количество квадратных метров. В этом примере квадратный метр — базовая единица измерения.
Оба вида единиц могут использоваться покупателями на витрине:
- для просмотра цен товаров в каждой из единиц — на странице товара, в списках товаров, в корзине;
- для фильтрации, сортировки и сравнения товаров.
Как проверить в 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
|
Информация о складской единице измерения товара — значение поля В полях со складскими остатками ( Например, если магазин продаёт обои рулонами, то на складе будет указано количество рулонов, и купить можно только целое количество рулонов. Нельзя купить любое количество квадратных метров обоев — только какое-то количество целых рулонов. |
shop_product
|
base_unit_id
|
Информация о базовой единице измерения товара — значение поля В этих единицах может более удобно сравнивать товары на витрине. Базовые единицы используются только для удобства пользователей — они не сохраняются в свойствах корзины и заказа и не используются для формирования печатных форм документов. В примере с обоями базовая единица измерения — квадратный метр. Покупателю на витрине удобнее сравнивать разные по размеру рулоны по цене за квадратный метр, а не за рулон. |
shop_product_skus
|
stock_base_ratio
|
Соотношение между складской и базовой единицами для артикула (сколько базовых в одной складской). В примере с обоями это количество квадратных метров в одном рулоне. |
shop_product
|
base_price
|
Базовая цена главного артикула товара в основной валюте магазина. Используется для оптимизации сортировки по базовой цене, когда в запросе не используется |
shop_product
|
min_base_price max_base_price
|
Границы базовой цены артикулов товара в основной валюте магазина. Используются для фильтрации по базовой цене, когда в запросе не используется |
shop_order_items
|
stock_unit_id
|
Складская единица позиции заказа, Сохраняется в заказе для истории — на случай, если товар удалят или отредактируют после создания заказа. |
В таблице shop_type
используется несколько дополнительных — парных — полей; в каждой паре есть поле с суффиксом _fixed
.
Смысл значений в полях с суффиксом _fixed
:
- 0: значение можно изменять отдельно в каждом товаре.
- 1: значение включено сразу для всех товаров этого типа, и его нельзя изменять отдельно для каждого товара этого типа.
- 2: значение выключено для всех товаров этого типа, и его нельзя включить отдельно для каждого товара этого типа.
stock_unit_id stock_unit_fixed
|
Складская единица для типа товаров. См. описание поля |
base_unit_id base_unit_fixed
|
Базовая единица для типа товаров. См. описание поля |
stock_base_ratio stock_base_ratio_fixed
|
Коэффициент конвертации единиц измерения: количество базовых единиц в одной складской единице. См. описание поля |