Спроектировать новый раздел управления промокодами в личном кабинете для администраторов и менеджеров. B2B-платформа для проверки контрагентов, финансового анализа и подбора финансирования. Пользователи: компании (проверяют контрагентов, продают долги), финансовые организации (ищут клиентов), партнеры (банки, факторинговые, инвестиционные компании).
На старте было только общее описание внешнего вида, основных экранов (таблица промокодов и форма создания) от менеджера, основанное на запросе клиента. Полная бизнес-логика, статусная модель, правила переходов и обработка ошибок требовалось проработать в процессе проектирования.
В компании нет аналитики и не проводят исследования и тестирования
В условиях ограничения работала в формате:


































| Статус | Условие | Примечание |
|---|---|---|
| Действует | Промокод создан, срок действия не просрочен, лимит активаций не превышен | — |
| Истек | Просрочен срок действия И/ИЛИ превышен лимит активаций | Наступает автоматически |
| Заблокирован | Промокод был в любом статусе, блокировка по желанию администратора | Можно разблокировать |
| Разблокирован | Промокод сохраняет статус, который был до блокировки | «Истек» → «Истек» «Действует» → «Действует», если позволяют срок и лимит |
| Действие | Статус(ы) промокода | Текст уведомления |
|---|---|---|
| Удалить (один) | Действует | «Удалить промокод? Промокод действует прямо сейчас. После удаления он станет недоступен и его нельзя будет восстановить.» |
| Заблокировать (один) | Действует | «Заблокировать промокод? Промокод действует прямо сейчас. После блокировки он станет недоступен.» |
| Удалить (один) | Истек / Заблокирован | «Удалить промокод? После удаления его нельзя будет восстановить.» |
| Удалить (несколько) | Все «Действует» | «Удалить промокоды (N)? Промокоды действуют прямо сейчас. После удаления они станут недоступны и их нельзя будет восстановить.» |
| Заблокировать (несколько) | Все «Действует» | «Заблокировать промокоды (N)? Промокоды действуют прямо сейчас. После блокировки они станут недоступны.» |
| Удалить (несколько) | Смешанные | «Удалить промокоды (N)? Выбранные промокоды будут удалены и их нельзя будет восстановить. Действующие промокоды станут недоступны.» |
| Заблокировать (несколько) | Смешанные | «Заблокировать промокоды (N)? Выбранные промокоды будут заблокированы. Действующие промокоды станут недоступны.» |
| Разблокировать (несколько) | Смешанные | «Разблокировать промокоды (N)? Выбранные промокоды будут разблокированы.» |
| Действие пользователя | Какое правило нарушено | Текст ошибки |
|---|---|---|
| Не ввел ничего | — | Нет уведомлений |
| Ничего не ввел, нажал «Создать» | Длина названия (пусто) | Не соблюдено условие «От 5 до 50 символов» |
| Ввел название, проверка | Уникальность | Если уникальный: соблюдено условие Если неуникальный: не соблюдено условие «Уникальный промокод» |
| Ввел название более 50 символов | Длина >50 | Не соблюдено условие «От 5 до 50 символов» |
| Ввел название с русскими буквами/спец.символами/эмодзи (длина 5-50) | Недопустимые символы | Соблюдено «От 5 до 50», но не соблюдено «Латинские буквы и цифры» и «Без эмодзи, спец.символов и пробелов (кроме _)» |
| Ввел скидку 0, дробное, отрицательное, >100 | Не 1–99 целое | «Укажите целое число от 1 до 99» |
| Ввел количество активаций 0 или >9999 | Не 1–9999 | «Укажите число от 1 до 9 999» |
| Ввел срок действия раньше сегодня | Раньше сегодня | «Срок действия не должен заканчиваться ранее сегодняшнего дня» |
| Ввел срок действия более 5 лет | Больше 5 лет | «Срок действия не должен быть более 5 лет» |
| Все поля валидны, нажал «Создать» | — | «Промокод успешно создан» |
| Сценарий | Текст ошибки (тост) | Действие системы |
|---|---|---|
| Другой администратор параллельно создал промокод с таким же названием (race condition) | «Промокод с таким названием уже существует. Придумайте другой.» | Toast на экране всех промокодов |
| Потеря соединения с интернетом во время создания | «Нет соединения с интернетом. Промокод не сохранен. Проверьте подключение и повторите попытку.» | Toast на экране всех промокодов |
| Сервер не отвечает (таймаут более 30 секунд) | «Сервер не отвечает. Попробуйте позже или обратитесь в поддержку.» | Toast на экране всех промокодов |
| Внутренняя ошибка сервера (500) | «Произошла техническая ошибка. Промокод не создан. Мы уже работаем над исправлением.» | Логирование ошибки, показ кода обращения в поддержку |
| У пользователя нет прав на создание промокодов | «У вас недостаточно прав для создания промокодов. Обратитесь к администратору.» | Toast на экране всех промокодов |
| Превышен лимит активных промокодов в системе | «Достигнут лимит активных промокодов (1000). Удалите неиспользуемые перед созданием новых.» | Toast на экране всех промокодов. Блокировка кнопки "Создать" |
| Некорректный формат данных от сервера | «Не удалось обработать ответ сервера. Попробуйте обновить страницу.» | Toast на экране всех промокодов |
| Сессия истекла (пользователь вышел из системы) | «Ваша сессия истекла. Пожалуйста, войдите снова для создания промокода.» | Перенаправление на страницу входа, с сохранением введенных данных |
| Блокировка создания из-за технических работ (плановый даунтайм) | «Система на техническом обслуживании до [время]. Создание промокодов временно недоступно.» | Показ уведомления на экране промокодов, указание планового времени окончания работ |
Раздел был полностью согласован клиентом без правок и передан в разработку. Минимизировалось кол-во ошибок и проблемных сценариев, которые бы привели к повторным задачам и правкам. Появилась продуманная система управления промокодами, включающая: