Кто делает LegoBPM

ЧП «Зокиров Зокир Умарбоевич», Душанбе. Программу пишем и поддерживаем сами: переносим данные новых компаний, настраиваем бланки под каждого застройщика и отвечаем на звонки по тому же номеру, что стоит в шапке сайта.

Организация
ЧП «Зокиров Зокир Умарбоевич»
Город
Душанбе

Четыре версии за три года

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

  1. 2023 · первая

    Excel и Word

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

    Файл живёт у того, кто его открыл. Копия у директора, копия у менеджера, копия «финальная-2» — и ни одна не совпадает с другой. Договор набирается заново каждый раз, потому что подстановки нет. Связи между проданной квартирой и пришедшими деньгами не существует вовсе: это два разных файла.

  2. Вторая

    Google Таблицы и Google Документы

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

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

  3. Третья

    Скрипты Google Apps Script поверх таблицы

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

Во что упёрлась надстройка над таблицей

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

Таблица вместо базы данных

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

Чужие правила игры

Apps Script считает время выполнения и число обращений. Отчёт за год упирался в потолок и обрывался на середине — не потому, что расчёт тяжёлый, а потому, что среда так решила.

Разделение компаний держалось на честном слове

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

Ошибка отдавала данные вместо отказа

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

Один и тот же список в двух местах

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

Ничего нельзя было проверить

Тестов не было, и правка в расчёте рассрочки могла молча сломать печать договора. Узнавали об этом от клиента.

Четвёртая версия — та, что работает сейчас

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

Свой сервер и настоящая база данных

Программа больше не живёт внутри чужой экосистемы и не зависит от её лимитов. Данные лежат в PostgreSQL — базе, которая умеет отдавать нужные строки, считать по ним итоги и не терять их при одновременной работе. Компании разделены на уровне базы, а не на уровне договорённости.

Права проверяет сервер, и на каждое действие

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

Одно число на всю систему

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

Документы по вашим бланкам

Договоры, приходные и расходные ордера, счета печатаются из шаблонов самой компании: файл .docx с вашими реквизитами превращается в PDF на сервере. Не «похожий бланк», а тот самый, который у вас уже подписывают.

Паспорт с фотографии

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

Переписка с покупателями внутри программы

Обращения из WhatsApp приходят в раздел «Лиды»: видно, кто написал, что спросил и кто ответил. Голосовые и фотографии остаются в системе, а не в личном телефоне менеджера, и каждое обращение привязывается к жилому комплексу и квартире.

Кабинет покупателя

У клиента есть свой адрес: он входит по номеру телефона без пароля и видит остаток, дату ближайшего платежа, историю оплат и свой договор. Отдел продаж перестаёт отвечать на «сколько я должен» по двадцать раз в день.

Сообщения уходят сами

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

Работает с телефона

Не «мобильная версия», а те же экраны, собранные под узкий экран: меню шторкой, таблицы карточками, шахматка квадратами. Ставить приложение не нужно.

Изменения проверяются до того, как их увидит клиент

Расчёты рассрочки, распределение платежей, права и ключи рассылок закрыты автоматическими проверками. Правка, которая ломает старое поведение, не доезжает до боевого сервера.