Экран отдела продаж: сделки из Мегаплана, звонки из Mango Office
Для отдела продаж Prime Wood сделал экран на офисный монитор: план месяца, оплаты за день, необработанные заявки и звонки по менеджерам. PHP без фреймворка и крон, потому что этого хватало. Работу с API Mango Office потом вынес в Laravel-пакет.
Что было
Весной 2020, через несколько месяцев после переезда магазина на OpenCart, в Prime Wood появилась задача не про сайт. Сделки отдела продаж жили в Мегаплане, звонки - в облачной АТС Mango Office. Руководитель отдела собирал картину дня руками из двух систем: кто сколько продал, кто сколько звонил, сколько заявок лежит без ответа. Хотелось одну картинку на мониторе в отделе, чтобы её видел и он, и менеджеры.
Что решил
Фреймворк не брал. Задача - раз в несколько минут сходить в два API и показать итоги на одном экране. Для этого хватает PHP, крона и нескольких JSON-файлов на диске. База данных тоже не нужна: экран показывает текущий месяц, прошлые данные никто не анализирует. Репозиторий начат 7 апреля 2020.
Как устроено
Крон запускает CLI-скрипт. Он постранично, по 40 сделок с паузой между страницами, выкачивает сделки через API Мегаплана: у API есть лимиты, торопиться незачем. От параллельного запуска защищает файл-блокировка: если скрипт ещё работает, следующий тик просто выходит, а если файл висит дольше часа, считается зависшим и снимается. Итоги раскладываются по менеджерам в JSON: сумма за месяц, оплаты за день, сделки на каждого.
Звонки идут отдельным модулем из API статистики Mango Office: запрос отчёта, потом получение результата, CSV в массив, подпись запросов ключом и солью. Оттуда же список сотрудников, чтобы сопоставить звонки с менеджерами.
Сама страница - PHP, Bootstrap, axios и Chart.js. Кнопка «Развернуть» переводит её в полноэкранный режим, дальше она обновляется сама. На экране: выполнение плана за месяц графиком, необработанные заявки, сумма оплат за день, исходящие звонки за день по каждому менеджеру и «КПД» - доля закрытых сделок от всех сделок менеджера.
Летом руководитель попросил поправить КПД: новичок с двумя закрытыми сделками из двух получал 100% и возглавлял рейтинг. Добавил порог: в рейтинг попадают только те, у кого от 20 закрытых сделок. ТЗ от 28 июля, правка 13 августа.
Laravel-пакет
В ноябре вынес работу с Mango Office в отдельный Composer-пакет для Laravel: ServiceProvider, конфиг с ключом и солью, класс с тремя методами - список сотрудников, статистика звонков за период, скачивание записи разговора. Внутри учёл особенность API: отчёт нельзя забрать сразу после запроса, нужно подождать несколько секунд, и пакет делает эту паузу сам. Имя зарегистрировано на Packagist, версий с тегами так и не выпустил: пакет делал под себя. Код открыт: Laravel-Mango-Office.
Что вышло
Экран висел в отделе продаж, пока я работал в компании. Руководитель перестал собирать картину дня руками, а менеджеры видели свои звонки и долю закрытых сделок рядом с чужими. Работа отдела превратилась в соревнование, которое видно всем, и на этом экране руководитель строил мотивацию менеджеров. Итог посчитали в деньгах: выручка выросла.
Вывод
Инструмент под одного руководителя и один монитор не нуждается в фреймворке, очередях и базе. Крон, два API и JSON на диске - решение, которое я могу объяснить за минуту и починить за десять. Переиспользуемую часть стоит выносить не заранее, а когда она действительно понадобилась ещё раз: пакет для Mango я вынес, когда понял, что этот код мне ещё пригодится.