Платформа обліку часу та розрахунків для субпідрядників
Конфіденційно – деталі анонімізовано.
Кадровий провайдер обліковував години субпідрядників в одному місці, рахував відпустки в другому, а рахунки клієнтам і зарплату формував у третьому. Цифри розходилися достатньо часто, щоб їх перевіряли вручну, – це дорогий спосіб дізнатися, що твої системи не узгоджуються між собою.
Відповіддю був не новий продукт, а самостійно розгорнутий Redmine, ґрунтовно розширений: плагіни обліку часу та ERP допрацьовувалися доти, доки одна система не почала тримати разом години, відпустки, рахунки й зарплату. Узяти перевірене й доопрацювати було кращим рішенням для компанії, чий бізнес – кадри, а не програмне забезпечення.
Я працював над цим два роки як основний розробник.
Де насправді ховається складність
Мало що тут технічно екзотичне – і все воно про деталі:
Оплачувано чи ні – це не прапорець. Типи активності визначають, чи потрапить година в рахунок клієнту, і правила відрізняються між клієнтським звітом про присутність і внутрішнім зарплатним. Значна частина роботи полягала в тому, щоб та сама година коректно зʼявлялася в обох – або в жодному.
Відпустка нараховується з роботи. Створення запису часу оновлює баланс відпустки, тож залишки випливають із зафіксованих годин, а не ведуться поруч і розходяться.
Рахунки переросли URL. Генерація рахунків була GET-запитом, доки параметри – діапазони дат, набори користувачів, фільтри проєктів – не перевищили те, що вміщає URL. Він став POST: звучить дрібно, а було справжньою стелею.
Зарплатні дані просочилися не тій групі. Умову в зарплатному звіті було інвертовано, і дані про зарплати бачив кожен із доступом до звітів, а не лише суперадміни. Виправлення в один рядок – і саме той тип помилки, який доводить, що перевірки прав у системі із зарплатними даними варто сприймати серйозно.
Інфраструктура
Працює на AWS ECS, і я переніс усе середовище в Terraform – 41 ресурс приблизно на 1200 рядків: VPC, підмережі, маршрутизація та security groups, ECS і ECR, балансувальник із TLS, RDS PostgreSQL, service discovery, політики автомасштабування та групи логів CloudWatch із сімома алярмами на CPU і вільну памʼять бази.
Це різниця між інфраструктурою, яку можна відтворити, і інфраструктурою, про яку лишається сподіватися, що вона не впаде. До того середовище існувало як послідовність кліків у консолі, які хтось колись зробив.
Поруч також працює невеликий Node.js-сервіс для інтеграцій, яким не місце всередині Rails-плагіна.
Чому це на цій сторінці
Усі інші проєкти тут тривали від двох до дванадцяти місяців. Цей тривав два роки, і більшість цього часу полягала в тому, щоб тримати систему в продакшені коректною, поки з неї щодня виставляли рахунки. Це та робота, на яку я вказав би, якщо ви хочете зрозуміти, який я після запуску.