Уявіть: у вас велика організація з тисячами співробітників. Кожен день хтось приходить, хтось іде у відрядження, хтось на лікарняному, хтось переводиться з одного підрозділу до іншого. А ви все це ведете в Excel. Точніше, не ви один – а десятки підрозділів, кожен у своєму файлі, зі своїм форматуванням, своїми помилками та своїми версіями правди.
Саме з такою ситуацією до нашої команди звернувся клієнт – державна оборонна структура, де облік особового складу вівся переважно вручну, в розрізнених таблицях і документах. Завдання було чітке: побудувати єдину систему, яка замінить хаос на порядок. Без компромісів у безпеці, без обмежень у масштабуванні, і з можливістю працювати в реальному часі.
Результат – HRM-система «Варта»: 93 тисячі рядків коду, 60+ моделей бази даних, 200+ API-ендпоінтів, 100+ React-компонентів. І головне – вона реально працює. Щодня. Для тисяч користувачів одночасно.
У цьому кейсі ми розповімо, як будували систему від нуля, з якими технічними викликами зіткнулися, і чому стандартні рішення на кшталт SAP чи Bitrix тут навіть не розглядалися.
Виклик: чому Excel не працює на великому масштабі
Коли в організації 10-50 людей, Excel – це нормально. Може, навіть зручно. Але коли людей стає тисячі, розкиданих по десятках підрозділів, Excel перетворюється на ворога. Ось конкретні проблеми, з якими жив клієнт:
Немає єдиної бази. Кожен підрозділ вів свій облік. Дані дублювалися, конфліктували, губилися. Щоб зібрати зведений звіт по всій організації, потрібно було обдзвонити 25 людей, зібрати 25 файлів і вручну звести їх в один. Це займало дні.
Табель – це кошмар. Тисячі людей помножити на 365 днів – це мільйони записів на рік. В Excel це фізично неможливо обробляти. Кожна помилка у відмітці – це невірні розрахунки, некоректні звіти, зрештою – фінансові втрати.
Документообіг – суцільне ручне заповнення. Накази, рапорти, довідки – все писалося вручну або копіювалося з попередніх документів з ризиком залишити чужі дані. Один оператор витрачав години на те, що система може зробити за секунди.
Відсутність контролю та прозорості. Хто вніс зміни? Коли? Які дані були до зміни? Ніхто не знав. Аудит-трейл був відсутній. Якщо виникала помилка, знайти її джерело було практично неможливо.
Безпека – формальна. Файли ходили по месенджерах, зберігалися на локальних комп'ютерах, доступ до них мали всі, кому «кинули файл». Для оборонної структури це критично неприйнятно.
Це саме той випадок, коли кастомна розробка – не примха, а необхідність. Жодне готове рішення не покриває такий набір вимог.
Що ми побудували: огляд системи «Варта»
Технологічний стек: Django REST Framework на бекенді, React 18 + TypeScript на фронтенді, PostgreSQL як основна база даних, Redis для кешування та черг, WebSocket для комунікації в реальному часі. Система замінила старий монолітний додаток на Django і стала повноцінною платформою з модульною архітектурою. Детальніше про те, чому ми обрали саме Django – ми писали в окремій статті.
Ось ключові модулі, на яких варто зупинитися детальніше:
1. Організаційна структура (дерево ШПС)
Замість жорстко закодованих рівнів ієрархії (бригада – батальйон – рота – взвод) ми побудували гнучке дерево з необмеженою глибиною вкладеності. Адміністратор може додавати нові типи підрозділів, переміщувати вітки, змінювати ієрархію – без участі розробника. Кожен вузол дерева – це підрозділ із власним набором посад, штатних місць і прив'язаних до нього людей.
Це критично важливо для оборонної структури, де організаційна ієрархія змінюється значно частіше, ніж у цивільних організаціях. Подібний підхід ми використовуємо і при розробці CRM-систем та ERP-рішень – гнучка структура, яка адаптується під клієнта.
2. Табель обліку (тисячі людей x 365 = мільйони записів на рік)
Це серце системи. Табель показує, де кожна людина перебуває кожного дня: на місці, у відрядженні, на лікарняному, у відпустці, в бойовому завданні. Тисячі рядків на 365 стовпців – це масив, який потрібно не просто зберігати, а швидко рендерити, редагувати та будувати на його основі звіти.
Ми використали помісячне партиціонування PostgreSQL: таблиця табелю розбивається на окремі розділи по місяцях, що забезпечує швидкі запити навіть при мільйонах записів. Фронтенд рендерить табель з віртуалізацією – показує лише видимі рядки.
Більше того, табель заповнюється автоматично. Адміністратор налаштовує правила маппінгу: якщо людина отримала статус «Відрядження», у табелі з'являється відповідна відмітка. Це усуває ручне введення і помилки.
3. Конструктор довільних полів та статусів
Одна з найцікавіших архітектурних рішень. Замість того, щоб захардкодити всі можливі поля для картки особи (а їх можуть бути десятки: від групи крові до номера жетону), ми створили конструктор. Адміністратор через інтерфейс додає нові поля: текстові, числові, дата, вибір зі списку, множинний вибір – будь-які.
Так само працює конструктор статусів. Потрібен новий статус «Курси підвищення кваліфікації»? Адміністратор створює його сам, налаштовує колір, іконку, прив'язку до табелю – і він одразу доступний у системі. Не потрібно чекати нову версію від розробника.
А для складних сценаріїв є конструктор умов (Condition Builder): каскадні зміни статусів, коли один статус автоматично впливає на інші поля чи статуси. Наприклад, статус «Госпіталізація» автоматично змінює відмітку в табелі та надсилає повідомлення командиру підрозділу.
4. Генерація документів із шаблонів
Система генерує документи у форматі DOCX за наперед підготовленими шаблонами. Рапорт, наказ, довідка – оператор натискає кнопку, і документ заповнюється автоматично даними з бази. Щоденний рапорт, реєстр в Excel, розрахунки виплат – все формується за секунди.
Раніше один оператор витрачав на щоденний звіт 2-3 години ручної роботи. Тепер це займає секунди. Помножте на 25 підрозділів – і ви зрозумієте масштаб автоматизації, яка реально економить гроші.
5. Бойовий журнал (Drag-and-Drop конструктор звітів)
Унікальний модуль, якого немає в жодній комерційній HRM-системі. Бойовий журнал – це конструктор звітів із drag-and-drop інтерфейсом, де командир будує звіт, перетягуючи блоки: текстові поля, таблиці з даними з бази, підписи, позначки часу. Кожен звіт зберігається з повним аудит-трейлом.
6. WhatsApp-інтеграція та Google Sheets
Система інтегрована з WhatsApp для автоматизованих розсилок: повідомлення про зміну статусу, нагадування, вітання з днем народження. Ми маємо великий досвід у розробці Telegram та чат-ботів, і ці ж підходи застосували для WhatsApp-інтеграції. Також є синхронізація з Google Sheets для підрозділів, які звикли працювати з таблицями – дані автоматично оновлюються в обох напрямках.
7. Адмін-панель із моніторингом
Окрема панель для системного адміністратора: моніторинг серверів, управління резервними копіями, перегляд активних WebSocket-з'єднань (хто зараз онлайн), логи дій, управління правами доступу. RBAC-система з 30+ дозволами дозволяє точно налаштувати, хто що бачить і що може робити.
Технічні виклики: як забезпечити масштаб і безпеку
Розробити масштабну систему для великої організації – це не просто «зробити більше полів у формі». Це принципово інші вимоги до архітектури. Ось головні виклики, з якими ми зіткнулися:
Продуктивність на мільйонах записів
9 мільйонів записів табелю на рік – це не та кількість, яку можна просто закинути в одну таблицю і робити SELECT. Ми впровадили помісячне партиціонування PostgreSQL, оптимізували індекси, налаштували кешування частих запитів через Redis. Результат – час відгуку для табелю підрозділу на 500 людей не перевищує 200 мілісекунд.
На фронтенді ми використали віртуалізацію списків (React Virtualized), lazy loading та оптимістичні оновлення UI, щоб користувач не відчував затримок навіть при роботі з великими масивами даних.
Реальний час через WebSocket
Коли один оператор змінює статус людини, всі інші користувачі повинні побачити це миттєво. Ми реалізували повноцінну WebSocket-архітектуру: зміни транслюються всім підписаним клієнтам у реальному часі. Це не polling кожні 5 секунд – це справжній real-time.
Адмін-панель показує, скільки користувачів зараз онлайн, в яких підрозділах вони працюють, і які дії виконують. Це критично важливо для розуміння навантаження та оперативного реагування.
Три рівні ізоляції даних
Для оборонної структури безпека – це не «приємно мати», а абсолютна вимога. Ми реалізували три рівні захисту:
- Рівень ORM (Django): кожен queryset автоматично фільтрується за підрозділом користувача. Неможливо випадково запитати дані чужого підрозділу.
- Рівень Middleware: додаткова перевірка прав на кожному запиті, незалежно від ORM. Навіть якщо розробник допустить помилку в коді, middleware не пропустить неавторизований доступ.
- Рівень PostgreSQL RLS (Row Level Security): база даних сама фільтрує рядки на рівні SQL. Навіть якщо зловмисник отримає прямий доступ до бази через SQL-клієнт, він побачить лише дані свого підрозділу.
Три незалежних рівня – це надлишково для більшості проєктів. Але для оборонної структури це мінімум.
Повний аудит-трейл
Жоден запис у системі ніколи не видаляється фізично. Кожна зміна логується: хто, коли, що змінив, які дані були до і після зміни. Це не лише вимога безпеки – це юридична необхідність. Будь-яку дію можна відтворити та перевірити навіть через роки.
Ключові результати: що змінилося для клієнта
Після впровадження «Варти» організація отримала те, чого раніше просто не існувало:
Єдина база замість десятків розрізнених файлів. Зведений звіт по всій організації формується за секунди, а не за дні. Дані не дублюються і не конфліктують.
Табель ведеться автоматично. Оператори більше не заповнюють тисячі рядків вручну. Статуси маппляться на відмітки табелю за правилами, які налаштовує адміністратор. Помилки зменшилися на порядок.
Документи генеруються миттєво. Щоденний рапорт, який раніше забирав 2-3 години, тепер формується за кілька секунд. Один натиск кнопки – і готовий DOCX-файл.
Прозорість і контроль. Повний аудит-трейл, RBAC з 30+ дозволами, три рівні ізоляції даних. Керівництво точно знає, хто, коли і що робив у системі.
Гнучкість без розробника. Нові поля, нові статуси, нові правила маппінгу – все це адміністратор налаштовує сам через конструктори. Система адаптується до змін організаційної структури без участі нашої команди.
Реальний час. Зміни видно миттєво всім користувачам. Немає затримок, немає розсинхронізації, немає «я ще не зберіг файл».
Подивитися сторінку проєкту з технічними деталями можна у нашому портфоліо – кейс «Варта».
Висновок: коли потрібна кастомна HRM-система
Ринок HRM-систем великий: BambooHR, Workday, SAP SuccessFactors, українські рішення. Але є ситуації, коли готові рішення не підходять:
- Масштаб понад 5 000 людей з комплексною ієрархією, де стандартні системи захлинаються
- Специфічні вимоги до безпеки, як в оборонному секторі, де потрібна ізоляція даних на рівні бази
- Унікальні бізнес-процеси, які неможливо вмістити в рамки готового рішення без болючих компромісів
- Необхідність інтеграції з внутрішніми системами, месенджерами, специфічними форматами документів
- Потреба в гнучкості, коли структура організації змінюється часто і непередбачувано
Якщо ви впізнали свою ситуацію хоча б у двох пунктах – вам, швидше за все, потрібна кастомна розробка. Це більша інвестиція на старті, ніж підписка на SaaS, але в довгостроковій перспективі – це система, яка працює саме так, як потрібно вашій організації.
Ми в Artbrain спеціалізуємося на розробці складних бізнес-систем: HRM, CRM, ERP та інших рішень для автоматизації. Якщо у вас є завдання, яке не вирішується коробковим продуктом, – напишіть нам. Ми проведемо безкоштовну консультацію, проаналізуємо вашу ситуацію і чесно скажемо, чи потрібна вам кастомна розробка, чи можна обійтися готовим рішенням.
Детальніше про наші послуги розробки та реалізовані проєкти.