**Технологии:** PHP 8.2, MySQL/MariaDB, HTML5, CSS3 (Bootstrap 5), JavaScript (Vanilla + Fetch API)
**Архитектура:** MVC (Model-View-Controller)
**База данных:** MySQL 8.0 / MariaDB 10.4+
**Платформа:** PHP 8.x
### Задача клиента
Клиент владеет сетью развлекательных клубов и столкнулся с необходимостью автоматизировать бизнес-процессы, которые ранее велись в Excel и на бумаге. Основные проблемы включали:
**Управление товарами и инвентарем:**
- Отсутствие единой системы учета товаров по нескольким клубам
- Ручной учет остатков, приводящий к ошибкам и расхождениям
- Невозможность отслеживать историю движений товаров
- Сложность проведения инвентаризации и сверки остатков
- Отсутствие автоматического расчета остатков при приходах, перемещениях и продажах
**Ценообразование и закупки:**
- Закупки товаров в разных магазинах и у разных поставщиков
- Необходимость отслеживать цены от различных источников (поставщики, магазины)
- Ручной ввод цен при создании приходов, что замедляло процесс
- Отсутствие истории цен и возможности сравнения
**Перемещения между клубами:**
- Необходимость перемещать товары между клубами сети
- Отсутствие системы отслеживания перемещений
- Невозможность редактирования черновиков перемещений до подтверждения
- Сложность учета цен при перемещениях товаров
**Заказы и обслуживание:**
- Необходимость принимать заказы от клиентов прямо за столиками
- Желание внедрить современное QR-меню без необходимости скачивания приложений
- Необходимость отслеживать статусы заказов в реальном времени
- Разделение прав доступа для администраторов, официантов и кухни
**Финансы и отчетность:**
- Учет кассовых операций (съемка кассы, размен)
- Отсутствие автоматических отчетов по реализации товаров
- Необходимость расчета себестоимости продаж для оценки прибыльности
- Отсутствие аналитики по категориям товаров и периодам
### Цель проекта
Создать комплексную веб-систему управления несколькими клубами, которая позволит:
1. **Централизованно управлять** товарами, инвентарем и операциями всех клубов сети в единой системе
2. **Автоматизировать** учет остатков товаров с учетом всех операций (приходы, перемещения, продажи, корректировки)
3. **Обеспечить гибкое ценообразование** с возможностью отслеживания цен от разных поставщиков и точек закупок
4. **Ускорить процессы** приема товаров через автоматическое подтягивание цен и сканирование штрихкодов
5. **Внедрить современное QR-меню** для улучшения клиентского опыта и сокращения времени обслуживания
6. **Обеспечить прозрачность** операций через детальную отчетность по реализации, движению товаров и финансовым операциям
7. **Разграничить права доступа** для разных ролей сотрудников (администраторы, бармены, официанты)
8. **Обеспечить мобильность** системы с возможностью работы с планшетов и смартфонов
Система должна быть интуитивно понятной, работать быстро и не требовать специального обучения для базовых операций.
### Архитектурные решения
**MVC-архитектура:**
Реализована классическая MVC-архитектура с разделением на:
- **Controllers (38+ файлов)** — бизнес-логика и обработка запросов
- **Views (100+ файлов)** — представление данных пользователю
- **Core** — базовые классы (Controller, Router) для переиспользования
**База данных:**
Спроектирована нормализованная схема с 25+ таблицами:
- Основные сущности: `users`, `roles`, `clubs`, `products`, `categories`
- Операции: `receipts`, `orders`, `transfers`, `cash_operations`
- Учет: `inventory`, `inventory_snapshots`, `product_movements`
- Ценообразование: `suppliers`, `shopping_points`, `product_prices`
- QR-меню: `tables`, `customer_orders`, `customer_order_items`
Использованы внешние ключи с каскадным удалением, индексы для оптимизации, ENUM для статусов операций.
### Ключевые технические решения
**1. Система управления ценами:**
Создана гибкая система с таблицей `product_prices`, поддерживающей:
- Цены от поставщиков (`supplier_id`, `source_type='supplier'`)
- Цены от точек закупок (`shopping_point_id`, `source_type='shopping_point'`)
- Автоматическое подтягивание цен в форму приходов через AJAX API (`api/product_price.php`)
- При выборе товара и поставщика цена автоматически загружается в поле ввода
**2. Автоматический расчет остатков:**
Реализована система движений товаров (`product_movements`) с типами:
- `receipt` — приход товара
- `sale` — продажа товара
- `transfer_in` / `transfer_out` — перемещение между клубами
- `adjustment_positive` / `adjustment_negative` — корректировки при инвентаризации
Остатки рассчитываются динамически через SQL-агрегацию всех движений, что обеспечивает точность данных.
**3. Система инвентаризации:**
- Создание снимков остатков (`inventory_snapshots`)
- Возможность создания с корректировками через интерфейс
- Автоматическое формирование движений типа `adjustment` при расхождениях
- Сравнительные отчеты между снимками для анализа продаж
**4. Отчет по реализации с умным определением цены:**
Реализован алгоритм определения себестоимости:
- Приоритет 1: последняя цена из приходов текущего клуба
- Приоритет 2: последняя цена из приходов исходного клуба (для перемещенных товаров)
- Используется подзапрос с `MAX(created_at)` для получения последней цены перед моментом снимка
**5. QR-меню для клиентов:**
- Генерация QR-кодов для каждого столика через библиотеку QRcode
- Публичный интерфейс без авторизации для клиентов
- AJAX-оформление заказов через `api/submit_order.php`
- Real-time уведомления для официантов через polling (`api/new_customer_orders.php`)
- Автоматическое обновление списка заказов каждые 10 секунд
**6. Перемещения между клубами:**
- Создание черновиков перемещений с возможностью редактирования
- Проверка наличия товаров на складе перед подтверждением
- Автоматическое обновление остатков через транзакции
- Отображение цены из приходов исходного клуба в отчетах получателя
**7. Кассовые операции:**
- Типы операций: съемка кассы, размен, депозиты, браслеты, самоинкасация
- Раздельный учет наличных и безналичных средств
- Автоматическое определение типа оплаты (cash/card/mixed)
- Экспорт отчетов в Excel через PHPExcel
### Технологический стек
**Backend:**
- PHP 8.2 с строгой типизацией и PSR-4 автозагрузкой
- PDO для работы с базой данных, подготовленные запросы для безопасности
- Сессионная аутентификация с ролевым доступом
- REST API endpoints для AJAX-запросов
**Frontend:**
- Bootstrap 5 для адаптивного дизайна
- Vanilla JavaScript, Fetch API для AJAX
- QRcode.js для генерации QR-кодов
**База данных:**
- MySQL 8.0 / MariaDB 10.4+
- Транзакции для атомарности операций
- Сложные JOIN и подзапросы для агрегации данных
- Индексы на ключевых полях для оптимизации
**Безопасность:**
- Ролевой доступ через метод `requireRole()`
- Подготовленные SQL-запросы
- Валидация данных на стороне сервера
### Практическое применение
Система успешно внедрена и используется в сети клубов для ежедневного управления операциями:
**Управление товарами:**
- Единая база товаров для всех клубов сети
- Мгновенное получение актуальных остатков в любой момент времени
- Упрощенная инвентаризация через создание снимков с автоматическими корректировками
- История всех движений товаров для аудита и анализа
**Прием товаров:**
- Сокращение времени на оформление прихода в 3-4 раза благодаря автоматическому подтягиванию цен
- Возможность сканирования штрихкодов для быстрого добавления товаров
- Автоматическое создание нового товара при сканировании неизвестного штрихкода
- Мгновенное обновление остатков после подтверждения прихода
**Ценообразование:**
- Централизованное хранение цен от всех поставщиков и точек закупок
- Возможность сравнения цен для принятия решений о закупках
- Автоматическое заполнение цен при создании приходов
- История цен в приходах для анализа динамики
**Перемещения между клубами:**
- Полный контроль над перемещениями товаров с возможностью редактирования до подтверждения
- Автоматическая проверка наличия товаров перед перемещением
- Точное отображение себестоимости в отчетах получателя товара
**QR-меню:**
- Улучшение клиентского опыта: клиенты заказывают со своих телефонов без скачивания приложений
- Сокращение времени обслуживания: официанты получают уведомления о новых заказах в реальном времени
- Улучшение коммуникации: клиенты видят статус приготовления заказа
- Снижение нагрузки на официантов за счет автоматизации процесса принятия заказов
**Отчетность и аналитика:**
- Автоматический расчет себестоимости продаж для оценки прибыльности
- Детальные отчеты по реализации с разбивкой по категориям и периодам
- Отчеты по движению товаров для анализа оборачиваемости
- Кассовые отчеты для контроля финансовых операций
### Измеримые результаты
**Производительность:**
- Создание прихода товаров: сокращение времени с 10-15 минут до 3-5 минут
- Проведение инвентаризации: экономия 60-70% времени благодаря автоматическим расчетам
- Оформление заказа через QR-меню: сокращение времени с 5-7 минут до 1-2 минут
**Точность данных:**
- Устранение ошибок в остатках благодаря автоматическому расчету на основе движений
- Точный расчет себестоимости благодаря учету цен из приходов
- Сокращение расхождений при инвентаризации на 80-90%
**Удобство использования:**
- Интуитивный интерфейс не требует специального обучения
- Мобильная адаптация позволяет работать с планшетов и смартфонов
- Централизованное управление всеми клубами из одной системы
### Дальнейшее развитие
Система продолжает развиваться с добавлением новых функций по запросам пользователей:
- Реализовано редактирование перемещений для исправления ошибок до подтверждения
- Добавлена система управления ценами от разных источников
- Улучшен алгоритм расчета себестоимости в отчетах
Система демонстрирует готовность к масштабированию и легко адаптируется под новые требования бизнеса благодаря модульной архитектуре и продуманной структуре базы данных.