SAC (master object)
   ├── Procedure #1 (англійський)
   ├── Procedure #2 (-50% від стартової)
   ├── Procedure #3 (голландський з -50% від першого)
   └── Procedure status controller

Загальний огляд sanctionedAuctionChain

Мета створення сутності та нормативні засади

З метою автоматичного перевиставлення лотів, що відповідає Постанові №75 від 21 січня 2026 в системі Prozorro.Sale на сервісі Jobber реалізовано нову сутність з pipelineMethod: sanctionedAuctionChain

Бізнес назва - Процес реалізації санкційного активу

Глоссарій

ТермінПояснення
Ланцюжок

це master-об’єкт в ЦБД на сервісі Jobber, який представляє бізнес-процес реалізації одного санкційного активу через послідовність автоматично створюваних аукціонних процедур.

Ланцюжок створюється Організатором як первинний об’єкт процесу реалізації активу та містить:

  • всі вихідні дані, необхідні для створення процедур
  • автоматично створює до трьох процедур продажу активу
  • зберігає ідентифікатори всіх процедур, що належать цьому процесу
  • керує логікою створення наступної процедури у випадку неуспішності попередньої
  • має власний життєвий цикл та статус (pending, active, sold, dissolved)

Ланцюжок є технічною сутністю, яка використовується для автоматизації перевиставлення активу відповідно до нормативних вимог.

Master-об’єкт

це основна сутність, яка:

  • містить всі дані процесу

  • управляє створенням дочірніх процедур

  • зберігає зв’язок між процедурами

У цьому ТЗ master-об’єктом є SAC.

Автоматично створена процедураце процедура, створена ЦБД без участі Організатора на основі правил Ланцюжка.
Попередня процедура

це процедура, на основі якої була створена наступна процедура в Ланцюжку.

В розрізі данного ТЗ "Попередня процедура" може бути лише процедурою цього самого одного ланцюжка і вона не може бути створена раніше до ланцюжка.

Стартова ціна

це початкова ціна продажу активу для конкретної процедури.

Особливості:

  • задається Організатором для першої процедури

  • для другої процедури автоматично зменшується на 50%

  • для третьої процедури використовується стартова ціна другої процедури

Розрахунок і округлення виконуються автоматично ЦБД.

Гарантійний внесок

це сума коштів, яку учасник повинен сплатити для участі в аукціоні.

Розмір:

  • 5% стартової ціни, якщо стартова ціна ≥ 250 млн грн;

  • 20% стартової ціни, якщо стартова ціна < 250 млн грн.

Гарантійний внесок:

  • задається для першої процедури;

  • для наступних процедур розраховується автоматично або задається окремо (залежно від конфігурації).

Реєстраційний внесок

це плата за реєстрацію заяви на участь в аукціоні.

Цей внесок:

  • передається Майданчиком в запиті на публікації обʼєкта SAC

  • не валідовується ЦБД (окрім перевірки, що значення > 0)

Особливості

Створення та робота із ланцюжком:


  1. Чи будемо відображати сутність "Процес реалізації санкційного активу" на Порталі чи на будь-якому іншому фронті?

Ця сутність може бути суто технічна і існувати для автоматизації створення процедур.

В такому випадку не бачу потреби розділяти статуси "успішний" та "неуспішний" процес. Процес (ланцюжок) або "діючий", або "закритий"


2. В Нормативці вказано: Оголошення про проведення аукціону, що публікується організатором аукціону, повинно містити такі відомості: ... 

  • стартова ціна активу для кожного аукціону;

  • розмір гарантійного внеску електронного аукціону для кожного аукціону;

Орг передає Стартову ціну і Гарантійний внесок тільки для першої процедури. Для наступних в ланцюжку розраховуємо автоматично (+ Орг може відредагувати протягом 48 годин після створення процедури)

АБО

Орг передає Стартову ціну і Гарантійний внесок для кожної процедури. (+ Орг може відредагувати протягом 48 годин після створення процедури)

Гарантійний внесок:

  • 5 відсотків стартової ціни, якщо вона дорівнює або перевищує 250 млн. гривень
  • 20 відсотків стартової ціни, якщо вона є меншою, ніж 250 млн. гривень

3. Реєстраційний внесок поривʼязаний до мін ЗП і ми також його не валідуємо, а віддаємо на Майданчик. 

Обʼєкт SanctionedAuctionChain

Статуси обʼєкта


techУКР назваАНГЛ назваПерехід зЗа умовиКоментар
pendingОпублікованоCreated-перший статус, який отримує обʼєкт при публікації

Статус, в якому перебуває обʼєкт до моменту створення першої процедури в ланцюжку

Протягом 5 хвилин має автоматично опублікуватися Перша процедура SAE

activeПроходить аукціонAuctionpendingСтворено першу процедуру в ланцюжкуОбʼєкт має цей статус з моменту створення першої процедури в ланцюжку і до моменту, поки:
  • третя в ланцюжку процедура не набуває термінального статусу (procedure.status: complete OR unsuccessful)
    АБО
  • будь-яка процедура в цьому ланцюжку набуває статусу cancelled
soldПроданоSoldactive

Будь-яка процедура в цьому ланцюжку набуває статусу procedure.status: complete

Термінальний статус
dissolvedНе проданоDissolved active

Будь-яка процедура в цьому ланцюжку набуває статусу procedure.status: cancelled

Третя в ланцюжку процедура набуває статусу procedure.status: unsuccessful

Термінальний статус

Періоди обʼєкта

Періоди відсутні

Документи обʼєкта

При публікації обʼєкта SAС необхідно передати документи першої Процедури ланцюжка.

В другу і третю процедури модель documents[] копіюється із попередньох процедури цього ланцюжка.

Перелік документів описано в ТЗ до Процедури ТУТ

Логіка роботи Ланцюжка

Публікація ланцюжка

Організатор публікує обʼєкт "Ланцюжка", в якому передає:

Обʼєкт створюється у статусі pending

Протягом цього статусу ручні дії (в тому числі редагування полів) над обʼєктом неможливі.

Публікація першої процедури

Після успішно опублікованого обʼєкта "ланцюжок", протягом 5 хвилин автоматично створюється перша процедура.

Майданчик може отримати токен від автоматично створеної процедури за endpoint: 

curl --location 'https://procedure-sandbox.prozorro.sale/api/jobber/sanctionedAuctionChain/sac/{{_id}}/produced_entities?acc_token=******' \
--header 'Authorization: ******'

З моменту створення першої процедури "ланцюжок" набуває статусу active.

В цьому статусі "ланцюжка" Організатор може редагувати поля:

Організатор може редагувати поля створеної процедури протягом 48 годин. Зміни потрібно робити безпосередньо в створеній процедурі, а не в обʼєкті SAC. В SAC редагуються тільки два вищевказані параметри.

Редагування Процедури згідно ТЗ процедури ТУТВся логіка процедури залишається без змін. Немає різниці чи Процедура була створена руками до запуску "ланцюжків" чи створена вітоматично "ланцюжком".

Публікація другої процедури

Якщо перша процедура в ланцюжку отримала статус unsuccessful, то протягом 5 хвилин створюється друга процедура, в яку копіюються значення полів із першої процедури + встановлюється дата auctionPeriod.startDate відповідно до періода експозиції із "ланцюжка".

Обʼєкт "ланцюжка" не змінює статус і залишаєтсья у статусі active

Стартова ціна для другої процедури розраховується в момент її створення, як 50% Стартової ціни першої процедури на момент створення другої

Гарантійний внесок для другої процедури розраховується в момент її створення, як:

Деталі і приклади розрахунку стартової ціни описані в розділі "Поля що розраховуються автоматично при створенні другої і третьої процедури"

При авто-створенні другої процедури у ланцюжку ЦБД має автоматично для другої процедури проставити tenderAttempt: 2 та у полі previousAuctionId проставити ID першої процедури із ланцюжка.

Публікація третьої процедури

Якщо друга процедура в ланцюжку отримала статус unsuccessful, то протягом 5 хвилин створюється третя процедура, в яку копіюються значення полів із другої процедури + встановлюється дата auctionPeriod.startDate відповідно до періода експозиції із "ланцюжка".

Обʼєкт "ланцюжка" не змінює статус і залишаєтсья у статусі active

Стартова ціна для третьої процедури розраховується в момент її створення, як 100% Стартової ціни другої процедури на момент створення третьої

Гарантійний внесок для третьої процедури розраховується в момент її створення, як:

Деталі і приклади розрахунку стартової ціни описані в розділі "Поля що розраховуються автоматично при створенні другої і третьої процедури"

При авто-створенні третьої процедури у ланцюжку ЦБД має автоматично для третьої процедури проставити tenderAttempt: 3 та у полі previousAuctionId проставити ID другої процедури із ланцюжка.


Приклад

Організатор створює ланцюжок, де передає:

Протягом 5 хвилин створилася перша процедура SAE.

Організатор протягом 48 годин редагує в Процедурі SAE:

В обʼєкті SAC залишиться першочергова Стартова ціна 100 000 грн, а в першіій процедурі SAE Організатор змінив на 80 000 грн.

За результатами - Перша процедура SAE НЕ успішна і отримує статус unsuccessful.

ЦБД протягом 5 хвилин, після отримання Першою процедурою статуса unsuccessful автоматично створює другу процедуру SAE

ЦБД автоматично розраховує:

Організатор протягом 48 годин редагує в другій Процедурі SAE:

В обʼєкті SAC залишиться першочергова Стартова ціна 100 000 грн і першочерговий Гарантійний внесок 10 000 грн.

За результатами - Друга процедура SAE НЕ успішна і отримує статус unsuccessful.

ЦБД протягом 5 хвилин, після отримання Другою процедурою статуса unsuccessful автоматично створює третью процедуру SAD

ЦБД автоматично розраховує:

Організатор протягом 48 годин від моменту створення процедури може редагувати Стартову ціну, Гарантійку і інші поля.




Поля що розраховуються автоматично при створенні другої і третьої процедури

70. Якщо електронний аукціон за методом підвищення ціни визнаний таким, що не відбувся, електронна торгова система автоматично оголошує повторний аукціон за методом підвищення ціни із зниженням стартової ціни на 50 відсотків, який проводиться не раніше ніж на двадцятий та не пізніше ніж на тридцять п’ятий день з дати його оголошення (стосовно активу, стартова ціна якого становить менше 250 млн. гривень) або не раніше ніж на тридцятий та не пізніше ніж на дев’яностий день з дати його оголошення (стосовно активу, стартова ціна якого більше або дорівнює 250 млн. гривень).


1) сума, що закінчується від 0,0001 до 0,4999 копійки, заокруглюється в бік зменшення до найближчої суми, яка дорівнює цілій копійці;

2) сума, що закінчується від 0,5 до 0,9999 копійки, заокруглюється в бік збільшення до найближчої суми, яка дорівнює цілій копійці.


Правила заокруглення:

Якщо стартова ціна 11,11 грн, то стартова другого має бути 5,56 грн

Якщо стартова 88,73, то для другого - 44,37 грн


Скасування

Скасувати "ланцюжок" окремим запитом неможливо.

При скасуванні будь-якої процедури ланцюжка - автоматично скасовується ланцюжок.


Структура даних обʼєкта SAC


Field nameRequired for publishingTypereadOnlyx-legalNameUax-legalNameEncomment
1owner-stringtrueІдентифікатор майданчикаBroker Name
2ownerToken-string($uuid)true

x-default: hex
3_id-string

trueВнутрішній ідентифікаторIDx-default: object_id
x-serialize_when_none: false

x-format: object-id
4datePublished-string($date-time)
trueДата публікаціїPublished datex-default: now
5dateModified-string($date-time)
trueОстання дата зміниDate modified
6objectId-string
trueІдентифікатор ланцюжкаChain IDexample: SAC001-UA-20260217-12345
7status-stringtrueСтатус процедуриProcedure status

enum:

  • pending
  • active
  • sold
  • dissolved
8pipelineMethod+
stringfalseТипChain type

enum:

  • sanctionedAuctionChain
  • sanctionedAuctionChain-fast
  • sanctionedAuctionChain-manual
  • sanctionedAuctionChain-ultrafast
  • sanctionedAuctionChain-fast-prod
  • sanctionedAuctionChain-fast-prod-fast-first
9initialProps+objectfalseЗагальна інформація про процедуриProcedure informantion


10extraSpecs+list[ ] of objectsfalseІнформація для базових специфікаційBase information
11producedEntities-list[ ] of objectstrueСтворені обʼєктиProduced entitiesbase.ProducedEntity{
type

string
readOnly: true

default: procedure

Тип зв'язку

_idstring
readOnly: true

x-legalNameUa: Внутрішній ідентифікатор створеної сутності

x-legalNameEn: ID

x-default: object_id

x-serialize_when_none: false

x-format: object-id
objectIdstring
readOnly: true

example: SAE001-UA-20260320-12345

x-legalNameUa: идентифікатор створеної сутності

x-legalNameEn: produced entity id

Людиночитаємий идентифікатор створеної сутності

ownerTokenstring($uuid)
readOnly: true

x-default: hex

Token used for get access to produced entity

urlstring
readOnly: true

Direct url to produced entity.


12_meta-    

Використовується стандартна логіка

13additionalInformation-    

Використовується стандартна логіка

14metaInfo-    

Використовується стандартна логіка


initialProps


field namerequired for publishingtypereadOnlyx-legalNameUax-legalNameEncomment
1sellingEntity base.SellingEntity Інформація про Організатора аукціонуOrganizer information

Використовується стандартна модель

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

2title+base.MultiLangfalseНазва аукціонуAuction title

Використовується стандартна модель

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

3description+base.MultiLangfalseОпис аукціонуAuction description

Використовується стандартна модель

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

4x_documentRequirements-base.MultiLangfalseПерелік та вимоги до оформлення документівList and requirements of registration documents

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

5x_additionalInformation-base.MultiLangfalseДодаткові відомостіOther requirements and additional information

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

6saleCondition+stringfalseНаявність умов продажуSale conditions

enum:

  • yes
  • no

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

7value+base.ValueWithTaxfalseСтартова цінаStart price

Використовується стандартна модель

nametypereadOnly

Comment

currency *string
false

default: UAH
x-legalNameUa: Валюта

x-legalNameEn: Currency

Enum:
[ UAH, USD, EUR ]

amount *number($float)falseexample: 10
minimum: 2

exclusiveMinimum: true

x-format: decimal-float

x-legalNameUa: Сума

x-legalNameEn: Amount
valueAddedTaxIncludedbooleanfalsedefault: true
x-legalNameUa: Податок

x-legalNameEn: Tax

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку відбувається авторозрахунок згідно правил

8valueAddedTaxCharged-booleanfalseНа фінальну суму нараховується ПДВValue added tax charged

default: false

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

9guarantee+

base.Value

falseРозмір гарантійного внескуGuarantee Fee


field nametypereadOnlycomment
currency *string
false

default: UAH
x-legalNameUa: Валюта

x-legalNameEn: Currency

Enum:
[ UAH, USD, EUR ]

amount *number($float)falseexample: 10
minimum: 0

exclusiveMinimum: true

x-format: decimal-float

x-legalNameUa: Сума

x-legalNameEn: Amount

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку відбувається авторозрахунок згідно правил

гарантійний внесок - сума коштів:

  • 5 % стартової ціни, якщо вона дорівнює або перевищує 250 млн. гривень
  • 20 % стартової ціни, якщо вона є меншою, ніж 250 млн. гривень
10registrationFee+base.ValuefalseРозмір реєстраційного внеску
field nametypereadOnlycomment
currency *string
false

default: UAH
x-legalNameUa: Валюта

x-legalNameEn: Currency

Enum:
[ UAH, USD, EUR ]

amount *number($float)falseexample: 10
minimum: 0

exclusiveMinimum: true

x-format: decimal-float

x-legalNameUa: Сума

x-legalNameEn: Amount


Реєстраційний внесок - плата за реєстрацію заяви про участь в аукціоні, що вноситься особою, яка має намір взяти участь в аукціоні, на відповідний рахунок оператора, у розмірі

  • 0,2 мінімальної заробітної плати, встановленої станом на 1 січня поточного року, для активів, стартова ціна яких є меншою, ніж 250 млн.гривень
  • у розмірі 10 мінімальних заробітних плат, встановлених станом на 1 січня поточного року, - для активів, стартова ціна яких дорівнює або перевищує 250 млн. гривень

Залишаємо на відповідальність Майданчика. ЦБД отримує значення і не валідує їх

Тільки, що значення >0

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

11minNumberOfQualifiedBids-integer($int64)falseМінімальна кількість заявMinimal number of bidsdefault: 1
minimum: 1

maximum: 2

При публікації обʼєкта можна не передавати. ЦБД автоматично згенерує == 1.

Організатор може передати явно 1 або 2 за необхідності.

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

12minimalStep+base.ValuefalseРозмір кроку аукціонуMinimal step

Використовується стандартна модель

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

13accessDetails-base.MultiLangfalseПорядок ознайомлення з майном, час і місце проведення огляду об’єктаAuction access details

Використовується стандартна модель

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

14bankAccounts+sanctionedAssets.BankAccountsByTypefalseБанківські рахунки організатораBank accounts

Використовується стандартна модель

Обов'язково один банківський рахунок з типом guarantee і валютою UAH. Рахунків для кожного типу в UAH/USD/EUR може бути безліч. 

field nametypecomment
accountTypestring

x-dictionaries: List [ "accountType" ]

Enum:
[ registrationFee, guarantee, other, payment ]

accountscommercialSell.BankAccountWithCurrencyx-baseClass: "prozorro_sale.procedure.models.base.BankAccount"

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

15tenderAttempts+integer($int64)
trueЛот виставляєтьсяAttempt number

Не повинно відображатися в моделі SAC як окреме поле, але має авто-розраховуватись і відображатись в Процедурі

При публікації SAC не очікуємо в запиті поля tenderAttempts.

При авто-публікації першої процедури ЦБД має проставити:

1-й процедурі: tenderAttempts = 1

2-й процедурі: tenderAttempts = 2 та у полі previousAuctionId значення auctionId від першої процедури цього ланцюжка

3-й процедурі: tenderAttempts = 3 та у полі previousAuctionId значення auctionId від другої процедури цього ланцюжка

16lotId+
stringfalseНомер лотаLot number

Очікуємо цей параметр в запиті на публікації SAC

При авто-створенні першої процедури копіюємо значення в неї.

При авто-створенні другої та\або третьої процедури в ланцюжку копіюємо це значення із попередньої процедури ланцюжка

17 items +sanctionedAssets.ItemfalseСклад лотаLot composition

Використовується стандартна модель

x-format: list-object
minItems: 1

default: List []

18documents + base.DocumentsfalseВсі документи аукціону та пов'язані додаткиDocuments

Використовується стандартна модель

x-format: list-object
default: List []

extraSpecs[ ]

field namerequired for publishingtypereadOnlyx-legalNameUax-legalNameEncomment
periods+base.PeriodSpecfalseІнформація про періоди аукціонівPeriods info
field nametypenamecomment
periodNamestringx-legalNameUa: Назва періода
x-legalNameEn: Period name

enum:

  • auctionPeriod
  • tenderPeriod
startDatestring($date-time)

x-legalNameUa: Дата та час початку
x-legalNameEn: Start date

endDatestring($date-time)

x-legalNameUa: Дата та час завершення
x-legalNameEn: End date

durationbase.Durationx-legalNameUa: Тривалість періоду
x-legalNameEn: Period duration
nametypecomment
unitstringEnum:
  • b_day
  • c_day
  • hour
  • minute
  • second
quantityinteger($int64)

minimum: 1

При публікації "ланцюжка", ЦБД очікує, що в extraSpecs обовʼязково буде передано обʼєкт для кожної процедури.

Тобто, всього три обʼєкта в extraSpecs, бо процедур в ланцюжку три.

Приклад:

"extraSpecs": [
	{
		"periods": [
			{
				"periodName": "auctionPeriod",
				"startDate": "2026-04-20T10:00:00.000000Z"
			}
		]
	},
	{
		"periods": [
			{
				"periodName": "tenderPeriod",
				"duration": [
					{
						"unit": "b_day",
						"quantity": 25
					}
				]
			}
		]
	},
	{
		"periods": [
			{
				"periodName": "tenderPeriod",
				"duration": [
					{
						"unit": "b_day",
						"quantity": 25
					}
				]
			}
		],
		"dutchStep": {
			"dutchStepQuantity": 99
		}
	}
]


dutchStep+base.DutchStep
Крок голландського раундуDutch step

Поля dutchStepPercent та dutchStepValue автогенеруються на рівні ЦБД, без можливості внесення змін Організатором
Для поля dutchStepQuantity ЦБД формує дефолтне значення згідно процедури, Організатор має можливість змінити дефолтне значення.

field nametypenamecomment
dutchStepQuantity

integer($int64)

x-legalNameUa: Кількість кроків
x-legalNameEn: Dutch steps quantity
default: 99
maximum: 99

minimum: 1
dutchStepPercent

integer($int64)

x-legalNameUa: Відсоток зниження, %
x-legalNameEn: Percentage reduction, %
default: 1
readOnly: true
dutchStepValuebase.Value

x-legalNameUa: Розмір кроку голландського раунду, грн

x-legalNameEn: Dutch step value

автогеровано, розраховується як 1 % від стартової ціни

currencystring
default: UAH

x-legalNameUa: Валюта

x-legalNameEn: Currency
Enum:
enum: UAH, USD, EUR
amountnumber($float)
example: 10

minimum: 0

x-format: decimal-float

x-legalNameUa: Сума

x-legalNameEn: Amount