13 Commits

Author SHA1 Message Date
89aeba12d4 fixed misspelling
Some checks failed
tests / unit (push) Has been cancelled
tests / coverage (push) Has been cancelled
2025-07-23 05:38:00 +03:00
1e2c591a70 fixed misspelling
Some checks are pending
tests / unit (push) Waiting to run
tests / coverage (push) Waiting to run
2025-07-23 04:32:47 +03:00
3e6c8fbc05 fixed misspelling
Some checks are pending
tests / unit (push) Waiting to run
tests / coverage (push) Waiting to run
2025-07-23 04:23:08 +03:00
c6c3030925 Refactor ProductDetails struct for improved clarity and organization
Some checks failed
tests / unit (push) Has been cancelled
tests / coverage (push) Has been cancelled
2025-05-26 03:37:54 +03:00
c9ca89e364 Update module path to git.denco.store/fakz9/ozon-api-client
Some checks are pending
tests / unit (push) Waiting to run
tests / coverage (push) Waiting to run
2025-05-26 03:24:11 +03:00
dcff4ba1e3 Change module path to git.denco.store/fakz9/ozon-api-client
Some checks are pending
tests / unit (push) Waiting to run
tests / coverage (push) Waiting to run
2025-05-26 03:19:07 +03:00
Kirill
25e5e568b5 Update March 11, 2025 (#154) 2025-04-11 01:53:40 +03:00
Kirill
a9d7a5c6d3 Update March 3, 2025 (#153) 2025-04-11 01:41:48 +03:00
Kirill
bac3c04f59 Fix GetProductPriceInfo response (#152) 2025-03-06 01:23:54 +03:00
Kirill
851e7a2819 Update February 28, 2025 (#150) 2025-03-02 15:43:21 +03:00
Kirill
94119c0f39 Update February 27, 2025 (#149) 2025-03-02 15:30:08 +03:00
Kirill
1c42f6b3a6 Update February 26, 2025 (#148) 2025-03-02 15:17:09 +03:00
Kirill
dc69b67f0f Update February 24, 2025 (#147) 2025-03-02 15:15:15 +03:00
51 changed files with 502 additions and 847 deletions

8
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -2,7 +2,7 @@
A Ozon Seller API client written in Golang A Ozon Seller API client written in Golang
[![Coverage Status](https://coveralls.io/repos/github/diPhantxm/ozon-api-client/badge.svg)](https://coveralls.io/github/diPhantxm/ozon-api-client) [![Coverage Status](https://coveralls.io/repos/github/diPhantxm/ozon-api-client/badge.svg)](https://coveralls.io/github/diPhantxm/ozon-api-client)
![example workflow](https://github.com/diPhantxm/ozon-api-client/actions/workflows/tests.yml/badge.svg) ![example workflow](https://git.denco.store/fakz9/ozon-api-client/actions/workflows/tests.yml/badge.svg)
[Ozon](https://ozon.ru) is a marketplace for small and medium enterprises to launch and grow their businesses in Russia. [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. Just add dependency to your project and you're ready to go.
```bash ```bash
go get github.com/diphantxm/ozon-api-client go get git.denco.store/fakz9/ozon-api-client
``` ```
A simple example on how to use this library: A simple example on how to use this library:
```Golang ```Golang
@@ -26,7 +26,7 @@ import (
"log" "log"
"net/http" "net/http"
"github.com/diphantxm/ozon-api-client/ozon" "git.denco.store/fakz9/ozon-api-client/ozon"
) )
func main() { func main() {
@@ -65,7 +65,7 @@ package main
import ( import (
"log" "log"
"github.com/diphantxm/ozon-api-client/ozon/notifications" "git.denco.store/fakz9/ozon-api-client/ozon/notifications"
) )
func main() { func main() {

2
go.mod
View File

@@ -1,4 +1,4 @@
module github.com/diphantxm/ozon-api-client module git.denco.store/fakz9/ozon-api-client
go 1.20 go 1.20

View File

@@ -4,7 +4,7 @@ import (
"context" "context"
"net/http" "net/http"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Analytics struct { type Analytics struct {
@@ -200,12 +200,9 @@ type GetStocksOnWarehousesResultRow struct {
// Name of the warehouse where the products are stored // Name of the warehouse where the products are stored
WarehouseName string `json:"warehouse_name"` WarehouseName string `json:"warehouse_name"`
// Number of days the stock will last based on your average daily sales
IDC float64 `json:"idc"`
} }
// Report on stocks and products movement at Ozon warehouses // Method for getting a report on leftover stocks and products movement at Ozon warehouses
func (c Analytics) GetStocksOnWarehouses(ctx context.Context, params *GetStocksOnWarehousesParams) (*GetStocksOnWarehousesResponse, error) { func (c Analytics) GetStocksOnWarehouses(ctx context.Context, params *GetStocksOnWarehousesParams) (*GetStocksOnWarehousesResponse, error) {
url := "/v2/analytics/stock_on_warehouses" url := "/v2/analytics/stock_on_warehouses"
@@ -340,3 +337,114 @@ func (c Analytics) Stock(ctx context.Context, params *GetStockManagementParams)
return resp, nil return resp, nil
} }
type GetProductQueriesParams struct {
// Date when analytics generation starts
DateFrom string `json:"date_from"`
//Date when analytics generation ends
DateTo string `json:"date_to"`
// Number of page returned in the request
Page int32 `json:"page"`
// Number of items on the pag
PageSize int32 `json:"page_size"`
// List of SKUs—product identifiers in the Ozon system.
// Analytics on requests is returned for them.
// Maximum value is 1,000 SKUs
SKUs []string `json:"skus"`
// Parameter by which products are sorted
SortBy string `json:"sort_by"`
// Sorting direction
SortDir string `json:"sort_dir"`
}
type GetProductQueriesResponse struct {
core.CommonResponse
// Period for which the analytics is generated
AnalyticsPeriod AnalyticsPeriod `json:"analytics_period"`
// Product list
Items []GetProductQueriesItem `json:"items"`
// Number of pages
PageCount int64 `json:"page_count"`
// Total number of queries
Total int64 `json:"total"`
}
type AnalyticsPeriod struct {
// Date when analytics generation starts
DateFrom string `json:"date_from"`
// Date when analytics generation ends
DateTo string `json:"date_to"`
}
type GetProductQueriesItem struct {
// Category name
Category string `json:"category"`
// Currency
Currency string `json:"currency"`
// Sales by queries
GMV float64 `json:"gmv"`
// Product name
Name string `json:"name"`
// Product identifier in the seller's system
OfferId string `json:"offer_id"`
// Average product position. Available only with the Premium or Premium Plus subscription, otherwise the field returns empty
Position float64 `json:"position"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
// Number of customers who searched for your product on Ozon
UniqueSearchUsers int64 `json:"unique_search_users"`
// Number of customers who have seen your product on Ozon.
// Available only with the Premium or Premium Plus subscription,
// otherwise the field returns empty
UniqueViewUsers int64 `json:"unique_view_users"`
// Conversion from product views.
// Available only with the Premium or Premium Plus subscription,
// otherwise the field returns empty
ViewConversion float64 `json:"view_conversion"`
}
// Use the method to get data about your product queries.
// Full analytics is available with the Premium and Premium Plus subscription.
// Without subscription, you can see a part of the metrics.
// The method is similar to the Products in Search → Queries for my product tab in your personal account.
//
// You can view analytics by queries for certain dates.
// To do this, specify the interval in the date_from and date_to fields.
// Data for the last month are available in any interval except for
// three days from the current date because these days the calculation is performed.
// Analytics for dates later than a month ago is available only with
// the Premium and Premium Plus subscription, and only by weeks.
// Specify the date_from parameter in the request
func (c Analytics) GetProductQueries(ctx context.Context, params *GetProductQueriesParams) (*GetProductQueriesResponse, error) {
url := "/v1/analytics/product-queries"
resp := &GetProductQueriesResponse{}
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
}

View File

@@ -6,7 +6,7 @@ import (
"testing" "testing"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetAnalyticsData(t *testing.T) { func TestGetAnalyticsData(t *testing.T) {
@@ -277,3 +277,74 @@ func TestGetStock(t *testing.T) {
} }
} }
} }
func TestGetProductQueries(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *GetProductQueriesParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&GetProductQueriesParams{
Page: 1,
PageSize: 10,
SKUs: []string{"string"},
},
`{
"analytics_period": {
"date_from": "string",
"date_to": "string"
},
"items": [
{
"category": "string",
"currency": "string",
"gmv": 0,
"name": "string",
"offer_id": "string",
"position": 0,
"sku": 0,
"unique_search_users": 0,
"unique_view_users": 0,
"view_conversion": 0
}
],
"page_count": 0,
"total": 0
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&GetProductQueriesParams{},
`{
"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.Analytics().GetProductQueries(ctx, test.params)
if err != nil {
t.Error(err)
continue
}
compareJsonResponse(t, test.response, &GetProductQueriesResponse{})
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}

View File

@@ -4,7 +4,7 @@ import (
"context" "context"
"net/http" "net/http"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Barcodes struct { type Barcodes struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGenerateBarcodes(t *testing.T) { func TestGenerateBarcodes(t *testing.T) {

View File

@@ -4,7 +4,7 @@ import (
"context" "context"
"net/http" "net/http"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Brands struct { type Brands struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestListCertifiedBrands(t *testing.T) { func TestListCertifiedBrands(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Cancellations struct { type Cancellations struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetCancellationInfo(t *testing.T) { func TestGetCancellationInfo(t *testing.T) {

View File

@@ -4,7 +4,7 @@ import (
"context" "context"
"net/http" "net/http"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Categories struct { type Categories struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetProductTree(t *testing.T) { func TestGetProductTree(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Certificates struct { type Certificates struct {

View File

@@ -6,7 +6,7 @@ import (
"testing" "testing"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestListOfAccordanceTypes(t *testing.T) { func TestListOfAccordanceTypes(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Chats struct { type Chats struct {
@@ -164,6 +164,8 @@ type ChatHistoryParams struct {
// The default value is `Backward`. You can set the number of messages in the limit parameter // The default value is `Backward`. You can set the number of messages in the limit parameter
Direction string `json:"direction" default:"Backward"` Direction string `json:"direction" default:"Backward"`
Filter *ChatHistoryFilter `json:"filter,omitempty"`
// Identifier of the message from which the chat history will be displayed. // Identifier of the message from which the chat history will be displayed.
// Default value is the last visible message // Default value is the last visible message
FromMessageId string `json:"from_message_id"` FromMessageId string `json:"from_message_id"`
@@ -172,6 +174,10 @@ type ChatHistoryParams struct {
Limit int64 `json:"limit" default:"50"` Limit int64 `json:"limit" default:"50"`
} }
type ChatHistoryFilter struct {
MessageIds []string `json:"message_ids"`
}
type ChatHistoryResponse struct { type ChatHistoryResponse struct {
core.CommonResponse core.CommonResponse
@@ -183,22 +189,33 @@ type ChatHistoryResponse struct {
} }
type ChatHistoryMessage struct { type ChatHistoryMessage struct {
Context *ChatHistoryContext `json:"context,omitempty"`
// Message creation date // Message creation date
CreatedAt time.Time `json:"created_at"` CreatedAt time.Time `json:"created_at"`
// Array with message content in Markdown format // Array with message content in Markdown format
Data []string `json:"data"` Data []string `json:"data"`
IsImage bool `json:"is_image"`
// Indication of the read message // Indication of the read message
IsRead bool `json:"is_read"` IsRead bool `json:"is_read"`
// Message identifier // Message identifier
MessageId string `json:"message_id"` MessageId string `json:"message_id"`
ModarateImageStatus string `json:"moderate_image_status"`
// Chat participant identifier // Chat participant identifier
User ChatHistoryMessageUser `json:"user"` User ChatHistoryMessageUser `json:"user"`
} }
type ChatHistoryContext struct {
OrderNumber string `json:"order_number"`
SKU string `json:"sku"`
}
type ChatHistoryMessageUser struct { type ChatHistoryMessageUser struct {
// Chat participant identifier // Chat participant identifier
Id string `json:"id"` Id string `json:"id"`
@@ -214,7 +231,7 @@ type ChatHistoryMessageUser struct {
// Returns the history of chat messages. By default messages are shown from newest to oldest. // 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) { func (c Chats) History(ctx context.Context, params *ChatHistoryParams) (*ChatHistoryResponse, error) {
url := "/v2/chat/history" url := "/v3/chat/history"
resp := &ChatHistoryResponse{} resp := &ChatHistoryResponse{}

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestListChats(t *testing.T) { func TestListChats(t *testing.T) {
@@ -212,16 +212,22 @@ func TestChatHistory(t *testing.T) {
"has_next": true, "has_next": true,
"messages": [ "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", "message_id": "3000000000817031942",
"moderate_image_status": "SUCCESS",
"user": { "user": {
"id": "115568", "id": "115568",
"type": "Сustomer" "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) телефона?"
]
} }
] ]
}`, }`,

View File

@@ -4,7 +4,7 @@ import (
"context" "context"
"net/http" "net/http"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Clusters struct { type Clusters struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestListClusters(t *testing.T) { func TestListClusters(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type FBO struct { type FBO struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetFBOShipmentsList(t *testing.T) { func TestGetFBOShipmentsList(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type FBS struct { type FBS struct {
@@ -195,6 +195,14 @@ type FBSPosting struct {
// Economy product identifier // Economy product identifier
QuantumId int64 `json:"quantum_id"` 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 { type FBSPostingTariffication struct {
@@ -240,7 +248,7 @@ type FBSPostingAddressee struct {
} }
type FBSPostingAnalyticsData struct { type FBSPostingAnalyticsData struct {
// Delivery city. Only for rFBS shipments // Delivery city. Only for rFBS shipments and sellers from CIS countries
City string `json:"city"` City string `json:"city"`
// Delivery start date and time // Delivery start date and time
@@ -373,9 +381,6 @@ type FBSRequirements struct {
} }
type PostingProduct struct { type PostingProduct struct {
// Mandatory product labeling
MandatoryMark []string `json:"mandatory_mark"`
// Product name // Product name
Name string `json:"name"` Name string `json:"name"`
@@ -393,6 +398,9 @@ type PostingProduct struct {
// Product identifier in the Ozon system, SKU // Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"` SKU int64 `json:"sku"`
// Product traceability attribute
IsBLRTraceable bool `json:"is_blr_traceable"`
} }
type FBSCustomer struct { type FBSCustomer struct {
@@ -1043,6 +1051,9 @@ type GetShipmentDataByIdentifierResult struct {
// Number of the parent shipment which split resulted in the current shipment // Number of the parent shipment which split resulted in the current shipment
ParentPostingNumber string `json:"parent_posting_number"` ParentPostingNumber string `json:"parent_posting_number"`
// List of products with additional characteristics
Optional GetShipmentDataByIdentifierOptional `json:"optional"`
// Shipment number // Shipment number
PostingNumber string `json:"posting_number"` PostingNumber string `json:"posting_number"`
@@ -1094,6 +1105,11 @@ type GetShipmentDataByIdentifierResult struct {
Tariffication []FBSPostingTariffication `json:"tariffication"` Tariffication []FBSPostingTariffication `json:"tariffication"`
} }
type GetShipmentDataByIdentifierOptional struct {
// List of products with optional labeling
ProductsWithPossibleMandatoryMark []int `json:"products_with_possible_mandatory_mark"`
}
type GetShipmentDataByIdentifierResultAdditionalData struct { type GetShipmentDataByIdentifierResultAdditionalData struct {
// Key // Key
Key string `json:"key"` Key string `json:"key"`
@@ -1113,7 +1129,7 @@ type GetShipmentDataByIdentifierResultAddressee struct {
} }
type GetShipmentDataByIdentifierResultAnalyticsData struct { type GetShipmentDataByIdentifierResultAnalyticsData struct {
// Delivery city. Only for rFBS shipments // Delivery city. Only for rFBS shipments and sellers from CIS countries
City string `json:"city"` City string `json:"city"`
// Delivery start date and time // Delivery start date and time

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestListUnprocessedShipments(t *testing.T) { func TestListUnprocessedShipments(t *testing.T) {
@@ -58,6 +58,11 @@ func TestListUnprocessedShipments(t *testing.T) {
"in_process_at": "2021-08-25T10:48:38Z", "in_process_at": "2021-08-25T10:48:38Z",
"shipment_date": "2021-08-26T10:00:00Z", "shipment_date": "2021-08-26T10:00:00Z",
"delivering_date": null, "delivering_date": null,
"optional": {
"products_with_possible_mandatory_mark": [
0
]
},
"cancellation": { "cancellation": {
"cancel_reason_id": 0, "cancel_reason_id": 0,
"cancel_reason": "", "cancel_reason": "",
@@ -71,12 +76,12 @@ func TestListUnprocessedShipments(t *testing.T) {
"products": [ "products": [
{ {
"currency_code": "RUB", "currency_code": "RUB",
"is_blr_traceable": true,
"price": "1259", "price": "1259",
"offer_id": "УТ-0001365", "offer_id": "УТ-0001365",
"name": "Мяч, цвет: черный, 5 кг", "name": "Мяч, цвет: черный, 5 кг",
"sku": 140048123, "sku": 140048123,
"quantity": 1, "quantity": 1
"mandatory_mark": []
} }
], ],
"addressee": null, "addressee": null,
@@ -255,6 +260,11 @@ func TestGetFBSShipmentsList(t *testing.T) {
"in_process_at": "2022-05-13T07:07:32Z", "in_process_at": "2022-05-13T07:07:32Z",
"shipment_date": "2022-05-13T10:00:00Z", "shipment_date": "2022-05-13T10:00:00Z",
"delivering_date": null, "delivering_date": null,
"optional": {
"products_with_possible_mandatory_mark": [
0
]
},
"cancellation": { "cancellation": {
"cancel_reason_id": 0, "cancel_reason_id": 0,
"cancel_reason": "", "cancel_reason": "",
@@ -267,12 +277,12 @@ func TestGetFBSShipmentsList(t *testing.T) {
"products": [ "products": [
{ {
"currency_code": "RUB", "currency_code": "RUB",
"is_blr_traceable": true,
"price": "1390.000000", "price": "1390.000000",
"offer_id": "205953", "offer_id": "205953",
"name": " Электронный конструктор PinLab Позитроник", "name": " Электронный конструктор PinLab Позитроник",
"sku": 358924380, "sku": 358924380,
"quantity": 1, "quantity": 1
"mandatory_mark": []
} }
], ],
"addressee": null, "addressee": null,
@@ -531,8 +541,7 @@ func TestGetShipmentDataByBarcode(t *testing.T) {
"offer_id": "250-7898-1", "offer_id": "250-7898-1",
"name": "Кофе ароматизированный \"Шоколадный апельсин\" 250 гр", "name": "Кофе ароматизированный \"Шоколадный апельсин\" 250 гр",
"sku": 180550365, "sku": 180550365,
"quantity": 1, "quantity": 1
"mandatory_mark": []
} }
], ],
"barcodes": null, "barcodes": null,
@@ -621,6 +630,11 @@ func TestGetShipmentDataByIdentifier(t *testing.T) {
"delivering_date": null, "delivering_date": null,
"provider_status": "", "provider_status": "",
"delivery_price": "", "delivery_price": "",
"optional": {
"products_with_possible_mandatory_mark": [
0
]
},
"cancellation": { "cancellation": {
"cancel_reason_id": 0, "cancel_reason_id": 0,
"cancel_reason": "", "cancel_reason": "",
@@ -634,12 +648,12 @@ func TestGetShipmentDataByIdentifier(t *testing.T) {
"products": [ "products": [
{ {
"currency_code": "RUB", "currency_code": "RUB",
"is_blr_traceable": true,
"price": "279.0000", "price": "279.0000",
"offer_id": "250-7898-1", "offer_id": "250-7898-1",
"name": "Кофе ароматизированный \"Шоколадный апельсин\" 250 гр", "name": "Кофе ароматизированный \"Шоколадный апельсин\" 250 гр",
"sku": 180550365, "sku": 180550365,
"quantity": 1, "quantity": 1,
"mandatory_mark": [],
"dimensions": { "dimensions": {
"height": "40.00", "height": "40.00",
"length": "240.00", "length": "240.00",

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Finance struct { type Finance struct {
@@ -362,11 +362,7 @@ type ListTransactionsResultOperationItem struct {
} }
type ListTransactionsResultOperationPosting struct { type ListTransactionsResultOperationPosting struct {
// Delivery scheme: // Delivery scheme
// - FBO — delivery to Ozon warehouse
// - FBS — delivery from seller's warehouse
// - RFBS — delivery service of seller's choice
// - Crossborder — delivery from abroad
DeliverySchema string `json:"delivery_schema"` DeliverySchema string `json:"delivery_schema"`
// Date the product was accepted for processing // Date the product was accepted for processing

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestReportOnSoldProducts(t *testing.T) { func TestReportOnSoldProducts(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Invoices struct { type Invoices struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestCreateUpdateProformaLink(t *testing.T) { func TestCreateUpdateProformaLink(t *testing.T) {

View File

@@ -11,7 +11,7 @@ import (
"testing" "testing"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type testData struct { type testData struct {

View File

@@ -3,7 +3,7 @@ package ozon
import ( import (
"net/http" "net/http"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
const ( const (

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Passes struct { type Passes struct {

View File

@@ -6,7 +6,7 @@ import (
"testing" "testing"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestListPasses(t *testing.T) { func TestListPasses(t *testing.T) {

View File

@@ -4,7 +4,7 @@ import (
"context" "context"
"net/http" "net/http"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Polygons struct { type Polygons struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestCreateDeliveryPolygon(t *testing.T) { func TestCreateDeliveryPolygon(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Products struct { type Products struct {
@@ -106,157 +106,41 @@ func (c Products) GetStocksInfo(ctx context.Context, params *GetStocksInfoParams
} }
type ProductDetails struct { type ProductDetails struct {
// All product barcodes
Barcodes []string `json:"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"` ColorImage []string `json:"color_image"`
// Commission fees details
Commissions []ProductDetailCommission `json:"commissions"` Commissions []ProductDetailCommission `json:"commissions"`
// Date and time when the product was created
CreatedAt time.Time `json:"created_at"` 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"` CurrencyCode string `json:"currency_code"`
DescriptionCategoryId int64 `json:"description_category_id"`
// The price of the product including all promotion discounts. This value will be shown on the Ozon storefront DiscountedFBOStocks int32 `json:"discounted_fbo_stocks"`
MarketingPrice string `json:"marketing_price"` Errors []ProductDetailsError `json:"errors"`
HasDiscountedFBOItem bool `json:"has_discounted_fbo_item"`
// Minimum price for similar products on Ozon. Id int64 `json:"id"`
// Images []string `json:"images"`
// The field is deprecated. Returns an empty string "" Images360 []string `json:"images360"`
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"` IsArchived bool `json:"is_archived"`
IsAutoarchived bool `json:"is_autoarchived"`
// 'true' if the item is archived automatically. IsDiscounted bool `json:"is_discounted"`
IsArchivedAuto bool `json:"is_autoarchived"` IsKGT bool `json:"is_kgt"`
IsPrepaymentAllowed bool `json:"is_prepayment_allowed"`
// 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"` 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"`
} }
type ProductDetailsError struct { type ProductDetailsError struct {
@@ -306,31 +190,14 @@ type NameValue struct {
} }
type ProductDetailsStatus struct { type ProductDetailsStatus struct {
// true, if the product is created correctly
IsCreated bool `json:"is_created"` IsCreated bool `json:"is_created"`
// Moderation status
ModerateStatus string `json:"moderate_status"` ModerateStatus string `json:"moderate_status"`
// Product status
Status string `json:"status"` Status string `json:"status"`
StatusDescription string `json:"status_description"`
// Product status description StatusFailed string `json:"status_failed"`
Description string `json:"status_description"` StatusName string `json:"status_name"`
StatusTooltip string `json:"status_tooltip"`
// Status of the product where the error occurred StatusUpdatedAt time.Time `json:"status_updated_at"`
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"` ValidationStatus string `json:"validation_status"`
} }
@@ -445,58 +312,28 @@ type ProductDetailStatus struct {
} }
type ProductDetailSource struct { type ProductDetailSource struct {
// Product creation date
CreatedAt time.Time `json:"created_at"` 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"` QuantCode string `json:"quant_code"`
ShipmentType string `json:"shipment_type"`
SKU int64 `json:"sku"`
Source string `json:"source"`
} }
type ProductDetailStock struct { type ProductDetailStock struct {
// true, if there are stocks at the warehouses
HasStock bool `json:"has_stock"` HasStock bool `json:"has_stock"`
// Status of product stocks
Stocks []ProductDetailStockStock `json:"stocks"` Stocks []ProductDetailStockStock `json:"stocks"`
} }
type ProductDetailStockStock struct { type ProductDetailStockStock struct {
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
// Currently at the warehouse
Present int32 `json:"present"` Present int32 `json:"present"`
// Reserved
Reserved int32 `json:"reserved"` Reserved int32 `json:"reserved"`
SKU int64 `json:"sku"`
// Sales scheme
Source string `json:"source"` Source string `json:"source"`
} }
type ProductDetailVisibilityDetails struct { 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"` HasPrice bool `json:"has_price"`
// If there is stock at the warehouses, the value is true
HasStock bool `json:"has_stock"` HasStock bool `json:"has_stock"`
// Reason why the product is hidden
Reasons map[string]interface{} `json:"reasons"`
} }
type ProductDiscountedStocks struct { type ProductDiscountedStocks struct {
@@ -758,6 +595,9 @@ type UpdatePricesPrice struct {
// Minimum product price with all promotions applied // Minimum product price with all promotions applied
MinPrice string `json:"min_price"` MinPrice string `json:"min_price"`
// Product cost price
NetPrice string `json:"net_price"`
// Product identifier in the seller's system // Product identifier in the seller's system
OfferId string `json:"offer_id"` OfferId string `json:"offer_id"`
@@ -866,7 +706,7 @@ type CreateOrUpdateProductItem struct {
DescriptionCategoryId int64 `json:"description_category_id"` DescriptionCategoryId int64 `json:"description_category_id"`
// New category identifier. Specify it if you want to change the current product category // New category identifier. Specify it if you want to change the current product category
NewDescriptinoCategoryId int64 `json:"new_description_category_id"` NewDescriptionCategoryId int64 `json:"new_description_category_id"`
// Marketing color. // Marketing color.
// //
@@ -996,7 +836,7 @@ type CreateOrUpdateProductPDF struct {
Name string `json:"name"` Name string `json:"name"`
// File address // File address
URL string `json:"url"` SrcUrl string `json:"src_url"`
} }
type CreateOrUpdateProductResponse struct { type CreateOrUpdateProductResponse struct {
@@ -1564,6 +1404,9 @@ type GetDescriptionOfProductResult struct {
// Barcode // Barcode
Barcode string `json:"barcode"` Barcode string `json:"barcode"`
// All product's barcodes
Barcodes []string `json:"barcodes"`
// Category identifier // Category identifier
DescriptionCategoryId int64 `json:"description_category_id"` DescriptionCategoryId int64 `json:"description_category_id"`
@@ -1589,7 +1432,10 @@ type GetDescriptionOfProductResult struct {
Id int64 `json:"id"` Id int64 `json:"id"`
// Array of links to product images // Array of links to product images
Images []GetDescriptionOfProductResultImage `json:"images"` Images []string `json:"images"`
// Model Information
ModelInfo GetDescriptionOfProductModelInfo `json:"model_info"`
// Array of 360 images // Array of 360 images
Images360 []GetDescriptionOfProductResultImage360 `json:"images360"` Images360 []GetDescriptionOfProductResultImage360 `json:"images360"`
@@ -1603,6 +1449,12 @@ type GetDescriptionOfProductResult struct {
// Array of PDF files // Array of PDF files
PDFList []GetDescriptionOfProductResultPDF `json:"pdf_list"` PDFList []GetDescriptionOfProductResultPDF `json:"pdf_list"`
// Link to the main product image
PrimaryImage string `json:"primary_image"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
// Product type identifier // Product type identifier
TypeId int64 `json:"type_id"` TypeId int64 `json:"type_id"`
@@ -1616,9 +1468,17 @@ type GetDescriptionOfProductResult struct {
Width int32 `json:"width"` 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 { type GetDescriptionOfProductResultAttr struct {
// Characteristic identifier // Characteristic identifier
AttributeId int64 `json:"attribute_id"` AttributeId int64 `json:"id"`
// Identifier of the characteristic that supports nested properties. // Identifier of the characteristic that supports nested properties.
// For example, the "Processor" characteristic has nested characteristics "Manufacturer" and "L2 Cache". // For example, the "Processor" characteristic has nested characteristics "Manufacturer" and "L2 Cache".
@@ -1663,12 +1523,6 @@ type GetDescriptionOfProductResultComplexAttrValue struct {
Value string `json:"value"` Value string `json:"value"`
} }
type GetDescriptionOfProductResultImage struct {
Default bool `json:"default"`
FileName string `json:"file_name"`
Index int64 `json:"index"`
}
type GetDescriptionOfProductResultImage360 struct { type GetDescriptionOfProductResultImage360 struct {
FileName string `json:"file_name"` FileName string `json:"file_name"`
Index int64 `json:"index"` Index int64 `json:"index"`
@@ -1742,7 +1596,6 @@ type GetDescriptionOfProductsResult struct {
ModelInfo *ModelInfo `json:"model_info,omitempty"` ModelInfo *ModelInfo `json:"model_info,omitempty"`
Images []string `json:"images"` Images []string `json:"images"`
PDFList []string `json:"pdf_list"`
Attributes []GetDescriptionOfProductsAttribute `json:"attributes"` Attributes []GetDescriptionOfProductsAttribute `json:"attributes"`
ComplexAttributes []GetDescriptionOfProductsComplexAttribute `json:"complex_attributes"` ComplexAttributes []GetDescriptionOfProductsComplexAttribute `json:"complex_attributes"`
@@ -2113,10 +1966,6 @@ type GetProductPriceInfoFilter struct {
type GetProductPriceInfoResponse struct { type GetProductPriceInfoResponse struct {
core.CommonResponse core.CommonResponse
Result GetProductPriceInfoResult `json:"result"`
}
type GetProductPriceInfoResult struct {
// Products list // Products list
Items []GetProductPriceInfoResultItem `json:"items"` Items []GetProductPriceInfoResultItem `json:"items"`
@@ -2129,7 +1978,7 @@ type GetProductPriceInfoResult struct {
type GetProductPriceInfoResultItem struct { type GetProductPriceInfoResultItem struct {
// Maximum acquiring fee // Maximum acquiring fee
Acquiring int32 `json:"acquiring"` Acquiring float64 `json:"acquiring"`
// Commissions information // Commissions information
Commissions GetProductPriceInfoResultItemCommission `json:"commissions"` Commissions GetProductPriceInfoResultItemCommission `json:"commissions"`

View File

@@ -7,7 +7,7 @@ import (
"testing" "testing"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetStocksInfo(t *testing.T) { func TestGetStocksInfo(t *testing.T) {
@@ -1370,37 +1370,33 @@ func TestGetDescriptionOfProduct(t *testing.T) {
{ {
"id": 213761435, "id": 213761435,
"barcode": "", "barcode": "",
"description_category_id": 17038062, "barcodes": [
"123124123",
"123342455"
],
"name": "Пленка защитная для Xiaomi Redmi Note 10 Pro 5G", "name": "Пленка защитная для Xiaomi Redmi Note 10 Pro 5G",
"offer_id": "21470", "offer_id": "21470",
"type_id": 124572394,
"height": 10, "height": 10,
"depth": 210, "depth": 210,
"width": 140, "width": 140,
"dimension_unit": "mm", "dimension_unit": "mm",
"weight": 50, "weight": 50,
"weight_unit": "g", "weight_unit": "g",
"primary_image": "https://cdn1.ozone.ru/s3/multimedia-4/6804736960.jpg",
"sku": 423434534,
"model_info": {
"model_id": 43445453,
"count": 4
},
"images": [ "images": [
{ "https://cdn1.ozone.ru/s3/multimedia-4/6804736960.jpg",
"file_name": "https://cdn1.ozone.ru/s3/multimedia-f/6190456071.jpg", "https://cdn1.ozone.ru/s3/multimedia-j/6835412647.jpg"
"default": true,
"index": 0
},
{
"file_name": "https://cdn1.ozone.ru/s3/multimedia-7/6190456099.jpg",
"default": false,
"index": 1
},
{
"file_name": "https://cdn1.ozone.ru/s3/multimedia-9/6190456065.jpg",
"default": false,
"index": 2
}
], ],
"images360": [],
"pdf_list": [], "pdf_list": [],
"attributes": [ "attributes": [
{ {
"attribute_id": 5219, "id": 5219,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1410,7 +1406,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 11051, "id": 11051,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1420,7 +1416,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 10100, "id": 10100,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1430,7 +1426,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 11794, "id": 11794,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1440,7 +1436,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 9048, "id": 9048,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1450,7 +1446,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 5076, "id": 5076,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1460,7 +1456,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 9024, "id": 9024,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1470,7 +1466,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 10015, "id": 10015,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1480,7 +1476,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 85, "id": 85,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1490,7 +1486,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 9461, "id": 9461,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1500,7 +1496,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 4180, "id": 4180,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1510,7 +1506,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 4191, "id": 4191,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1520,7 +1516,7 @@ func TestGetDescriptionOfProduct(t *testing.T) {
] ]
}, },
{ {
"attribute_id": 8229, "id": 8229,
"complex_id": 0, "complex_id": 0,
"values": [ "values": [
{ {
@@ -1531,7 +1527,8 @@ func TestGetDescriptionOfProduct(t *testing.T) {
} }
], ],
"complex_attributes": [], "complex_attributes": [],
"color_image": "" "color_image": "",
"description_category_id": 71107562
} }
], ],
"total": 1, "total": 1,
@@ -2158,11 +2155,10 @@ func TestGetProductPriceInfo(t *testing.T) {
}, },
}, },
`{ `{
"result": {
"cursor": "string", "cursor": "string",
"items": [ "items": [
{ {
"acquiring": 0, "acquiring": 0.5,
"commissions": { "commissions": {
"fbo_deliv_to_customer_amount": 14.75, "fbo_deliv_to_customer_amount": 14.75,
"fbo_direct_flow_trans_max_amount": 46.5, "fbo_direct_flow_trans_max_amount": 46.5,
@@ -2225,7 +2221,6 @@ func TestGetProductPriceInfo(t *testing.T) {
} }
], ],
"total": 0 "total": 0
}
}`, }`,
}, },
// Test No Client-Id or Api-Key // Test No Client-Id or Api-Key

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Promotions struct { type Promotions struct {
@@ -297,196 +297,6 @@ func (c Promotions) RemoveProduct(ctx context.Context, params *RemoveProductFrom
return resp, nil 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 { type ListDiscountRequestsParams struct {
// Discount request status // Discount request status
Status ListDiscountRequestsStatus `json:"status" default:"UNKNOWN"` Status ListDiscountRequestsStatus `json:"status" default:"UNKNOWN"`

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetAvailablePromotions(t *testing.T) { func TestGetAvailablePromotions(t *testing.T) {
@@ -354,248 +354,6 @@ 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) { func TestListDiscountRequests(t *testing.T) {
t.Parallel() t.Parallel()

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Quants struct { type Quants struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestListQuants(t *testing.T) { func TestListQuants(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Rating struct { type Rating struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetCurrentRatingInfo(t *testing.T) { func TestGetCurrentRatingInfo(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Reports struct { type Reports struct {
@@ -480,6 +480,10 @@ type GetReturnsReportsFilter struct {
type GetReturnsReportResponse struct { type GetReturnsReportResponse struct {
core.CommonResponse 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. // Unique report identifier. The report is available for downloading within 3 days after making a request.
Code string `json:"code"` Code string `json:"code"`
} }

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetList(t *testing.T) { func TestGetList(t *testing.T) {
@@ -380,7 +380,9 @@ 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 // Test No Client-Id or Api-Key

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Returns struct { type Returns struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetRFBSReturns(t *testing.T) { func TestGetRFBSReturns(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Reviews struct { type Reviews struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestLeaveComment(t *testing.T) { func TestLeaveComment(t *testing.T) {

View File

@@ -4,7 +4,7 @@ import (
"context" "context"
"net/http" "net/http"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Strategies struct { type Strategies struct {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestListCompetitors(t *testing.T) { func TestListCompetitors(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
type Warehouses struct { type Warehouses struct {
@@ -88,7 +88,8 @@ type GetListOfWarehousesResultFirstMile struct {
FirstMileType string `json:"first_mile_type"` FirstMileType string `json:"first_mile_type"`
} }
// You do not need to specify any parameters in the request. Your company will be identified by the Warehouses ID // Method returns the list of FBS and rFBS warehouses.
// To get the list of FBO warehouses, use the /v1/cluster/list method.
func (c Warehouses) GetListOfWarehouses(ctx context.Context) (*GetListOfWarehousesResponse, error) { func (c Warehouses) GetListOfWarehouses(ctx context.Context) (*GetListOfWarehousesResponse, error) {
url := "/v1/warehouse/list" url := "/v1/warehouse/list"

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"testing" "testing"
core "github.com/diphantxm/ozon-api-client" core "git.denco.store/fakz9/ozon-api-client"
) )
func TestGetListOfWarehouses(t *testing.T) { func TestGetListOfWarehouses(t *testing.T) {