Торговая платформа Честный Чек









Сайт: https://chestniychek.ru/
1. О проекте
- Платформа разработана для сети розничных точек, которым требуется:
- Единый каталог товаров с актуальными ценами и остатками
- Прием оплаты от клиентов через разные каналы (онлайн, терминалы, мобильные приложения)
- Работа в условиях нестабильного интернета (рынки, ярмарки, выездная торговля)
- Интеграция с корпоративной учетной системой для синхронизации данных о продажах
Ключевая задача — обеспечить бесперебойную работу продавцов даже при отсутствии связи, сохраняя при этом полный контроль над финансами и инвентаризацией.
Проект построен на Yii 2 и включает:
- Модульную архитектуру для гибкого расширения
- Асинхронную обработку платежей через очередь
- Автономный режим через PWA с кешированием критических данных (QR-коды, каталог)
- Гибкую систему скидок, подписок и промоакций
- Административную панель с RBAC-разграничением доступа
2. Архитектура проекта
2.1. Структура приложения
Модульный принцип — вся функциональность разбита на 19 независимых модулей. Каждый модуль может быть включен/отключен без влияния на остальные.
modules/<name>/
├── Bootstrap.php # Инициализация модуля (URL, меню, события)
├── Module.php # Базовый класс с доступом и фильтрацией
├── controllers/ # Входные точки (веб/API)
├── models/ # Бизнес-логика и работа с БД
├── views/ # Шаблоны интерфейса
├── migrations/ # Локальные изменения БД
├── jobs/ # Задачи для асинхронной обработки
└── commands/ # Консольные скрипты (cron, синхронизация)
Благодаря этой структуре новая функциональность (например, новый способ оплаты или тип подписки) добавляется как отдельный модуль без изменения ядра.
2.2. Работа с платежами
Система поддерживает несколько платежных провайдеров, что дает возможность:
- Выбирать наиболее выгодные тарифы
- Обеспечивать резервирование (при сбое одного провайдера — переключение на другой)
- Подключать локальные банковские решения для конкретного региона
Архитектурное решение:
- Единый сервис PaymentService абстрагирует работу с разными провайдерами
- Каждый провайдер реализует общий интерфейс (подтверждение, отмена, рефанд)
- Вебхуки обрабатываются через отдельный контроллер с валидацией подписи
- Для синхронизации статусов используется очередь и консольные команды
Это позволяет добавлять нового провайдера за ~2-3 дня разработки без переписывания существующей логики.
2.3. Интеграция с учетной системой
Вместо прямого доступа к БД корпоративной системы используется JSON API с подписью запросов. Это:
- Изолирует платформу от внутренней структуры 1С
- Позволяет легко тестировать интеграцию на стендах
- Обеспечивает аудит всех передаваемых данных
Поток данных:
- Кассовое устройство отправляет чек в платформу
- Платформа проверяет подпись, обогащает данные (скидки, бонусы)
- Сохраняет транзакцию в локальной БД и ставит в очередь
- Асинхронно передает подтверждение обратно в учетную систему
- В случае сбоя — повторные попытки с экспоненциальной задержкой
Такой подход гарантирует согласованность данных даже при временных проблемах сети.
2.4. Офлайн-режим через PWA
Платформа работает как Progressive Web Application, что позволяет:
- Установить на устройство продавца как приложение
- Кешировать статику и критический контент через Service Worker
- Работать с QR-кодами без доступа к интернету
Особенность реализации QR-кеширования:
- QR-код генерируется на сервере (единый стандарт, контроль качества)
- При наличии интернета клиент загружает и сохраняет QR в Cache Storage
- В IndexedDB хранится только мета-информация (когда сохранен, версия)
- При офлайн-режиме отображается закешированный код
Это гарантирует, что покупатели всегда могут отсканировать QR для оплаты, даже если связь на точке продажи отсутствует.
2.5. Асинхронная обработка (очереди)
Для задач, не требующих мгновенного ответа, используется DB-очередь:
- Отправка уведомлений (email, push)
- Обновление остатков после продажи
- Генерация отчетов
- Синхронизация с внешними системами
Преимущества:
- Снижение нагрузки на веб-сервер
- Возможность повторной обработки при ошибках
- Прозрачное управление задачами через админку
2.6. SEO и управление контентом
Для страниц товаров, категорий и статей используется гибкая система шаблонов:
- В контроллерах только передача данных
- Формирование мета-тегов происходит во view-слое через специальный менеджер
Приоритет: если для конкретной страницы есть ручные настройки → они применяются, иначе — шаблон категории, иначе — глобальный шаблон - Поддержка плейсхолдеров: {name}, {price}, {category} и кастомных
Это позволяет маркетинговому отделу самостоятельно управлять метаданными без разработчиков.
3. Технические детали для разработчиков
3.1. Стек и версии
- PHP 8.4+ с использованием всех современных фич (типизация, атрибуты, match-выражения)
- MySQL 9.5 с транзакциями и индексами для быстрых запросов
- Docker для унификации окружения разработки и продакшена
- Bootstrap 5 — адаптивный интерфейс для ПК, планшетов, смартфонов
3.2. Безопасность (общие принципы)
- Доступ на основе ролей (RBAC) — каждый контроллер проверяет права через access
- Все ключи и пароли хранятся в .env (исключен из репозитория)
- Входящие запросы проходят валидацию по схемам (JSON Schema)
- Для чувствительных операций используется подпись запросов (HMAC)
- Логирование всех критических событий с разделением по потокам (отдельные файлы для API, платежей, ошибок)
3.3. Тестирование
- Codeception для unit-тестов (модели, компоненты) и функциональных тестов (контроллеры)
- Фикстуры для изолированной среды тестирования
- CI-процесс (например, GitHub Actions) запускает тесты при каждом PR
Команды разработчика:
vendor/bin/codecept build # Сборка акторов после изменения модулей
vendor/bin/codecept run # Запуск всех тестов
vendor/bin/codecept run unit,functional # Выборочный запуск
3.4. Деплой и окружение
Для локальной разработки используется docker-compose:
docker compose up -d
docker compose run --rm php composer install
docker compose run --rm php yii update # Миграции + начальные данные
Для продакшена — отдельный стек с настроенным кешированием (Redis, CDN).
3.5. Мониторинг и логи
- Структурированные логи (JSON) для сбора в ELK/Sentry
- Разделение по каналам: api, payment, cron, auth, sync
- Метрики через Prometheus + Grafana (бизнес-показатели и технические)
4. Итоговые преимущества платформы
- Универсальность — работает как стационарная касса, так и мобильное устройство
- Устойчивость к сбоям — офлайн-режим и асинхронная обработка
- Гибкость — модули позволяют дорабатывать систему без простоев
- Прозрачность — аудит всех операций от чека до банка
- Масштабируемость — горизонтальное расширение за счет очередей и микросервисного подхода
- Интеграционная готовность — API для 1С, маркетплейсов, CRM
5. Для чего этот кейс разработчику
Этот проект — пример промышленной архитектуры на Yii 2, которая:
- Использует современные подходы (модульность, очереди, PWA)
- Решает реальные бизнес-задачи (онлайн-офлайн, платежи, синхронизация)
- Имеет четкие паттерны (Service Layer, Repository, DTO)
- Сопровождается тестами и документацией
Такая система может быть адаптирована для: ритейла, HoReCa, мероприятий, доставки и любых сценариев, где нужен быстрый прием оплаты и работа в автономном режиме.
ваш проект?
Кейсы с результатами
Реальные проекты с измеримым эффектом для бизнеса. Делимся тем, чем гордимся.

Сайт детского лагеря ДОЦ Медвежонок
Как мы разработали сайт детского лагеря ДОЦ Медвежонок с нуля за 18 дней — и он принял первые заявки до начала летнего сезона.

Сайт для детского комплекса ДОК Мечта
Как мы создали полноценный корпоративный сайт для детского лагеря «Мечта» в Анапе — с нуля до запуска. Многостраничник, структура, SEO и первые заявки.

CRM для сервиса выездных услуг «Муж на час»
Как мы за месяц разработали CRM для сервиса «Муж на час»: автоматический сбор заявок с сайтов и телефонии, финансовый учёт, напоминания.

Сайт семейного комплекса Мечта
Обновили сайт семейного комплекса «Мечта» в Анапе: внедрили современный дизайн в стиле Bento UI, упростили бронирование, адаптировали под мобильные устройства. Результат: +52% к конверсии, рост прямых заявок без агрегаторов.