Compare commits
2 Commits
master
...
update-feb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dcf366d7d4 | ||
|
|
f5d2d0197b |
8
.idea/.gitignore
generated
vendored
8
.idea/.gitignore
generated
vendored
@@ -1,8 +0,0 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
@@ -2,7 +2,7 @@
|
||||
A Ozon Seller API client written in Golang
|
||||
|
||||
[](https://coveralls.io/github/diPhantxm/ozon-api-client)
|
||||

|
||||

|
||||
|
||||
[Ozon](https://ozon.ru) is a marketplace for small and medium enterprises to launch and grow their businesses in Russia.
|
||||
|
||||
@@ -14,7 +14,7 @@ Get Client-Id and Api-Key in your seller profile [here](https://seller.ozon.ru/a
|
||||
|
||||
Just add dependency to your project and you're ready to go.
|
||||
```bash
|
||||
go get git.denco.store/fakz9/ozon-api-client
|
||||
go get github.com/diphantxm/ozon-api-client
|
||||
```
|
||||
A simple example on how to use this library:
|
||||
```Golang
|
||||
@@ -26,7 +26,7 @@ import (
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"git.denco.store/fakz9/ozon-api-client/ozon"
|
||||
"github.com/diphantxm/ozon-api-client/ozon"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -65,7 +65,7 @@ package main
|
||||
import (
|
||||
"log"
|
||||
|
||||
"git.denco.store/fakz9/ozon-api-client/ozon/notifications"
|
||||
"github.com/diphantxm/ozon-api-client/ozon/notifications"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
2
go.mod
2
go.mod
@@ -1,4 +1,4 @@
|
||||
module git.denco.store/fakz9/ozon-api-client
|
||||
module github.com/diphantxm/ozon-api-client
|
||||
|
||||
go 1.20
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Analytics struct {
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetAnalyticsData(t *testing.T) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Barcodes struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGenerateBarcodes(t *testing.T) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Brands struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestListCertifiedBrands(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Cancellations struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetCancellationInfo(t *testing.T) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Categories struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetProductTree(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Certificates struct {
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestListOfAccordanceTypes(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Chats struct {
|
||||
@@ -164,8 +164,6 @@ type ChatHistoryParams struct {
|
||||
// The default value is `Backward`. You can set the number of messages in the limit parameter
|
||||
Direction string `json:"direction" default:"Backward"`
|
||||
|
||||
Filter *ChatHistoryFilter `json:"filter,omitempty"`
|
||||
|
||||
// Identifier of the message from which the chat history will be displayed.
|
||||
// Default value is the last visible message
|
||||
FromMessageId string `json:"from_message_id"`
|
||||
@@ -174,10 +172,6 @@ type ChatHistoryParams struct {
|
||||
Limit int64 `json:"limit" default:"50"`
|
||||
}
|
||||
|
||||
type ChatHistoryFilter struct {
|
||||
MessageIds []string `json:"message_ids"`
|
||||
}
|
||||
|
||||
type ChatHistoryResponse struct {
|
||||
core.CommonResponse
|
||||
|
||||
@@ -189,33 +183,22 @@ type ChatHistoryResponse struct {
|
||||
}
|
||||
|
||||
type ChatHistoryMessage struct {
|
||||
Context *ChatHistoryContext `json:"context,omitempty"`
|
||||
|
||||
// Message creation date
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
// Array with message content in Markdown format
|
||||
Data []string `json:"data"`
|
||||
|
||||
IsImage bool `json:"is_image"`
|
||||
|
||||
// Indication of the read message
|
||||
IsRead bool `json:"is_read"`
|
||||
|
||||
// Message identifier
|
||||
MessageId string `json:"message_id"`
|
||||
|
||||
ModarateImageStatus string `json:"moderate_image_status"`
|
||||
|
||||
// Chat participant identifier
|
||||
User ChatHistoryMessageUser `json:"user"`
|
||||
}
|
||||
|
||||
type ChatHistoryContext struct {
|
||||
OrderNumber string `json:"order_number"`
|
||||
SKU string `json:"sku"`
|
||||
}
|
||||
|
||||
type ChatHistoryMessageUser struct {
|
||||
// Chat participant identifier
|
||||
Id string `json:"id"`
|
||||
@@ -231,7 +214,7 @@ type ChatHistoryMessageUser struct {
|
||||
|
||||
// Returns the history of chat messages. By default messages are shown from newest to oldest.
|
||||
func (c Chats) History(ctx context.Context, params *ChatHistoryParams) (*ChatHistoryResponse, error) {
|
||||
url := "/v3/chat/history"
|
||||
url := "/v2/chat/history"
|
||||
|
||||
resp := &ChatHistoryResponse{}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestListChats(t *testing.T) {
|
||||
@@ -212,22 +212,16 @@ func TestChatHistory(t *testing.T) {
|
||||
"has_next": true,
|
||||
"messages": [
|
||||
{
|
||||
"context": {
|
||||
"order_number": "123456789",
|
||||
"sku": "987654321"
|
||||
},
|
||||
"created_at": "2019-08-24T14:15:22Z",
|
||||
"data": [
|
||||
"Здравствуйте, у меня вопрос по вашему товару \"Стекло защитное для смартфонов\", артикул 11223. Подойдет ли он на данную [ модель ](https://www.ozon.ru/product/smartfon-samsung-galaxy-a03s-4-64-gb-chernyy) телефона?"
|
||||
],
|
||||
"is_image": true,
|
||||
"is_read": true,
|
||||
"message_id": "3000000000817031942",
|
||||
"moderate_image_status": "SUCCESS",
|
||||
"user": {
|
||||
"id": "115568",
|
||||
"type": "Сustomer"
|
||||
}
|
||||
},
|
||||
"created_at": "2022-07-18T20:58:04.528Z",
|
||||
"is_read": true,
|
||||
"data": [
|
||||
"Здравствуйте, у меня вопрос по вашему товару \"Стекло защитное для смартфонов\", артикул 11223. Подойдет ли он на данную [ модель ](https://www.ozon.ru/product/smartfon-samsung-galaxy-a03s-4-64-gb-chernyy) телефона?"
|
||||
]
|
||||
}
|
||||
]
|
||||
}`,
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Clusters struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestListClusters(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type FBO struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetFBOShipmentsList(t *testing.T) {
|
||||
|
||||
28
ozon/fbs.go
28
ozon/fbs.go
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type FBS struct {
|
||||
@@ -195,14 +195,6 @@ type FBSPosting struct {
|
||||
|
||||
// Economy product identifier
|
||||
QuantumId int64 `json:"quantum_id"`
|
||||
|
||||
// List of products with additional characteristics
|
||||
Optional FBSPostingOptional `json:"optional"`
|
||||
}
|
||||
|
||||
type FBSPostingOptional struct {
|
||||
// List of products with optional labeling
|
||||
ProductsWithPossibleMandatoryMark []int `json:"products_with_possible_mandatory_mark"`
|
||||
}
|
||||
|
||||
type FBSPostingTariffication struct {
|
||||
@@ -248,7 +240,7 @@ type FBSPostingAddressee struct {
|
||||
}
|
||||
|
||||
type FBSPostingAnalyticsData struct {
|
||||
// Delivery city. Only for rFBS shipments and sellers from CIS countries
|
||||
// Delivery city. Only for rFBS shipments
|
||||
City string `json:"city"`
|
||||
|
||||
// Delivery start date and time
|
||||
@@ -381,6 +373,9 @@ type FBSRequirements struct {
|
||||
}
|
||||
|
||||
type PostingProduct struct {
|
||||
// Mandatory product labeling
|
||||
MandatoryMark []string `json:"mandatory_mark"`
|
||||
|
||||
// Product name
|
||||
Name string `json:"name"`
|
||||
|
||||
@@ -398,9 +393,6 @@ type PostingProduct struct {
|
||||
|
||||
// Product identifier in the Ozon system, SKU
|
||||
SKU int64 `json:"sku"`
|
||||
|
||||
// Product traceability attribute
|
||||
IsBLRTraceable bool `json:"is_blr_traceable"`
|
||||
}
|
||||
|
||||
type FBSCustomer struct {
|
||||
@@ -1051,9 +1043,6 @@ type GetShipmentDataByIdentifierResult struct {
|
||||
// Number of the parent shipment which split resulted in the current shipment
|
||||
ParentPostingNumber string `json:"parent_posting_number"`
|
||||
|
||||
// List of products with additional characteristics
|
||||
Optional GetShipmentDataByIdentifierOptional `json:"optional"`
|
||||
|
||||
// Shipment number
|
||||
PostingNumber string `json:"posting_number"`
|
||||
|
||||
@@ -1105,11 +1094,6 @@ type GetShipmentDataByIdentifierResult struct {
|
||||
Tariffication []FBSPostingTariffication `json:"tariffication"`
|
||||
}
|
||||
|
||||
type GetShipmentDataByIdentifierOptional struct {
|
||||
// List of products with optional labeling
|
||||
ProductsWithPossibleMandatoryMark []int `json:"products_with_possible_mandatory_mark"`
|
||||
}
|
||||
|
||||
type GetShipmentDataByIdentifierResultAdditionalData struct {
|
||||
// Key
|
||||
Key string `json:"key"`
|
||||
@@ -1129,7 +1113,7 @@ type GetShipmentDataByIdentifierResultAddressee struct {
|
||||
}
|
||||
|
||||
type GetShipmentDataByIdentifierResultAnalyticsData struct {
|
||||
// Delivery city. Only for rFBS shipments and sellers from CIS countries
|
||||
// Delivery city. Only for rFBS shipments
|
||||
City string `json:"city"`
|
||||
|
||||
// Delivery start date and time
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestListUnprocessedShipments(t *testing.T) {
|
||||
@@ -58,11 +58,6 @@ func TestListUnprocessedShipments(t *testing.T) {
|
||||
"in_process_at": "2021-08-25T10:48:38Z",
|
||||
"shipment_date": "2021-08-26T10:00:00Z",
|
||||
"delivering_date": null,
|
||||
"optional": {
|
||||
"products_with_possible_mandatory_mark": [
|
||||
0
|
||||
]
|
||||
},
|
||||
"cancellation": {
|
||||
"cancel_reason_id": 0,
|
||||
"cancel_reason": "",
|
||||
@@ -76,12 +71,12 @@ func TestListUnprocessedShipments(t *testing.T) {
|
||||
"products": [
|
||||
{
|
||||
"currency_code": "RUB",
|
||||
"is_blr_traceable": true,
|
||||
"price": "1259",
|
||||
"offer_id": "УТ-0001365",
|
||||
"name": "Мяч, цвет: черный, 5 кг",
|
||||
"sku": 140048123,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"mandatory_mark": []
|
||||
}
|
||||
],
|
||||
"addressee": null,
|
||||
@@ -260,11 +255,6 @@ func TestGetFBSShipmentsList(t *testing.T) {
|
||||
"in_process_at": "2022-05-13T07:07:32Z",
|
||||
"shipment_date": "2022-05-13T10:00:00Z",
|
||||
"delivering_date": null,
|
||||
"optional": {
|
||||
"products_with_possible_mandatory_mark": [
|
||||
0
|
||||
]
|
||||
},
|
||||
"cancellation": {
|
||||
"cancel_reason_id": 0,
|
||||
"cancel_reason": "",
|
||||
@@ -277,12 +267,12 @@ func TestGetFBSShipmentsList(t *testing.T) {
|
||||
"products": [
|
||||
{
|
||||
"currency_code": "RUB",
|
||||
"is_blr_traceable": true,
|
||||
"price": "1390.000000",
|
||||
"offer_id": "205953",
|
||||
"name": " Электронный конструктор PinLab Позитроник",
|
||||
"sku": 358924380,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"mandatory_mark": []
|
||||
}
|
||||
],
|
||||
"addressee": null,
|
||||
@@ -313,7 +303,7 @@ func TestGetFBSShipmentsList(t *testing.T) {
|
||||
],
|
||||
"has_next": true
|
||||
}
|
||||
}`,
|
||||
}`,
|
||||
},
|
||||
// Test No Client-Id or Api-Key
|
||||
{
|
||||
@@ -541,7 +531,8 @@ func TestGetShipmentDataByBarcode(t *testing.T) {
|
||||
"offer_id": "250-7898-1",
|
||||
"name": "Кофе ароматизированный \"Шоколадный апельсин\" 250 гр",
|
||||
"sku": 180550365,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"mandatory_mark": []
|
||||
}
|
||||
],
|
||||
"barcodes": null,
|
||||
@@ -630,11 +621,6 @@ func TestGetShipmentDataByIdentifier(t *testing.T) {
|
||||
"delivering_date": null,
|
||||
"provider_status": "",
|
||||
"delivery_price": "",
|
||||
"optional": {
|
||||
"products_with_possible_mandatory_mark": [
|
||||
0
|
||||
]
|
||||
},
|
||||
"cancellation": {
|
||||
"cancel_reason_id": 0,
|
||||
"cancel_reason": "",
|
||||
@@ -648,12 +634,12 @@ func TestGetShipmentDataByIdentifier(t *testing.T) {
|
||||
"products": [
|
||||
{
|
||||
"currency_code": "RUB",
|
||||
"is_blr_traceable": true,
|
||||
"price": "279.0000",
|
||||
"offer_id": "250-7898-1",
|
||||
"name": "Кофе ароматизированный \"Шоколадный апельсин\" 250 гр",
|
||||
"sku": 180550365,
|
||||
"quantity": 1,
|
||||
"mandatory_mark": [],
|
||||
"dimensions": {
|
||||
"height": "40.00",
|
||||
"length": "240.00",
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Finance struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestReportOnSoldProducts(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Invoices struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestCreateUpdateProformaLink(t *testing.T) {
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type testData struct {
|
||||
|
||||
@@ -3,7 +3,7 @@ package ozon
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Passes struct {
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestListPasses(t *testing.T) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Polygons struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestCreateDeliveryPolygon(t *testing.T) {
|
||||
|
||||
312
ozon/products.go
312
ozon/products.go
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Products struct {
|
||||
@@ -106,41 +106,157 @@ func (c Products) GetStocksInfo(ctx context.Context, params *GetStocksInfoParams
|
||||
}
|
||||
|
||||
type ProductDetails struct {
|
||||
Barcodes []string `json:"barcodes"`
|
||||
ColorImage []string `json:"color_image"`
|
||||
Commissions []ProductDetailCommission `json:"commissions"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
CurrencyCode string `json:"currency_code"`
|
||||
DescriptionCategoryId int64 `json:"description_category_id"`
|
||||
DiscountedFBOStocks int32 `json:"discounted_fbo_stocks"`
|
||||
Errors []ProductDetailsError `json:"errors"`
|
||||
HasDiscountedFBOItem bool `json:"has_discounted_fbo_item"`
|
||||
Id int64 `json:"id"`
|
||||
Images []string `json:"images"`
|
||||
Images360 []string `json:"images360"`
|
||||
IsArchived bool `json:"is_archived"`
|
||||
IsAutoarchived bool `json:"is_autoarchived"`
|
||||
IsDiscounted bool `json:"is_discounted"`
|
||||
IsKGT bool `json:"is_kgt"`
|
||||
IsPrepaymentAllowed bool `json:"is_prepayment_allowed"`
|
||||
IsSuper bool `json:"is_super"`
|
||||
MarketingPrice string `json:"marketing_price"`
|
||||
MinPrice string `json:"min_price"`
|
||||
ModelInfo *ProductDetailsModelInfo `json:"model_info"`
|
||||
Name string `json:"name"`
|
||||
OfferId string `json:"offer_id"`
|
||||
OldPrice string `json:"old_price"`
|
||||
Price string `json:"price"`
|
||||
PriceIndexes ProductDetailPriceIndex `json:"price_indexes"`
|
||||
PrimaryImage []string `json:"primary_image"`
|
||||
Sources []ProductDetailSource `json:"sources"`
|
||||
Statuses ProductDetailsStatus `json:"statuses"`
|
||||
Stocks ProductDetailStock `json:"stocks"`
|
||||
TypeId int64 `json:"type_id"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
VAT string `json:"vat"`
|
||||
VisibilityDetails ProductDetailVisibilityDetails `json:"visibility_details"`
|
||||
VolumeWeight float64 `json:"volume_weight"`
|
||||
// All product barcodes
|
||||
Barcodes []string `json:"barcodes"`
|
||||
|
||||
// Main offer price on Ozon.
|
||||
//
|
||||
// The field is deprecated. Returns an empty string ""
|
||||
BuyboxPrice string `json:"buybox_price"`
|
||||
|
||||
// Category identifier
|
||||
DescriptionCategoryId int64 `json:"description_category_id"`
|
||||
|
||||
// Markdown product stocks at the Ozon warehouse
|
||||
DiscountedFBOStocks int32 `json:"discounted_fbo_stocks"`
|
||||
|
||||
// Details on errors when creating or validating a product
|
||||
Errors []ProductDetailsError `json:"errors"`
|
||||
|
||||
// Indication that the product has similar markdown products at the Ozon warehouse
|
||||
HasDiscountedFBOItem bool `json:"has_discounted_fbo_item"`
|
||||
|
||||
// Product type identifier
|
||||
TypeId int64 `json:"type_id"`
|
||||
|
||||
// Marketing color
|
||||
ColorImage []string `json:"color_image"`
|
||||
|
||||
// Commission fees details
|
||||
Commissions []ProductDetailCommission `json:"commissions"`
|
||||
|
||||
// Date and time when the product was created
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
// Product SKU
|
||||
SKU int64 `json:"sku"`
|
||||
|
||||
// SKU of the product that is sold from the Ozon warehouse (FBO)
|
||||
FBOSKU int64 `json:"fbo_sku,omitempty"`
|
||||
|
||||
// SKU of the product that is sold from the seller's warehouse (FBS and rFBS)
|
||||
FBSSKU int64 `json:"fbs_sku,omitempty"`
|
||||
|
||||
// Product identifier
|
||||
Id int64 `json:"id"`
|
||||
|
||||
// An array of links to images. The images in the array are arranged in the order of their arrangement on the site. If the `primary_image` parameter is not specified, the first image in the list is the main one for the product
|
||||
Images []string `json:"images"`
|
||||
|
||||
// Main product image
|
||||
PrimaryImage []string `json:"primary_image"`
|
||||
|
||||
// Array of 360 images
|
||||
Images360 []string `json:"images360"`
|
||||
|
||||
// true if the product has markdown equivalents at the Ozon warehouse
|
||||
HasDiscountedItem bool `json:"has_discounted_item"`
|
||||
|
||||
// Indication of a markdown product:
|
||||
//
|
||||
// * true if the product was created by the seller as a markdown
|
||||
//
|
||||
// * false if the product is not markdown or was marked down by Ozon
|
||||
IsDiscounted bool `json:"is_discounted"`
|
||||
|
||||
// Markdown products stocks
|
||||
DiscountedStocks ProductDiscountedStocks `json:"discounted_stocks"`
|
||||
|
||||
// Indication of a bulky product
|
||||
IsKGT bool `json:"is_kgt"`
|
||||
|
||||
// Indication of mandatory prepayment for the product:
|
||||
//
|
||||
// * true — to buy a product, you need to make a prepayment.
|
||||
//
|
||||
// * false—prepayment is not required
|
||||
IsPrepayment bool `json:"is_prepayment"`
|
||||
|
||||
// If prepayment is possible, the value is true
|
||||
IsPrepaymentAllowed bool `json:"is_prepayment_allowed"`
|
||||
|
||||
// Currency of your prices. It matches the currency set in the personal account settings
|
||||
CurrencyCode string `json:"currency_code"`
|
||||
|
||||
// The price of the product including all promotion discounts. This value will be shown on the Ozon storefront
|
||||
MarketingPrice string `json:"marketing_price"`
|
||||
|
||||
// Minimum price for similar products on Ozon.
|
||||
//
|
||||
// The field is deprecated. Returns an empty string ""
|
||||
MinOzonPrice string `json:"min_ozon_price"`
|
||||
|
||||
// Minimum product price with all promotions applied
|
||||
MinPrice string `json:"min_price"`
|
||||
|
||||
// Name
|
||||
Name string `json:"name"`
|
||||
|
||||
// Product identifier in the seller's system
|
||||
OfferId string `json:"offer_id"`
|
||||
|
||||
// Price before discounts. Displayed strikethrough on the product description page
|
||||
OldPrice string `json:"old_price"`
|
||||
|
||||
// Product price including discounts. This value is shown on the product description page
|
||||
Price string `json:"price"`
|
||||
|
||||
// Product price indexes
|
||||
PriceIndexes ProductDetailPriceIndex `json:"price_indexes"`
|
||||
|
||||
// Deprecated: Price index. Learn more in Help Center
|
||||
//
|
||||
// Use PriceIndexes instead
|
||||
PriceIndex string `json:"price_index"`
|
||||
|
||||
// Product state description
|
||||
Status ProductDetailStatus `json:"status"`
|
||||
|
||||
// Details about the sources of similar offers. Learn more in Help Сenter
|
||||
Sources []ProductDetailSource `json:"sources"`
|
||||
|
||||
// Details about product stocks
|
||||
Stocks ProductDetailStock `json:"stocks"`
|
||||
|
||||
// Date of the last product update
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
|
||||
// Product VAT rate
|
||||
VAT string `json:"vat"`
|
||||
|
||||
// Product visibility settings
|
||||
VisibilityDetails ProductDetailVisibilityDetails `json:"visibility_details"`
|
||||
|
||||
// If the product is on sale, the value is true
|
||||
Visible bool `json:"visible"`
|
||||
|
||||
// Product volume weight
|
||||
VolumeWeight float64 `json:"volume_weight"`
|
||||
|
||||
// 'true' if the item is archived manually.
|
||||
IsArchived bool `json:"is_archived"`
|
||||
|
||||
// 'true' if the item is archived automatically.
|
||||
IsArchivedAuto bool `json:"is_autoarchived"`
|
||||
|
||||
// Product status details
|
||||
Statuses ProductDetailsStatus `json:"statuses"`
|
||||
|
||||
// Product model details
|
||||
ModelInfo ProductDetailsModelInfo `json:"model_info"`
|
||||
|
||||
// Indication of a super product
|
||||
IsSuper bool `json:"is_super"`
|
||||
}
|
||||
|
||||
type ProductDetailsError struct {
|
||||
@@ -190,15 +306,32 @@ type NameValue struct {
|
||||
}
|
||||
|
||||
type ProductDetailsStatus struct {
|
||||
IsCreated bool `json:"is_created"`
|
||||
ModerateStatus string `json:"moderate_status"`
|
||||
Status string `json:"status"`
|
||||
StatusDescription string `json:"status_description"`
|
||||
StatusFailed string `json:"status_failed"`
|
||||
StatusName string `json:"status_name"`
|
||||
StatusTooltip string `json:"status_tooltip"`
|
||||
StatusUpdatedAt time.Time `json:"status_updated_at"`
|
||||
ValidationStatus string `json:"validation_status"`
|
||||
// true, if the product is created correctly
|
||||
IsCreated bool `json:"is_created"`
|
||||
|
||||
// Moderation status
|
||||
ModerateStatus string `json:"moderate_status"`
|
||||
|
||||
// Product status
|
||||
Status string `json:"status"`
|
||||
|
||||
// Product status description
|
||||
Description string `json:"status_description"`
|
||||
|
||||
// Status of the product where the error occurred
|
||||
Failed string `json:"status_failed"`
|
||||
|
||||
// Product status name
|
||||
Name string `json:"status_name"`
|
||||
|
||||
// Status description
|
||||
Tooltip string `json:"status_tooltip"`
|
||||
|
||||
// Time of the last status change
|
||||
UpdatedAt time.Time `json:"status_updated_at"`
|
||||
|
||||
// Validation status
|
||||
ValidationStatus string `json:"validation_status"`
|
||||
}
|
||||
|
||||
type ProductDetailsModelInfo struct {
|
||||
@@ -312,28 +445,58 @@ type ProductDetailStatus struct {
|
||||
}
|
||||
|
||||
type ProductDetailSource struct {
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
QuantCode string `json:"quant_code"`
|
||||
ShipmentType string `json:"shipment_type"`
|
||||
SKU int64 `json:"sku"`
|
||||
Source string `json:"source"`
|
||||
// Product creation date
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
// Product identifier in the Ozon system, SKU
|
||||
SKU int64 `json:"sku"`
|
||||
|
||||
// Link to the source
|
||||
Source string `json:"source"`
|
||||
|
||||
// Package type
|
||||
ShipmentType string `json:"shipment_type"`
|
||||
|
||||
// List of MOQs with products
|
||||
QuantCode string `json:"quant_code"`
|
||||
}
|
||||
|
||||
type ProductDetailStock struct {
|
||||
HasStock bool `json:"has_stock"`
|
||||
Stocks []ProductDetailStockStock `json:"stocks"`
|
||||
// true, if there are stocks at the warehouses
|
||||
HasStock bool `json:"has_stock"`
|
||||
|
||||
// Status of product stocks
|
||||
Stocks []ProductDetailStockStock `json:"stocks"`
|
||||
}
|
||||
|
||||
type ProductDetailStockStock struct {
|
||||
Present int32 `json:"present"`
|
||||
Reserved int32 `json:"reserved"`
|
||||
SKU int64 `json:"sku"`
|
||||
Source string `json:"source"`
|
||||
// Product identifier in the Ozon system, SKU
|
||||
SKU int64 `json:"sku"`
|
||||
|
||||
// Currently at the warehouse
|
||||
Present int32 `json:"present"`
|
||||
|
||||
// Reserved
|
||||
Reserved int32 `json:"reserved"`
|
||||
|
||||
// Sales scheme
|
||||
Source string `json:"source"`
|
||||
}
|
||||
|
||||
type ProductDetailVisibilityDetails struct {
|
||||
// If the product is active, the value is true
|
||||
//
|
||||
// Deprecated: Use `visible` parameter of `ProductDetails`
|
||||
ActiveProduct bool `json:"active_product"`
|
||||
|
||||
// If the price is set, the value is true
|
||||
HasPrice bool `json:"has_price"`
|
||||
|
||||
// If there is stock at the warehouses, the value is true
|
||||
HasStock bool `json:"has_stock"`
|
||||
|
||||
// Reason why the product is hidden
|
||||
Reasons map[string]interface{} `json:"reasons"`
|
||||
}
|
||||
|
||||
type ProductDiscountedStocks struct {
|
||||
@@ -595,9 +758,6 @@ type UpdatePricesPrice struct {
|
||||
// Minimum product price with all promotions applied
|
||||
MinPrice string `json:"min_price"`
|
||||
|
||||
// Product cost price
|
||||
NetPrice string `json:"net_price"`
|
||||
|
||||
// Product identifier in the seller's system
|
||||
OfferId string `json:"offer_id"`
|
||||
|
||||
@@ -706,7 +866,7 @@ type CreateOrUpdateProductItem struct {
|
||||
DescriptionCategoryId int64 `json:"description_category_id"`
|
||||
|
||||
// New category identifier. Specify it if you want to change the current product category
|
||||
NewDescriptionCategoryId int64 `json:"new_description_category_id"`
|
||||
NewDescriptinoCategoryId int64 `json:"new_description_category_id"`
|
||||
|
||||
// Marketing color.
|
||||
//
|
||||
@@ -836,7 +996,7 @@ type CreateOrUpdateProductPDF struct {
|
||||
Name string `json:"name"`
|
||||
|
||||
// File address
|
||||
SrcUrl string `json:"src_url"`
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
type CreateOrUpdateProductResponse struct {
|
||||
@@ -1432,10 +1592,7 @@ type GetDescriptionOfProductResult struct {
|
||||
Id int64 `json:"id"`
|
||||
|
||||
// Array of links to product images
|
||||
Images []string `json:"images"`
|
||||
|
||||
// Model Information
|
||||
ModelInfo GetDescriptionOfProductModelInfo `json:"model_info"`
|
||||
Images []GetDescriptionOfProductResultImage `json:"images"`
|
||||
|
||||
// Array of 360 images
|
||||
Images360 []GetDescriptionOfProductResultImage360 `json:"images360"`
|
||||
@@ -1468,17 +1625,9 @@ type GetDescriptionOfProductResult struct {
|
||||
Width int32 `json:"width"`
|
||||
}
|
||||
|
||||
type GetDescriptionOfProductModelInfo struct {
|
||||
// Model Identifier
|
||||
ModelId int64 `json:"model_id"`
|
||||
|
||||
// Quantity of combined model products
|
||||
Count int64 `json:"count"`
|
||||
}
|
||||
|
||||
type GetDescriptionOfProductResultAttr struct {
|
||||
// Characteristic identifier
|
||||
AttributeId int64 `json:"id"`
|
||||
AttributeId int64 `json:"attribute_id"`
|
||||
|
||||
// Identifier of the characteristic that supports nested properties.
|
||||
// For example, the "Processor" characteristic has nested characteristics "Manufacturer" and "L2 Cache".
|
||||
@@ -1523,6 +1672,12 @@ type GetDescriptionOfProductResultComplexAttrValue struct {
|
||||
Value string `json:"value"`
|
||||
}
|
||||
|
||||
type GetDescriptionOfProductResultImage struct {
|
||||
Default bool `json:"default"`
|
||||
FileName string `json:"file_name"`
|
||||
Index int64 `json:"index"`
|
||||
}
|
||||
|
||||
type GetDescriptionOfProductResultImage360 struct {
|
||||
FileName string `json:"file_name"`
|
||||
Index int64 `json:"index"`
|
||||
@@ -1595,7 +1750,8 @@ type GetDescriptionOfProductsResult struct {
|
||||
// new "model_info" structure
|
||||
ModelInfo *ModelInfo `json:"model_info,omitempty"`
|
||||
|
||||
Images []string `json:"images"`
|
||||
Images []string `json:"images"`
|
||||
PDFList []string `json:"pdf_list"`
|
||||
|
||||
Attributes []GetDescriptionOfProductsAttribute `json:"attributes"`
|
||||
ComplexAttributes []GetDescriptionOfProductsComplexAttribute `json:"complex_attributes"`
|
||||
@@ -1966,6 +2122,10 @@ type GetProductPriceInfoFilter struct {
|
||||
type GetProductPriceInfoResponse struct {
|
||||
core.CommonResponse
|
||||
|
||||
Result GetProductPriceInfoResult `json:"result"`
|
||||
}
|
||||
|
||||
type GetProductPriceInfoResult struct {
|
||||
// Products list
|
||||
Items []GetProductPriceInfoResultItem `json:"items"`
|
||||
|
||||
@@ -1978,7 +2138,7 @@ type GetProductPriceInfoResponse struct {
|
||||
|
||||
type GetProductPriceInfoResultItem struct {
|
||||
// Maximum acquiring fee
|
||||
Acquiring float64 `json:"acquiring"`
|
||||
Acquiring int32 `json:"acquiring"`
|
||||
|
||||
// Commissions information
|
||||
Commissions GetProductPriceInfoResultItemCommission `json:"commissions"`
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetStocksInfo(t *testing.T) {
|
||||
@@ -2155,72 +2155,74 @@ func TestGetProductPriceInfo(t *testing.T) {
|
||||
},
|
||||
},
|
||||
`{
|
||||
"cursor": "string",
|
||||
"items": [
|
||||
{
|
||||
"acquiring": 0.5,
|
||||
"commissions": {
|
||||
"fbo_deliv_to_customer_amount": 14.75,
|
||||
"fbo_direct_flow_trans_max_amount": 46.5,
|
||||
"fbo_direct_flow_trans_min_amount": 31,
|
||||
"fbo_return_flow_amount": 50,
|
||||
"fbs_deliv_to_customer_amount": 60,
|
||||
"fbs_direct_flow_trans_max_amount": 61.5,
|
||||
"fbs_direct_flow_trans_min_amount": 41,
|
||||
"fbs_first_mile_max_amount": 25,
|
||||
"fbs_first_mile_min_amount": 0,
|
||||
"fbs_return_flow_amount": 40,
|
||||
"sales_percent_fbo": 15,
|
||||
"sales_percent_fbs": 0
|
||||
},
|
||||
"marketing_actions": {
|
||||
"actions": [
|
||||
{
|
||||
"date_from": "2024-12-13T06:49:37.591Z",
|
||||
"date_to": "2024-12-13T06:49:37.591Z",
|
||||
"title": "string",
|
||||
"value": 0
|
||||
"result": {
|
||||
"cursor": "string",
|
||||
"items": [
|
||||
{
|
||||
"acquiring": 0,
|
||||
"commissions": {
|
||||
"fbo_deliv_to_customer_amount": 14.75,
|
||||
"fbo_direct_flow_trans_max_amount": 46.5,
|
||||
"fbo_direct_flow_trans_min_amount": 31,
|
||||
"fbo_return_flow_amount": 50,
|
||||
"fbs_deliv_to_customer_amount": 60,
|
||||
"fbs_direct_flow_trans_max_amount": 61.5,
|
||||
"fbs_direct_flow_trans_min_amount": 41,
|
||||
"fbs_first_mile_max_amount": 25,
|
||||
"fbs_first_mile_min_amount": 0,
|
||||
"fbs_return_flow_amount": 40,
|
||||
"sales_percent_fbo": 15,
|
||||
"sales_percent_fbs": 0
|
||||
},
|
||||
"marketing_actions": {
|
||||
"actions": [
|
||||
{
|
||||
"date_from": "2024-12-13T06:49:37.591Z",
|
||||
"date_to": "2024-12-13T06:49:37.591Z",
|
||||
"title": "string",
|
||||
"value": 0
|
||||
}
|
||||
],
|
||||
"current_period_from": "2024-12-13T06:49:37.591Z",
|
||||
"current_period_to": "2024-12-13T06:49:37.591Z",
|
||||
"ozon_actions_exist": true
|
||||
},
|
||||
"offer_id": "356792",
|
||||
"price": {
|
||||
"auto_action_enabled": true,
|
||||
"currency_code": "RUB",
|
||||
"marketing_price": 0,
|
||||
"marketing_seller_price": 0,
|
||||
"min_price": 0,
|
||||
"old_price": 579,
|
||||
"price": 499,
|
||||
"retail_price": 0,
|
||||
"vat": 0.2
|
||||
},
|
||||
"price_indexes": {
|
||||
"color_index": "WITHOUT_INDEX",
|
||||
"external_index_data": {
|
||||
"min_price": 0,
|
||||
"min_price_currency": "string",
|
||||
"price_index_value": 0
|
||||
},
|
||||
"ozon_index_data": {
|
||||
"min_price": 0,
|
||||
"min_price_currency": "string",
|
||||
"price_index_value": 0
|
||||
},
|
||||
"self_marketplaces_index_data": {
|
||||
"min_price": 0,
|
||||
"min_price_currency": "string",
|
||||
"price_index_value": 0
|
||||
}
|
||||
],
|
||||
"current_period_from": "2024-12-13T06:49:37.591Z",
|
||||
"current_period_to": "2024-12-13T06:49:37.591Z",
|
||||
"ozon_actions_exist": true
|
||||
},
|
||||
"offer_id": "356792",
|
||||
"price": {
|
||||
"auto_action_enabled": true,
|
||||
"currency_code": "RUB",
|
||||
"marketing_price": 0,
|
||||
"marketing_seller_price": 0,
|
||||
"min_price": 0,
|
||||
"old_price": 579,
|
||||
"price": 499,
|
||||
"retail_price": 0,
|
||||
"vat": 0.2
|
||||
},
|
||||
"price_indexes": {
|
||||
"color_index": "WITHOUT_INDEX",
|
||||
"external_index_data": {
|
||||
"min_price": 0,
|
||||
"min_price_currency": "string",
|
||||
"price_index_value": 0
|
||||
},
|
||||
"ozon_index_data": {
|
||||
"min_price": 0,
|
||||
"min_price_currency": "string",
|
||||
"price_index_value": 0
|
||||
},
|
||||
"self_marketplaces_index_data": {
|
||||
"min_price": 0,
|
||||
"min_price_currency": "string",
|
||||
"price_index_value": 0
|
||||
},
|
||||
"product_id": 243686911,
|
||||
"volume_weight": 0
|
||||
}
|
||||
},
|
||||
"product_id": 243686911,
|
||||
"volume_weight": 0
|
||||
],
|
||||
"total": 0
|
||||
}
|
||||
],
|
||||
"total": 0
|
||||
}`,
|
||||
},
|
||||
// Test No Client-Id or Api-Key
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Promotions struct {
|
||||
@@ -297,6 +297,196 @@ func (c Promotions) RemoveProduct(ctx context.Context, params *RemoveProductFrom
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
type ListHotSalePromotionsResponse struct {
|
||||
core.CommonResponse
|
||||
|
||||
// Method result
|
||||
Result []ListHotSalePromotionsResult `json:"result"`
|
||||
}
|
||||
|
||||
type ListHotSalePromotionsResult struct {
|
||||
// Promotion end date
|
||||
DateEnd string `json:"date_end"`
|
||||
|
||||
// Promotion start date
|
||||
DateStart string `json:"date_start"`
|
||||
|
||||
// Promotion description
|
||||
Description string `json:"description"`
|
||||
|
||||
// Promotion freeze date.
|
||||
//
|
||||
// If the field is filled, the seller can't increase prices, change the list of products,
|
||||
// or decrease the number of product units in the promotion.
|
||||
//
|
||||
// The seller can lower prices and increase the product units number in the promotion
|
||||
FreezeDate string `json:"freeze_date"`
|
||||
|
||||
// Hot Sale promotion identifier
|
||||
HotsaleId float64 `json:"hotsale_id"`
|
||||
|
||||
// Indication that you participate in this promotion
|
||||
IsParticipating bool `json:"is_participating"`
|
||||
|
||||
// Promotion name
|
||||
Title string `json:"title"`
|
||||
}
|
||||
|
||||
// List of available Hot Sale promotions
|
||||
func (c Promotions) ListHotSalePromotions(ctx context.Context) (*ListHotSalePromotionsResponse, error) {
|
||||
url := "/v1/actions/hotsales/list"
|
||||
|
||||
resp := &ListHotSalePromotionsResponse{}
|
||||
|
||||
response, err := c.client.Request(ctx, http.MethodPost, url, nil, resp, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
response.CopyCommonResponse(&resp.CommonResponse)
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
type ProductsAvailableForHotSalePromotionParams struct {
|
||||
// Hot Sale promotion identifier
|
||||
HotSaleId float64 `json:"hotsale_id"`
|
||||
|
||||
// Number of elements in the response. Default value is 100
|
||||
Limit float64 `json:"limit"`
|
||||
|
||||
// Number of elements that will be skipped in the response. For example, if offset=10, the response will start with the 11th element found
|
||||
Offset float64 `json:"offset,omitempty"`
|
||||
}
|
||||
|
||||
type ProductsAvailableForHotSalePromotionResponse struct {
|
||||
core.CommonResponse
|
||||
|
||||
// Method result
|
||||
Result ProductsAvailableForHotSalePromotionResult `json:"result"`
|
||||
}
|
||||
|
||||
type ProductsAvailableForHotSalePromotionResult struct {
|
||||
// Products list
|
||||
Products []ProductsAvailableForHotSalePromotionResultProduct `json:"products"`
|
||||
|
||||
// Total number of products that are available for the promotion
|
||||
Total float64 `json:"total"`
|
||||
}
|
||||
|
||||
type ProductsAvailableForHotSalePromotionResultProduct struct {
|
||||
// Promotional product price
|
||||
ActionPrice float64 `json:"action_price"`
|
||||
|
||||
// Date when the product participates in the promotion in the YYYY-MM-DD format
|
||||
DateDayPromo string `json:"date_day_promo"`
|
||||
|
||||
// Product identifier
|
||||
Id float64 `json:"id"`
|
||||
|
||||
// Indication that product participates in the promotion
|
||||
IsActive bool `json:"is_active"`
|
||||
|
||||
// Maximum possible promotional price of the product
|
||||
MaxActionPrice float64 `json:"max_action_price"`
|
||||
|
||||
// Minimum number of product units in a stock discount type promotion
|
||||
MinStock float64 `json:"min_stock"`
|
||||
|
||||
// Number of product units in a stock discount type promotion
|
||||
Stock float64 `json:"stock"`
|
||||
}
|
||||
|
||||
// Method for getting a list of products that can participate or are already participating in the Hot Sale promotion
|
||||
func (c Promotions) ProductsAvailableForHotSalePromotion(ctx context.Context, params *ProductsAvailableForHotSalePromotionParams) (*ProductsAvailableForHotSalePromotionResponse, error) {
|
||||
url := "/v1/actions/hotsales/products"
|
||||
|
||||
resp := &ProductsAvailableForHotSalePromotionResponse{}
|
||||
|
||||
response, err := c.client.Request(ctx, http.MethodPost, url, params, resp, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
response.CopyCommonResponse(&resp.CommonResponse)
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
type AddProductsToHotSaleParams struct {
|
||||
// Hot Sale promotion identifier
|
||||
HotSaleId float64 `json:"hotsale_id"`
|
||||
|
||||
// Products to be added to the promotion. The maximum number in one request is 100
|
||||
Products []AddProductsToHotSaleProduct `json:"products"`
|
||||
}
|
||||
|
||||
type AddProductsToHotSaleProduct struct {
|
||||
// Promotional product price
|
||||
ActionPrice float64 `json:"action_price"`
|
||||
|
||||
// Product identifier
|
||||
ProductId float64 `json:"product_id"`
|
||||
|
||||
// Number of product units in a stock discount type promotion
|
||||
Stock float64 `json:"stock"`
|
||||
}
|
||||
|
||||
type ProductsToHotSaleResponse struct {
|
||||
core.CommonResponse
|
||||
|
||||
// Method result
|
||||
Result ProductsToHotSaleResult `json:"result"`
|
||||
}
|
||||
|
||||
type ProductsToHotSaleResult struct {
|
||||
// List of products that haven't been added to the promotion
|
||||
Rejected []ProductsToHotSaleResultRejected `json:"rejected"`
|
||||
}
|
||||
|
||||
type ProductsToHotSaleResultRejected struct {
|
||||
//Product identifier
|
||||
ProductId float64 `json:"product_id"`
|
||||
|
||||
// Reason why the product hasn't been added to the promotion
|
||||
Reason string `json:"reason"`
|
||||
}
|
||||
|
||||
func (c Promotions) AddProductsToHotSale(ctx context.Context, params *AddProductsToHotSaleParams) (*ProductsToHotSaleResponse, error) {
|
||||
url := "/v1/actions/hotsales/activate"
|
||||
|
||||
resp := &ProductsToHotSaleResponse{}
|
||||
|
||||
response, err := c.client.Request(ctx, http.MethodPost, url, params, resp, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
response.CopyCommonResponse(&resp.CommonResponse)
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
type RemoveProductsToHotSaleParams struct {
|
||||
// Hot Sale promotion identifier
|
||||
HotSaleId float64 `json:"hotsale_id"`
|
||||
|
||||
// List of products identifiers. Maximum number of values in one request is 100
|
||||
ProductIds []float64 `json:"product_ids"`
|
||||
}
|
||||
|
||||
// Remove product from the Hot Sale promotion
|
||||
func (c Promotions) RemoveProductsToHotSale(ctx context.Context, params *RemoveProductsToHotSaleParams) (*ProductsToHotSaleResponse, error) {
|
||||
url := "/v1/actions/hotsales/activate"
|
||||
|
||||
resp := &ProductsToHotSaleResponse{}
|
||||
|
||||
response, err := c.client.Request(ctx, http.MethodPost, url, params, resp, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
response.CopyCommonResponse(&resp.CommonResponse)
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
type ListDiscountRequestsParams struct {
|
||||
// Discount request status
|
||||
Status ListDiscountRequestsStatus `json:"status" default:"UNKNOWN"`
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetAvailablePromotions(t *testing.T) {
|
||||
@@ -354,6 +354,248 @@ func TestRemoveProduct(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestListHotSalePromotions(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
tests := []struct {
|
||||
statusCode int
|
||||
headers map[string]string
|
||||
response string
|
||||
}{
|
||||
// Test Ok
|
||||
{
|
||||
http.StatusOK,
|
||||
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
|
||||
`{
|
||||
"result": [
|
||||
{
|
||||
"date_end": "string",
|
||||
"date_start": "string",
|
||||
"description": "string",
|
||||
"freeze_date": "string",
|
||||
"hotsale_id": 0,
|
||||
"is_participating": true,
|
||||
"title": "string"
|
||||
}
|
||||
]
|
||||
}`,
|
||||
},
|
||||
// Test No Client-Id or Api-Key
|
||||
{
|
||||
http.StatusUnauthorized,
|
||||
map[string]string{},
|
||||
`{
|
||||
"code": 16,
|
||||
"message": "Client-Id and Api-Key headers are required"
|
||||
}`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
c := NewMockClient(core.NewMockHttpHandler(test.statusCode, test.response, test.headers))
|
||||
|
||||
ctx, _ := context.WithTimeout(context.Background(), testTimeout)
|
||||
resp, err := c.Promotions().ListHotSalePromotions(ctx)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
continue
|
||||
}
|
||||
|
||||
compareJsonResponse(t, test.response, &ListHotSalePromotionsResponse{})
|
||||
|
||||
if resp.StatusCode != test.statusCode {
|
||||
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestProductsAvailableForHotSalePromotion(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
tests := []struct {
|
||||
statusCode int
|
||||
headers map[string]string
|
||||
params *ProductsAvailableForHotSalePromotionParams
|
||||
response string
|
||||
}{
|
||||
// Test Ok
|
||||
{
|
||||
http.StatusOK,
|
||||
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
|
||||
&ProductsAvailableForHotSalePromotionParams{
|
||||
HotSaleId: 0,
|
||||
Limit: 0,
|
||||
Offset: 0,
|
||||
},
|
||||
`{
|
||||
"result": {
|
||||
"products": [
|
||||
{
|
||||
"action_price": 0,
|
||||
"date_day_promo": "string",
|
||||
"id": 0,
|
||||
"is_active": true,
|
||||
"max_action_price": 0,
|
||||
"min_stock": 0,
|
||||
"stock": 0
|
||||
}
|
||||
],
|
||||
"total": 0
|
||||
}
|
||||
}`,
|
||||
},
|
||||
// Test No Client-Id or Api-Key
|
||||
{
|
||||
http.StatusUnauthorized,
|
||||
map[string]string{},
|
||||
&ProductsAvailableForHotSalePromotionParams{},
|
||||
`{
|
||||
"code": 16,
|
||||
"message": "Client-Id and Api-Key headers are required"
|
||||
}`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
c := NewMockClient(core.NewMockHttpHandler(test.statusCode, test.response, test.headers))
|
||||
|
||||
ctx, _ := context.WithTimeout(context.Background(), testTimeout)
|
||||
resp, err := c.Promotions().ProductsAvailableForHotSalePromotion(ctx, test.params)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
continue
|
||||
}
|
||||
|
||||
compareJsonResponse(t, test.response, &ProductsAvailableForHotSalePromotionResponse{})
|
||||
|
||||
if resp.StatusCode != test.statusCode {
|
||||
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAddProductsToHotSale(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
tests := []struct {
|
||||
statusCode int
|
||||
headers map[string]string
|
||||
params *AddProductsToHotSaleParams
|
||||
response string
|
||||
}{
|
||||
// Test Ok
|
||||
{
|
||||
http.StatusOK,
|
||||
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
|
||||
&AddProductsToHotSaleParams{
|
||||
HotSaleId: 1234,
|
||||
Products: []AddProductsToHotSaleProduct{
|
||||
{
|
||||
ActionPrice: 12,
|
||||
ProductId: 111,
|
||||
Stock: 45,
|
||||
},
|
||||
},
|
||||
},
|
||||
`{
|
||||
"result": {
|
||||
"rejected": [
|
||||
{
|
||||
"product_id": 0,
|
||||
"reason": "string"
|
||||
}
|
||||
]
|
||||
}
|
||||
}`,
|
||||
},
|
||||
// Test No Client-Id or Api-Key
|
||||
{
|
||||
http.StatusUnauthorized,
|
||||
map[string]string{},
|
||||
&AddProductsToHotSaleParams{},
|
||||
`{
|
||||
"code": 16,
|
||||
"message": "Client-Id and Api-Key headers are required"
|
||||
}`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
c := NewMockClient(core.NewMockHttpHandler(test.statusCode, test.response, test.headers))
|
||||
|
||||
ctx, _ := context.WithTimeout(context.Background(), testTimeout)
|
||||
resp, err := c.Promotions().AddProductsToHotSale(ctx, test.params)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
continue
|
||||
}
|
||||
|
||||
compareJsonResponse(t, test.response, &ProductsToHotSaleResponse{})
|
||||
|
||||
if resp.StatusCode != test.statusCode {
|
||||
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestRemoveProductsToHotSale(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
tests := []struct {
|
||||
statusCode int
|
||||
headers map[string]string
|
||||
params *RemoveProductsToHotSaleParams
|
||||
response string
|
||||
}{
|
||||
// Test Ok
|
||||
{
|
||||
http.StatusOK,
|
||||
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
|
||||
&RemoveProductsToHotSaleParams{
|
||||
HotSaleId: 12345,
|
||||
ProductIds: []float64{111},
|
||||
},
|
||||
`{
|
||||
"result": {
|
||||
"rejected": [
|
||||
{
|
||||
"product_id": 0,
|
||||
"reason": "string"
|
||||
}
|
||||
]
|
||||
}
|
||||
}`,
|
||||
},
|
||||
// Test No Client-Id or Api-Key
|
||||
{
|
||||
http.StatusUnauthorized,
|
||||
map[string]string{},
|
||||
&RemoveProductsToHotSaleParams{},
|
||||
`{
|
||||
"code": 16,
|
||||
"message": "Client-Id and Api-Key headers are required"
|
||||
}`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
c := NewMockClient(core.NewMockHttpHandler(test.statusCode, test.response, test.headers))
|
||||
|
||||
ctx, _ := context.WithTimeout(context.Background(), testTimeout)
|
||||
resp, err := c.Promotions().RemoveProductsToHotSale(ctx, test.params)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
continue
|
||||
}
|
||||
|
||||
compareJsonResponse(t, test.response, &ProductsToHotSaleResponse{})
|
||||
|
||||
if resp.StatusCode != test.statusCode {
|
||||
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestListDiscountRequests(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Quants struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestListQuants(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Rating struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetCurrentRatingInfo(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Reports struct {
|
||||
@@ -480,10 +480,6 @@ type GetReturnsReportsFilter struct {
|
||||
type GetReturnsReportResponse struct {
|
||||
core.CommonResponse
|
||||
|
||||
Result GetReturnsReportResult `json:"result"`
|
||||
}
|
||||
|
||||
type GetReturnsReportResult struct {
|
||||
// Unique report identifier. The report is available for downloading within 3 days after making a request.
|
||||
Code string `json:"code"`
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetList(t *testing.T) {
|
||||
@@ -380,9 +380,7 @@ func TestGetReturnsReport(t *testing.T) {
|
||||
},
|
||||
},
|
||||
`{
|
||||
"result": {
|
||||
"code": "REPORT_seller_products_924336_1720170405_a9ea2f27-a473-4b13-99f9-d0cfcb5b1a69"
|
||||
}
|
||||
"code": "REPORT_seller_products_924336_1720170405_a9ea2f27-a473-4b13-99f9-d0cfcb5b1a69"
|
||||
}`,
|
||||
},
|
||||
// Test No Client-Id or Api-Key
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Returns struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetRFBSReturns(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Reviews struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestLeaveComment(t *testing.T) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Strategies struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestListCompetitors(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
type Warehouses struct {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
core "git.denco.store/fakz9/ozon-api-client"
|
||||
core "github.com/diphantxm/ozon-api-client"
|
||||
)
|
||||
|
||||
func TestGetListOfWarehouses(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user