Микросервис price

В статье описываются функции, логика работы, конфигурация и методы микросервиса price.

Микросервис price предоставляет функциональность для управления валютами, ценами и прайс листами.

Доступ к сервису предоставляется по запросу.

В работе микросервиса задействованы следующие сущности:

  • Price - содержит данные о цене товара (артикул товара, статус цены, дата действия, минимальное количество товара, стоимость товара и валюта, в которой указана стоимость)
  • Currency - содержит данные о валюте (id валюты, пиктограмма, код валюты по ISO, название валюты)
  • Article - содержит информацию о продукте, его количестве, цене за единицу товара и общей стоимости указанного количества товара
  • PriceList - содержит информацию о прайс листе (id и название)

Для работы с микросервисом аутентификация не требуется.

/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"

  }
}


Copy-icon
Указываемые на каждом отдельном стенде

// пример взят с тестового стенда


{
  "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": "пароль"
  }
}


Copy-icon

Методы микросервиса Copy-icon

Работа с валютами Copy-icon

  • Получение списка валют, отсортированных по ISO коду по возрастанию - GET запрос, /v1/currencies
Request parameters

page - query-параметр, необязательный: номер страницы с валютами

size - query-параметр, необязательный: размер страницы с валютами
sort - query-параметр, необязательный: сортировка валют


Copy-icon
Response sample

{
  "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
}



Copy-icon
Response codes

200 - операция выполнена успешно, список валют получен

  • Получение валюты по ее ID - GET запрос, /v1/currencies/{id}
Request parameters

id - path-параметр, обязательный: идентификатор валюты

Copy-icon
Response sample

{
    "id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
    "isoCode": "EUR",
    "name": "Euro",
    "symbol": "€",

    "forOnlinePayment": false
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, получены данные о запрашиваемой валюте
  • 404 - ошибка, валюта с таким ID не найдена
  • Получение страницы с валютами (с возможностью фильтрации) - POST запрос, /v1/currencies/page
Request body sample

{
  "sort": [
    {
      "sortBy": "string",
      "direction": "ASC"
    }
  ],
  "page": 0,
  "size": 1,
  "filter": {
    "searchTerm": "string",
    "isoCode": "string",
    "name": "string",
    "symbols": [
      "string"
    ]
  }
}


Copy-icon
Response sample

{
  "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
}


Copy-icon
Response codes

200 - операция выполнена успешно, получена страница с валютами

  • Получение отфильтрованного списка валют - POST запрос, /v1/currencies/list
Request body

{
  "searchTerm": "string",
  "isoCode": "string",
  "name": "string",
  "symbols": [
    "string"
  ]
}


Copy-icon
Response sample

[
  {
    "id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
    "isoCode": "EUR",
    "name": "Euro",
    "symbol": "€",

    "forOnlinePayment": false
  }
]


Copy-icon
Response codes

200 - операция успешно выполнена, получен отфильтрованный список валют

  • Получение символов валют - GET запрос, /v1/currencies/symbols/unique
Request parameters

Отсутствуют.

Response sample

[
  "€",
  "₽"
]

Copy-icon
Response codes

200 - операция выполнена успешно, получен список символов валют

  • Создание валюты - POST запрос, /v1/currencies
Request body sample

{
    "isoCode": "BYN",
    "name": "Белорусский рубль",
    "symbol": "Р",

    "forOnlinePayment": false
}



Copy-icon
Response sample

{
  "id": "58fc8a3d-238b-4251-9af0-e9976738d3c2",
  "isoCode": "BYN",
  "name": "Белорусский рубль",
  "symbol": "Р",

  "forOnlinePayment": false
}


Copy-icon
Response codes
  • 201 - операция выполнена успешно, новая валюта создана
  • 422 - ошибка, невалидные данные
  • Редактирование валюты - PATCH запрос, /v1/currencies/{id}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор валюты

Copy-icon
Request body sample

{
  "id": "58fc8a3d-238b-4251-9af0-e9976738d3c2",
  "isoCode": "BN",
  "name": "Белорусский рубль",
  "symbol": "Р"
}

Copy-icon
Response sample

{
  "id": "58fc8a3d-238b-4251-9af0-e9976738d3c2",
  "isoCode": "BN",
  "name": "Белорусский рубль",
  "symbol": "Р"
}

Copy-icon
Response codes
  • 200 - операция успешна, валюта обновлена
  • 404 - ошибка, валюта не найдена
  • 409 - ошибка, ID не может быть изменено
  • 422 - ошибка, пропущенные или невалидные данные, передаваемые в запросе
  • Удаление валюты - DELETE запрос, /v1/currencies/{id}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор валюты

Copy-icon
Response sample

Отсутствует. В ответе приходит только код операции, например, 204.

Response codes
  • 204 - операция выполнена успешно, валюта удалена
  • 404 - ошибка, валюта не найдена
  • 422 - ошибка, валюта не может быть удалена
  • Загрузка списка цен - PUT запрос, /v1/prices/list
Request body sample

{
  "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"
  }
}

Copy-icon
Response sample

{
  "created": 1,
  "updated": 0
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, список цен загружен
  • 422 - ошибка, невалидные или пропущенные данные

     

  • Получение отфильтрованного списка цен - POST запрос, /v1/prices/list
Request body sample

{
  "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"
  ]

}


Copy-icon
Response sample

[
  {
    "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"
    }
  }
]

Copy-icon
Response codes
  • 200 - операция выполнена успешно, получен отфильтрованный список цен
  • 422 - ошибка, Unprocessable Entity
  • Создание цены на товар - POST запрос, /v2/prices
Request body sample

{
    "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_Беларусь"
    }
}

Copy-icon
Response sample

{
    "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_Беларусь"
    }
}

Copy-icon
Response codes
  • 200 - операция успешно выполнена, создана новая цена
  • 422 - ошибка, отсутствуют обязательные данные (например, артикул товара) или данные не валидны
  • Получение страницы с ценами (с возможностью фильтрации) - POST запрос, /v2/prices/page
Request body sample

{
     "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"
        ]
   }
}

Copy-icon
Response sample

{
  "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
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, получена страница с ценами
  • 422 - ошибка, отсутствуют обязательные данные или данные не валидны
  • Получение списка цен (с возможностью фильтрации) - POST запрос, /v2/prices/list
Request body sample

{
  "articleId": "1021531DC"
}

Copy-icon
Response sample

[
  {
    "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_Беларусь"
    }
  }
]

Copy-icon
Response codes
  • 200 - операция выполнена успешно, получен список цен
  • 422 - ошибка, Unprocessable Entity
  • Получение цены по ее ID - GET запрос, /v2/prices/{id}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор цены

Copy-icon
Response sample

{
  "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_Беларусь"
  }
}

Copy-icon
Response codes
  • 200 - операция успешно выполнена, получены данные цены
  • 404 - ошибка, цена с таким ID не найдена
  • 422 - ошибка, Unprocessable Entity
  • Удаление цены по ее ID - DELETE запрос, /v2/prices/{id}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор цены

Copy-icon
Response sample

Отсутствует. В ответе приходит только код операции, например, 204.

Response codes
  • 204 - операция выполнена успешно, цена удалена
  • 404 - ошибка, цена не найдена
  • 422 - ошибка, Unprocessable Entity
  • Изменение цены - PATCH запрос, /v2/prices/{id}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор цены

Copy-icon
Request body sample

{
  "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_Беларусь"
  }
}

Copy-icon
Response sample

{
  "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_Беларусь"
  }
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, цена отредактирована
  • 404 - ошибка, цена не найдена
  • 409 - ошибка, нельзя изменить articleId и/или id
  • 422 - ошибка, отсутствуют обязательные данные

Расчет стоимости товаров Copy-icon

  • Расчет итоговой стоимости товара в указанном количестве - GET запрос, /v1/article/{id}/prices/{quantity}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор товара
quantity - path-параметр, обязательный: количество единиц товара

Copy-icon
Response sample

{
  "id": "D000022DC",
  "quantity": 42,
  "totalPrice": 630,
  "unitPrice": 15
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, рассчитана итоговая стоимость товара в указанном количестве
  • 404 - ошибка, не удалось найти цену товара
  • 422 - ошибка, отсутствуют обязательные данные (например, articleId)
  • Расчет итоговой стоимости нескольких товаров в указанном количестве - POST запрос, /v1/article/prices
Request body sample

{
  "articles": [
    {
      "id": "D000044DC",
      "quantity": 2,

      "totalPrice": 3300,
      "unitPrice": 1650

    },
    {
      "id": "D000033DC",
      "quantity": 3,

      "totalPrice": 4200,
      "unitPrice": 1400

    }
  ]
}

Copy-icon
Response sample

{
  "articles": [
    {
      "id": "D000044DC",
      "quantity": 2,
      "totalPrice": 3300,
      "unitPrice": 1650
    },
    {
      "id": "D000033DC",
      "quantity": 3,
      "totalPrice": 4200,
      "unitPrice": 1400
    }
  ]
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, рассчитана итоговая стоимость каждого товара
  • 206 - ошибка, не все указанные товары имеют стоимость (будут возвращена информация только о тех товарах, у которых есть цена)
  • 422 - ошибка, отсутствуют обязательные данные (например, articleId)

Работа с прайс листами Copy-icon

  • Создание прайс листа для рынка - POST запрос, /v1/pricelists
Request body sample

{
  "id": "aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",
  "name": "new_pricelist"
}

Copy-icon
Response sample

{
  "id": "aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",
  "name": "new_pricelist"
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, прайс лист создан
  • 422 - ошибка, отсутствуют обязательные данные
  • Получение прайс листа по его ID - GET запрос, /v1/pricelists/{id}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор прайс листа

Copy-icon
Response sample

{
  "id": "aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",
  "name": "new_pricelist"
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, получены данные прайс листа
  • 404 - ошибка, прайс лист с таким ID не найден
  • Удаление прайс листа - DELETE запрос, /v1/pricelists/{id}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор прайс листа

Copy-icon
Response sample

Отсутствует.

Response codes
  • 204 - операция выполнена успешно, прайс лист удален
  • 404 - ошибка, прайс лист с таким ID не найден
  • Редактирование прайс листа - PATCH запрос, /v1/pricelists/{id}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор прайс листа

Copy-icon
Request body sample

{
   "id": "aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",

    "name": "pricelist_edited"
}

Copy-icon
Response sample

{
  "id": "aa8db513-d7f6-4d29-87d2-11f2b8cd68ca",
  "name": "pricelist_edited"
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, прайс лист отредактирован
  • 404 - ошибка, прайс лист с таким ID не найден