EN
← Все технологии

LARAVEL · BIG FISH

Laravel.
Сложная логика.
Удобный продукт.

Разрабатываем кабинеты, B2B-порталы и цифровые сервисы, в которых сильный дизайн соединяется с правилами вашего бизнеса, данными и интеграциями.

PARTNER WORKSPACE

Дилерский портал

Всё для следующей сделки.

Заказ#108
Товаров12
УсловияB2B
PUMP-240

Промышленный насос

Договорные цены · остатки · документы

✓ Заказ принят · данные согласованы
Laravel × ваш бизнес

ИНСТРУМЕНТ ДЛЯ ВАШЕГО ПРОДУКТА

Сначала задача.
Затем технология.

Laravel — PHP-фреймворк для серверной части приложения. Он даёт основу для работы с данными, доступом и фоновыми задачами. Сам продукт — его сценарии, интерфейс и бизнес-правила — проектируется под вас.

1

Дилерские порталы

Индивидуальные цены, заказы, лимиты и согласования. Единое место работы партнёра с вашей компанией.

2

Клиентские кабинеты

Документы, обращения, история услуг и персональные действия. Отдельные сценарии для клиента и сотрудников.

3

Внутренние сервисы

Операционные процессы, роли и интеграции там, где таблиц уже недостаточно, а готовая система ограничивает процесс.

Иллюстрация дизайна цифрового продукта на Laravel
Иллюстрация цифрового сервиса

BIG FISH · Laravel

Бизнес-процесс виден на экране.

Разработка личного кабинета на Laravel соединяет правила компании с понятным рабочим пространством. Дилер видит свои цены и заказы, менеджер — согласования, руководитель — результат. Разные права получают разные интерфейсные акценты.

При создании CRM и B2B-портала на Laravel проектируем цепочку от заявки до исполнения: статусы, документы, комментарии и историю изменений. Пользователь видит следующий доступный шаг, даже если за ним стоят очередь задач и обмен с ERP.

ИНТЕРАКТИВНЫЙ ПРИМЕР

Заказ, который знает
правила компании.

Условный дилер заказывает насосы. Скидка выше 10% требует руководителя; при сбое обмена можно повторить отправку без второго заказа. Попробуйте изменить условия.

Демонстрационные данные. Действия выполняются только в браузере, без отправки заказов и связи с ERP.

Заказ #108

PUMP-240 · Промышленный насос

Цена за единицу25 000 ₽
Итого276 000 ₽
Черновик готов к оформлению
  1. Выберите количество и условия
Заказов в портале0
Документов ERP0
Попыток обмена0

КАК ЭТО СВЯЗАНО

Один заказ.
Несколько систем.

01

Интерфейс

Каталог, корзина, статусы

02

Laravel

Права, цены, согласование

03

База данных

Заказ + событие отправки

04

Очередь → ERP

Повторы и подтверждение

Заказ и событие сохраняются вместе. Обмен идёт отдельно: если ERP недоступна, пользователь видит ожидание, а оператор — причину и историю попыток.

РУКОВОДСТВО ПО ПРОЕКТИРОВАНИЮ

За красивым интерфейсом —
продуманная инженерия.

12 тем для обсуждения проекта. Это пример архитектурных решений, а не универсальная конфигурация: конкретные требования фиксируем до разработки.

GUIDE / 01

Архитектура под процесс, а не под моду

Начинаем с карты процесса: кто создаёт заказ, кто меняет цену, где хранится остаток и когда заказ считается принятым. Для дилерского портала разделяем каталог, заказы, договорные цены и интеграции. На первом этапе это могут быть модули одного приложения с общей базой — их проще разворачивать и сопровождать. Отдельный сервис появляется, когда есть конкретная потребность в независимой нагрузке, команде или цикле выпуска.

До разработки фиксируем владельца каждого значения. Например, ERP владеет остатками и отгрузками, портал — черновиками и согласованиями. Документируем переходы статусов и запрещённые действия. Это помогает не получить две конкурирующие версии заказа.

Проверяем на проекте
Результат проектирования: схема контекстов, таблица источников данных, модель состояний и перечень интеграционных контрактов.

GUIDE / 02

Запрос: проверить, разрешить, выполнить

Контроллер принимает запрос, но не должен содержать весь бизнес-процесс. Form Request проверяет форму данных: количество — целое число в допустимом диапазоне, адрес относится к выбранному клиенту. Затем политика доступа проверяет полномочия сотрудника, а прикладной сервис выполняет действие. Синтаксически корректный запрос ещё не означает, что скидка разрешена.

Цена, скидка и итог пересчитываются сервером. Клиент передаёт идентификатор товара и количество, а не сумму, которой приложение обязано доверять. Ошибки возвращаются рядом с полями; интерфейс сохраняет введённые данные и объясняет следующий шаг.

Проверяем на проекте
Приёмка: повторить запрос напрямую к API, подменить цену, отправить дробное и отрицательное количество. Сервер должен отклонить нарушение независимо от интерфейса.

GUIDE / 03

Данные и транзакции

У заказа есть позиции, клиент, версия условий и история изменений. Денежные значения храним с явной валютой и точностью: например, целым числом минимальных денежных единиц. Позиция хранит снимок цены на момент оформления, иначе изменение прайс-листа перепишет историю продажи.

Создание заказа и его позиций выполняем в транзакции базы данных. Для конкурирующего резервирования выбираем подходящую блокировку или проверку версии. Внешний HTTP-запрос к ERP не делает локальную транзакцию распределённой: для обмена предусматриваем отдельное состояние и повторную доставку.

Проверяем на проекте
Приёмка: два сотрудника одновременно заказывают последний доступный остаток. Проверяем согласованное поведение, а не только успешный одиночный запрос.

GUIDE / 04

Вход и права на уровне компании

Для собственного браузерного кабинета можно использовать сессионную аутентификацию; для сторонних клиентов — подходящую токеновую схему. Sanctum поддерживает оба сценария, но выбор и настройка зависят от доменов и клиентов. Пароли, сессии, восстановление доступа и защита от перебора требуют отдельной конфигурации.

Одной роли «менеджер» недостаточно. Политика должна учитывать компанию пользователя, принадлежность заказа, этап процесса и лимит согласования. Пользователь одной дилерской организации не должен читать данные другой, даже если угадает идентификатор. Проверки распространяются на выгрузки, вложения и фоновые действия.

Проверяем на проекте
Составляем матрицу «роль × действие × область данных» и проверяем запреты автоматическими тестами. Двухфакторный вход и срок жизни сессии выбираем по требованиям проекта.

GUIDE / 05

API как договор между системами

Описываем ресурсы, обязательные поля, формат ошибок, пагинацию и правила совместимости. Для мобильного приложения и партнёрских систем полезна спецификация OpenAPI с примерами. API Resources помогают контролировать выдаваемые поля; внутренние атрибуты модели не должны попадать в ответ случайно.

Создание заказа может вернуть 202 Accepted, если обмен с ERP ещё впереди. Ответ содержит идентификатор и статус, по которому клиент узнает результат. Удаление или переименование поля требует согласованной миграции клиентов; номер версии URL сам по себе эту задачу не решает.

Проверяем на проекте
Приёмка: контрактные тесты на обязательные поля, ограничения доступа, пустые списки и предсказуемый формат ошибки. Пример ниже — проектный контракт, а не встроенный маршрут Laravel.

POST /api/v1/orders
Idempotency-Key: dealer-42-order-108

{"items":[{"sku":"PUMP-240","quantity":12}]}

HTTP/1.1 202 Accepted
{"id":"ORD-108","status":"awaiting_erp"}

GUIDE / 06

Интеграции без двойных заказов

ERP может принять заказ, а соединение оборваться до ответа. Поэтому повторная отправка не должна создавать второй документ. Клиентский ключ идемпотентности связываем с компанией и контрольной суммой запроса; повтор с тем же ключом и другими данными отклоняем. На стороне получателя согласуем уникальный внешний идентификатор.

Для важных событий используем журнал отправки: запись заказа и события создаются атомарно, обработчик доставляет событие отдельно. Вебхуки проверяем по подписи и сроку допустимости, сохраняем идентификатор события. Таймаут, число повторов и ручное восстановление входят в проект интеграции.

Проверяем на проекте
Приёмка: повтор события, ответ 500, таймаут после принятия заказа и нарушение порядка уведомлений. Статус «отправлен» не равен статусу «принят ERP».

GUIDE / 07

Очереди и фоновые задачи

Импорт каталога, формирование документа и отправка уведомления могут выполняться в очереди. Пользователь получает понятный статус, пока длительная операция работает отдельно. Критичные задания отделяем от массовых рассылок, чтобы большой импорт не задерживал подтверждение заказа.

Повторный запуск задания должен быть безопасен. Настраиваем таймауты, количество попыток и задержки между ними, следим за глубиной очереди и возрастом самого старого задания. Уведомления, зависящие от транзакции, запускаем после её успешного завершения. Ошибка после последней попытки попадает в понятный оператору список.

Проверяем на проекте
Приёмка: остановить worker посреди обработки и возобновить его. Заказ должен завершиться один раз, а оператор — увидеть причину зависания.

GUIDE / 08

Файлы и документы

Коммерческие предложения, договоры и счета хранятся отдельно от публичных изображений каталога. Доступ к документу проверяем по пользователю и компании; для скачивания применяем контролируемый маршрут или ограниченную по времени ссылку. Секретный путь не заменяет проверку прав.

Проверяем размер и допустимый тип файла, формируем серверное имя, определяем политику проверки содержимого и сроки хранения. При генерации PDF фиксируем версию исходных данных и шаблона. Объектное хранилище и резервные копии выбираем вместе с требованиями к доступу и восстановлению.

Проверяем на проекте
Приёмка: чужой документ по прямой ссылке, просроченная ссылка, слишком большой файл и файл с подменённым расширением.

GUIDE / 09

Производительность и кэш

Сначала измеряем пользовательские сценарии: открытие каталога, поиск по артикулу, оформление заказа. Смотрим количество SQL-запросов, время внешних вызовов и размер ответа. Индексы, пагинация и загрузка связанных данных часто важнее добавления серверов.

Кэшируем данные с понятным сроком актуальности. Ключ договорной цены включает компанию и версию условий: общий ключ может раскрыть чужую скидку. Изменение цены или прав должно инвалидировать зависимые записи. На оформлении заказа проверяем актуальные условия повторно.

Проверяем на проекте
Целевые задержки и нагрузочный профиль согласуем до теста. Фреймворк не гарантирует конкретный RPS: результат зависит от приложения, базы, инфраструктуры и внешних сервисов.

GUIDE / 10

Интерфейс, доступность и поиск

Laravel можно сочетать с серверными шаблонами, Livewire или отдельным интерфейсом на React/Vue. Выбор зависит от интерактивности и команды. Для публичного каталога продумываем индексируемые URL, метаданные и отображение контента; закрытый кабинет не должен случайно попасть в поиск.

Дизайн начинается с задач сотрудника: найти товар, сравнить условия, понять причину блокировки. Таблицы адаптируем к узкому экрану, подтверждения делаем однозначными, фокус клавиатуры — видимым. Светлая и тёмная темы должны сохранять контраст диаграмм, уведомлений и состояний.

Проверяем на проекте
Приёмка: оформление заказа с клавиатуры, увеличение текста, ошибки формы, пустой каталог, медленная сеть и длинные названия товаров.

GUIDE / 11

Тесты, журнал действий и наблюдаемость

Проверяем не только успешный заказ. В набор входят границы скидок, изоляция компаний, конкурирующие изменения, повторные события и недоступность ERP. Доменные правила удобно проверять отдельно, а критические цепочки — интеграционными тестами и сценариями браузера.

Технический лог ошибки и журнал бизнес-действий решают разные задачи. В журнале фиксируем сотрудника, действие, время и изменённые значения; секреты и лишние персональные данные не записываем. Сквозной идентификатор запроса связывает портал, задание очереди и обращение к внешней системе.

Проверяем на проекте
Настраиваем оповещения о сбоях обмена, росте ошибок и задержке очереди. Для каждого сигнала нужен ответственный и описанный порядок восстановления.

GUIDE / 12

Выпуск и сопровождение

Разделяем окружения разработки, проверки и production. Секреты не храним в репозитории, отладочный вывод отключаем на публичном сервере. Выпуск включает сборку интерфейса, проверку конфигурации, миграции и перезапуск долгоживущих worker-процессов.

Изменения базы проектируем совместимыми с предыдущим кодом на время выпуска. Откат приложения не отменяет автоматически изменение данных. Перед опасной миграцией нужен отдельный план восстановления и проверенная копия. Резервирование базы, файлов и конфигурации дополняем практической проверкой восстановления.

Проверяем на проекте
Перед передачей проекта фиксируем схему окружений, команды выпуска, график резервирования, доступы ответственных и регламент обновления зависимостей. Конкретные сроки реакции определяются договором поддержки.

FAQ

До начала проекта

Когда Laravel подходит лучше готовой CRM?

Когда ценность продукта определяется собственными процессами, интерфейсом и моделью данных. Если задача решается настройками готовой системы, сначала оцениваем этот путь: кастомная разработка требует бюджета на развитие и сопровождение.

Можно ли связать приложение с 1С и Битрикс24?

Да, при наличии доступного способа обмена и необходимых прав. До оценки изучаем конфигурацию, API, объёмы, ограничения и правила обновления данных. Интеграция проектируется для конкретных систем.

Что входит в дизайн?

Исследование сценариев, структура экранов, прототип, визуальная система, адаптивные макеты и состояния: загрузка, ошибки, пустые данные, ограничения доступа. Дизайн проверяется на задачах пользователей.

Как оценить стоимость и сроки?

По согласованному объёму: роли, процессы, экраны, интеграции, требования к нагрузке и миграции. Сначала выделяем полезный первый выпуск, затем оцениваем этапы и зависимости.

Получим ли мы код и документацию?

Состав передачи фиксируем в договоре: исходный код, дизайн, схема данных, описание API, команды выпуска и инструкция администратору. Права на результат и порядок поддержки согласуем заранее.

BIG FISH · DESIGN & DEVELOPMENT

Начнём с вашего процесса

Расскажите, кто будет пользоваться сервисом, какие операции нужно автоматизировать и с чем связать данные. Предложим структуру продукта и этапы разработки.