CRM для автошколы?

в 7:15, , рубрики: CRM, php, автошкола, Безопастность, разработка

Доброго времени. Меня зовут Дмитрий и я веб‑разработчик. На данный момент работаю в группе компаний по экспорту автомобилей и техники из Японии, Китая и Кореи. Но, сейчас поговорим не об основной работе, а о «подработке».

>= 2 лет назад, на меня вышел директор достаточно крупной автошколы нашего города. На тот момент у них имелось порядка 3-х филиалов, и приблизительно 4,5 тыс. учеников (как актуальных, так и те — которые уже получили свои ВУ). Директор предложил мне поработать с их CRM системой. Данное ПО было написано какими‑то фрилансерами, и на протяжении нескольких лет они же и обеспечивали поддержку. Но, со слов директора, они начали забивать на свою работу, затягивали с выполнением задач или во все игнорировали пожелания по внесению изменений (все это было не бесплатно).

Что из себя представляла на тот момент данная CRM

Это было веб‑приложение, написанное на PHP 5.4, база была на MySQL (версию уже не помню) и какой‑то даже JS присутствовал. По мимо кабинета для сотрудников — реализованы личные кабинеты для каждого ученика, где они могут пополнить свой счет через YooMoney, сделать онлайн запись на вождение или изучить свою финансовую статистику.

К сожалению, самую первую версию фронта не нашел, тут уже начинал приводить его в порядок.

К сожалению, самую первую версию фронта не нашел, тут уже начинал приводить его в порядок.

Во‑первых, что меня тут больше всего удивляло — разметка страницы представляла собой 3 фрейма:

  • Верхняя навигация (1-й фрейм);

  • Левая навигация (2-й фрейм);

  • Контент (3-й фрейм);

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

  • Учет учеников по 3-м филиалам, контроль документов;

  • Ведение учебных групп;

  • Ведение и учет групп на экзамен;

  • Финансовый контроль;

  • График вождения;

  • Документооборот;

  • Отчетность;

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

Ученик открывает график и выбирает удобное и свободное для себя время. Выбрав его — у него открывается окно подтверждения. После подтверждения записи логика работала так:

  • если была соответствующая ячейка по времени — делался UPDATE userid

  • если не было — делался INSERT

И так как у них достаточно большой поток учеников, допускался вариант — учениками одновременного открытия одинаковых окон подтверждения записи. Тем самым — если у обоих учеников был положительный баланс — условие выполнялось — делался UPDATE у одного, а у второго INSERT. И на выходе мы получаем 2 записи учеников в 1 и тоже время, в 1 и ту же дату к одному инструктору.

Я был немного в замешательстве от такой логики построения условий — это первое. Второе — зачем вообще ученикам давать возможность что‑то INSERT‑ить в базу данных, если есть возможность делать UPDATE.

Так как я был на тот момент еще недостаточно компетентен, я придумал еще более уникальное решение — сделал доп. таблицу, в которую вносилась запись при ожидании подтверждения =). Ну то есть, человек выбрал время — сделался INSERT в таблицу, и другие не смогут уже выбрать это время в течении 2–3 минут. И каков был результат? Конечно дубликаты записей сохранились. Люди так же записывались по 2–3 записи на 1 занятие.

Спустя 86400 * 365...

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

CRM для автошколы? - 2

Ничего хорошего из этого не вышло: было куча ошибок, связанных с внутренними нюансами организации, о которых мне просто никто не сказал. Были так же вопросы с генерацией номеров сертификатов о профессии водителя. В общем — написал то, что потом опять пришлось переписывать =), но сделал я это куда более быстрее: примерно за 1,5 месяца.

time();

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

CRM для автошколы? - 3

И, отгадайте что? Правильно, я опять переписываю данное ПО =) Но, не ттолько из‑за своей некомпетентности, но и еще кое почему.

  1. Безопасность. Ранее я практически не зацикливался на этом, и сейчас я обнаружил кучу дыр в данном приложении — это и инъекции и XSS атаки.

  2. Статика. В ПО практически не используется JS, а тем более jQuery. Так как я обрел больше опыта, необходимо его применять.

  3. Требования организации. Появились новый функционал, который необходимо интегрировать в ПО.

  4. Обновление версии php. Да, я решил переписать ПО на 8.2 с использованием PDO драйвера для mysql.

  5. Оптимизация запросов. Так как я подтянул язык запросов и изучил такие понятия как LEFT JOIN, IN, COUNT — необходимо переписать все запросы.

  6. Использования ООП. Не использовал вообще. Понял, спустя несколько лет что вещь незаменимая, теперь активно применяю.

По крайней мере, отправной точкой решения переписать ПО стало — возможность обучения одного ученика на несколько категорий. То есть, реализовать это можно только интегрируя систему договоров. Учет финансов и всего прочего будет не ученика, а договора — который привязан к самому ученику. А к самому договору уже привязывается и категория, и группа. То есть сколько у учеников будет договоров — столько и балансов. А также, реализовать тарифные планы более статичным — вплоть до статичной суммы списания за занятие у ученика. (один может платить 1200 за час, другой 1600).

В предыдущем релизе, стоимость вождения вносилась в сразу в таблицу с занятиями. Теперь все эти записи будут суммироваться и вычитаться из поступлений. Таким образом будет теперь считаться баланс у учеников — просто одним большим запросом.

На данном этапе, так как из‑за малого количества свободного времени, готовы страницы со списками учебных групп, и список договоров в группе. Ну и фронтик =) как же не без этого. Ужасно раздражает эта синяя полоска с иконками для навигации и вываливающийся левый блок.

CRM для автошколы? - 4
CRM для автошколы? - 5

Вся таблица на втором изображении формируется всего 1 запросом. Ранее — данная таблица формировалась несколькими, и если в не было порядка 100 элементов, страница могла открываться 10–20 секунд.

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

Автор: glu-dimaz

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js