Учет продаж и производства ведется в системе "МойСклад"
Необходимо на основе данных из программы формировать заказы поставщикам по определенному алгоритму, с выскакивающим уведомлением на компьютере пользователя, как только заказ сформирован. Интерфейс не важен, можно просто показать где какая переменная и какая формула в коде.
Данные:
Переменные из статистики (задаем изначально, далее обновляются):
1) T максимальный срок доставки товара до конкретной точки продаж (начало отсчета заказ поставщику, конец отсчета приемка на основании соответствующего заказа);
2) M максимальный расход товара на каждой точке продаж за T времени;
3) N1 количество товара на соответствующем складе;
4) N2 количество товара в заказах поставщику;
5) D доля каждой позиции в заказе;
Постоянные задает пользователь:
1) Поставщик для каждой позиции;
2) S сумма одного заказа у поставщика;
3) H частота заказа у поставщика (кратно 1 суткам);
4) V время заказа;
5) R точность округления для каждой позиции;
6) С цена от поставщика единицы товара;
7) K коэффициент запаса.
Определение момента заказа:
1) Если H не указана для поставщика, то после каждой отгрузки и проведения производства система проверяет каждую позицию по критерию: N1+N2<=K*M. Если хотя бы одна из позиций ему удовлетворяет, то делаем «заказ» у соответствующего поставщика.
2) Если H указана для поставщика, то в соответствии с ней, в установленное время V система проверяет все позиции поставщика по критерию N1+N2<=K*M. Если хотя бы одна из позиций ему удовлетворяет, то делаем «заказ» у соответствующего поставщика.
Формирование заказа:
1) Если S не указана для поставщика, то количество для заказа считаем по формуле K*M-(N1+N2), по этой же формуле заказываем все позиции, которые заказываем у данного поставщика, но которые пока не соответствуют критерию: N1+N2<=K*M. Все количества формируются в соответствии с R каждой позиции. Заказы в «Мойсклад» разделяются в соответствии с точками продаж, для отправки поставщику получаем на выходе единый суммарный заказ.
2) Если S указана для поставщика, то считаем долю каждого товара в заказе по формуле (D): Сумма всех товаров K*M-(M-(N1+N2))+K*M-(M-(N1+N2))+… разделить на K*M-(M-(N1+N2)) конкретного товара, если K*M-(M-(N1+N2)) конкретного товара <=0, то приравниваем её и долю к 0. Далее D*S/C для каждой позиции и получаем количество для заказа (Z). Округляем их в соответствии с R каждой позиции по стандартным правилам (Z0). Сумму заказа нужно максимально приблизить к S, но не превзойти её, можно предложить свой вариант, я вижу следующий: А) если сумму нужно уменьшить: смотрим стоимость по каждой позиции одного шага округления R, выбираем позиции при уменьшении которых сумма максимально бы приблизилась к S и вычитаем их , если стоимости одного шага округления совпадают по некоторым позициям то считаем разницу Z0-Z и убираем сначала позиции у которых эта разница будет наибольшей Б) если сумму нужно увеличить: смотрим стоимость по каждой позиции одного шага округления R, выбираем позиции при увеличении которых сумма максимально бы приблизилась к S, и прибавляем их , если стоимости одного шага округления совпадают по некоторым позициям то считаем разницу Z0-Z и убираем сначала позиции у которых эта разница будет наименьшей. Заказы в «Мойсклад» разделяются в соответствии с точками продаж, для отправки поставщику получаем на выходе единый суммарный заказ.
В приложении пример