Versions Compared

Key

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

...

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


Посилання

Постанова

Вимоги до Майданчиків (напишу до кінця тижня і віддам)

ТЗ Процедури SAE

ТЗ Процедури SAD

Глоссарій

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

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

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

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

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

Master-об’єкт

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Розмір:

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

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

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

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

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

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

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

Цей внесок:

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

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

...

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

Обʼєкт SanctionedAuctionChain

...

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:

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

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

extraSpecs.[0].periods.startDate ==

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

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

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

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

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

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

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

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

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

extraSpecs.[1].periods.duration ==

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

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

1. Коли тільки створено ланцюжок (status: pending), відповідь на запит має містити:

  • Кількість Процедур у ланцюжку - три;
  • Порядковий номер кожної процедури:
    • Для Першої Процедури tenderAttempts == 1
    • Для Другої Процедури tenderAttempts == 2
    • Для Третьої Процедури tenderAttempts == 3
  • Статус кожної Процедури - scheduled;
  • sellingMethod:
    • Перша Процедура - sanctionedAsset-english
    • Друга Процедура - sanctionedAsset-english
    • Третя Процедура - sanctionedAsset-dutch
  • Стартова ціна Об'єкта (value):
    • Перша Процедура - initialProps.value
    • Друга Процедура - 50% від initialProps.value
    • Третя Процедура - 50% від initialProps.value
  • Крок аукціону (minimalStep):
    • Для Першої Процедури - значення, що вказав Організатор при створенні в  initialProps.minimalStep
    • Для Другої Процедури - значення, що дорівнює 1% від value Поточної Другої Процедури.
    • Для Третьої Процедури - значення, що дорівнює 1% від value Поточної Третьої Процедури.
  • Дата проведення аукціону (periods.periodName:auctionPeriod:startDate):
    • Для Першої Процедури це дата, яку вказав Організатор у полі extraSpecs.periods:"auctionPeriod".startDate при створенні ланцюжка
    • Для Другої і Третьої Процедури ця дата не визначена і поле виводити не потрібно.
  • Період між аукціонами (periods.periodName:"tenderPeriod".duration):
    • Для Першої Процедури - відсутній
    • Для Другої і Третьої Процедури значення, що вказав Організатор при створенні ланцюжка у extraSpecs.periods.periodName:"tenderPeriod".duration
  • Розмір гарантійного внеску (guarantee):
    • Для Першої Процедури значення, що Організатор вніс у initialProps.guarantee
    • Для Другої і Третьої Процедури по формулі: initialProps.guarantee == розраховується по формулі, залежить від Стартової ціни. Формули ТУТ

2. Коли створено Першу Процедуру (status: active), відповідь має містити:

  • Кількість Процедур у ланцюжку - три;
  • Порядковий номер кожної процедури (tenderAttempts):
    • Для Першої Процедури tenderAttempts == 1
    • Для Другої Процедури tenderAttempts == 2
    • Для Третьої Процедури tenderAttempts == 3
  • Статус Процедури (status):
    • Перша Процедура - active
    • Друга і Третя Процедура - scheduled
  • sellingMethod (sellingMethod):
    • Перша Процедура - sanctionedAsset-english
    • Друга Процедура - sanctionedAsset-english
    • Третя Процедура - sanctionedAsset-dutch
  • Стартова ціна Об'єкта (value):
    • Перша Процедура - initialProps.value
    • Друга Процедура - 50% від initialProps.value
    • Третя Процедура - 50% від initialProps.value
  • Крок аукціону (minimalStep):
    • Для Першої Процедури - значення, що вказав Організатор при створенні ланцюжка у initialProps.minimalStep
    • Для Другої Процедури - значення, що дорівнює 1% від value Поточної Другої Процедури.
    • Для Третьої Процедури - значення, що дорівнює 1% від value Поточної Третьої Процедури.
  • Дата проведення аукціону (periods.periodName:"auctionPeriod":startDate):
    • Для Першої Процедури це дата, яку вказав Організатор у полі auctionPeriod.startDate при створенні ланцюжка
    • Для Другої і Третьої Процедури ця дата не визначена і поле виводити не потрібно.
  • Період між аукціонами (periods.periodName:tenderPeriod.duration):
    • Для Першої Процедури - відсутній
    • Для Другої і Третьої Процедури значення, що вказав Організатор при створенні ланцюжку у tenderPeriodDuration
  • Розмір гарантійного внеску (guarantee):
    • Для Першої Процедури значення, що Організатор вніс у initialProps.guarantee
    • Для Другої і Третьої Процедури initialProps.guarantee розраховується по формулі, залежить від Стартової ціни. Формули ТУТ
  • auctionID створеної Першої Процедури (relatedEntities)
    • Для першої Процедури вказано
    • Для другої і третьої - ні

3. Коли створено Другу Процедуру (status: active), відповідь має містити:

  • Кількість Процедур у ланцюжку - три;
  • Порядковий номер кожної процедури (tenderAttempts):
    • Для Першої Процедури tenderAttempts == 1
    • Для Другої Процедури tenderAttempts == 2
    • Для Третьої Процедури tenderAttempts == 3
  • Статус Процедури (status):
    • Перша Процедура - unsuccessful
    • Друга Процедура - active
    • Третя Процедура - scheduled
  • sellingMethod (sellingMethod):
    • Перша Процедура - sanctionedAsset-english
    • Друга Процедура - sanctionedAsset-english
    • Третя Процедура - sanctionedAsset-dutch
  • Стартова ціна Об'єкта (value):
    • Перша Процедура - initialProps.value
    • Друга Процедура - 50% від initialProps.value АБО якщо Організатор відредагував в Першій процедурі "Стартову ціну", то необхідно змінити значення на 50% від Стартової ціни Першої процедури (до розробки: це можливо без довгої розробки?)
    • Третя Процедура - 50% від initialProps.value
  • Крок аукціону (minimalStep):
    • Для Першої Процедури - значення, що вказав Організатор при створенні ланцюжка у initialProps.minimalStep
    • Для Другої Процедури - значення, що дорівнює 1% від value Поточної Другої Процедури
    • Для Третьої Процедури - значення, що дорівнює 1% від value Поточної Третьої Процедури
  • Дата проведення аукціону (periods.periodName:"auctionPeriod":startDate):
    • Для Першої Процедури це дата, яку вказав Організатор у полі auctionPeriod.startDate при створенні ланцюжка
    • Для Другої і Третьої Процедури поле виводити не потрібно.
  • Період між аукціонами (periods.periodName:"tenderPeriod".duration):
    • Для Першої Процедури - відсутній
    • Для Другої і Третьої Процедури значення, що вказав Організатор при створенні ланцюжка у tenderPeriod.duration
  • Розмір гарантійного внеску (guarantee):
    • Для Першої Процедури значення, що Організатор вніс у initialProps.guarantee
    • Для Другої Процедури initialProps.guarantee розраховується по формулі, залежить від Стартової ціни. Формули ТУТ (Варто в розрахунок брати Стартову ціну Другої створеної процедури)
    • Для Третьої Процедури initialProps.guarantee розраховується по формулі, залежить від Стартової ціни. Формули ТУТ
  • auctionID створеної Першої Процедури (relatedEntities)
    • Для першої і другої Процедури вказано
    • Для третьої - ні

4. Коли створено Третю Процедуру (status: active), відповідь має містити:

  • Кількість Процедур у ланцюжку - три;
  • Порядковий номер кожної процедури (tenderAttempts):
    • Для Першої Процедури tenderAttempts == 1
    • Для Другої Процедури tenderAttempts == 2
    • Для Третьої Процедури tenderAttempts == 3
  • Статус Процедури (status):
    • Перша Процедура - unsuccessful
    • Друга Процедура - unsuccessful
    • Третя Процедура - active
  • sellingMethod (sellingMethod):
    • Перша Процедура - sanctionedAsset-english
    • Друга Процедура - sanctionedAsset-english
    • Третя Процедура - sanctionedAsset-dutch
  • Стартова ціна Об'єкта (value):
    • Перша Процедура - initialProps.value
    • Друга Процедура - 50% від initialProps.value АБО якщо Організатор відредагував в Першій процедурі "Стартову ціну", то необхідно змінити значення на 50% від Стартової ціни Першої процедури (до розробки: це можливо без довгої розробки?)
    • Третя Процедура - 50% від initialProps.value АБО якщо Організатор відредагував в Другій процедурі "Стартову ціну", то необхідно змінити значення на 50% від Стартової ціни Другої процедури (до розробки: це можливо без довгої розробки?)
  • Крок аукціону (minimalStep):
    • Для Першої Процедури - значення, що вказав Організатор при створенні у initialProps.minimalStep
    • Для Другої Процедури - значення, що дорівнює 1% від value Поточної Другої Процедури.
    • Для Третьої Процедури - значення, що дорівнює 1% від value Поточної Третьої Процедури.
  • Дата проведення аукціону (periods.periodName:"auctionPeriod":startDate):
    • Для Першої Процедури це дата, яку вказав Організатор у полі auctionPeriod.startDate при створенні ланцюжка
    • Для Другої і Третьої Процедури поле виводити не потрібно.
  • Період між аукціонами (periods.periodName:tenderPeriod.duration):
    • Для Першої Процедури - відсутній
    • Для Другої і Третьої Процедури значення, що вказав Організатор при створенні ланцюжка у tenderPeriod.duration
  • Розмір гарантійного внеску (guarantee):
    • Для Першої Процедури значення, що Організатор вніс у initialProps.guarantee
    • Для Другої Процедури initialProps.guarantee розраховується по формулі, залежить від Стартової ціни. Формули ТУТ (Варто в розрахунок брати Стартову ціну Другої створеної процедури)
    • Для Третьої Процедури initialProps.guarantee розраховується по формулі, залежить від Стартової ціни. Формули ТУТ (Варто в розрахунок брати Стартову ціну Третьої створеної процедури)
  • auctionID Першої Процедури, auctionID Другої Процедури і auctionID створеної Третьої Процедури

Приклад:

Code Block
"_specs": {
	"pipeline": {
		"stages": [
			{
				"producedEntities": [
					{
						"type": "procedure",
						"_id": "69945eec410e8611f93bb132",
						"objectId": "SAE001-UA-20260320-17748",
						"url": "/api/procedures/69945eec410e8611f93bb132"
					}
				],
				"status": "unsuccessful",
				"name": "sa-english-first",
				"calculatedData": {
					"value": {
						"currency": "UAH",
						"amount": 100000,
						"valueAddedTaxIncluded": true
					},
					"guarantee": {
						"currency": "UAH",
						"amount": 10000
					},
                    "registrationFee": {
						"currency": "UAH",
						"amount": 800
					},
 					"tenderAttempts": 1, 
                    "auctionPeriod": {
						"startDate": "2026-03-20T14:30:31.326000+02:00"
					},
					"sellingMethod": "sanctionedAsset-english",
					"minimalStep": {
						"currency": "UAH",
						"amount": 1200
					}
				}
			},
			{
				"producedEntities": [
					{
						"type": "procedure",
						"_id": "69945f5d410e8611f93bb134",
						"objectId": "SAE001-UA-20260417-44432",
						"url": "/api/procedures/69945f5d410e8611f93bb134"
					}
				],
				"status": "active",
				"name": "sa-english-second",
				"calculatedData": {
					"value": {
						"currency": "UAH",
						"amount": 50000,
						"valueAddedTaxIncluded": true
					},
 					"guarantee": {
						"currency": "UAH",
						"amount": 10000
					}, 
                    "registrationFee": {
						"currency": "UAH",
						"amount": 800
					},
					"sellingMethod": "sanctionedAsset-english",
					"tenderAttempts": 2,
					"tenderPeriod": [
						{
							"unit": "с_day",
							"quantity": 25
						}
					],
					"minimalStep": {
						"currency": "UAH",
						"amount": 500
					}
				}
			},
			{
				"producedEntities": [],
				"status": "sheduled",
				"name": "sa-dutch-first",
				"calculatedData": {
					"value": {
						"currency": "UAH",
						"amount": 50000,
						"valueAddedTaxIncluded": true
					},
 					"guarantee": {
						"currency": "UAH",
						"amount": 10000
					}, 
                    "registrationFee": {
						"currency": "UAH",
						"amount": 800
					},
					"sellingMethod": "sanctionedAsset-dutch",
					"tenderAttempts": 3,
					"tenderPeriod": [
						{
							"unit": "c_day",
							"quantity": 35
						}
					],
					"minimalStep": {
						"currency": "UAH",
						"amount": 500
					}
				}
			}
		]
	}
}

...