В продолжении части 2 и части 1, мы решили написать ещё одну статью, в которой хотим детально рассказать, что произошло за 2 года работы над проектом, чего мы добились, что нового реализовали, почему вообще системы заявок настолько перспективное направление. И конечно номер статьи (3) соответствует номеру версии продукта, о которой ниже пойдёт речь.
Как собрать снова команду и написать систему с нуля?
Мы поняли, что дальнейшее развитии проекта и его разработка на текущей архитектуре тянет за собой большие затраты на трудовой ресурс и производительность системы. Слишком много было «велосипеда» в нашем коде, который был «самокатом» в прямом смысле этого слова. С него было трудно упасть, так как колёса маленькие, но большой скорости развить мы не смогли уже. А ехать хотелось далеко и быстро :)Поэтому выбор встал в сторону PHP framework, который бы по большей своей части обладал следующими критериями:
— Простота и понимание принципов работы за счёт хорошей документации и нашей идеологии
— Быстрое вхождение в разработку
— Наличие необходимых инструментов и библиотек для интеграции с необходимыми нам сервисами
— Перспективы поддержки фреймворка
— Повышение квалификации наших разработчиков
— Единый стандарт поддержки и развития системы
Так, мы поставили себе цель и добились её. За 8 месяцев был написан с нуля, используя переработанную и адаптированную бизнес модель предыдущей версии системы, целый проект.
Почему мы развиваем именно систему заявок?
Вы даже не представляете себе, насколько широко применение систем заявок. В теории, в организации где есть постановка задач и отслеживание их выполнения, самый примитивный вид документооборота — это и есть система заявок. Её могут использовать от пиццерий (курьерская доставка и заказы) и до конечно же IT-департаментов, которые оказывают поддержку пользователям. Именно на них мы и нацелены в первую очередь.Из эстетических соображений — оптимизировать рабочий процесс, в направлении контроля и учёта задач — это наша ключевая задача в данном направлении.
Почему мы решили использовать Laravel?
Во-первых, это новый фреймворк, но довольно популярный, красивый и в нём из коробки доступны реализации тех механизмов, которые нам необходимо использовать в нашей системе. Во-вторых, мы хотели расширять нашу команду, а использовать узкий свой собственный фреймворк, который нигде больше, кроме нас не используется — не позволяла совесть перед нашими разработчиками. Заодно мы «убили двух зайцев» — получили общую стандартизированную систему в рамках которой всё работает и добавили +1 фреймворк в skills опыта наших коллег.Какие направления для нас приоритетные в развитии?
Не секрет, что в последнее время всё больше офисные сотрудники проводят времени в социальных сетях. Наша идея — развивать продукт именно в этом направлении. Ведь лучше сотрудник будет проводить большую часть времени в корпоративной ленте новостей, читая профильные темы и повышая свою квалификацию, чем смотрит котики и сиськи в общих соц. сетях. (Естественно Вы можете постить тоже самое в системе заявок). Нам очень симпатизирует Bitrix, но ввиду личных отношений наших разработчиков к архитектуре их проекта и качеству кода, мы решили вести своё направление. Мы не хотим быть их аналогом или конкурентом, мы просто занимаем своё направление в этой области.Как много пользователей интересуется подобными системами?
Настолько много, что в любой адекватной офисной структурной организации есть необходимость вести учёт задач и сроков их исполнения. Тут уже либо выбирают PM-продукты, либо системы заявок, либо ToDo-блокноты, ну или в идеале CRM-системы. В этом плане ZENLIX — не является универсальным средством, но его новая версия старается максимально легко быть интегрирована в среду предприятия, благодаря различным общим сущностям. Например, слово группа заменяется, компанией либо проектом и тогда задача/заявка уже создаётся на проект.Разработка и поддержка
Это самая важная часть для нас, ведь именно в ней мы расскажем о нашем процессе разработки.
Deploy & Test
Благодаря Envoy, мы имеем прекрасную возможность быстро развернуть/обновить существующую среду разработки для тестирования, к примеру API разработчику iOS-мобильного приложения.Процесс разработки
Всё начинается с клиента. Наша команда делится на 2 группы — одна занимается развитием текущей ветки, другая — разработкой узких решений системы заявок. Часто эти границы стираются, ведь есть некоторые задачи, которые пересекаются и мы реализуем их быстрее, чем это оговорено. 65% всех идей реализации поступают от наших постоянных клиентов, от которых мы анализируем их запросы и представляем в виде плана развития проекта. Остальная часть — поступает от руководителя проекта, который чаще руководствуется своими анализаторскими способностями рынка систем заявок. Благодаря такой формуле — мы достигаем успех и признание наших клиентов. Сам процесс разработки — не является основной работой, ведь кроме него есть ещё — техническая поддержка.Поддержка пользователей
Наши клиенты получают бесплатную поддержку по почте «в течении одного рабочего дня», на практике же этот показатель достигает «в течении часа». Мы очень стремимся, что бы этот показатель был максимально высокий. Это обусловлено тем, что для нас Важно понимать наших пользователей и получать в первую очередь от них информацию, что бы двигаться дальше. Удалённая поддержка осуществляется нашим техническим персоналом только по SSH, предварительно клиенты принимают небольшое пользовательское соглашение.Что нового мы реализовали?
В новой версии мы пересмотрели подходы к организации пользователей/групп, системе уведомлений, общих разделениях структурных единиц. Теперь администратор может создать неограниченное число групп (например в соответсвии компаниям-клиентов и отделов организации, которые оказывают поддержку данным группам). Кроме того, каждой группе можно назначить своих главных пользователей, которые будут видеть в группе все заявки. Для создания заявок — ещё более гибкий подход. Мы создали систему форм заявок, благодаря которой, каждой группе или пользователю можно назначить уникальную форму создания заявок.Формы создания заявок
Это та возможность, которая реализовалась именно из запросов наших пользователей. Это прекрасный пример, когда одним пользователям важно было поле «крайний срок» на странице создания заявок, а другим — «статус» и так далее. Мы решили всех удовлетворить и сделать механизм форм создания заявок. Теперь более чем из 20-ти пунктов настраивается форма создания заявок. Кроме того, форму можно подключить как на пользователя, так и на группу пользователей. Данный функционал дополнительно даёт возможность управления правами доступа на создание заявок группам/пользователям.Группы и пользователи
Мы изменили подход от отделов пользователей и компаний клиентов в сторону групп пользователей. Это более гибкая и простая структура управления единицами пользователей. Теперь можно создать свою изолированную среду, в которой группы и пользователи не будут пересекаться, но в то же время смогу взаимодействовать в рамках своих прав на создание и обработку заявок.NodeJS+REDIS
В ранней версии (v.2) в качестве системы опроса новых событий мы использовали ежесекундное обращение к таблице БД. В новой версии, мы убрали эту связку и решили использовать REDIS. Теперь наш nodejs сервер подписан на redis и это даёт дополнительную стабильность и скорость в работе всплывающих уведомлений.
Полноценный QUEUE
Аналогично, в ранней версии мы использовали наш собственный механизм обработки очереди сообщений. Раз в минуту cron запускал систему обработки очереди сообщений и производил обработку их. Такой механизм подходил только под почтовую рассылку и расширять его под pushbullet, iOS-push, SMS — было не совсем правильным. В новой версии мы использовали Laravel Queues, который полноценно справляется с этими задачами и даёт дополнительно запас на дальнейшую интеграцию с внешними сервисами.
Индивидуальное выполнение заявки и принятие заявки после её выполнения
Дополнительные статусы заявок в новой версии:
— проверка выполнения заявки — это значит, что если есть такой пункт в заявке, то заявка после статуса выполнена должна будет быть подтверждена автором заявки или супер пользователем группы что это так. Только после этого заявка получает статус выполнена и закрывается.
— выполнение несколькими одновременно — это значит что заявка будет считаться выполненной, если только все пользователи из списка исполнители её выполнят.
Во всех случаях будет работать нотификация: на почту, sms, pushbullet, webpush, ios-push. (в зависимости от личных настроек пользователя)
Безопасность системы
Это одно из немаловажных мест, в системе, которое должно максимально сокращать расстояние между Удобством и Безопасностью. Много стало возможным благодаря встроенной системе учётных записей Laravel. Но мы её доработали, для одновременного использования с LDAP. Мы использовали полноценно механизмы middleware для полного контроля доступа к методам и ресурсам системы.
Система лицензий
Приложив много усилий к написанию кода, мы не раз возвращались к вопросу контроля использования нашего продукта и защиты от нелегального коммерческого использования. Мы даже реализовали целый механизм сверки лицензий и блокирования работы системы. Но, использование такой системы тянуло за собой ioncube + зависимость от версий PHP.Нас всё-таки покорил принцип простоты и непривязанности использования системы клиентами. Мы уверенны в том, что наши клиенты не должны чувствовать ограничения в выборе версии PHP, закодированных файлах и постоянно быть под нашим лицензионным наблюдением. Если нам доверяют, при выборе ПО — мы доверяем нашим клиентам в их порядочности.
Система обновлений
Мы использовали прекрасный механизм консольных команд Laravel, для стабильного получения последней версии файлов и замены их новой.При этом так же удобно запускается проверка целостности системы, миграции баз данных и резервные копии системы.
Чат
Чат возможно использовать, как обычный мессенджер между пользователями системы, так и между пользователями-клиентами, но в последнем случае, клиенту необходимо предварительно послать запрос на поддержку. А пользователю — необходимо принять запрос. И только после оказания поддержки, в конце общения либо в любой другой момент, пользователь может закрыть чат.Новая версия мобильного приложения
Мобильное приложение, которое работает в новой версии, умеет хранить заявки локально, без доступа в инет на мобильном устройстве.
В старой версии — необходим постоянный доступ к интернет.
Одним из преимуществ использование приложения, является использование PUSH-уведомлений.
Общий список поддерживаемых возможностей новой версии
- SLA-планы заявок
Учёт заявок по времени реакции на заявку, времени работы с заявкой, крайнего срока заявки
- Редактирование/удаление/объединение/печать заявок
Возможность производить действия с заявкой
- Журналирование действия с заявками
Отображение всех действий с заявками
- Уведомления по заявкам по действиям:
— Создание заявки
— Взятие в работу заявки
— Снятие с обработки заявки
— Переадресация заявки
— Комментирование заявки
— Выполнение заявки
— Ожидание проверки выполнения заявки
— Успешное/не успешное подтверждение выполнения заявки
— Удаление заявки
— Восстановление заявки
— Напоминание об окончании срока выполнения заявки (крайник срок)
— Напоминание о просроченной заявке
- Уведомления через сервисы
— Уведомления в веб-браузер (по аналогии с VK.com), приходят по всем вышеописанным действиям, а так же выводится в правом верхнем углу веб-интерфейса в панель уведомлений, в которой хранятся все действия.
— Уведомления на email
— Уведомления на SMS (в профиле пользователя должен быть указано номер мобильного и сервис должен быть активен) основано на SMSC.ru. Для использования сервиса SMS, необходимо зарегистрироваться на сайте SMSc.ru, пополнить баланс и в системе ZENLIX ввести данные для (логин/пароль) для работы с SMSC.
— iOS-push приходят так же автоматически, если пользователь установил мобильное приложение и авторизировался.
— PUSHBULLET-позволяет бесплатно получать уведомления на различные ОС, платформы и мобильные устройства. Для этого, необходимо зарегистрироваться на сайте pushbullet.com, и получить API-ключ, который необходимо ввести в настройках ZENLIX.
- Сообщения и комментарии в заявках
Возможность вести общение в рамках заявки, уведомлять клиента, скрывать сообщения от клиента, отправлять комментарии в веб-интерфейс через email.
- Создание заявки через email
Возможность настраиваемо создавать заявки через входящие email.
- Дополнительные поля заявки
Неограниченное к-во дополнительных полей заявок для формы создания заявок.
- Интеграция с Active Directory
LDAP — авторизация и мастер импорта учётных записей - Многоуровневая система прав
Полный контроль доступа пользователей и логирование действий. - Центр знаний
Позволяет хранить обучающий материал в системе заявок
- Система сообщений
Даёт возможность обмениваться личными сообщениями между пользователями системы - Календарь
Позволяет создавать события как личные, так и групповые и уведомлять других пользователей групп о событиях. - Чат
Для быстрого обмен сообщениями (на равных условиях), а так же для поддержки клиентов (запрос-ответ, закрытие-открытие чата)
- Инсталляция и обновление
Удобные встроенные инструменты веб-инсталляции приложения и обновления системы
- iOS-мобильный клиент
С поддержкой PUSH-уведомлений и offline-хранением заявок. - Отчёты
Система генерации отчёты как конкретных пользователей, так и целых групп. - API
На котором работает мобильное приложение и поддерживает другие методы. - Другие функции, которые лучше увидеть :)
PS.
Мы были бы рады рассмотреть преложения о долгосрочном сотрудничестве больших компаний на определённый результат и цели. Мы хотим сделать наш продукт ещё лучше, но для этого необходимы инвестиции: для увеличения штата разработчиков, оборудования, рабочих мест и т.д.
Это типичная проблема с которой мы столкнулись. Слишком много клиентов, цена на продукт довольно лояльная, работы хоть отбавляй. Но мы не хотим терять текущих клиентов, но в то же время хотим выйти на более большие компании.
А для тех, кого заинтересовал проект — прошу писать на info@zenlix.com и мы будем рады любому сотрудничеству.
Комментарии (20)
rd_nino
21.06.2016 14:00А демо по старому адресу не работает? :(
https://ru.zenlix.com/demorustem_ck
21.06.2016 14:02Демо работает по адресу:
https://demo2.zenlix.com/
Login: admin@local
Password: p@ssw0rdradli
21.06.2016 16:21-2Тоже не работает. Вы хоть проверяйте что-ли. И надо отключать дебаг режим)
in Collection.php line 1045 at HandleExceptions->handleError('8', 'Undefined offset: 0', Collection.php line 1045 at Collection->offsetGet('0') in DashboardController.php line 123
rustem_ck
21.06.2016 16:35Мне очень жаль, что среди порядочных Хабра-Пользователей находятся те, которые пишут матерные выражения в названиях групп и пишут политические тексты. Мы вынуждены закрыть демо. Если у кого-то есть прямое желание ознакомиться с новой версией — пишите на почту и мы любезно предоставим доступ.
artishok
21.06.2016 15:06Так совпало, что вы выкатили релиз первой версии в то время, как у нас на работе было решено внедрить хелпдеск. Большинство функционала пересекалось, поэтому было решено взять вашу версию за основу, но в итоге большая часть была переписана и добавлен новый функционал. Была добавлена авторизация по лдап + привязка еще к одной внутренней БД. Также полностью перерисовал интерфейс.
Сейчас подумываю также переписать все с использованием какого-нибудь фреймворка =)
asvechkar
22.06.2016 13:14А почему использовали Apple PUSH-server? Или у Вас не планируется клиент под Android? Почему для синхронизации с мобильной версией не использовали, например, Rabbit-MQ, или AWS DynamoDB / Google Firebase? Я почему интересуюсь оффлайн-синхронизацией, потому что столкнулся с подобным вопросом в своем проекте.
rustem_ck
22.06.2016 14:22У нас не используется пока клиент под Android, но мы планируем его использование. Даже при этом, так как у нас единый сервер отправки PUSH-уведомлений, проблем с отправкой параллельно на Android-устройства не возникнет.
Мы используем https://github.com/davibennun/laravel-push-notification на нашем PUSH-сервере, а с него уже возможна отправка и на Apple Push, и на Android Push серверы.
Для синхронизации мы решили использовать именно API/json-обмен данными по запросу мобильного клиента. Не совсем понятно, каким образом можно использовать тот же Rabbit-MQ для синхронизации?asvechkar
22.06.2016 16:02С помощью очередей и «потребителей». При добавлении/изменении/удалении объекта в очередь отправляется сообщение либо с ID объекта, либо объект целиком. Всё в json-формате. Удобно в том плане, что сообщение не пропадает, а лежит в очереди, пока его не прочитают веб/мобильные клиенты.
rustem_ck
22.06.2016 16:09Мы это реализовали с помощью REDIS+NodeJS/Socket.IO для веб-нотификации. Нам не важны были оффлайн нотификации, они итак отражены в логах в связи со структурой проекта.
Мы хотим использовать beanstalkd для очередей, я не могу сказать поддерживает ли он весь тот функционал, как тот же Rabbit-MQ, но идея отличная.asvechkar
22.06.2016 16:18Не страшно было делать проект с высокой нагрузкой на PHP-фреймворке? Если уже используете Node.js, почему не сделали весь Backend на нем (express.js, sequelize.js...)? Я сейчас делаю один проект на Laravel 5.1, но интересует Ваше мнение относительно выбранной технологии не только потому, что у Вас уже есть PHP разработчики. Была ли еще какая то причина?
Извините, если много вопросов задаю. Ищу полезные аргументы.rustem_ck
22.06.2016 16:27Спасибо за вопросы, наоборот задавайте, нам так же важно и Ваше мнение.
1. На данный момент проблем с использованием NodeJS — нет, это очень маленькая часть кода и функционала которая отвечает только за веб-уведомления. Поэтому затрат на дополнительные силы разработки nodejs — нет. На данный момент это не критический функционал системы, поэтому мы его не так сильно развиваем.
Если сравнивать прошлую версию 2.95 — там было его больше, например активности комментариев на странице заявок (автодобавление новых комментариев по тем же nodejs/socket.io push-событиям).
2. СтОит понимать, что для очереди сообщений мы используем БД (планируем либо REDIS, либо BeanstalkD). Для рассылки всплывающих уведомлений используем REDIS+NodeJS/Socket.IO.
Сама тема рассылки уведомлений и обработка их статусов для нас так же является важной. Мы например используем функционал уведомлений о последних событиях, но он отражается в БД, в качестве логов. Теперь будем смотреть в сторону rabbitMQ.
ruFog
Так скоро и до Java + Spring дело дойдет. Визуально выглядит красиво.
SerafimArts
Визуально — это очередная поверхностно подтюнингованная AdminLTE
rd_nino
Разве это плохо — использовать шаблон в своих разработках? Тем более, что он для этого и делался.
SerafimArts
А что-то говорил про то, что это плохо? Просто проинформировал, что "красивости" не столь заслуга авторов helpdesk, сколь автора самой админки.