Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Code Block

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

...

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


Info

Реалізація найбільше схожа на Інформаційні Повідомлення (announcement), які використовуються для Приватизаційних процедур



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

...

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

  • При створенні ланцюжка немає НЕМАЄ повʼязаного обʼєкта типу "Обʼєкт реєстру". "Ланцюжок" - перший обʼєкт, який створюється на ЦБД в процесі реалізації Санкційного майна
  • При створенні ланцюжка Організатор має вказати:
    • Дату аукціону для першої процедури
    • Період експозиції (tenderPeriod) для другої і третьої процедури в ланцюжку (присутні валідації, які детально описані нижче)
  • При створенні ланцюжка Організатор має вказати Стартову ціну реалізації для першого аукціону, а для другого і третього ЦБД розрахує автоматично згідно описаних нижче правил
  • При створенні ланцюжка Організатор має вказати розмір Гарантійного внеску для першого аукціону, а для другого і третього ЦБД розрахує автоматично згідно описаних нижче правил
  • В ланцюжку зберігаються ідентифікатори Процедур, які були автоматично створені цим ланцюжком (в producedEntities)
  • Лацюжок складається максимум з трьох процедур, де кожна наступна процедура створюється автоматично за умови, що попередня процедура "неуспішна"

...

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

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

...

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

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

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

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

додати приклад запиту

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

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

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

...

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

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

Перша процедура

Розмір гарантійного внеску для першої процедури автоматично втановлюється той, який Організатор вказав при публікації обʼєкта SAC

Друга та третя процедура

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

Розрахунок виконується за формулою:

guarantee = startPrice * guaranteeRate

де:

if procedure.value.amount ≥ 250 000 000

then guaranteeRate = 0.05

else guaranteeRate = 0.20

Таким чином:

guaranteeProcedure2 = startPriceProcedure2 * guaranteeRateProcedure2

guaranteeProcedure3 = startPriceProcedure3 * guaranteeRateProcedure3

Розрахунок гарантійного внеску виконується ЦБД автоматично під час створення відповідної процедури.

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

Номер спроби продажу (tenderAttempts)

При публікації обʼєкта SAC Організатор НЕ передає параметр tenderAttempts

При автоматичній публікації процедур ЦБД встановлює значення поля tenderAttempts відповідно до порядкового номера процедури в ланцюжку:

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

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

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

Скасування

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

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

...

Info
titleПостанова

гарантійний внесок - сума коштів (5 відсотків стартової ціни, якщо вона дорівнює або перевищує 250 млн. гривень, або 20 відсотків стартової ціни, якщо вона є меншою, ніж 250 млн. гривень), яка вноситься потенційним покупцем активу для забезпечення виконання його зобов’язання щодо участі в аукціоні у вигляді грошових коштів або банківської гарантії. Банківська гарантія може бути надана тільки системно важливими банками, перелік яких визначається Національним банком та за формою, встановленою Національним банком;

Перша процедура

Розмір гарантійного внеску для першої процедури автоматично втановлюється той, який Організатор вказав при публікації обʼєкта SAC

Друга та третя процедура

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

Розрахунок виконується за формулою:

guarantee = startPrice * guaranteeRate

де:

if procedure.value.amount ≥ 250 000 000

then guaranteeRate = 0.05

else guaranteeRate = 0.20

Таким чином:

guaranteeProcedure2 = startPriceProcedure2 * guaranteeRateProcedure2

guaranteeProcedure3 = startPriceProcedure3 * guaranteeRateProcedure3

Розрахунок гарантійного внеску виконується ЦБД автоматично під час створення відповідної процедури.

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

Номер спроби продажу (tenderAttempts)

При публікації обʼєкта SAC Організатор НЕ передає параметр tenderAttempts

При автоматичній публікації процедур ЦБД встановлює значення поля tenderAttempts відповідно до порядкового номера процедури в ланцюжку:

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

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

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

Скасування

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

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


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

string
meta 

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

x-default: hex
3_id-string

trueField nameRequired for publishingTypereadOnlyx-legalNameUax-legalNameEncomment1owner-stringtrueІдентифікатор майданчикаBroker Name2ownerToken-string($uuid)truex-default: hex3_id-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_
specs-
  
objecttrueРозрахункові даніCalculated data

 

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

13_meta-    

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

14additionalInformation-    

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

1415metaInfo-    

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

...

"extraSpecs": [ { "periods": [ { "periodName": "auctionPeriod", "startDate": "2026-04-20T10:00:00.000000Z" } ] }, { "periods": [ { "periodName": "tenderPeriod", "duration": [
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, бо процедур в ланцюжку три.

Валідації

На рівні ЦБД необхідно встановити валідації для pipelineMethod: sanctionedAuctionChain:

Якщо tenderAttempts = 1

ТА 

Для першої процедури приймається значення:

extraSpecs.[0].periods.periodName=="auctionPeriod"

extraSpecs.[0].periods.startDate ==

if value.amount < 250 000 000 (двісті п'ятдесят мільйонів)

ТО 

then 
ЦБД має приймати тільки значення для

auctionPeriod

extraSpecs.[0].periods[0].startDate в діапазоні  currentDate+25 c_day <=

auctionPeriod.

startDate <=  currentDate+35 c_day

ЦБД повинна відхилити запит, якщо

auctionPeriod.startDate знаходиться

знчення extraSpecs.[0].periods[0].startDate, яке передають в запиті на публікацію SAC знаходиться поза цим діапазоном.

Якщо tenderAttempts = 1

ТА 

else if value.amount >= 250 000 000 (двісті п'ятдесят мільйонів)

ТО

then
ЦБД має приймати тільки значення для auctionPeriod.startDate в діапазоні  currentDate+60 c_day <=

auctionPeriod.

 startDate <=  currentDate+90 c_day

Якщо tenderAttempts > 1
ТА
value.amount < 250 000 000 (двісті п'ятдесят мільйонів)
ТО 
Необхідно відобразити організатору часовий проміжок, коли можна обрати дату початку аукціону (auctionPeriod.startDate). Мінімальна дата початку - на 20 КД, максимальна - на 35 КД

Якщо tenderAttempts > 1
ТА 
value.amount >= 250

ЦБД повинна відхилити запит, якщо знчення extraSpecs.[0].periods[0].startDate, яке передають в запиті на публікацію SAC знаходиться поза цим діапазоном.

При цьому дата початку аукціону не може припадати на святковий чи вихідний день! 

Для другої процедури приймається значення:

extraSpecs.[1].periods.periodName=="tenderPeriod"

extraSpecs.[1].periods.duration ==

if value.amount < 250 000 000 (двісті п'ятдесят мільйонів)

ТО
Необхідно відобразити організатору часовий проміжок, коли можна обрати дату початку аукціону (auctionPeriod.startDate). Мінімальна дата початку - на 30 КД, максимальна - на 90 КД

Приклад:

Code Block

then 
ЦБД має приймати тільки значення для extraSpecs.[1].periods[0].duration в діапазоні  20 c_day <= duration <=  35 c_day

ЦБД повинна відхилити запит, якщо знчення duration, яке передають в запиті на публікацію SAC знаходиться поза цим діапазоном.

else if value.amount >= 250 000 000 (двісті п'ятдесят мільйонів)

then
ЦБД має приймати тільки значення для extraSpecs.[1].periods[0].duration в діапазоні  30 c_day <= startDate <=  90 c_day

ЦБД повинна відхилити запит, якщо знчення duration, яке передають в запиті на публікацію SAC знаходиться поза цим діапазоном.

Для третьої процедури приймається значення:

extraSpecs.[1].periods.periodName=="tenderPeriod"

extraSpecs.[1].periods.duration ==

if value.amount < 250 000 000 (двісті п'ятдесят мільйонів)

then 
ЦБД має приймати тільки значення для extraSpecs.[2].periods[0].duration в діапазоні  20 c_day <= duration <=  35 c_day

ЦБД повинна відхилити запит, якщо знчення duration, яке передають в запиті на публікацію SAC знаходиться поза цим діапазоном.

else if value.amount >= 250 000 000 (двісті п'ятдесят мільйонів)

then
ЦБД має приймати тільки значення для extraSpecs.[2].periods[0].duration в діапазоні  30 c_day <= startDate <=  90 c_day

ЦБД повинна відхилити запит, якщо знчення duration, яке передають в запиті на публікацію SAC знаходиться поза цим діапазоном.


Приклад для value.amount < 250 000 000 (двісті п'ятдесят мільйонів):

Code Block
"extraSpecs": [
	{
		"periods": [
			{
				"periodName": "auctionPeriod",
				"startDate": "2026-03-20T10:00:00.000000Z"
			}
		]
	},
	{
		"periods": [
			{
				"periodName": "tenderPeriod",
				"duration": [
					{
						"unit": "c_day",
						"quantity": 25
					}
				]
			}
		]
	},
	{
		"periods": [
			{
				"periodName": "tenderPeriod",
				"duration": [
					{
						"unit": "c_day",
						"quantity": 35
					}
				]
			}
		],
		"dutchStep": {
			"dutchStepQuantity": 99
		}
	}
]


dutchStep+base.DutchStepfalseКрок голландського раунду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
 

_specs

Code Block
"_specs": {
	"pipeline": {
		"stages": [
			{
				"producedEntities": [
					{
						"type": "procedure",
						"_id": "69945eec410e8611f93bb132",
						"objectId": "SPE001-UA-20260217-17748",
						"url": "/api/procedures/69945eec410e8611f93bb132"
					}
				],
				"status": "unsuccessful",
				"name": "sp-english-first",
				"calculatedData": {
					"value": {
						"currency": "UAH",
						"amount": 1000,
						"valueAddedTaxIncluded": true
					},
					"registrationFee": {
						"currency": "UAH",
						"amount": 200
					},
					"auctionPeriod": {
						"startDate": "2026-02-17T14:30:31.326000+02:00"
					},
					"sellingMethod": "smallPrivatization-english-fast",
					"tenderAttempts": 1,
					"guarantee": {
						"currency": "UAH",
						"amount": 500
					},
					"minimalStep": {
						"

...

currency": "

...

UAH",
						"

...

amount": 

...

100
					}

...

	

...

			}
		

...

	},
			{
				"

...

producedEntities": [
				{

...

"

...

type": "

...

procedure",

...

"_id": 

...

"69945f5d410e8611f93bb134",
"objectId": "

...

SPE001-UA-20260217-44432",

...

"url": "/api/procedures/69945f5d410e8611f93bb134"
}
],
"status": "active",
"name": "sp-english-second",
"calculatedData": {
"value": {
"currency": "UAH",
"amount": 500,
"valueAddedTaxIncluded": true
},
"registrationFee": {
"currency": "UAH",
"amount": 200
},
"sellingMethod": "smallPrivatization-english-fast",
"tenderAttempts": 2,
"guarantee": {
"currency": "UAH",
"amount": 100
},
"tenderPeriod": [
{
"unit": "b_day",
"quantity": 344
}
],
"minimalStep": {
"currency": "UAH",
"amount": 5
}
}
},
{},
{}
]
}




...

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

...

integer($int64)

...

integer($int64)

...

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

x-legalNameEn: Dutch step value

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

...

Note
titleПИТАННЯ
  1. Чи будемо відображати сутність "Процес реалізації санкційного активу" на Порталі, Майданчику чи на будь-якому іншому фронті? - На фронті має відображатися період експозиції для майбутніх Процедур, а ця інформація міститься тільки в SAC
  2.  Реєстраційний внесок поривʼязаний до мін ЗП і ми також його не валідуємо, а віддаємо на Майданчик.
  3. Валідації на Період?
На ЦБД буде присутня валідація лише на мінімальний термін тривалості tenderPeriod в 19 днів (тобто найближча дата проведення аукціону (auctionPeriod.startDate) може бути на 20 день від дати створення процедури). Майданчик зі своєї сторони має реалізувати валідацію на проміжок, в який може бути призначено дату початку аукціону (auctionPeriod.startDate) за наступною логікою: 
  1. Періоди? - так 
  1. Якщо tenderAttempts > 1
    ТА
    value.amount < 250 000 000 (двісті п'ятдесят мільйонів)
    ТО 
    Необхідно відобразити організатору часовий проміжок, коли можна обрати дату початку аукціону (auctionPeriod.startDate). Мінімальна дата початку - на 20 КД, максимальна - на 35 КД
  2. Якщо tenderAttempts > 1
    ТА
    value.amount >= 250 000 000 (двісті п'ятдесят мільйонів)
    ТО
    Необхідно відобразити організатору часовий проміжок, коли можна обрати дату початку аукціону (auctionPeriod.startDate). Мінімальна дата початку - на 30 КД, максимальна - на 90 КД

При цьому дата початку аукціону не може припадати на святковий чи вихідний день! 

...