Равномерное распределение скидки php

Распределение скидок в заказах

Распределение скидок нужно для взаимодействия интернет-магазина с платёжными системами и правильной фискализации чеков.

В Shop-Script есть два вида скидок, которые относятся к товарам:

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

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

Распределение скидки по товарам в заказе — обязательное требование для работы современного интернет-магазина. Для того чтобы распределение всегда происходило по одинаковым правилам, Shop-Script сам сразу выполняет эту операцию и отправляет готовые данные в сторонние сервисы с помощью соответствующих плагинов.

В Shop-Script есть 2 способа распределения скидки: с корректировкой итогового размера скидки и с разделением одной из позиций заказа на две. Для выбора нужного вам способа используйте настройку «Распределение скидки в заказе» в разделе «Настройки → Валюты».

Способ 1. Корректировка итогового размера скидки

Для использования этого способа выберите вариант настройки «Распределение скидки в заказе: увеличить скидку».

При использовании этого способа скидка на весь заказ делится поровну по всем группам одинаковых товаров. Например, если общая скидка равна 100 руб., а в заказе 5 одинаковых товаров, то скидка на каждый товар будет равна 100 / 5 = 20 руб.

Более сложный случай: скидка на весь заказ равна 100 руб., а в заказе 3 одинаковых товара. Вроде бы надо «просто» разделить 100 на 3, однако точное деление выполнить не удастся, потому что получится по 33,33 руб. на каждый товар и ещё останется 1 копейка. Если проигнорировать эту копейку, то окажется, что покупатель получит скидку на 1 копейку меньше и из-за этого может быть недоволен работой магазина.

А если применить оставшуюся копейку скидки к одному из товаров, то окажется, что к одинаковым товарам применяются разные скидки. Из-за этого могут возникнуть сложности при частичном возврате заказа: если покупатель захочет вернуть одну из трёх единиц товара, то стоимость какой из них нужно возвращать покупателю: той, где скидка больше на 1 копейку, или той, где скидка меньше? Этот выбор усложнил бы работу администратора магазина.

Как выполняется корректировка скидки

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

Уменьшать скидку мы не можем, чтобы не расстраивать покупателя!

Заказ до распределения скидки
Заказ после распределения скидки

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

Когда размер скидки увеличивается на несколько копеек из-за корректировки, на столько же копеек уменьшается итоговая сумма заказа.

Размер суммы для корректировки скидки

В примере выше показано, как размер скидки был увеличен на несколько копеек, чтобы итоговую скидку можно было без остатка разделить на количество заказанных товаров. Если нужно, то размер суммы для корректировки скидки можно увеличить до десятков копеек, целых рублей, десятков и даже сотен рублей. В этом примере итоговый размер скидки может стать равным не 100,02 руб., а 100,20 руб., 102 руб., 120 руб. или 300 руб. — каждая из этих сумм делится на 3 без остатка (напомним, что 3 — это количество товара в данном примере и оно может быть другим в реальных заказах).

Чтобы изменить размер суммы для корректировки скидки:

Способ 2. Разделение одной позиции заказа на две

Для использования этого способа выберите вариант настройки «Распределение скидки в заказе: разделить одну из позиций в заказе на две».

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

Рассмотрим тот же простой пример: заказ с 3 одинаковыми товарами и скидкой 100 руб. на весь заказ. Поскольку 100 не делится без остатка на 3, Shop-Script разделяет одну товарную позицию из 3 шт. в заказе на две позиции: 2 шт. и 1 шт. Для каждой штуки товара в 1-й позиции применяется скидка 33,33 руб., а для оставшейся штуки товара во 2-й позиции применяется более высокая скидка 33,34 руб. Суммарная скидка в итоге остаётся без изменений: 33,33 руб. х 2 + 33,34 руб. х 1 = 100 руб.

Читайте также:  самые знаменитые американские актеры и актрисы
Заказ до распределения скидки
Заказ после распределения скидки

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

2 комментария

В заказе не разделяется позиция на две

Скидка 100 рублей, количество 3 в итоге скидка в заказе подгоняется а не распределяется.

Подскажите что мы делаем не так

В вашем примере не соблюдается условие «В случаях, когда невозможно нацело разделить скидку по позициям заказа»: скидку 99,99 руб. можно точно разделить на 3.

Почему у вас скидка оказалось равной 99,99 руб. вместо 100 руб., как вы написали, нужно подробнее изучить настройки вашего магазина. Напишите нам для этого в службу поддержки, пожалуйста.

В Shop-Script версии 8.21 такое поведение повторить не удалось. Обновите свой магазин до последней доступной версии, если вы этого ещё не сделали.

Источник

Равномерное распределение скидки php

С 1 июля 2017 прекращена поддержка программного продукта Frontol 4
С 9 ноября 2019 прекращена поддержка программного продукта Frontol 5
пруф

С 3 августа 2017 восстановление лицензий производится ТОЛЬКО через СервисДеск
Просьба обращаться к партнерам компании для оформления заявок в СД

Начинающий

Группа: Пользователи
Сообщений: 89
Регистрация: 20.4.2005
Пользователь №: 380

Здравствуйте,
У нас имеется Frontol, работающий с внешеней платежной системой АСТОР:RS.Loaylty. Оказалось, что при оплате чека бонусами (дается суммовая скидка на чек, равная кол-ву бонусов) скидка распределяется не равномерно по позициям, а последовательно. Техподдержка дала четкий и вразумительный ответ:

«Ручная скидка распределяется по позициям равномерно. Как это происходит с обычной скидкой.
При оплате бонусом скидка распределяется последовательно по каждой позиции, начиная с первой, пока не спишется вся сумма скидки. Приэтом с каждой позиции списывается максимально возможная сумма.
Почему сделано так. Дело в том, что обычная скидка, если ей не хватает суммы в позиции, может уменьшится, и тогда сумма фактически начисленной скидки станет уменьшится. Что нормально для скидки на чек, но недопустимо для Оплаты по бонусу. Сумма Оплаты по бонусу должна быть распределена вся по позициям полностью.»

Есть ли решение проблемы?
Можно ли написать какой-то скрипт, чтобы изменить процесс распределения скидок?

Магистр слова

Группа: Партнеры
Сообщений: 14 678
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778

Магистр слова

Группа: Специалисты
Сообщений: 4 072
Регистрация: 16.5.2008
Пользователь №: 13 449

Тут скидка начисляется не из справочника, поэтому не получится так сделать.

Источник

1. Вычисляем, во сколько раз отличается 100 от суммы 150 и 50.
100/(150+50) = 0,5

2. Умножаем наши суммы на полученный к-т.
150 * 0,5 = 75
50 * 0,5 = 25

(3)Формулой это типа:
Ч1 = 150
Ч2 = 100
Ч3 = 50
Сумма = Ч2 / (Ч1 + Ч3)
Ч1 = Ч1 + Ч1 * Сумма
Ч3 = Ч3 + Ч3 * Сумма

Все понятно, всем спасибо.

(20)
declare t table (id int, b decimal)
declare @sum as decimal

insert t values (1, 100), (2, 50)

select
cast(@sum / (SUM(b) OVER()) * b as decimal(15,2)) AS t
from
t

Усложним задачу:
Есть главный документ.
Сумма документа = 150
Нал = 50
БезНал = 100

Он делится на 2 документа.

Это 1с розница, программно деление чека выглядит так:

Если Константы.ДваФР.Получить() Тогда
Запрос = Новый Запрос(»
|ВЫБРАТЬ * ПОМЕСТИТЬ ТабТов ИЗ &ТабТов КАК ТТ;
|ВЫБРАТЬ *
|ИЗ
| ТабТов КАК Товары
|ГДЕ
| Товары.Номенклатура.ТоварОрганизации = &Организация»);
Запрос.УстановитьПараметр(«ТабТов», Товары.Выгрузить());
ВремКассаККМ = КассаККМ;
Оплаты = Оплата.Выгрузить();
Организации = Справочники.Организации.Выбрать();
Пока Организации.Следующий() Цикл
Если Организации.Ссылка = Магазин.ОсновнойСклад.Организация Тогда;
Организация = Справочники.Организации.ПустаяСсылка();
Иначе
Организация = Организации.Ссылка;
КонецЕсли;
Запрос.УстановитьПараметр(«Организация», Организация);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
ЭтотОбъект.Товары.Загрузить(Результат.Выгрузить());
ФР = ПолучитьСерверТО().ПолучитьИдентификаторПоИдКассы(Организация);
Если ЗначениеЗаполнено(Организация) И Не ПустаяСтрока(ФР) Тогда
КассаККМ = ПолучитьСерверТО().ПолучитьКассуККМ(ФР);
Иначе
КассаККМ = ВремКассаККМ;
КонецЕсли;
ИтогСуммы = Товары.Итог(«Сумма»);
ИтогОплат = Оплаты.Итог(«Сумма»);
Если ИтогСуммы <> ИтогОплат Тогда
ЭтотОбъект.Оплата.Загрузить(Оплаты);
Для Каждого ФормаОплат Из Оплата Цикл

КонецЦикла;
КонецЕсли;
ЗавершитьЗакрытиеЧека2(Печать, РучнойРежим, ВыбратьДокументПечати, ФР);
КонецЕсли;
КонецЦикла;
Иначе
ЗавершитьЗакрытиеЧека2(Печать, РучнойРежим, ВыбратьДокументПечати);
КонецЕсли;

Источник

Корректировка скидки в Shop-Script 8.9

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

Читайте также:  райа и последний дракон озвучка русская актеры и роли

В Shop-Script есть два вида скидок, которые относятся к товарам:

Есть ещё скидка на стоимость доставки, но к этой ситуации она не имеет отношения.

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

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

Получается, что распределение скидки по товарам в заказе — это сегодня обязательное требование для работы интернет-магазина. Для того чтобы распределение всегда происходило по одинаковым правилам, Shop-Script сам сразу выполняет эту операцию и отправляет готовые данные в сторонние сервисы с помощью соответствующих плагинов.

Откуда же всё-таки берутся лишние копейки в скидке?

Копейки появляются в тех случаях, когда не получается поровну распределить скидку по товарам. Простой пример: надо распределить скидку 100 руб. по 3 одинаковым товарам. Получится скидка 33,33 руб. на товар, но станется 1 копейка, которую нельзя просто «выбросить», потому что из-за этого уменьшится скидка покупателя и он может от этого расстроиться: «Обещали скидку 100 руб., но копейку и тут зажали!»

Чтобы не расстраивать покупателя, скидку уменьшать не будем. Но её ведь всё равно надо распределить по товарам! Выход — скидку можно увеличить. Увеличиваем её постепенно по одной копейке — до тех пор, пока она не станет кратной количеству заказанных товаров. В этом примере мы увеличим скидку со 100 руб. до 100,02 руб. Она поделится на 3 товара поровну, и получится по 33,34 руб. на товар.

Ура! Теперь скидка распределяется поровну, и проблема с платёжными системами и фискализацей чеков решена.

Давайте обсудим

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

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

19 комментариев

В каком магазине было обращение от покупателей про «Копейку зажали!»? Может при стоимости заказа в 49 999,99 они с курьеров или на кассе тоже сдачу просят?
Основные покупатели приложений владельцы магазинов и для них главное удобство работы, а так получился бонус покупателям, за их счёт, о котором не просили.

В эвоторе в случае 3-х товаров и 100 руб скидки, в чеке пишется 2 товара скидка по 33,33 и 1 товар 33,34.

Верно предложил Worker, увеличивать скидку по целой единицы пока не будет делиться. И сделать настройку в магазине включить/отключить округление округление-скидки до целого числа. Если кто то из-за 2 рублей хочет морочиться с копейками. С нетерпением ждем обновления, а то бухгалтер с ума сойдет от этих копеек. Или подскажите как это можно самим изменить пока ждем обновления.

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

Из-за этих копеек перестало нормально работать округление валют! Сделайте чтобы сначала скидка на заказ делилась на все товары, а потом получившееся цена товара округлялась до целого. А для решения проблем с копейками есть два нормальных пути, которые предложил Worker. Можно обе их и реализовать, пусть кто как хочет, так и включает в настройках.

Однозначно за округление! Курьерские службы ругаются на аптечные цены. Где курьеру столько мелочи взять? Магазин от 2-5 рублей не обеднеет.

https://www.webasyst.ru/store/plugin/shop/currency/#_ga=2.150263806.957990872.1586868098-44785708.1583930963 + округление точности до 4

Сотни или уже тысячи магазинов с установленным обновлением вынуждены терпеть этот бред. У нас так вообще пару заказов не получили статус «Оплачен», т.к. заказ был на 1600 руб, а в эквайринг передано 1599,98 руб. В итоге заказы не оплачены, мы обнаруживаем данную ошибку через несколько дней, когда хотим звонить клиенту, но в служебных комментариях: «Ответ платежной системы получен, но не применен к этому заказу по следующей причине: Сумма заказа изменилась: ожидалось 1600.00, получено 1599.98.»

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

По поводу ошибки с изменением статуса заказа напишите, пожалуйста, подробное сообщение в службу поддержки: https://www.webasyst.ru/my/requests/my/
Мы изучим ситуацию и передадим конкретную информацию разработчикам.

конечно все недовольны, у нас каждый второй клиент спрашивает, а зачем у вас копейки?

Да, история со скидками возможно и нужная для платёжных систем, но не для обычных людей. Идеально бы дать возможность выбирать эту настройку в настройках магазина. После этого обновления уверен многие магазины были удивлены что случилось :)). Я сам долго понять не мог что за копейки вылазят.

Изменили в конфиге сайта точность до 4 знаков, копейки теперь не вылезают, но пока не известно как на это реагирует плагины онлайн оплаты, было несколько заказов у которых произошла ошибка в момент оплаты, точно не знаю из-за этого ли, клиенты оформили повторный заказ без скидки и там оплата прошла. как это сделать можно почитать здесь https://support.webasyst.ru/shop-script/23384/custom-currency-config/
Создали файл wa-config/currency.php
array(
‘precision’ => 4, //вместо стандартного значения 2
),
);

Половина заказов с копейками! БРЕД. Срочно исправляйте этот маразм!

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

Лучше бы дали возможность фильтровать по ценам со скидками и сортировать товары в категориях с учетом скидок!

Напишите своё предложение в специальном разделе форума, пожалуйста: https://support.webasyst.ru/forum/ideas/

Сделайте возможность начислять скидку на каждый товар в фронтенде в ручную. Чтобы каждый раз не пересчитывать и не вносить вручную цены на каждый товар с разной скидкой.

Напишите нам, пожалуйста, подробнее об этом в службу поддержки https://www.webasyst.ru/my/requests/my/ или в специальном разделе форума https://support.webasyst.ru/forum/ideas/, чтобы обсудить конкретные нюансы вашего предложения.

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

Платформа
Магазин Webasyst
Помощь

Мы получаем и обрабатываем персональные данные посетителей сайта в соответствии с Политикой обработки персональных данных. Отправка персональных данных с помощью любой страницы сайта подразумевает согласие со всеми пунктами Политики.

Источник

Проверка гипотезы о виде распределения

Характеристики распределений

Равномерное распределение

Графическое представление

Функция плотности равномерного распределения

Математическое ожидание: M[X] = (a+b)/2
Дисперсия:

Нормальное распределение

Графическое представление

Плотность распределения

Математическое ожидание: M[X]=a

Дисперсия: D[X] = σ 2

Запись Х

N( a ; σ) означает, что случайная величина Х распределена по нормальному закону с параметрами a и σ.

Показательное распределение

Графическое представление

Плотность распределения

Математическое ожидание: M[X] = 1/λ
Дисперсия: D[X] = 1/λ 2

Распределение Пуассона

Биномиальное распределение

Проверка гипотез о виде распределения.
1. Проверим гипотезу о том, что Х распределено по нормальному закону с помощью критерия согласия Пирсона.

Пример 1. Нормальным или гауссовым распределением называется непрерывное распределение, плотность которого имеет вид

φ(x)– функция Гаусса (таблица),
Параметры a и σ имеют смысл математического ожидания и среднего квадратичного отклонения.

2. Справедливы формулы:

Ф(x)– интеграл вероятностей, таблица.
Обратим внимание, что Ф(-x)=–Ф(x), Ф(x)=0.5 при x>5.

3. Правило трех сигм: P(|X-a|>3ε)=0.0027 – т.е. вероятность отклонения нормально распределенной величины от математического ожидания более чем на 3σ практически равна нулю.
Главная особенность, выделяющая нормальный закон среди других законов распределения, состоит в том, что он является предельным, к которому приближаются другие законы при весьма часто встречающихся условиях.

Выбираем в качестве начала интервала 6.07, так как именно на этот интервал приходится наибольшее количество

Наиболее часто встречающееся значение ряда – 6.16
Медиана
Медиана делит выборку на две части: половина вариант меньше медианы, половина — больше

Таким образом, что 25% единиц совокупности будут меньше по величине 5.86
Q2 совпадает с медианой, Q2 = 6.1

Остальные 25% превосходят 6.26
Децили (децентили)
Децили – это значения признака в ранжированном ряду распределения, выбранные таким образом, что 10% единиц совокупности будут меньше по величине D1; 80% будут заключены между D1 и D9; остальные 10% превосходят D9

Таким образом, что 10% единиц совокупности будут меньше по величине 5.76

Каждое значение ряда отличается от другого не более, чем на 0.22
Дисперсия

Среднее квадратическое отклонение

Каждое значение ряда отличается от среднего значения 6.08 не более, чем на 0.25
Коэффициент вариации

Источник

Онлайн портал