Микросервис price
Микросервис price предоставляет функциональность для управления валютами, ценами и прайс листами.
Доступ к сервису предоставляется по запросу.
Логика работы
В работе микросервиса задействованы следующие сущности:
- Price - содержит данные о цене товара (артикул товара, статус цены, дата действия, минимальное количество товара, стоимость товара и валюта, в которой указана стоимость)
- Currency - содержит данные о валюте (id валюты, пиктограмма, код валюты по ISO, название валюты)
- Article - содержит информацию о продукте, его количестве, цене за единицу товара и общей стоимости указанного количества товара
- PriceList - содержит информацию о прайс листе (id и название)
Аутентификация
Для работы с микросервисом аутентификация не требуется.
Service context path
/api/price/
Настройки и параметры конфигурации
Параметры конфигурации указываются в Vault.
Vault используется на нашей платформе в качестве хранилища всех конфигураций развертывания. Инструмент может быть выбран другой.
{
"env": {
"JAVA_XMS": "XXm",
"JAVA_XMX": "YYYm",
"POSTGRES_DATABASE": "price",
"POSTGRES_MIGRATION_USER": "price_migration",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "price_user"
}
}
// пример взят с тестового стенда
{
"env": {
"AUTH_ENABLED": "флаг_активации_аутентификации",
"KAFKA_BROKER_ADDRESS": "сокет_для_брокера_kafka",
"OAUTH_ECOM_CLIENT_ID": "токен_приложения_ECOM_OAuth",
"OAUTH_ZITADEL_CLIENT_ID": "токен_приложения_Zitadel",
"OAUTH_ZITADEL_ISSUER_URI": "url_Zitadel",
"POSTGRES_HOST": "адрес_хоста",
"POSTGRES_MIGRATION_PASSWORD": "пароль",
"POSTGRES_PASSWORD": "пароль"
}
}
Методы микросервиса
Работа с валютами
- Получение списка валют, отсортированных по ISO коду по возрастанию - GET запрос, /v1/currencies
page - query-параметр, необязательный: номер страницы с валютами
size - query-параметр, необязательный: размер страницы с валютами
sort - query-параметр, необязательный: сортировка валют
{
"content": [
{
"id": "90e5fed1-1eaa-4e45-8574-b687605817fd",
"isoCode": "RUB",
"name": "Российский рубль",
"symbol": "₽",
"forOnlinePayment": false
},
{
"id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
"isoCode": "EUR",
"name": "Euro",
"symbol": "€",
"forOnlinePayment": false
}
],
"pageable": {
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"pageNumber": 0,
"pageSize": 10,
"offset": 0,
"paged": true,
"unpaged": false
},
"totalElements": 2,
"totalPages": 1,
"last": true,
"numberOfElements": 2,
"first": true,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"size": 10,
"number": 0,
"empty": false
}
200 - операция выполнена успешно, список валют получен
- Получение валюты по ее ID - GET запрос, /v1/currencies/{id}
id - path-параметр, обязательный: идентификатор
валюты
{
"id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
"isoCode": "EUR",
"name": "Euro",
"symbol": "€",
"forOnlinePayment": false
}
- 200 - операция выполнена успешно, получены данные о запрашиваемой валюте
- 404 - ошибка, валюта с таким ID не найдена
- Получение страницы с валютами (с возможностью фильтрации) - POST запрос, /v1/currencies/page
{
"sort": [
{
"sortBy": "string",
"direction": "ASC"
}
],
"page": 0,
"size": 1,
"filter": {
"searchTerm": "string",
"isoCode": "string",
"name": "string",
"symbols": [
"string"
]
}
}
{
"content": [
{
"id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
"isoCode": "EUR",
"name": "Euro",
"symbol": "€",
"forOnlinePayment": false
},
{
"id": "90e5fed1-1eaa-4e45-8574-b687605817fd",
"isoCode": "RUB",
"name": "Российский рубль",
"symbol": "₽",
"forOnlinePayment": false
}
],
"pageable": {
"sort": {
"sorted": true,
"unsorted": false,
"empty": false
},
"pageNumber": 0,
"pageSize": 10,
"offset": 0,
"paged": true,
"unpaged": false
},
"totalElements": 2,
"totalPages": 1,
"last": true,
"numberOfElements": 2,
"first": true,
"sort": {
"sorted": true,
"unsorted": false,
"empty": false
},
"size": 10,
"number": 0,
"empty": false
}
200 - операция выполнена успешно, получена страница с валютами
- Получение отфильтрованного списка валют - POST запрос, /v1/currencies/list
{
"searchTerm": "string",
"isoCode": "string",
"name": "string",
"symbols": [
"string"
]
}
[
{
"id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
"isoCode": "EUR",
"name": "Euro",
"symbol": "€",
"forOnlinePayment": false
}
]
200 - операция успешно выполнена, получен отфильтрованный список валют
- Получение символов валют - GET запрос, /v1/currencies/symbols/unique
Отсутствуют.
[
"€",
"₽"
]
200 - операция выполнена успешно, получен список символов валют
- Создание валюты - POST запрос, /v1/currencies
{
"isoCode": "BYN",
"name": "Белорусский рубль",
"symbol": "Р",
"forOnlinePayment": false
}
{
"id": "58fc8a3d-238b-4251-9af0-e9976738d3c2",
"isoCode": "BYN",
"name": "Белорусский рубль",
"symbol": "Р",
"forOnlinePayment": false
}
- 201 - операция выполнена успешно, новая валюта создана
- 422 - ошибка, невалидные данные
- Редактирование валюты - PATCH запрос, /v1/currencies/{id}
id - path-параметр, обязательный: уникальный идентификатор
валюты
{
"id":
"58fc8a3d-238b-4251-9af0-e9976738d3c2",
"isoCode":
"BN",
"name": "Белорусский рубль",
"symbol": "Р"
}
{
"id":
"58fc8a3d-238b-4251-9af0-e9976738d3c2",
"isoCode":
"BN",
"name": "Белорусский рубль",
"symbol": "Р"
}
- 200 - операция успешна, валюта обновлена
- 404 - ошибка, валюта не найдена
- 409 - ошибка, ID не может быть изменено
- 422 - ошибка, пропущенные или невалидные данные, передаваемые в запросе
- Удаление валюты - DELETE запрос, /v1/currencies/{id}
id - path-параметр, обязательный: уникальный идентификатор
валюты
Отсутствует. В ответе приходит только код операции, например, 204.
- 204 - операция выполнена успешно, валюта удалена
- 404 - ошибка, валюта не найдена
- 422 - ошибка, валюта не может быть удалена
- Загрузка списка цен - PUT запрос, /v1/prices/list
{
"id": "10391eac-db31-4065-abbb-d193d341d103",
"articleId": "D000033DC",
"validFrom": "2024-01-22T00:00:00",
"validTo": "2024-12-31T00:00:00",
"minQuantity": 1,
"unitPrice": 1400,
"active": true,
"currency": {
"id": "90e5fed1-1eaa-4e45-8574-b687605817fd",
"isoCode": "RUB",
"name": "Российский рубль",
"symbol": "₽",
"forOnlinePayment": false
},
"priceList": {
"id": "defaultPricelist",
"name": "Default Price List"
}
}
{
"created": 1,
"updated": 0
}
- 200 - операция выполнена успешно, список цен загружен
- 422 - ошибка, невалидные или пропущенные данные
- Получение отфильтрованного списка цен - POST запрос, /v1/prices/list
{
"searchTerm": "string",
"articleId": "string",
"priceListIds": [
"string"
],
"articleIds": [
"string"
],
"statusSet": [
"ACTIVE"
],
"validFrom": "string",
"validTo": "string",
"minQuantityFirstValue": 0,
"minQuantityFirstOperator": "EQ",
"minQuantityFilterConnectiveType": "AND",
"minQuantitySecondValue": 0,
"minQuantitySecondOperator": "EQ",
"priceFirstValue": 0,
"priceFirstOperator": "EQ",
"priceFilterConnectiveType": "AND",
"priceSecondValue": 0,
"priceSecondOperator": "EQ",
"currenciesIds": [
"string"
]
}
[
{
"id": "e02e492c-0cfd-453e-8544-e5cd4a326c51",
"articleId": "1001586DC",
"validFrom": "2024-05-02T00:00:00",
"validTo": "2024-12-31T23:59:59",
"minQuantity": 0,
"unitPrice": 500,
"active": true,
"currency": {
"id":
"02d3eb94-8d0c-4e21-a952-db8684a1534d",
"isoCode": "EUR",
"name": "Euro",
"symbol":
"€"
},
"priceList": {
"id":
"defaultPricelist",
"name":
"Default Price List"
}
}
]
- 200 - операция выполнена успешно, получен отфильтрованный список цен
- 422 - ошибка, Unprocessable Entity
- Создание цены на товар - POST запрос, /v2/prices
{
"articleId": "1019724DC",
"validFrom": "2024-06-13T00:00:00.000",
"validTo": "2024-06-14T23:59:59.000",
"minQuantity": "1",
"unitPrice": "100",
"active": true,
"currency": {
"id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
"isoCode": "EUR",
"name": "Euro",
"symbol": "€",
"forOnlinePayment": false
},
"priceList": {
"id": "2bcd9d1a-52cc-4828-98ab-1a013cbb4b9c",
"name": "priceList_Беларусь"
}
}
{
"id": "5f68ab2f-bc15-42cd-a4bc-689bcabbdef5",
"articleId": "1019724DC",
"validFrom": "2024-06-13T00:00:00.000",
"validTo": "2024-06-14T23:59:59.000",
"minQuantity": "1",
"unitPrice": "100",
"active": true,
"currency": {
"id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
"isoCode": "EUR",
"name": "Euro",
"symbol": "€",
"forOnlinePayment": false
},
"priceList": {
"id": "2bcd9d1a-52cc-4828-98ab-1a013cbb4b9c",
"name": "priceList_Беларусь"
}
}
- 200 - операция успешно выполнена, создана новая цена
- 422 - ошибка, отсутствуют обязательные данные (например, артикул товара) или данные не валидны
- Получение страницы с ценами (с возможностью фильтрации) - POST запрос, /v2/prices/page
{
"sort": [
{
"sortBy": "string",
"direction": "ASC"
}
],
"page": 0,
"size": 1,
"filter": {
"searchTerm": "string",
"articleId": "string",
"priceListIds": [
"string"
],
"articleIds": [
"string"
],
"statusSet": [
"ACTIVE"
],
"validFrom": "string",
"validTo": "string",
"minQuantityFirstValue": 0,
"minQuantityFirstOperator": "EQ",
"minQuantityFilterConnectiveType": "AND",
"minQuantitySecondValue": 0,
"minQuantitySecondOperator": "EQ",
"priceFirstValue": 0,
"priceFirstOperator": "EQ",
"priceFilterConnectiveType": "AND",
"priceSecondValue": 0,
"priceSecondOperator": "EQ",
"currenciesIds": [
"string"
]
}
}
{
"content": [
{
"id":
"c2122fd7-fef3-4801-aa06-49b4ebc91d05",
"articleId": "1021531DC",
"validFrom": "2024-05-27T00:00:00",
"validTo": "2024-09-29T23:59:59",
"minQuantity": 1,
"unitPrice": 123,
"active": true,
"currency":
{
"id":
"02d3eb94-8d0c-4e21-a952-db8684a1534d",
"isoCode": "EUR",
"name": "Euro",
"symbol": "€"
},
"priceList": {
"id":
"2bcd9d1a-52cc-4828-98ab-1a013cbb4b9c",
"name": "priceList_Беларусь"
}
},
{
"id":
"03806b5d-2824-46b6-92cc-1039a553b378",
"articleId": "1021531DC",
"validFrom": "2024-05-28T00:00:00",
"validTo": "2024-07-07T23:59:59",
"minQuantity": 2,
"unitPrice": 560.89,
"active": true,
"currency":
{
"id":
"0a46630e-76d7-4eb3-b12a-79317dc871d7",
"isoCode": "TRY",
"name": "турецкая лира1",
"symbol": "₺"
},
"priceList": {
"id":
"2bcd9d1a-52cc-4828-98ab-1a013cbb4b9c",
"name": "priceList_Беларусь"
}
}
],
"pageable": {
"sort": {
"unsorted":
false,
"sorted": true,
"empty": false
},
"pageNumber": 0,
"pageSize": 3,
"offset": 0,
"paged": true,
"unpaged": false
},
"last": true,
"totalElements": 2,
"totalPages": 1,
"first": true,
"numberOfElements": 2,
"sort": {
"unsorted": false,
"sorted": true,
"empty": false
},
"size": 3,
"number": 0,
"empty": false
}
- 200 - операция выполнена успешно, получена страница с ценами
- 422 - ошибка, отсутствуют обязательные данные или данные не валидны
- Получение списка цен (с возможностью фильтрации) - POST запрос, /v2/prices/list
{
"articleId":
"1021531DC"
}
[
{
"id": "c2122fd7-fef3-4801-aa06-49b4ebc91d05",
"articleId": "1021531DC",
"validFrom": "2024-05-27T00:00:00",
"validTo": "2024-09-29T23:59:59",
"minQuantity": 1,
"unitPrice": 123,
"active": true,
"currency": {
"id":
"02d3eb94-8d0c-4e21-a952-db8684a1534d",
"isoCode": "EUR",
"name": "Euro",
"symbol":
"€"
},
"priceList": {
"id":
"2bcd9d1a-52cc-4828-98ab-1a013cbb4b9c",
"name": "priceList_Беларусь"
}
},
{
"id": "03806b5d-2824-46b6-92cc-1039a553b378",
"articleId": "1021531DC",
"validFrom": "2024-05-28T00:00:00",
"validTo": "2024-07-07T23:59:59",
"minQuantity": 2,
"unitPrice": 560.89,
"active": true,
"currency": {
"id":
"0a46630e-76d7-4eb3-b12a-79317dc871d7",
"isoCode": "TRY",
"name": "турецкая лира1",
"symbol": "₺"
},
"priceList": {
"id":
"2bcd9d1a-52cc-4828-98ab-1a013cbb4b9c",
"name": "priceList_Беларусь"
}
}
]
- 200 - операция выполнена успешно, получен список цен
- 422 - ошибка, Unprocessable Entity
- Получение цены по ее ID - GET запрос, /v2/prices/{id}
id - path-параметр, обязательный: уникальный
идентификатор цены
{
"id": "03806b5d-2824-46b6-92cc-1039a553b378",
"articleId": "1021531DC",
"validFrom": "2024-05-28T00:00:00",
"validTo": "2024-07-07T23:59:59",
"minQuantity": 2,
"unitPrice": 560.89,
"active": true,
"currency": {
"id": "0a46630e-76d7-4eb3-b12a-79317dc871d7",
"isoCode": "TRY",
"name": "турецкая лира1",
"symbol": "₺",
"forOnlinePayment": false
},
"priceList": {
"id": "2bcd9d1a-52cc-4828-98ab-1a013cbb4b9c",
"name": "priceList_Беларусь"
}
}
- 200 - операция успешно выполнена, получены данные цены
- 404 - ошибка, цена с таким ID не найдена
- 422 - ошибка, Unprocessable Entity
- Удаление цены по ее ID - DELETE запрос, /v2/prices/{id}
id - path-параметр, обязательный: уникальный
идентификатор цены
Отсутствует. В ответе приходит только код операции, например, 204.
- 204 - операция выполнена успешно, цена удалена
- 404 - ошибка, цена не найдена
- 422 - ошибка, Unprocessable Entity
- Изменение цены - PATCH запрос, /v2/prices/{id}
id - path-параметр, обязательный: уникальный
идентификатор цены
{
"id": "03806b5d-2824-46b6-92cc-1039a553b378",
"articleId": "1021531DC",
"validFrom": "2024-05-28T00:00:00",
"validTo": "2024-07-09T23:59:59",
"minQuantity": 1,
"unitPrice": 100,
"active": true,
"currency": {
"id": "0a46630e-76d7-4eb3-b12a-79317dc871d7",
"isoCode": "TRY",
"name": "турецкая лира1",
"symbol": "₺",
"forOnlinePayment": false
},
"priceList": {
"id": "2bcd9d1a-52cc-4828-98ab-1a013cbb4b9c",
"name": "priceList_Беларусь"
}
}
{
"id": "03806b5d-2824-46b6-92cc-1039a553b378",
"articleId": "1021531DC",
"validFrom": "2024-05-28T00:00:00",
"validTo": "2024-07-09T23:59:59",
"minQuantity": 1,
"unitPrice": 100,
"active": true,
"currency": {
"id": "0a46630e-76d7-4eb3-b12a-79317dc871d7",
"isoCode": "TRY",
"name": "турецкая лира1",
"symbol": "₺",
"forOnlinePayment": false
},
"priceList": {
"id": "2bcd9d1a-52cc-4828-98ab-1a013cbb4b9c",
"name": "priceList_Беларусь"
}
}
- 200 - операция выполнена успешно, цена отредактирована
- 404 - ошибка, цена не найдена
- 409 - ошибка, нельзя изменить articleId и/или id
- 422 - ошибка, отсутствуют обязательные данные
Расчет стоимости товаров
- Расчет итоговой стоимости товара в указанном количестве - GET запрос, /v1/article/{id}/prices/{quantity}
id - path-параметр, обязательный: уникальный
идентификатор товара
quantity - path-параметр, обязательный:
количество единиц товара
{
"id": "D000022DC",
"quantity": 42,
"totalPrice": 630,
"unitPrice": 15
}
- 200 - операция выполнена успешно, рассчитана итоговая стоимость товара в указанном количестве
- 404 - ошибка, не удалось найти цену товара
- 422 - ошибка, отсутствуют обязательные данные (например, articleId)
- Расчет итоговой стоимости нескольких товаров в указанном количестве - POST запрос, /v1/article/prices
{
"articles": [
{
"id": "D000044DC",
"quantity": 2,
"totalPrice": 3300,
"unitPrice": 1650
},
{
"id": "D000033DC",
"quantity": 3,
"totalPrice": 4200,
"unitPrice": 1400
}
]
}
{
"articles": [
{
"id":
"D000044DC",
"quantity": 2,
"totalPrice": 3300,
"unitPrice": 1650
},
{
"id": "D000033DC",
"quantity": 3,
"totalPrice": 4200,
"unitPrice":
1400
}
]
}
- 200 - операция выполнена успешно, рассчитана итоговая стоимость каждого товара
- 206 - ошибка, не все указанные товары имеют стоимость (будут возвращена информация только о тех товарах, у которых есть цена)
- 422 - ошибка, отсутствуют обязательные данные (например, articleId)
Работа с прайс листами
- Создание прайс листа для рынка - POST запрос, /v1/pricelists
{
"id": "aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",
"name": "new_pricelist"
}
{
"id":
"aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",
"name":
"new_pricelist"
}
- 200 - операция выполнена успешно, прайс лист создан
- 422 - ошибка, отсутствуют обязательные данные
- Получение прайс листа по его ID - GET запрос, /v1/pricelists/{id}
id - path-параметр, обязательный: уникальный
идентификатор прайс листа
{
"id":
"aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",
"name":
"new_pricelist"
}
- 200 - операция выполнена успешно, получены данные прайс листа
- 404 - ошибка, прайс лист с таким ID не найден
- Удаление прайс листа - DELETE запрос, /v1/pricelists/{id}
id - path-параметр, обязательный: уникальный
идентификатор прайс листа
Отсутствует.
- 204 - операция выполнена успешно, прайс лист удален
- 404 - ошибка, прайс лист с таким ID не найден
- Редактирование прайс листа - PATCH запрос, /v1/pricelists/{id}
id - path-параметр, обязательный: уникальный
идентификатор прайс листа
{
"id": "aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",
"name": "pricelist_edited"
}
{
"id":
"aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",
"name":
"pricelist_edited"
}
- 200 - операция выполнена успешно, прайс лист отредактирован
- 404 - ошибка, прайс лист с таким ID не найден