Перейти до вмісту

Інтеграція з Prom, Rozetka, Hotline

Матеріал з K2 ERP Wiki
Версія від 14:30, 7 травня 2026, створена R (обговорення | внесок) (Створена сторінка: {{DISPLAYTITLE:Технічне завдання: Інтеграція з Prom, Rozetka, Hotline для Python}} {{SEO |title=Технічне завдання: Інтеграція з Prom, Rozetka, Hotline для Python |description=Технічне завдання на реалізацію Python-сервісу для інтеграції K2 ERP, CRM або інтернет-магазину з Prom.ua, Rozetka Marketplace та Hotline: товари,...)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
 

 async def check_connection(self) -> dict:


 db.commit()
 marketplace=marketplace,
! |-
| customer_email
| string
| Email. | API-токени керуються в кабінеті компанії. |-
| Status Export Worker
| Передача статусів і ТТН. "channels": ["PROM", "ROZETKA", "HOTLINE"]
<syntaxhighlight lang="python">
 pass

=== 14.10. Публікація фіду Hotline ===
2. | Він бачить товари, замовлення, фіди, помилки по Prom/Rozetka/Hotline.=== 27.3. Ціни та залишки ===
Як комерційний менеджер, 
[[Категорія:Hotline]]
 pass
=== 12.1. Загальна схема ===
 pass
{| class="wikitable"
! |-
| оновлення версій залишків
| Критичний
| Захищає від продажу відсутнього товару. |-
| marketplace
| varchar
| PROM або ROZETKA. |-
| Bid
| Ставка Hotline по товарній пропозиції. Якщо замовлення нове  створює його в K2 ERP. # Чи потрібна повна синхронізація товарів у Prom через API? ! | Передати менеджеру каталогу. |-
| Помилки категорій
| Товари не проходять модерацію. Якщо все коректно  статус IMPORTED. * реалізувати XML/YML generator;
* реалізувати валідацію XML;
* реалізувати публікацію файлу;
* реалізувати журнал генерацій;
* реалізувати фід акцій, якщо потрібно. |-
| оновлення версій цін
| Високий
| Впливає на маржу. |}

 external_order_id=external_order_id,

 mp_product = marketplace_product_repository.get_or_create(

1. |-
| images
| array
| Фото. Коментар
 event_type="PRODUCT_SYNCED",
 payload=order_payload,
<div style="border-left: 6px solid #f57c00; background: #fff3e0; padding: 12px 16px; margin: 16px 0;">
== 17. Валідація товарів ==
 error=str(exc),
{| class="wikitable"
=== 8.3. Замовлення з маркетплейса ===
! |-
| external_order_id
| varchar
| ID замовлення в каналі. |-
| AC-11
| Залишок став 0.=== 24.1. Основні KPI ===

=== 18.2. Дедублікація замовлень ===
Retry заборонений для:
 <id>K2-PRODUCT-000123</id>
|-
| Marketplace Integration
| конфігурація інтеграції з Prom, Rozetka або Hotline. |-
| Hotline
| XML/YML/CSV/XLS/TXT фіди + API ставок
| Передача товарів через фід, контроль акцій, керування ставками. @abstractmethod

* додати rate limiting;
* додати retry policy;
* додати dead letter queue;
* додати alerting;
* додати моніторинг;
* додати резервне копіювання;
* додати безпечне зберігання secret-ів. |-
| Помилки характеристик
| Rozetka часто потребує точних характеристик категорій. Очікуваний результат
 "marketplace": marketplace,
|-
| integration_name
| string
| Так
| Назва інтеграції. | style="background:#ffcc80;" | Помаранчевий
|-
| Підтверджено
| CONFIRMED
| Замовлення прийнято в роботу. |-
| order_number
| string
| Номер замовлення. Канал
 "name": "Смартфон Example X 128GB",
|-
| sku
| базовий артикул. |-
| old_status
| varchar
| Старий статус. SEO-опис
 response = await client.sync_product(payload)
 "status": "IMPORTED",
 async def import_orders(self, filters: dict) -> list [dict]:
|-
| AC-5
| Товар має всі обов'язкові поля. )

* централізовану картку інтеграції по кожному каналу;
* синхронізацію товарів;
* синхронізацію цін;
* синхронізацію залишків;
* отримання замовлень;
* оновлення версій статусів замовлень;
* передачу номерів ТТН / ЕН;
* генерацію товарних фідів;
* валідацію товарів перед передачею;
* контроль помилок API;
* контроль помилок фідів;
* журнал усіх запитів і відповідей;
* dashboard по маркетплейсах;
* захист від дублювання товарів і замовлень. |}

Як менеджер товарного каталогу, 

POST /api/v1/marketplaces/hotline/feed/generate

POST /api/v1/marketplaces/products/sync-batch
 product_id=product.id,


Prom і Rozetka можуть бути джерелами замовлень. |-
| k2_order_id
| uuid
| ID замовлення K2 ERP. 
! |-
| price
| numeric
| Базова ціна. Статус
=== 14.9. Генерація фіду Hotline ===

Python-сервіс повинен:

=== 24.3. Проблемні товари ===
До MVP не входить:
! v
Marketplace Adapters

 async def update_stock(self, external_product_id: str, stock: dict) -> dict:

 v

{

! |-
| Помилка API
| Код, текст, raw-відповідь. |-
| Генерація фідів
| Середній
| Hotline / Rozetka feed. |-
| total_amount
| numeric
| Сума замовлення. Тип

 "customer_phone": order_payload.get("customer_phone"),
[[Категорія:Python]]
 mp_product.external_product_id = response.get("external_product_id")

 )
 db=db,
 "description": "SEO-опис товару без HTML-помилок та заборонених символів.",

 self.token = token
 </category>
=== 27.5. Hotline ===

 "marketplace": channel,
! |-
| raw_response
| jsonb
| Відповідь API. | Вони підсвічуються помаранчевим. |-
| customer_name
| string
| ПІБ покупця. |-
| sync_products_enabled
| boolean
| Так
| Чи синхронізувати товари. Заборонено зберігати API token, логіни, паролі або auth token у коді, Git, frontend-змінних або відкритих логах. | Він переходить у NEEDS_CORRECTION. Ключ
інтеграційні функції ERP призначена для:
K2 ERP / Dashboard / Менеджери
4. Python-сервіс отримує подію. |-
| name
| varchar
| Назва. Поле
=== 12.2. Основні компоненти Python-сервісу ===
! Тип

 <priceRUAH>12999</priceRUAH>

! Тип
 pass
=== 13.4. Hotline Client ===
! Валідація, мапінг, черги, дедублікація
 <name>Смартфони</name>
K2 ERP передає залишки по складах. |-
| marketplace
| varchar
| PROM, ROZETKA, HOTLINE. | Ставка передається через API ставок і логуються. |}

[[Категорія:Маркетплейси]]

 async def update_stock(self, external_product_id: str, stock: dict) -> dict:
'''Критично критично:''' інтеграційні функції ERP не повинна створювати дублікати товарів, замовлень або фідів. |-
| sync_orders_enabled
| boolean
| Так
| Чи імпортувати замовлення. Очікуваний результат

{| class="wikitable"

! # Чи потрібні окремі склади для залишків по каналах? |-
| Зміна ціни
| Стара ціна, нова ціна, канал. Що зберігати

 "external_order_id": external_order_id,
 product = product_repository.get_by_id(db, product_id)
! | style="background:#bbdefb;" | Блакитний
|-
| Синхронізується
| SYNCING
| Виконується API-запит або генерація фіду. ! | style="background:#ef9a9a;" | Критично
|-
| Нові замовлення
| Отримані з Prom/Rozetka. K2 ERP змінює товар. Production-фід потрібно формувати за актуальною специфікацією Hotline XML або YML. |-
| Синхронізація товарів
| Середній
| Каталог. # Чи потрібно оновлювати статуси замовлень у маркетплейсах? |-
| оновлення версій статусу
| Старий статус, новий статус, канал. Python-сервіс повинен:
 return
 </item>
POST /api/v1/marketplaces/products/{product_id}/sync
я хочу, щоб залишки з K2 ERP автоматизовано оновлювались на маркетплейсах, 
</pre>
 if existing:
== 29. Етапи реалізації ==
щоб контролювати якість інтеграції. product_status_service.set_status(

{| class="wikitable"

 async def sync_product(self, product: dict) -> dict:

* отримувати статус із K2 ERP;
* мапити статус у статус маркетплейса;
* передавати статус у Prom / Rozetka;
* передавати номер ТТН / ЕН;
* зберігати історію статусів;
* логувати помилки оновлення версій. # Як часто оновлювати залишки? |-
| external_order_id
| ID замовлення в маркетплейсі. pass
 <items>

 validation_result = product_validator.validate(product)
</price>

До MVP входить:
<pre>

[[Категорія:Інтеграції]]
"price": 12999.00,
async def update_stock(self, external_product_id: str, stock: dict) -> dict:
! Стан
[[Категорія:API]]
=== 14.7. Імпорт замовлень ===

 self.username = username

 db.commit()
! | style="background:#c8e6c9;" | Норма
|-
| Фіди сформовані
| XML/YML-фіди згенеровані. |-
| payment_type
| string
| Оплата. Колір
 pass
! Задача

* реалізувати price engine;
* реалізувати stock engine;
* реалізувати чергу оновлення версій;
* реалізувати історію змін. | Заблокувати синхронізацію ціни. |-
| status
| varchar
| Статус генерації. |-
| warranty
| string
| Гарантія. |-
| status
| string
| Статус. |-
| feed_public_url
| varchar
| URL фіду. |-
| style="background:#f3e5f5;" | Фіолетовий
| #f3e5f5
| Спеціальний або ручний сценарій. Дія системи

 except Exception as exc:

 pass

 external_order_id = order_payload ["external_order_id"]
 <firmName>Example Store</firmName>
=== 14.2. Перевірка підключення ===

[[Категорія:Rozetka]]

 "category_id": "phones",
 db=db,
Як складський облік, 

 payload={

 data={
{| class="wikitable"
 "attributes": {

! SEO-опис
! |-
| status
| varchar
| Статус K2 ERP. |-
| order_date
| datetime
| Дата замовлення. |}

Окремо варто відзначити який інтегрує K2 ERP / CRM / інтернет-магазин із маркетплейсами і прайс-агрегаторами '''Prom.=== Етап 7. Фіди Hotline / Rozetka ===
 pass
|-
| AC-16
| платформа генерує Hotline XML. # Які категорії товарів потрібно підтримати в MVP? Канал
== 28. MVP ==
 "warranty": "12 місяців"
|-
| Синхронізація товару
| SKU, канал, статус, відповідь. |-
| entity_id
| uuid
| ID сутності. |-
| sync_prices_enabled
| boolean
| Так
| Чи синхронізувати ціни. | Зберегти raw-відповідь. |-
| errors_count
| integer
| Кількість помилок. :contentReference [oaicite:1]{index=1}
! |-
| UnknownStatusError
| Канал повернув невідомий статус. | style="background:#ef9a9a;" | Червоний
|-
| Приховано
| HIDDEN
| Товар приховано через залишок, правило або вручну. Поле

K2 ERP виступає як джерелом операційних статусів. №
 errors=validation_result.errors,

 <categories>
 external_order_id=external_order_id,
<syntaxhighlight lang="python">

я хочу отримувати замовлення з Prom і Rozetka в K2 ERP, 

 @abstractmethod
 async def import_orders(self, filters: dict) -> list [dict]:
 entity_id=mp_product.id,
1. class RozetkaClient(MarketplaceClient):

 <firmId>12345</firmId>

* отримати Prom API token;
* отримати Rozetka API credentials;
* отримати Hotline feed specs;
* отримати Hotline bid API token, якщо потрібно;
* перевірити тестові запити;
* визначити список категорій;
* визначити правила мапінгу. # Який формат фіду Rozetka потрібен? |-
| external_product_id
| varchar
| ID товару в каналі. | style="background:#c8e6c9;" | Зелений
|-
| Скасовано
| CANCELLED
| Замовлення скасовано. Призначення

 audit_logger.log(
! Ключ

=== 14.12. Dashboard ===

=== 14.4. Масова синхронізація товарів ===

* визначити активні канали для товару;
* застосувати правила націнки;
* застосувати промо-ціну, якщо виступає як;
* застосувати мінімальну ціну;
* сформувати зміну ціни;
* передати зміну в Prom;
* передати зміну в Rozetka;
* оновити XML/YML-фід Hotline;
* зберегти історію зміни ціни. ! Код

5. №
щоб вона автоматизовано оновилась у всіх підключених каналах. Де застосовується для

 mp_product.status = "SYNCED"
=== 7.3. Залишки ===
 <item>
|-
| marketplace
| Джерело замовлення. |-
| tracking_number
| varchar
| ТТН / ЕН. | платформа передає новий залишок.=== 7.6. Dashboard керівника ===

* реалізувати product mapper;
* реалізувати category mapper;
* реалізувати attribute mapper;
* реалізувати валідацію;
* реалізувати sync workers. |-
| raw_payload
| jsonb
| інформаційні дані замовлення. |-
| Продаж відсутнього товару
| Залишки не оновились вчасно. |-
| sync_orders_enabled
| boolean
| Імпорт замовлень. |-
| style="background:#c8e6c9;" | Зелений
| #c8e6c9
| Успішно: синхронізовано, опубліковано, імпортовано, виконано. # Чи потрібно передавати ТТН Нової пошти / Укрпошти? |-
| AC-3
| Адміністратор створює інтеграцію Hotline. # Чи потрібна технічна підтримка декількох магазинів Prom? |-
| external_order_id
| string
| ID замовлення в маркетплейсі. Товари, ціни, залишки, статуси
 pass
 "prom": "prom-category-ref",
 |
 | 2. Для реалізації задачі необхідно отримати:

 "marketplace_categories": {
class HotlineClient:
 payload = marketplace_mapper.to_payload(product, marketplace)
 def __init__(self, feed_storage_url: str, bid_api_token: str | None = None):
=== Етап 1. Аналіз API та вимог ===

!

2. Область сценарії використання

21.3. Імпорт замовлень

21.2. Worker передачі товару

async def generate_product_feed(self, products: list [dict], format: str = "xml") -> bytes:

платформа повинна логувати:

pass

я хочу один раз вести товар у K2 ERP,

5. Основні бізнес-сценарії

finally:

я хочу змінити ціну в K2 ERP,

"stock_quantity": 12,
"old_price": 13999.00,
критично: Prom, Rozetka і Hotline мають різну логіку інтеграції. |-
Червоний #ef9a9a - items array Товари замовлення. SEO-опис }

POST /api/v1/marketplaces/hotline/bids/update

</syntaxhighlight>

24.2. Приклад dashboard

)
sku string Товар не передається і показується менеджеру. |}

3. Резервує товар у K2 ERP. Ризик

  • отримувати товари з K2 ERP;
  • перевіряти обов'язкові поля;
  • мапити категорії;
  • мапити характеристики;
  • формувати SEO-опис;
  • перевіряти фото;
  • формувати ціну;
  • формувати залишок;
  • передавати товар у Prom / Rozetka через API або фід;
  • включати товар у фід Hotline;
  • зберігати зовнішні ID товарів.<vendor>Example</vendor>

Python Sync Workers критично: структура XML вище виступає як прикладом. |-

Rozetka Seller API + товарний фід платформа формує тестовий фід або перевіряє конфігурація. |- Невідомий статус - Feed style="background:#c8e6c9;" | Норма
Проблемні фіди Мапінг категорій і dashboard проблем. * повна технічна підтримка всіх API-методів Prom;
  • повна технічна підтримка всіх API-методів Rozetka;
  • повна автоматизація процесів модерації;
  • автоматичне виправлення характеристик;
  • складна аналітичні інструменти реклами;
  • повна інтеграційні функції ERP з кабінетами маркетплейсів;
  • ML-мапінг категорій;
  • автоматичне створення рекламних кампаній. | style="background:#ef9a9a;" | Критично
Помилки синхронізації - AC-9 - AC-14 Він передається в активні канали. | Воно імпортується в K2 ERP. | style="background:#e3f2fd;" | інформаційні матеріали
Синхронізовано style="background:#bbdefb;" | Блакитний
Відправлено SHIPPED Передати менеджеру каталогу. Worker передає товар через API або додає у фід. orders = await client.import_orders(filters={"status": "new"})
  • неправильного API token;
  • помилок категорії;
  • помилок характеристик;
  • товару без фото;
  • товару без ціни;
  • дубліката замовлення;
  • відхиленого товару без виправлення даних.
! Поле щоб опрацьовувати їх в єдиній системі. |- | Token недійсний | API не функціонує. ! № </div> ! | style="background:#c8e6c9;" | Зелений |- | Комплектується | PROCESSING | Замовлення збирається. | Черги, API-запити, статуси обробки. ! |- | product_id | uuid | ID товару K2 ERP. |- | brand | string | Бренд. Статус K2 ERP ! Кожен товар, замовлення, зміна ціни, залишку, статусу, фід, XML-файл, API-запит і помилка повинні мати внутрішній ID, external_id, журнал подій і захист від повторної обробки. {| class="wikitable" == 13. Marketplace Client Interface == pass <pre> ! |- | Feed Publisher | Публікація фідів за публічним URL. |- | base_url | varchar | URL API. |- | AC-8 | Товар успішно передано. | платформа показує AuthError і не виконує синхронізацію. ! |- | marketplace | varchar | PROM, ROZETKA, HOTLINE. {| class="wikitable" 2. |- | login_encrypted | text | Зашифрований login. | Не публікувати фід. Код 4. | Статус стає SYNCED або PUBLISHED. |- | api_token_encrypted | text | Зашифрований token. |- | sync_stocks_enabled | boolean | Синхронізація залишків. |- | Category Mapping | Мапінг категорій K2 ERP до категорій каналу. |- | api_token | secret | Ні | Token для API. | Дубль не створюється. |- | last_synced_stock | numeric | Останній переданий залишок. |- | Некоректний XML | Hotline не прийме фід. Коментар @abstractmethod
try:

6. Колір

27.2. Товари

8.1. конфігурація інтеграції

Товар проходить валідацію. Технічний стек: Python 3.11+, FastAPI, PostgreSQL, SQLAlchemy, Alembic, httpx, Pydantic, Celery/RQ/APScheduler, Redis, Docker, XML/YML generator. :contentReference [oaicite:2]{index=2}
"https://example.com/images/sku-001-2.jpg"
"product_id": "K2-PRODUCT-000123",
id uuid ID замовлення. Помилка
<image>https://example.com/images/sku-001-1.jpg</image>
- Генерація фіду Канал, формат, кількість товарів, помилки. async def update_price(self, external_product_id: str, price: dict) -> dict:

Етап 6. Замовлення

style="background:#eeeeee;" | Сірий
XML validation перед публікацією. :contentReference [oaicite:3]{index=3} style="background:#c8e6c9;" | Зелений
Потребує перевірки NEEDS_REVIEW }

3. |-

Hotline Bid Client style="background:#c8e6c9;" | Норма
На модерації платформа передає нову ціну в канали. ! |- customer_phone varchar - sync_stocks_enabled boolean Так style="background:#eeeeee;" | Сірий
Помилка ERROR Помилка імпорту або оновлення версій. SEO-опис }
sync_queue.enqueue(
  1. Чи K2 ERP виступає як головним джерелом товарів? |-
idempotency_key Ключ повторної обробки.
<div style="border-left: 6px solid #f57c00; background: #fff3e0; padding: 12px 16px; margin: 16px 0;">
! Якщо товар не знайдено — статус NEEDS_REVIEW. |-
| AC-4
| Token неправильний. | Версіонування клієнтів і contract-тести. |-
| style="background:#bbdefb;" | Блакитний
| #bbdefb
| операційна дія виконується або інформаційні дані в процесі передачі. |-
| payload
| jsonb
| Технічні інформаційні дані. платформа повинна не допускати дублювання товарів і замовлень.<description>SEO-опис товару</description>

5.2. Синхронізація цін

  • регулярно отримувати нові замовлення;
  • перевіряти, чи замовлення вже імпортовано;
  • створювати замовлення в K2 ERP;
  • створювати покупця або прив'язувати до існуючого;
  • створювати резерв товарів;
  • зберігати джерело замовлення;
  • зберігати external_order_id;
  • передавати статус обробки назад у маркетплейс. №

</syntaxhighlight>

AuthError - sync_prices_enabled boolean class="wikitable"
pass
},
- delivery_service string - external_product_id string ID товару в маркетплейсі. Колір
- total_amount numeric - password_encrypted text - AC-19 Керівник відкриває dashboard.<id>phones</id>
  • створити FastAPI-проєкт;
  • налаштувати PostgreSQL;
  • створити моделі інтеграцій, товарів, замовлень, фідів, подій;
  • налаштувати Alembic;
  • реалізувати healthcheck. | Заблокувати синхронізацію залишку. |}
product = product_repository.get_by_id(db, product_id)

<price>

pass
"raw_payload": order_payload,
- is_active boolean Заблокувати передачу товару. pass
"images": [

Python Marketplace Integration Service

Див. 33. так само

"barcode": "4820000000000",
- Order - feed_public_url string Ні Attribute mapping і валідація. |- marketplace_status varchar - status varchar Статус синхронізації. №

</syntaxhighlight>

Статус style="background:#fff9c4;" | Увага
Відхилено - delivery_address text Адреса або відділення. SEO-опис
async def update_order_status(self, external_order_id: str, status: dict) -> dict:

14.6. оновлення версій залишків

async def sync_product(self, product: dict) -> dict:

20.1. marketplace_integrations

POST /api/v1/marketplaces/stocks/sync

1. Мета

Перед передачею товару платформа повинна перевірити:

style="background:#fff9c4;" | Жовтий
Імпортується IMPORTING Створюється в K2 ERP. SEO-опис
db=db,
marketplace_order_repository.create(
"hotline": "hotline-category-code"

async def sync_product_to_marketplaces(product_id: str, channels: list [str], db: "Session") -> None:

pass
 async def check_connection(self) -> dict:

! }

 "product_id": product_id,

! SEO-опис

 )

* інтернет-магазинів;
* ERP;
* CRM;
* WMS;
* торгових компаній;
* дистриб'юторів;
* компаній, які продають одночасно на декількох маркетплейсах;
* компаній, які ведуть товари, ціни, залишки і замовлення в K2 ERP. SKU

! # Як часто імпортувати замовлення? |-
| order_number
| Номер замовлення. '''Управлінський результат:''' менеджер і керівник повинні бачити, які товари синхронізовані, які мають помилки, які замовлення отримані, які ціни та залишки передані, які товари не пройшли модерацію, які фіди сформовані, які ставки Hotline активні та які канали продажів дають результат. |}

! |-
| Attribute Mapping
| Мапінг характеристик. Результат зберігається. | Вони підсвічуються червоним. | Товар приховується або передається як недоступний за правилом. |-
| file_id
| uuid
| Файл. | Воно імпортується в K2 ERP. Rozetka

== 16. Приклад XML-фіду Hotline ==
== 31. Відкриті питання ==

== 6. Основні сутності ==
== 3. Канали інтеграції ==

class MarketplaceClient(ABC):
<div style="border-left: 6px solid #c62828; background: #ffebee; padding: 12px 16px; margin: 16px 0;">
! |-
| Order Import Worker
| Імпорт замовлень. |-
| AttributeMappingError
| Не замаплені характеристики. |-
| order_number
| varchar
| Номер. |}

</syntaxhighlight>

{| class="wikitable"
 <guarantee>12 місяців</guarantee>
{| class="wikitable"
== 7. User Story ==
|-
| id
| uuid
| ID запису. |-
| Зміна залишку
| Старий залишок, новий залишок, канал. |}

=== 20.4. marketplace_feeds ===

=== 21.1. Синхронізація товару ===

 payload=response,
1. self.api_token = api_token

14. API Python-сервісу

<url>https://example.com/product/sku-001</url>

 integration = integration_repository.get_active(db, marketplace)
=== 14.3. Синхронізація товару ===
! |-
| оновлення версій ставки
| Hotline offer ID, стара ставка, нова ставка. базовий тип інтеграції
 pass

! KPI
 if not validation_result.is_valid:
 },
щоб він автоматизовано передавався в Prom, Rozetka і Hotline. |-
| products_count
| integer
| Кількість товарів. |-
| StockError
| Залишок некоректний. | Ручна перевірка, нестандартний фід. |-
| API Event
| Подія інтеграції. | style="background:#fff9c4;" | Жовтий
|-
| Потребує виправлення
| NEEDS_CORRECTION
| Не вистачає фото, категорії, характеристик або опису. | style="background:#fff9c4;" | Увага
|-
| Імпортовано замовлень
| Успішно створено в K2 ERP. Очікуваний результат
== 24. Dashboard керівника ==
! |-
| Dashboard API
| Статистика по товарах, замовленнях, помилках і каналах. async def publish_feed(self, feed: bytes, filename: str) -> str:
 new_status="SYNCED",
 ],
 async def sync_product(self, product: dict) -> dict:
|-
| id
| uuid
| ID інтеграції. | Фід доступний за public URL. |-
| Category Mapper
| Мапить категорії K2 ERP до категорій каналів. |-
| new_status
| varchar
| Новий статус. | Потрібно звірити актуальний API продавця. Тип
== 21. Приклад Python-логіки ==
{{SEO
|title=Технічне завдання: Інтеграція з Prom, Rozetka, Hotline для Python
|description=Технічне завдання на реалізацію Python-сервісу для інтеграції K2 ERP, CRM або інтернет-магазину з Prom.ua, Rozetka Marketplace та Hotline: товари, ціни, залишки, замовлення, статуси, фіди, XML/YML, ставки, помилки, dashboard та журналювання.
|keywords=Python, Prom.ua API, Rozetka API, Hotline XML, маркетплейси, інтеграція, товари, замовлення, ціни, залишки, K2 ERP, FastAPI, XML feed, YML, seller API
}}
 pass
style="background:#c8e6c9;" | Зелений
На модерації MODERATION Товар очікує перевірки маркетплейса. Критерій
 |
 | 4. | style="background:#bbdefb;" | Блакитний
|-
| Виконано
| COMPLETED
| Замовлення завершено. | Це більше price-comparison / рекламний канал, ніж класичний marketplace.=== 20.3. marketplace_orders ===

* реалізувати PromClient;
* реалізувати RozetkaClient;
* реалізувати HotlineFeedGenerator;
* реалізувати HotlineBidClient;
* реалізувати client factory;
* реалізувати обробку помилок. Пріоритет
|-
| AC-1
| Адміністратор створює інтеграцію Prom. |-
| customer_name
| varchar
| Покупець. |-
| Marketplace Product
| Товар у конкретному каналі. |-
| created_at
| timestamp
| Дата створення. |-
| style="background:#ffcc80;" | Помаранчевий
| #ffcc80
| Потрібна дія менеджера. | Перевести в ручну перевірку. 6. | інтеграційні функції ERP зберігається і проходить check_connection. async def sync_product_to_channel(product_id: str, marketplace: str, db: "Session") -> None:

 v
=== 19.1. Логіка синхронізації товарів ===
! |-
| Price Engine
| Формує ціну по правилах. Поле
Hotline офіційно описує вимоги до товарних фідів, зокрема Hotline XML і YML, а так само має API для керування ставками по пропозиціях магазину. Показник
=== Етап 9. Production hardening ===
! Тип
== 30. Ризики ==
=== 13.2. Prom Client ===

 )

<div style="border-left: 6px solid #c62828; background: #ffebee; padding: 12px 16px; margin: 16px 0;">
== 18. Дедублікація ==
 mp_product.error_message = str(exc)

=== 20.5. marketplace_events ===

== 8. Функціональні вимоги ==
{| class="wikitable"
 async def update_price(self, external_product_id: str, price: dict) -> dict:

! |-
| AC-7
| Категорія не замаплена. |-
| sync_products_enabled
| boolean
| Синхронізація товарів. |}

 pass

 <name>Смартфон Example X 128GB</name>
</div>
! |-
| stock_quantity
| numeric
| Залишок. Тип
|-
| Чернетка
| DRAFT
| Товар створений у K2 ERP, але ще не готовий до передачі. Критерій
! |-
| barcode
| string
| Штрихкод. |-
| ValidationError
| Некоректний товар або замовлення. SEO-опис
 k2_order = k2_order_service.create_from_marketplace(order_payload)
<pre>
 pass
я хочу автоматизовано формувати фід для Hotline, 
=== 13.1. Загальний інтерфейс ===
Python-сервіс повинен:
 )
 "total_amount": order_payload.get("total_amount"),
 @abstractmethod
 try:
async def import_marketplace_orders(marketplace: str, db: "Session") -> None:
! Критерій

 self.password = password

! | UNKNOWN_STATUS і ручний мапінг.== 9. Статуси товарів ==

== 19. Черги синхронізації ==
=== 7.2. Ціни ===
Python-сервіс повинен:
{| class="wikitable"

<syntaxhighlight lang="python">
K2 ERP виступає як головним джерелом товарів. |-
| entity_type
| varchar
| product, order, feed, price, stock, bid. |-
| Product
| Товар у K2 ERP. Колір

 pass
 async def update_order_status(self, external_order_id: str, status: dict) -> dict:
pass
SEO-опис
self.bid_api_token = bid_api_token

5.3. Синхронізація залишків

|-
| API Layer
| REST API для команд із K2 ERP. | інтеграційні функції ERP зберігається і проходить check_connection. |-
| Stock Engine
| Формує доступний залишок. | style="background:#ef9a9a;" | Червоний
|-
| Помилка синхронізації
| SYNC_ERROR
| API або фід повернув помилку. | Високий пріоритет stock sync. Критерій
GET /api/v1/marketplaces/dashboard?date_from=2026-05-01&date_to=2026-05-31
K2 ERP передає нові ціни. | API error, rejected, sync error. |-
| sku
| varchar
| Артикул. |-
| feed_type
| varchar
| products, actions, prices. |-
| style="background:#fff9c4;" | Жовтий
| #fff9c4
| Очікування дії або модерації. Для кожного активного каналу створюється sync task. |-
| AC-17
| У товарі некоректний XML-символ. "rozetka": "rozetka-category-id",

* https://public-api.docs.prom.ua/
* https://support.prom.ua/hc/uk/articles/360005438678-Чи-є-у-сервіса-публічне-API
* https://support.prom.ua/hc/uk/articles/360020350478-Управління-API-токенами-в-кабінеті-компанії
* https://api-seller.rozetka.com.ua/apidoc/
* https://sellerhelp.rozetka.com.ua/p282-api-start.html
* https://hotline.ua/ua/about/pricelists_specs/
* https://hotline.ua/ua/about/pricelists_specs_xml_action/
* https://hotline.ua/ua/about/api_auctions/

{| class="wikitable"

* [[Python]]
* [[FastAPI]]
* [[K2 ERP]]
* [[Prom.ua]]
* [[Rozetka Marketplace]]
* [[Hotline]]
* [[Маркетплейси]]
* [[Товарний фід]]
* [[XML]]
* [[YML]]
* [[Синхронізація залишків]]
* [[Синхронізація цін]]
* [[Замовлення маркетплейсів]]
* [[API інтеграція]]

 for order_payload in orders:
Prom.ua офіційно має публічне API для віддаленого керування даними в кабінеті компанії, а API-токени можна керувати в кабінеті компанії у розділі налаштувань. # Чи потрібно автоматизовано приховувати товари без залишку? Поле
! |}

 <categoryId>phones</categoryId>

 async def update_price(self, external_product_id: str, price: dict) -> dict:
Rozetka Marketplace має API для інтеграції продавців: офіційна довідка описує API як набір інструментів для інтеграції системи продавця з ROZETKA Маркетплейс, а API-документація вказує можливість роботи із замовленнями, товарами, листуванням і контролем процесів. |-
| Product Validator
| Перевіряє товари перед передачею. |-
| last_synced_price
| numeric
| Остання передана ціна. |-
| AC-2
| Адміністратор створює інтеграцію Rozetka. |-
| AC-15
| Товар у замовленні не знайдено. # Чи потрібно імпортувати замовлення з Prom? Prom та Rozetka мають API для продавців, а Hotline у базовому сценарії функціонує через товарні фіди, вимоги до прайсів і окремий API керування ставками. |-
| created_at
| timestamp
| Дата. | Зупинити інтеграцію, повідомити адміністратора. Перевіряє external_order_id. SEO-опис
! | Фід не публікується або товар виключається за правилом. оновлення версій K2 ERP
 pass
 integration = integration_repository.get_active(db, marketplace)
! | Dashboard, список товарів, список замовлень. | style="background:#bbdefb;" | Блакитний
|-
| Імпортовано
| IMPORTED
| Замовлення створено в K2 ERP. POST /api/v1/marketplaces/prices/sync

 mp_product.status = "SYNCING"

=== 7.1. Товари ===
=== 27.1. Інтеграції ===
== 22. Обробка помилок ==

<pre>

== 12. технічна архітектура рішення для бізнесу ==
 mp_product.last_synced_price = product.price
! |}

! |-
| style="background:#eeeeee;" | Сірий
| #eeeeee
| Чернетка, приховано, скасовано або архів. | style="background:#ef9a9a;" | Червоний
|}

 self.feed_storage_url = feed_storage_url

 "https://example.com/images/sku-001-1.jpg",
=== 19.2. Логіка імпорту замовлень ===
 </items>
<pre>
Hotline у MVP розглядається як канал передачі товарних пропозицій через фід. |-
| attributes
| object
| Характеристики. | Модерація, нові замовлення, очікування. |-
| barcode
| Штрихкод. | style="background:#ffcc80;" | Помаранчевий
|-
| Готовий до синхронізації
| READY_TO_SYNC
| Товар готовий до передачі. |-
| DuplicateOrderError
| Замовлення вже імпортовано. Замовлення, статуси, модерація, фіди
 self.base_url = base_url
{| class="wikitable"
 |
 | 5. '''Головна ідея:''' розробити Python-сервіс.ua''', '''Rozetka Marketplace''' і '''Hotline''' для синхронізації товарів, цін, залишків, замовлень, статусів, фідів, ставок, помилок і аналітики. | style="background:#c8e6c9;" | Зелений
|-
| Відхилено
| REJECTED
| Товар відхилено каналом. |-
| category_id
| string
| Категорія K2 ERP. # Чи потрібна технічна підтримка декількох кабінетів Rozetka? |-
| product_id
| ID товару K2 ERP. |-
| error_message
| text
| Остання помилка. # Чи Rozetka товари приймає через API, фід або змішано? |-
| marketplace_category_id
| string
| Категорія маркетплейса. |-
| AC-13
| Rozetka має нове замовлення. Назва

 "memory": "128GB",

=== 5.4. Отримання замовлень ===

! |}

Як керівник, 

</div>

! HTML
! 7. async def authenticate(self) -> dict:
async def get_bids(self) -> list [dict]:

14.5. оновлення версій цін

11. Єдина логіка кольорів

class PromClient(MarketplaceClient):

</categories>

25. Безпека

product_id=product_id,
def __init__(self, base_url: str, username: str | None = None, password: str | None = None, token: str | None = None):
async def update_bid(self, offer_id: str, bid_value: int) -> dict:
@abstractmethod
)
marketplace=marketplace,
Python-сервіс повинен:
  • timeout;
  • HTTP 429;
  • HTTP 500;
  • HTTP 502;
  • HTTP 503;
  • HTTP 504;
  • тимчасової недоступності API;
  • тимчасової помилки імпорту замовлень;
  • тимчасової помилки оновлення версій ціни;
  • тимчасової помилки оновлення версій залишку;
  • тимчасової помилки генерації фіду. |-
Attribute Mapper Мапить характеристики. Основні сценарії

</syntaxhighlight>

"sku": "SKU-001",

POST /api/v1/marketplaces/orders/{order_id}/update-status

14.11. оновлення версій ставок Hotline

except Exception as exc:

23. Retry-логіка

  • Prom.ua;
  • Rozetka Marketplace;
  • Hotline. |-
Hotline Feed Generator - оновлення версій статусів замовлень Високий - old_price numeric Check-connection і alert адміністратору. |- Order Status Статус замовлення. Призначення
task_name="sync_product_to_channel",
  • SKU заповнений;
  • назва заповнена;
  • SEO-опис заповнений;
  • категорія K2 ERP визначена;
  • категорія каналу замаплена;
  • бренд заповнений, якщо обов'язковий;
  • ціна більша за 0;
  • залишок не від'ємний;
  • фото доступні за URL;
  • характеристики заповнені;
  • штрихкод валідний, якщо потрібен;
  • гарантія заповнена, якщо потрібна;
  • товар не заборонений правилами каналу;
  • назва не містить HTML або службового сміття;
  • SEO-опис не містить заборонених тегів;
  • для Hotline виступає як URL товару на сайті магазину;
  • для Rozetka виступає як категорія й характеристики згідно з вимогами категорії;
  • для Prom виступає як коректний статус публікації. |-
Rozetka Adapter Робота з API Rozetka. Значення

POST /api/v1/marketplaces/integrations/{integration_id}/check-connection

Імпорт замовлень Критичний - customer_phone string }

POST /api/v1/marketplaces/orders/import

- оновлення версій ставок Hotline Середній Маркетинг. SEO-опис
continue

Prom.ua / Rozetka / Hotline

8.2. Товар для синхронізації

- Price Rule - PriceError Замовлення переходить у NEEDS_REVIEW. | Архів, hidden, cancelled. |- password secret Ні }
"order_number": order_payload.get("order_number"),

5.6. Hotline як фід і канал просування

19.3. Пріоритети задач

Як менеджер продажів,

AC-12 Повернути існуюче замовлення. Поле

Метою задачі виступає як створення Python-сервісу для інтеграції з трьома зовнішніми каналами продажів і просування:

"brand": "Example",

Етап 8. Dashboard та аудит

Критично критично: товар без категорії, фото, ціни або обов'язкових характеристик не повинен автоматизовано передаватись у канали. Тип помилки <stock>В наявності</stock>
 mp_product.raw_response = response
=== 7.5. Hotline ===
{| class="wikitable"
<pre>
5. Поле
 mp_product.status = "SYNC_ERROR"
|-
| marketplace
| enum
| PROM або ROZETKA. Тип

! Дія

 db=db,

* доступ до кабінету продавця Prom.ua;
* API token Prom.ua;
* доступ до кабінету продавця Rozetka;
* API credentials Rozetka;
* актуальну API-документацію Rozetka Seller API;
* вимоги Rozetka до товарного фіду, якщо застосовується для фід;
* доступ до кабінету Hotline;
* вимоги Hotline до XML/YML/CSV-фідів;
* auth token Hotline для API ставок, якщо застосовується для;
* список категорій товарів;
* правила мапінгу категорій K2 ERP  Prom / Rozetka / Hotline;
* правила мапінгу характеристик;
* правила округлення цін;
* правила синхронізації залишків;
* правила резервування товару після отримання замовлення;
* правила оновлення версій статусів замовлень;
* правила передачі ТТН. SEO-опис
== 15. Приклад запиту на синхронізацію товару ==

 "marketplace_status": order_payload.get("status"),
! * зберігання API token і credentials тільки у secret storage;
* заборону логування secrets;
* HTTPS для всіх API-запитів;
* перевірку SSL;
* рольову модель доступу;
* окремі права на синхронізацію товарів;
* окремі права на зміну цін;
* окремі права на зміну залишків;
* окремі права на оновлення версій ставок Hotline;
* журнал усіх дій;
* маскування персональних даних покупців;
* контроль доступу до замовлень;
* захист від дублювання. |-
| marketplace_product_id
| ID товару в каналі. |-
| FeedGenerationError
| Помилка генерації XML/YML. | style="background:#ef9a9a;" | Критично
|}

K2 ERP / CRM / WMS

 self.base_url = base_url
 marketplace_order_repository.create_error_record(
</div>
== 20. Модель даних ==
=== 27.4. Замовлення ===
<syntaxhighlight lang="python">
|-
| Активні товари
| 12 450
| 8 210
| 10 980
| style="background:#e3f2fd;" | інформаційні матеріали
|-
| Синхронізовано
| 12 100
| 7 940
| 10 900
| style="background:#c8e6c9;" | Норма
|-
| На модерації
| 120
| 180
| -
| style="background:#fff9c4;" | Увага
|-
| Відхилено
| 35
| 52
| -
| style="background:#ef9a9a;" | Критично
|-
| Помилки
| 18
| 24
| 6
| style="background:#ef9a9a;" | Критично
|-
| Нові замовлення
| 42
| 28
| -
| style="background:#fff9c4;" | Увага
|-
| Імпортовано замовлень
| 39
| 27
| -
| style="background:#c8e6c9;" | Норма
|}

<div style="border-left: 6px solid #6a1b9a; background: #f3e5f5; padding: 12px 16px; margin: 16px 0;">

=== Етап 2. Базовий Python-сервіс ===
[[Категорія:Технічні завдання]]
<pre>
<syntaxhighlight lang="xml">
</pre>
! |-
| delivery_service
| varchar
| Служба доставки. |-
| product_hash
| Hash назви, ціни, залишку, характеристик. Тип
|-
| Prom.ua
| Public API
| Товари, замовлення, статуси, ціни, залишки. Очікуваний результат
=== Етап 3. Marketplace Adapters ===
! |}

__TOC__

! |-
| base_url
| string
| Так
| URL API або endpoint фіду. Критерій
from abc import ABC, abstractmethod

 mp_product.last_synced_stock = product.available_stock
! |-
| CategoryMappingError
| Не знайдено категорію каналу. |}

 pass

</pre>
 "k2_order_id": k2_order.id,
Сервіс повинен забезпечити:
 db.commit()
|-
| id
| uuid
| ID фіду. Prom

=== 14.1. Створення інтеграції ===
 v
платформа повинна забезпечити:

 existing = marketplace_order_repository.get_by_external_id(

! |
 | 3. |-
| ApiError
| API повернув помилку. Сутність
|-
| id
| uuid
| ID події. |-
| AC-21
| виступає як товари без мапінгу. # Який формат Hotline використовуємо: XML, YML, CSV? # Чи потрібно імпортувати замовлення з Rozetka? SEO-опис

 pass
<syntaxhighlight lang="json">
! |-
| ImageError
| Фото недоступне або некоректне. |-
| Retry
| Хто або який worker запустив, причина, результат.</pre>

* реалізувати order import workers;
* реалізувати дедублікацію;
* реалізувати створення замовлення в K2 ERP;
* реалізувати status export;
* реалізувати передачу ТТН. |-
| name
| string
| Назва. |-
| generated_at
| timestamp
| Дата генерації. | style="background:#eeeeee;" | Сірий
|-
| Очікує валідації
| PENDING_VALIDATION
| Товар очікує перевірки. |}

POST /api/v1/marketplaces/hotline/feed/publish

Python-сервіс повинен:

! Компонент

{{DISPLAYTITLE:Технічне завдання: Інтеграція з Prom, Rozetka, Hotline для Python}}

 "customer_name": order_payload.get("customer_name"),
 async def generate_action_feed(self, actions: list [dict]) -> bytes:
{| class="wikitable"
 client = marketplace_client_factory.create(integration)
|-
| Активні товари
| Кількість товарів, активних у каналах. |-
| Імпорт замовлення
| Канал, external_order_id, статус. Подія
=== 14.8. оновлення версій статусу замовлення ===
 @abstractmethod
 async def check_connection(self) -> dict:
 },

щоб товари були актуальні за ціною, наявністю і характеристиками. |-

Дублювання замовлень style="background:#bbdefb;" | Блакитний
Передано SYNCED - Prom Adapter - marketplace varchar - event_type varchar - public_url varchar - AC-20 виступає як відхилені товари. Prom API / Rozetka API / Hotline Feed + Bids API

</syntaxhighlight>

  • формувати XML/YML-фід;
  • включати тільки активні товари;
  • передавати актуальні ціни;
  • передавати актуальні залишки;
  • передавати URL товару;
  • передавати фото;
  • передавати характеристики;
  • формувати фід акцій, якщо потрібно;
  • керувати ставками через API ставок, якщо підключено. | external_order_id + marketplace unique constraint. Поле

Як маркетолог,

SKU-001 Смартфон Example X Rozetka Потребує виправлення Не замаплена характеристика «Пам'ять» Заповнити мапінг
SKU-002 Навушники Example Air Prom Помилка Фото недоступне Перевірити URL фото
SKU-003 Кавоварка Example Hotline Помилка фіду Некоректний XML-символ в описі Очистити SEO-опис

щоб не продавати товар, якого немає. Критерій

client = marketplace_client_factory.create(integration)
async def update_order_status(self, external_order_id: str, status: dict) -> dict:

10. Статуси замовлень

 entity_type="product",
<div style="border-left: 6px solid #c62828; background: #ffebee; padding: 12px 16px; margin: 16px 0;">
{| class="wikitable"
== 4. Передумови ==
 <date>2026-05-07 12:00</date>
POST /api/v1/marketplaces/integrations
</div>
<pre>
я хочу бачити продажі та реалізація, помилки, статуси товарів і ефективність каналів, 
</pre>
! | Перевести в NEEDS_CORRECTION / NEEDS_REVIEW. SEO-опис
=== 5.1. Передача товарів ===
=== 18.1. Дедублікація товарів ===
 },
== 32. Джерела ==
 <code>SKU-001</code>
== 27. Acceptance Criteria ==
 def __init__(self, base_url: str, api_token: str):
== 26. Логування та аудит ==
! Обов'язковість
|-
| Нове
| NEW
| Замовлення отримано з маркетплейса. |}

! | style="background:#fff9c4;" | Жовтий
|-
| Опубліковано
| PUBLISHED
| Товар доступний покупцям. Hotline

Retry дозволений для:
 marketplace=marketplace,
 for channel in channels:
Зміна API - Stock Rule Помилки валідації, невідомі товари, retry. |} - description text - is_active boolean - AC-6 - AC-18 користувач системи оновлює ставку Hotline. Як зменшити
<category>

Критично критично: доступи до Prom, Rozetka і Hotline потрібно зберігати тільки в secret storage або в зашифрованому вигляді. |-

is_active boolean Так - marketplace_category_id varchar Категорія каналу. async def import_orders(self, filters: dict) -> list [dict]:
  • реалізувати dashboard API;
  • реалізувати список проблемних товарів;
  • реалізувати список проблемних замовлень;
  • реалізувати список помилок фідів;
  • реалізувати експорт, якщо потрібно. SEO-опис
marketplace=marketplace, v

13.3. Rozetka Client

db=db,
"color": "Black",

20.2. marketplace_products

- format varchar - Audit Logger - marketplace varchar PROM, ROZETKA, HOTLINE. ! Очікуваний результат
  • отримати актуальний залишок;
  • врахувати резерви;
  • врахувати мінімальний страховий залишок;
  • визначити доступну кількість для продажу;
  • передати залишок у канали;
  • приховати товар, якщо залишок 0;
  • відновити товар, якщо залишок з'явився. |-
marketplace enum Так - login secret Ні - updated_at timestamp - AC-10 }
status="NEEDS_CORRECTION",

7.4. Замовлення

  • створення інтеграцій Prom, Rozetka, Hotline;
  • перевірка підключення;
  • мапінг категорій;
  • мапінг характеристик;
  • синхронізація товарів;
  • синхронізація цін;
  • синхронізація залишків;
  • імпорт замовлень з Prom;
  • імпорт замовлень з Rozetka;
  • оновлення версій статусів замовлень;
  • передача ТТН;
  • генерація Hotline XML/YML-фіду;
  • публікація фіду за URL;
  • базове керування ставками Hotline, якщо виступає як token;
  • дедублікація;
  • retry-механізм;
  • журнал подій;
  • dashboard API;
  • unit-тести;
  • mock clients для Prom/Rozetka/Hotline. Очікуваний результат

Етап 4. Товари

5.5. оновлення версій статусів замовлень

27.6. Dashboard

=== Етап 5. Ціни та залишки ===