Дробные товары


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

Функциональность плагина

  • Поддержка целочисленных единиц товара
  • Поддержка дробных единиц товара
  • Возможность задания кратности покупки
  • Настройки единиц измерения и кратности покупки по типу товара
  • Контроль ввода количества в темах дизайна с учетом кратности на витрине

Единицы измерения и минимальная кратность

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

Ед. измеренияОписаниеМинимальная кратность

Товары по весу

кг. товар в килограммах 0.001
г. товар в граммах 1 (целочисленный товар)
унция товар в унциях (28.34 г) 1 (целочисленный товар)

Товары по длине

м. товар в метрах 0.01
м. п. товар в погонных метрах 0.01
см. товар в сантиметрах 1 (целочисленный товар)
км. товар в километрах 0.001

Товары по площади

м² товар в квадратных метрах 0.001
га. товар в гектарах 0.001
км² товар в квадратных километрах 0.001
см² товар в квадратных километрах 1 (целочисленный товар)

Товары по объему

л. товар в литрах 0.001
м³ товар в кубических метрах 0.001
см³ товар в кубических сантиметрах 1 (целочисленный товар)
мл. товар в миллилитрах 1 (целочисленный товар)

Целочисленные единицы товара

шт. Штучный товар 1 (целочисленный товар)
л. товар в литрах (не путать с литрами в дробных единицах) 1 (целочисленный товар)
100 г. товар фасованный по 100 грамм 1 (целочисленный товар)
0.5 л. товар в таре 0.5 литра 1 (целочисленный товар)
м. п. товар в погонных метрах (не путать с п. метрами в дробных единицах) 1 (целочисленный товар)



Возможность задания кратности покупки

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

Настройка приведения к кратному работает в нескольких режимах:

  • Отключено (не приводить к кратному)
  • Только на витрине (для покупателей)
  • Везде

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

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

Настройки единиц измерения и кратности покупки

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

Внимание!
Плагин подменяет некоторые модели и экшены самого приложения, в связи с чем в плагине предусмотрена версионность.
Во избежание ошибок работы магазина, устанавливать обновления Shop-Script необходимо будет вместе с выходом обновления плагина!
Это бета версия плагина! 
В данной версии не реализована поддержка дробного количества в:
  • стандартном импорте и экспорте (если очень нужно сделаем)
  • в стандартном обмене с 1С (нет тестовой установки 1С), с модулем 1С Полная интеграция все работает.


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

Логика работы плагина:

Плагин эмулирует дробное количество за счет конвертации видимого покупателю количества в минимальную неделимую единицу. Пример: заводится товар в метрах погонных, для данной размерности минимальная единица будет сантиметр, что составляет одну сотую метра, множитель 100. Соответственно когда покупатель вводит количество в корзине 1.2 м, в базу пишется 1.2 * 100 , что равно 120 см. При запросе данных данные из базы декодируются в видимое пользователем, количеcтво делится на множитель 120 см / 100 = 1.2 м и уже выводится пользователю. Таким же образом конвертируются остатки на складах, позиции заказа и отчеты продаж.

Апи для разработчиков плагинов и приложений:

В плагине предусмотрены методы для взаимодействия с другими плагинами, предусмотрены методы конвертации и кастомизации продуктов, артикулов и их остатков, позиций корзины, позиций заказа, методы добавления и сохранения позиций корзины, все методы описаны в интерфейсе shopZzzfractionalPluginStrategyPublicInterface и shopZzzfractionalPluginHelperUnitsInterface.

Проверка наличия плагина

if(class_exists('shopZzzfractionalPlugin') && shopZzzfractionalPlugin::isOn()) {

/* Тут логика */

}

Получение объекта апи

$api = wao(new shopZzzfractionalPluginFactory())->getStrategy();

Публичные методы:

Конвертирует количество, остатки на складах в массиве $products, а также их skus в видимое для покупателя

Возвращает исходный массив с преобразованными и дополненными данными

$api->decodeProducts(&$products = array());

Конвертирует количество, остатки на складах в массиве $products, а также их skus в минимальную единицу размерности, используется перед записью в бд

Возвращает исходный массив с преобразованными и дополненными данными

$api->encodeProducts(&$products= array());

Конвертирует количество, остатки на складах артикулов в видимое для покупателя

Возвращает исходный массив с преобразованными и дополненными данными

$skus - Массив артикулов одного товара или разных

$api->decodeSkus(&$skus);


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

Возвращает исходный массив с преобразованными и дополненными данными

$skus - Массив артикулов одного товара или разных

$api->encodeSkus(&$skus);


Конвертирует количество (quantity) позиций корзины или заказа в видимое пользователю

Возвращает исходный массив с преобразованными и дополненными данными

$items - Массив позиций корзины или заказа

$api->decodeItemsCount(&$items);


Конвертирует количество (quantity) позиций корзины или заказа в минимальную единицу размерности, используется перед записью в бд

Возвращает исходный массив с преобразованными и дополненными данными

$items - Массив позиций корзины или заказа

$api->encodeItemsCount(&$items);


Конвертирует количество в видимое пользователю (эмуляция дробного)

$count - количество для конвертации

$unit_id - единица измерения для конвертации от базовой находится в $product['unit']

$cast_default - для бесконечного количества вернуть по умолчанию строку или null

$api->decodeCount(&$count = null, $unit_id, $cast_default = '');


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

$count - количество для конвертации

$unit_id - единица измерения для конвертации от базовой находится в $product['unit']

$cast_default - для бесконечного количества вернуть по умолчанию строку или null

$api->encodeCount(&$count = null, $unit_id, $cast_default = '');

Методы приведения к кратному, используются в корзине:

Конвертирует из дробного в минимальную единицу размерности, с приведением количества к кратному

$count - количество для конвертации

$product_data - массив данных продукта

$error - переменная по ссылке возвращает текст ошибки, при переданном не кратном количестве, если в настройках включены уведомления о кратности

$api->encodeAndCastCountByProduct(&$count, $product_data, &$error = null);

Конвертирует количество в видимое пользователю (эмуляция дробного) с приведением к кратному

$count - количество для конвертации

$product_data - массив данных продукта

$error - переменная по ссылке возвращает текст ошибки, при переданном не кратном количестве, если в настройках включены уведомления о кратности

$api-> decodeAndCastCountByProduct(&$count, $product_data, &$error = null);

Приводит переданное количество к кратному

$count - количество для конвертации ДРОБНОЕ!!!!

$product_data - массив данных продукта

$error - переменная по ссылке возвращает текст ошибки, при переданном не кратном количестве, если в настройках включены уведомления о кратности

$api-> castCountByProduct(&$count, $product_data, &$error = null);

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

$quantity - количество для конвертации ДРОБНОЕ!!!!

$sku_id - ID артикула покупаемого товара

$product_id - ID товара

$error - переменная по ссылке возвращает текст ошибки, при переданном не кратном количестве, если в настройках включены уведомления о кратности, также вернется ошибка о недоступном количестве к покупке товара

$api->encodeCartAddQuantity(&$quantity, $sku_id, $product_id = null, &$error = null);

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

$quantity - количество для конвертации ДРОБНОЕ!!!!

$sku_id - ID артикула покупаемого товара

$product_id - ID товара

$error - переменная по ссылке возвращает текст ошибки, при переданном не кратном количестве, если в настройках включены уведомления о кратности, также вернется ошибка о недоступном количестве к покупке товара

$api->encodeCartSaveQuantity(&$quantity, $sku_id, $product_id = null, &$error = null);

Методы Хелперы

Возвращает название ячейки единицы измерения в массиве

$api->unitKey();

Возвращает название ячейки кратности покупки в массиве, используется в конвертации количества с приведением к кратному

$api->multiplicityKey();

Возвращает название ячейки веса позиции заказа в массиве, можно использовать для проверки позиции на тип вес, если ячейка есть значит товар продается по весу

$api->weightKey();

$api->setConvert($flag = null);

$api->returnValueType($type = shopZzzfractionalPluginConfig::RETURN_VALUE_TYPE_NUMERIC);

$api->castReturnValue(&$value);