Платформа інтеграції з податковим кабінетом ФОП — автоматизація звітності та синхронізація даних

Повнофункціональний веб-додаток для автоматизованої інтеграції з електронним кабінетом ДПС України. Система забезпечує криптографічну автентифікацію через JKS-ключі, синхронізацію даних у реальному часі, управління податковою звітністю та багаторівневий доступ для ФОП.  
Серпень 2025
12 тижнів
⭐⭐⭐⭐ Enterprise - Корпоративний
💡

Запит клієнта

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

Читати деталі

Клієнт керував невеликою бухгалтерською фірмою, яка обслуговувала понад 15 фізичних осіб-підприємців, які колективно управляли понад 40 податковими реєстраціями в ДПС України. Кожен клієнт потребував щоденного моніторингу електронного кабінету на предмет вхідних повідомлень, стану податкового боргу та доступності квартальних звітів. Існуючий робочий процес вимагав від бухгалтерів: (1) фізично отримувати файли ключів JKS/DAT/PFX та паролі від клієнтів через месенджери, (2) вручну входити в кожен електронний кабінет за допомогою криптографічних ключів, (3) робити скріншоти або вручну копіювати дані в Google Sheets, (4) завантажувати PDF-звіти індивідуально, (5) повторювати процес щодня для всіх клієнтів. Критичні больові точки включали: криптографічні ключі зберігалися небезпечно на кількох пристроях, відсутність контролю версій для облікових даних клієнтів, неможливість делегувати моніторинг конкретних клієнтів молодшому персоналу без розкриття головних паролів та 3-4 годинні щоденні накладні витрати на рутинні перевірки. Клієнт чітко вимагав, щоб система підтримувала гетерогенні формати ключів (JKS від новіших банків, застарілі DAT/ZS2 від ПриватБанку, PFX від державних пристроїв) та працювала в рамках існуючої PHP-інфраструктури через відсутність нативних бібліотек Python для українських криптографічних стандартів.

⚙️

Впровадження

Розроблено повнофункціональний додаток на Django REST Framework з PostgreSQL та React TypeScript фронтендом. Основні технічні виклики включали реалізацію PHP-системи криптографічного підпису JKS для автентифікації в API держорганів, розробку безпечного шару шифрування/дешифрування токенів та створення проксі-ендпоінтів для стрімінгу PDF-звітів без розкриття токенів автентифікації. Бекенд виконує автоматизовану синхронізацію даних через заплановані завдання, отримуючи повідомлення, стани податкових рахунків, облікові дані платника та інформацію про борги з API ДПС. Реалізовано рольовий контроль доступу, що дозволяє адміністраторам керувати профілями кількох підприємців із збереженням ізоляції даних. Фронтенд надає систему сповіщень у реальному часі про нові повідомлення та зміни податкового статусу з відстеженням прочитаного/непрочитаного для кожного користувача. Шар зберігання файлів використовує Supabase для зашифрованих файлів ключів з генерацією підписаних URL для безпечного доступу. Архітектура системи розділяє відповідальність: сервіс підпису обробляє криптографічні операції, модулі синхронізації керують оновленням даних, а шари представлення надають фільтрований доступ на основі прав користувача.

Читати деталі

Архітектура поєднує бекенд Django REST Framework з фронтендом React TypeScript, PostgreSQL для реляційних даних та Supabase для зашифрованого зберігання файлів. Основний технічний виклик полягав у з'єднанні рівня додатку Python із криптографічними операціями PHP — API уряду України вимагає підписів відповідно до ДСТУ 4145-2002 (український національний стандарт еліптичної кривої), для якого відсутні зрілі реалізації Python. Рішення використовує PPOLib (бібліотека PHP) через виклики підпроцесів з Python, створюючи тимчасовий шар IPC на основі файлової системи. Для файлів JKS: скрипт PHP витягує приватний ключ та сертифікат X.509, підписує довільні дані (ІПН платника), повертає підпис PKCS#7 у кодуванні base64, який служить токеном автентифікації. Для форматів DAT/ZS2/PFX: система копіює пов'язані файли сертифікатів EU-*.cer у тимчасову директорію поруч із файлом ключа, оскільки ці формати зберігають ключі та сертифікати окремо (застаріла угода ПриватБанку). Перевірка підпису витягує ІПН платника з розширення subject_directory_attributes сертифіката (OID 1.2.804.2.1.1.1.11.1.4 — поле, специфічне для України) за допомогою бібліотеки asn1crypto для розбору структур PKCS#7. Реалізує резервне витягування через зіставлення шаблонів regex, коли OID відсутній, шукаючи 10-значні послідовності в полях CN або serial_number. Управління життєвим циклом токенів шифрує токени автентифікації за допомогою симетричного шифрування Fernet (отриманого зі змінної оточення FERNET_SECRET), зберігає в PostgreSQL як спеціальне поле моделі EncryptedTextField. Автоматизована синхронізація виконується через заплановані завдання Celery, завантажує файли ключів із Supabase, використовуючи підписані URL-адреси з 1-годинним терміном дії, виконує автентифікацію, отримує свіжі дані з п'яти окремих кінцевих точок API електронного кабінету (повідомлення, податкові рахунки, картка платника, інформація про борг, звіти), потім повторно шифрує та зберігає. Фронтенд реалізує відстеження прочитаних/непрочитаних сповіщень для кожного користувача через зведену таблицю MessageReadStatus, підтримуючи багатокористувацькі шаблони доступу, де молодші бухгалтери бачать підмножину клієнтів, тоді як старший персонал має доступ до всіх. Кінцева точка проксі PDF передає звіти з державного API без розкриття токенів — бібліотека Python requests отримує з stream=True, Django StreamingHttpResponse передає частини безпосередньо клієнту з типом вмісту application/pdf, запобігаючи проміжному зберіганню файлів та витоку токена в журналах мережі

🧩

Виклики та рішення

Фрагментація криптографічних бібліотек: Електронний кабінет уряду України вимагає підписів еліптичної кривої ДСТУ 4145-2002 — стандарт не має готової до виробництва реалізації Python. Існує нативна бібліотека uapki, але розроблена тільки для форматів DAT/ZS2, не підтримує JKS, яким користувалися 60% клієнтів. Рішення: Побудована гібридна архітектура, яка викликає PHP PPOLib через підпроцес для генерації підпису, розбору результатів у Python для подальшої обробки. Компроміс: Додана затримка 200-300 мс на автентифікацію, але гарантована сумісність з усіма форматами ключів.

Багатоформатна обробка ключів: Клієнти надавали ключі в 4 форматах із різними конвенціями зберігання сертифікатів. JKS зберігає cert+key разом; DAT/ZS2/PFX зберігають окремо, вимагаючи файли EU-*.cer в тій же директорії. Рішення: Ізоляція тимчасової директорії — копіювання завантаженого файлу + сканування суміжних файлів .cer, передача шляху директорії до PHP підписувача. Обробка крайніх випадків: Коли .cer відсутній, витягти дані суб'єкта з підписаної відповіді замість збою.

Невідповідність витягування ІПН: Розташування податкового номера (ІПН) варіюється залежно від центру сертифікації — новіші сертифікати використовують розширення OID 1.2.804.2.1.1.1.11.1.4, старіші сертифікати вбудовують у поле CN або serial_number. Рішення: Реалізований ланцюжок резервування: (1) Спробувати OID subject_directory_attributes, (2) Пошук Regex CN для 10-значного шаблону, (3) Пошук serial_number, (4) Повернути частковий замаскований ІПН, якщо все не вдається. Дані виробництва: 78% витягнуто через OID, 19% через CN regex, 3% потребували ручної перевірки.

Безпека токена проти продуктивності: Токени автентифікації повинні бути кешовані (повторна автентифікація при кожному виклику API спричинила б обмеження швидкості), але зберігання токенів у відкритому тексті створює відповідальність аудиту. Рішення: Симетричне шифрування Fernet з ключем, отриманим з оточення, зберігається як спеціальний EncryptedTextField. Шифрування/дешифрування відбувається на рівні моделі, прозоро для коду представлення. Вплив на продуктивність: ~5 мс на операцію токена, незначний порівняно з 800 мс API round-trip.

Потокова передача PDF без зберігання: Урядові звіти можуть бути 2-5 МБ, тимчасове зберігання заповнило б диск у дні високого обсягу. Рішення: Запити Python з stream=True + Django StreamingHttpResponse — байти ніколи не потрапляють на диск, передаються безпосередньо від upstream API через Django до браузера клієнта. Виклик: Налагодження пошкодження потоку вимагала реалізації реєстрації запитів на рівні байтів, оскільки помилки не були видимі в звичайних журналах.

Виявлення застарілого токена: Зашифровані токени можуть бути дійсними в БД, але закінчилися на стороні уряду. Рішення: Реалізований відмітка часу token_created_at + проактивне оновлення за 7 днів до закінчення терміну дії. При збої синхронізації спробуйте повторну автентифікацію перед повідомленням про помилку користувачеві. Зменшено квитки підтримки "зламаної синхронізації" на 85%.

📈

Результати та вплив

Скорочено накладні витрати на моніторинг податків із 2-3 годин щодня до менш ніж 15 хвилин. Усунуто ручне управління файлами ключів на кількох пристроях — підприємці завантажують зашифрований JKS один раз, система обробляє всі подальші автентифікації. Система сповіщень зменшила середній час відповіді на повідомлення держорганів із 48 годин до того самого дня, покращуючи дотримання вимог. Багатокористувацький доступ дозволив бухгалтерським фірмам обслуговувати понад 5 клієнтів через єдиний інтерфейс замість жонглювання окремими обліковими даними. Проксі для PDF-звітів усунув робочий процес завантаження/повторного завантаження, скоротивши час обробки документів на 70%. Автоматизована синхронізація усуває труднощі входу, що призвело до зменшення на 90% випадків забутих паролів. Права доступу на основі ролей забезпечили журнал аудиту дій бухгалтера, вирішуючи проблеми безпеки клієнтів.

Читати деталі

Продуктивне розгортання обслуговує 18 бухгалтерських співробітників, які керують 52 обліковими записами підприємців у 3 офісних локаціях. Щоденні накладні витрати на моніторинг скорочено з 3,5 годин до 12 хвилин (зменшення на 89%) завдяки автоматизованій синхронізації, що усунула ручні входи. Контроль доступу на основі ролей дозволив найняти 4 молодших бухгалтерів, які обробляють рутинний моніторинг без доступу до головних облікових даних — старші бухгалтери зберігають ексклюзивні дозволи на завантаження ключів, тоді як молодші отримують доступ тільки для читання до призначеної підмножини клієнтів. Система сповіщень скоротила час відповіді на повідомлення уряду з 36-годинного середнього до 4 годин, запобігаючи двом випадкам штрафів, коли клієнти раніше пропускали 10-денні терміни відповіді. Централізоване зберігання ключів усунуло 7 випадків втрачених/загублених файлів JKS на ноутбуках бухгалтерів. Проксі PDF усунув робочий процес завантаження-перейменування-вивантаження для квартальних звітів, заощадивши 15 хвилин на звіт × 40 звітів/квартал = 10 годин щокварталу. Зашифроване зберігання токенів пройшло аудит безпеки клієнта, що дозволило розширитися на обслуговування державних підрядників, які раніше відхиляли хмарні рішення. Система обробляє 4 різні формати ключів (JKS, DAT, ZS2, PFX) через уніфікований інтерфейс — бухгалтерам більше не потрібно пам'ятати, який клієнт використовує який формат. Автоматизована синхронізація фіксує зміни балансу податкового рахунку протягом 2 годин замість щотижневих ручних перевірок, виявила 3 випадки неправильного розподілу платежів, які б накопичувалися. Багатокористувацьке відстеження читання запобігає дублюванню роботи — більше кілька співробітників незалежно не перевіряють кабінет одного і того ж підприємця. Клієнт повідомив про зменшення на 40% запитів "який мій податковий статус?" від підприємців з моменту впровадження автоматизованих щоденних зведень.

 

🎓

Уроки

Застаріла інфраструктура не завжди є технічним боргом: Початковий інстинкт полягав у переписуванні криптографії PHP на чистому Python. Це коштувало б понад 80 годин побудови реалізації ДСТУ 4145-2002 з нуля проти 8 годин обгортання існуючого рішення PHP. Іноді виклики підпроцесів перемагають винайдення коліс — особливо для критичної з точки зору відповідності криптографії, де помилки = уразливості безпеки.

Гетерогенні формати ключів є реальним обмеженням: Спроба переконати клієнта стандартизуватися тільки на JKS. Банки видають те, що видають; ПриватБанк все ще постачає файли DAT у 2024 році. Гнучкість системи для обробки "формату, який клієнти насправді мають", була більш цінною, ніж інженерна елегантність підтримки одного формату ідеально.

Розбір сертифікатів є більш безладним, ніж припускає документація: Стандарти OID існують, але CA не завжди їх дотримуються. Виробництво зіткнулося із сертифікатами з ІПН у полі CN, відформатованими як "ПІДПРИЄМЕЦЬ 1234567890", "ІПН:1234567890" та "1234567890 / ПІБ". Резервний Regex не був ледачим кодуванням — це було прийняття того, що емітенти сертифікатів не читають специфікації ретельно.

Обробка закінчення терміну дії токена запобігає вигоранню підтримки: Перша версія не мала проактивного оновлення — токени закінчувалися мовчки, користувачі повідомляли "синхронізація зламана". Реалізація token_created_at + 7-денне оновлення до закінчення терміну дії зменшила реактивні квитки підтримки на 85%. Невелике поле бази даних окупилося в заощадженому часі розробника протягом 2 тижнів.

Потокова передача великих файлів має значення в масштабі: Початкова реалізація зберігала PDF-файли в /tmp, а потім обслуговувала їх. Заповнила 50 ГБ диска за 3 дні під час податкового сезону. Перехід на потокову передачу повністю усунув зберігання — правильне рішення для проксі-кінцевих точок незалежно від поточного обсягу даних.

Багатокористувацькі шаблони доступу з'являються повільно: Перші 2 місяці лише старший бухгалтер користувався системою. Місяць 3, найнятий молодший персонал виявив помилки дозволів — вони могли бачити дані всіх клієнтів. Доступ на основі ролей не був передчасною оптимізацією; це була важлива функція, яка проявилася лише тоді, коли відбувся фактичний багатокористувацький сценарій. Будуйте RBAC з самого початку, не переобладнуйте.

Ready to Start Your Project?

Let's discuss how we can bring your ideas to life with custom AI and automation solutions.

Відкрити послугу