...
Система завантажує конфіг для {sellingMethod}
Якщо в startDate є масив conditions[], система має:
пройтись по conditions[] у вказаному у відповіді порядку
знайти першу умову, у якої caseповністю матчиться із параметрами якимось параметром запиту
застосувати її правила розрахунку дат
Якщо жоден case не матчиться — використовується дефолтна логіка з startDate.validation (як зараз)
Робота з case
case — це набір умов над параметрами, переданими у query
Підтримувані типи перевірок:
boolean equality
isPerishable: true→ очікує?isPerishable=truenumeric comparisons для чисел
Наприклад:value.amount > 250000000value.amount >= 250000000value.amount < 250000000value.amount <= 250000000
Розширення формату конфігу
Boolean case (існує і зараз)
| Code Block | ||
|---|---|---|
| ||
"conditions": [
{
"auto_set": true,
"case": {
"isPerishable": true
},
"diff": "2 business days",
"direction": "forward",
"from": "now",
"time": "11:00 - 13:00"
}
] |
Numeric case для value.amount
Якщо матчиться кілька conditions - застосовується перший у масиві (тобто порядок у конфігу = пріоритет).
Це важливо, бо може бути комбінація:
GET /api/procedures/basicSell-english/auctionPeriod?value.amount=300000000.00&isPerishable=true
то в такому випадку застосується правило, яке перше в списку.
Наприклад, конфіг такий:
| Code Block | ||
|---|---|---|
| ||
"active_tendering": {
"periods": {
"procedure": {
"auctionPeriod": {
"startDate": {
"conditions": [
{
"auto_set": true,
"case": {
"isPerishable": true
},
"diff": "2 business days",
| ||
| Code Block | ||
| ||
"conditions": [ { "case": { "value.amount": { "gt": 250000000.00 //використовуємо оператори gt/gte/lt/lte } }, "validation": { "min": { "diff": "30 days", "direction": "forward", "error": "raise", "from": "now", "time": "11:00 - 13:00" }, { "case": { "value.amount": { "gt": 250000000 } }, "validation": { "min": { "diff": "30 days", "direction": "forward", "error": "raise", "from": "now", "time": "11:00", "is_business_day": true }, "max": { "diff": "60 days", "direction": "forward", "error": "raise", "from": "now", "time": "13:00", "is_business_day": true } } } ], "time": "11:00 - 13:00", "validation": { "is_business_day": true, "min": { "diff": "8 days", "direction": "forward", "error": "raise", "from": "now", "time": "11:00" } } } } } } } |
Інтерпретація:
isPerishable=trueматчить condition №1value.amount=300000000.00також матчить condition №2 (бо300000000 > 250000000)але оскільки умови перевіряються послідовно, застосовується перший condition, який матчиться.
Отже результат має бути розрахований за condition №1 (isPerishable), а не за “високою ціною”:
minDate = now + 2 business days, час = початок інтервалу11:00maxDateу цьому прикладі не повертається, бо condition №1 не задаєvalidation.max, а визначає лише правило для найранішої дати (як у поточних спеках basicSell).
Робота з case
case — це набір умов над параметрами, переданими у query
Підтримувані типи перевірок:
boolean equality
isPerishable: true→ очікує?isPerishable=truenumeric comparisons для чисел
Наприклад:value.amount > 250000000value.amount >= 250000000value.amount < 250000000value.amount <= 250000000
Розширення формату конфігу
Boolean case (існує і зараз)
| Code Block | ||
|---|---|---|
| ||
"conditions": [
{
"auto_set": true,
"case": {
"isPerishable": true
},
"diff": "2 business days",
"direction": "forward",
"from": "now",
"time": "11:00 - 13:00"
}
] |
Numeric case для value.amount
| Code Block | ||
|---|---|---|
| ||
"conditions": [ { "case": { "value.amount": { "gt": 250000000.00 //використовуємо оператори gt/gte/lt/lte } }, "validation": { "min": { "diff": "30 days", "direction": "forward", "from": "now", "time": "11:00" }, "max": { "diff": "60 days", "direction": "forward", "from": "now", "time": "13:00" } } } "from": "now", "time": "11:00" }, "max": { "diff": "60 days", "direction": "forward", "from": "now", "time": "13:00" } } } ] |
conditions[] мають мати можливість:
...
| Code Block | ||
|---|---|---|
| ||
"auctionPeriod": {
"startDate": {
"conditions": [
{
"case": { "value.amount": { "gt": 250000000 } },
"validation": {
"min": { "diff": "30 days", "direction": "forward", "from": "now", "time": "11:00" },
"max": { "diff": "60 days", "direction": "forward", "from": "now", "time": "13:00" }
}
},
{
"case": { "value.amount": { "lte": 250000000 } },
"validation": {
"min": { "diff": "20 days", "direction": "forward", "from": "now", "time": "11:00" },
"max": { "diff": "35 days", "direction": "forward", "from": "now", "time": "13:00" }
}
}
],
"time": "11:00 - 13:00",
"validation": {
"is_business_day": true,
"min": {
"diff": "20 days",
"direction": "forward",
"error": "raise",
"from": "now",
"time": "11:00"
}
}
}
} |
Формат query параметрів
Boolean
isPerishable=true|false (case-insensitive)
якщо параметр переданий не як boolean → 400 помилка
Числовий value.amount
value.amount— decimalякщо не число → 400 помилка
Правила пріоритетів
Якщо знайдено condition, який матчиться, і він містить власний validation — використати його
Якщо condition матчиться і він задає пряме правило diff/from/time — розрахувати min/max на його основі
Якщо condition не матчиться — використати дефолтний startDate.validation (поточна поведінка)
...
}
} |
Формат query параметрів
Boolean
isPerishable=true|false (case-insensitive)
якщо параметр переданий не як boolean → 400 помилка
Числовий value.amount
value.amount— decimalякщо не число → 400 помилка
Відповідь ендпоінта (без змін)
...