V·NESTERENKO
← Усі роботи
Провідний розробник · 2023–25 · 2 роки

Платформа обліку часу та розрахунків для субпідрядників

Конфіденційно – деталі анонімізовано.

Кадровий провайдер обліковував години субпідрядників в одному місці, рахував відпустки в другому, а рахунки клієнтам і зарплату формував у третьому. Цифри розходилися достатньо часто, щоб їх перевіряли вручну, – це дорогий спосіб дізнатися, що твої системи не узгоджуються між собою.

Відповіддю був не новий продукт, а самостійно розгорнутий 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-плагіна.

Чому це на цій сторінці

Усі інші проєкти тут тривали від двох до дванадцяти місяців. Цей тривав два роки, і більшість цього часу полягала в тому, щоб тримати систему в продакшені коректною, поки з неї щодня виставляли рахунки. Це та робота, на яку я вказав би, якщо ви хочете зрозуміти, який я після запуску.

Наступний проєкт →