Задача
Учёт вёлся в тетрадях. Из-за этого никто не мог быстро сказать, сколько товара действительно осталось, какие партии скоро потеряют пригодность и что нужно заказать к ближайшей поставке. Закупка делалась по памяти закупщика, а её ошибки обнаруживались либо пустой полкой, либо списанием просрочки.
Осложняло всё то, что три магазина торгуют по-разному. Продукты зависят от сроков годности и сезонного спроса. Стройматериалы — от сезона и крупных нерегулярных продаж, когда один клиент забирает месячный объём. Автозапчасти — это длинный ассортимент, где половина позиций продаётся редко, но должна лежать на складе. Одна и та же логика пополнения для этих трёх случаев не работает, а три отдельные системы не дали бы руководителю общей картины.
Решение
Кассовый контур. Кассир входит под своим логином, открывает смену и находит товар по штрихкоду, артикулу или названию. Система считает сумму, скидки и способ оплаты, печатает чек и сразу уменьшает остаток нужного магазина. Поддержаны возвраты, отмены, корректировки и закрытие смены со сверкой кассового итога. Каждая операция сохраняет сотрудника, время, магазин и состав чека — именно поэтому история продаж стала достоверным источником и для складского учёта, и для прогноза, а не ещё одним набором цифр, который приходится сверять.
Партии и пригодность. Поступления учитываются партиями. Для продуктов фиксируются дата приёмки и срок годности, и при продаже и планировании применяется FEFO: первой уходит партия, которая раньше станет непригодной. Для стройматериалов и автозапчастей срок годности можно не применять, сохранив серийный, партионный или обычный количественный учёт. Система показывает остаток по магазину и складу, зарезервированный товар, ожидаемые поставки, расхождения инвентаризации, медленно оборачиваемые позиции и партии с приближающимся сроком списания.
Прогноз спроса. Прогноз строится отдельно для каждой пары «товар — магазин». В основе — модель временных рядов с экспоненциальным сглаживанием уровня, тренда и сезонности: она учитывает недавнюю скорость продаж, устойчивое изменение спроса и повторяющиеся сезонные колебания. Для новых и редко продаваемых позиций, где ряда просто нет, используется более простая оценка по средней скорости и похожей товарной категории.
Расчёт потребности. Закупщик выбирает горизонт — три дня, неделю, месяц. Система прогнозирует спрос на этот период с учётом времени до поставки и считает:
```text потребность = прогноз спроса + страховой запас − пригодный остаток − товар в ожидаемых поставках ```
Ключевое слово здесь — «пригодный»: партии, срок годности которых истекает раньше расчётного горизонта, не считаются полноценным запасом, хотя физически лежат на складе. Количество округляется до упаковки поставщика и проверяется по минимальной партии заказа.
Контроль остаётся у человека. Система не отправляет непрозрачный автоматический заказ. Закупщик видит тренд, историю продаж, остатки и объяснение расчёта, может изменить рекомендацию вручную и оставить комментарий. Рекомендации группируются по магазину, поставщику и дате следующей поставки; отдельно подсвечиваются дефицит, избыточный запас, риск списания и товары с аномальным изменением спроса. После утверждения формируется заявка, а после поступления фактические количества связываются с исходной заявкой — так система видит отклонение плана от поставки и учитывает его в следующем цикле.
Аналитика. Отчёты показывают продажи и маржинальность по магазинам и категориям, оборачиваемость, дни запаса, дефицит, списания, приближающиеся сроки годности и точность предыдущих прогнозов. Руководитель сравнивает три направления бизнеса, закупщик — быстро находит позиции, требующие решения до планового заказа.
Серверная часть построена на ASP.NET.
Результат
«Монолит» перешёл от тетрадей к сквозному цифровому учёту продаж, партий и остатков. Кассиры проводят товары в системе, склады обновляются сами, а закупщик получает готовую потребность на выбранный период — с обоснованием, которое можно оспорить.
Одна платформа обслуживает три принципиально разных ассортимента и три набора правил хранения, но даёт руководителю общий отчёт. Прогноз не существует отдельно от учёта: продажа влияет на остаток и следующий расчёт закупки в тот же момент. За счёт этого одновременно снизился риск дефицита, избыточных закупок и списаний просроченных партий.