From 040bc23ebcdb29704c39070cbba887cad871ecc3 Mon Sep 17 00:00:00 2001 From: Kirill Date: Thu, 23 Jan 2025 01:22:28 +0300 Subject: [PATCH] Update December 26, 2024 (#132) --- ozon/fbo.go | 58 ---------------------------- ozon/fbo_test.go | 62 ------------------------------ ozon/products.go | 82 ++++++++++++---------------------------- ozon/products_test.go | 84 ++++++++++++++++++++++------------------- ozon/warehouses.go | 3 ++ ozon/warehouses_test.go | 3 +- 6 files changed, 75 insertions(+), 217 deletions(-) diff --git a/ozon/fbo.go b/ozon/fbo.go index 9c425c6..cc0218b 100644 --- a/ozon/fbo.go +++ b/ozon/fbo.go @@ -472,64 +472,6 @@ func (c FBO) GetSupplyRequestInfo(ctx context.Context, params *GetSupplyRequestI return resp, nil } -type ListProductsInSupplyRequestParams struct { - // Number of the page returned in the query - Page int32 `json:"page"` - - // Number of elements on the page - PageSize int32 `json:"page_size"` - - // Supply request identifier - SupplyOrderId int64 `json:"supply_order_id"` -} - -type ListProductsInSupplyRequestResponse struct { - core.CommonResponse - - // Indicates that the response contains not the entire array of supply requests: - // - true — make a new request with a different page and page_size values to get the remaining products; - // - false — the entire array of product was returned in the response - HasNext bool `json:"has_next"` - - // Products list - Items []ListProductsInSupplyRequestItem `json:"items"` - - // Total number of products in the request - TotalItemsCount int32 `json:"total_items_count"` -} - -type ListProductsInSupplyRequestItem struct { - // Link to product image - IconPath string `json:"icon_path"` - - // Product name - Name string `json:"name"` - - // Product ID - OfferId string `json:"offer_id"` - - // Product quantity - Quantity int64 `json:"quantity"` - - // Product identifier in the Ozon system, SKU - SKU int64 `json:"sku"` -} - -// List of products in the sullpy request -func (c FBO) ListProductsInSupplyRequest(ctx context.Context, params *ListProductsInSupplyRequestParams) (*ListProductsInSupplyRequestResponse, error) { - url := "/v1/supply-order/items" - - resp := &ListProductsInSupplyRequestResponse{} - - 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 GetWarehouseWorkloadResponse struct { core.CommonResponse diff --git a/ozon/fbo_test.go b/ozon/fbo_test.go index 2b5b9b1..bf20cd9 100644 --- a/ozon/fbo_test.go +++ b/ozon/fbo_test.go @@ -456,68 +456,6 @@ func TestGetSupplyRequestInfo(t *testing.T) { } } -func TestListProductsInSupplyRequest(t *testing.T) { - t.Parallel() - - tests := []struct { - statusCode int - headers map[string]string - params *ListProductsInSupplyRequestParams - response string - }{ - // Test Ok - { - http.StatusOK, - map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"}, - &ListProductsInSupplyRequestParams{ - Page: 0, - PageSize: 0, - SupplyOrderId: 0, - }, - `{ - "has_next": true, - "items": [ - { - "icon_path": "string", - "name": "string", - "offer_id": "string", - "quantity": 0, - "sku": 0 - } - ], - "total_items_count": 0 - }`, - }, - // Test No Client-Id or Api-Key - { - http.StatusUnauthorized, - map[string]string{}, - &ListProductsInSupplyRequestParams{}, - `{ - "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.FBO().ListProductsInSupplyRequest(ctx, test.params) - if err != nil { - t.Error(err) - continue - } - - compareJsonResponse(t, test.response, &ListProductsInSupplyRequestResponse{}) - - if resp.StatusCode != test.statusCode { - t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode) - } - } -} - func TestGetWarehouseWorkload(t *testing.T) { t.Parallel() diff --git a/ozon/products.go b/ozon/products.go index 0fd44ed..6060e2d 100644 --- a/ozon/products.go +++ b/ozon/products.go @@ -2053,10 +2053,8 @@ type GetProductPriceInfoParams struct { // Filter by product Filter GetProductPriceInfoFilter `json:"filter"` - // Identifier of the last value on page. - // - // To get the next values, specify the recieved value in the next request in the `last_id` parameter - LastId string `json:"last_id"` + // Cursor for the next data sample + Cursor string `json:"cursor"` // Number of values per page. Minimum is 1, maximum is 1000 Limit int32 `json:"limit"` @@ -2076,7 +2074,6 @@ type GetProductPriceInfoFilter struct { type GetProductPriceInfoResponse struct { core.CommonResponse - // Result Result GetProductPriceInfoResult `json:"result"` } @@ -2084,10 +2081,8 @@ type GetProductPriceInfoResult struct { // Products list Items []GetProductPriceInfoResultItem `json:"items"` - // Identifier of the last value on page. Leave this field blank in the first request. - // - // To get the next values, specify last_id from the response of the previous request - LastId string `json:"last_id"` + // Cursor for the next data sample + Cursor string `json:"cursor"` // Products number in the list Total int32 `json:"total"` @@ -2109,11 +2104,6 @@ type GetProductPriceInfoResultItem struct { // Product price Price GetProductPriceInfoResultItemPrice `json:"price"` - // Deprected: price index - // - // Use PriceIndexes instead - PriceIndex string `json:"price_index"` - // Product price indexes PriceIndexes GetProductPriceInfoResultItemPriceIndexes `json:"price_indexes"` @@ -2201,11 +2191,11 @@ type GetProductPriceInfoResultItemMarketingActionsAction struct { // Date and time when the seller's promotion ends DateTo time.Time `json:"date_to"` - // Discount on the seller's promotion - DiscountValue string `json:"discount_value"` - // Promotion name Title string `json:"title"` + + // Discount on the seller's promotion + Value float64 `json:"value"` } type GetProductPriceInfoResultItemPrice struct { @@ -2216,72 +2206,50 @@ type GetProductPriceInfoResultItemPrice struct { CurrencyCode string `json:"currency_code"` // Product price including all promotion discounts. This value will be indicated on the Ozon storefront - MarketingPrice string `json:"marketing_price"` + MarketingPrice float64 `json:"marketing_price"` // Product price with seller's promotions applied - MarketingSellerPrice string `json:"marketing_seller_price"` + MarketingSellerPrice float64 `json:"marketing_seller_price"` // Minimum price for similar products on Ozon - MinOzonPrice string `json:"min_ozon_price"` + MinOzonPrice float64 `json:"min_ozon_price"` // Minimum product price with all promotions applied - MinPrice string `json:"min_price"` + MinPrice float64 `json:"min_price"` // Price before discounts. Displayed strikethrough on the product description page - OldPrice string `json:"old_price"` + OldPrice float64 `json:"old_price"` // Product price including discounts. This value is shown on the product description page - Price string `json:"price"` + Price float64 `json:"price"` // Retailer price - RetailPrice string `json:"retail_price"` + RetailPrice float64 `json:"retail_price"` // Product VAT rate - VAT string `json:"vat"` + VAT float64 `json:"vat"` } type GetProductPriceInfoResultItemPriceIndexes struct { + // Resulting price index of the product + ColorIndex string `json:"color_index"` + // Competitors' product price on other marketplaces - ExternalIndexData GetProductPriceInfoResultItemPriceIndexesExternal `json:"external_index_data"` + ExternalIndexData GetProductPriceInfoResultItemPriceIndexesValue `json:"external_index_data"` // Competitors' product price on Ozon - OzonIndexData GetProductPriceInfoResultItemPriceIndexesOzon `json:"ozon_index_data"` - - // Resulting price index of the product - PriceIndex string `json:"price_index"` + OzonIndexData GetProductPriceInfoResultItemPriceIndexesValue `json:"ozon_index_data"` // Price of your product on other marketplaces - SelfMarketplaceIndexData GetProductPriceInfoResultItemPriceIndexesSelfMarketplace `json:"self_marketplaces_index_data"` + SelfMarketplaceIndexData GetProductPriceInfoResultItemPriceIndexesValue `json:"self_marketplaces_index_data"` } -type GetProductPriceInfoResultItemPriceIndexesExternal struct { - // Minimum competitors' product price on other marketplaces - MinimalPrice string `json:"minimal_price"` - - // Price currency - MinimalPriceCurrency string `json:"minimal_price_currency"` - - // Price index value - PriceIndexValue float64 `json:"price_index_value"` -} - -type GetProductPriceInfoResultItemPriceIndexesOzon struct { - // Minimum competitors' product price on Ozon - MinimalPrice string `json:"minimal_price"` - - // Price currency - MinimalPriceCurrency string `json:"minimal_price_currency"` - - // Price index value - PriceIndexValue float64 `json:"price_index_value"` -} - -type GetProductPriceInfoResultItemPriceIndexesSelfMarketplace struct { +type GetProductPriceInfoResultItemPriceIndexesValue struct { // Minimum price of your product on other marketplaces - MinimalPrice string `json:"minimal_price"` + MinimalPrice float64 `json:"min_price"` // Price currency - MinimalPriceCurrency string `json:"minimal_price_currency"` + MinimalPriceCurrency string `json:"min_price_currency"` // Price index value PriceIndexValue float64 `json:"price_index_value"` @@ -2293,7 +2261,7 @@ type GetProductPriceInfoResultItemPriceIndexesSelfMarketplace struct { // The `fbo_direct_flow_trans_max_amount` and `fbo_direct_flow_trans_min_amount` parameters // from the method response are in development and return 0 func (c Products) GetProductPriceInfo(ctx context.Context, params *GetProductPriceInfoParams) (*GetProductPriceInfoResponse, error) { - url := "/v4/product/info/prices" + url := "/v5/product/info/prices" resp := &GetProductPriceInfoResponse{} diff --git a/ozon/products_test.go b/ozon/products_test.go index e0de4df..18d5be0 100644 --- a/ozon/products_test.go +++ b/ozon/products_test.go @@ -2139,66 +2139,72 @@ func TestGetProductPriceInfo(t *testing.T) { }, `{ "result": { + "cursor": "string", "items": [ { "acquiring": 0, - "product_id": 243686911, + "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", - "price": "499.0000", - "old_price": "579.0000", - "retail_price": "", - "vat": "0.200000", - "min_ozon_price": "", - "marketing_price": "", - "marketing_seller_price": "", - "auto_action_enabled": true + "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": { - "minimal_price": "string", - "minimal_price_currency": "string", + "min_price": 0, + "min_price_currency": "string", "price_index_value": 0 }, "ozon_index_data": { - "minimal_price": "string", - "minimal_price_currency": "string", + "min_price": 0, + "min_price_currency": "string", "price_index_value": 0 }, - "price_index": "WITHOUT_INDEX", "self_marketplaces_index_data": { - "minimal_price": "string", - "minimal_price_currency": "string", + "min_price": 0, + "min_price_currency": "string", "price_index_value": 0 } }, - "commissions": { - "sales_percent": 15, - "sales_percent_fbo": 15, - "sales_percent_fbs": 0, - "fbo_fulfillment_amount": 0, - "fbo_direct_flow_trans_min_amount": 31, - "fbo_direct_flow_trans_max_amount": 46.5, - "fbo_deliv_to_customer_amount": 14.75, - "fbo_return_flow_amount": 50, - "fbo_return_flow_trans_min_amount": 21.7, - "fbo_return_flow_trans_max_amount": 21.7, - "fbs_first_mile_min_amount": 0, - "fbs_first_mile_max_amount": 25, - "fbs_direct_flow_trans_min_amount": 41, - "fbs_direct_flow_trans_max_amount": 61.5, - "fbs_deliv_to_customer_amount": 60, - "fbs_return_flow_amount": 40, - "fbs_return_flow_trans_min_amount": 41, - "fbs_return_flow_trans_max_amount": 61.5 - }, - "marketing_actions": null, + "product_id": 243686911, "volume_weight": 0 } ], - "total": 1, - "last_id": "ceVуbA==" + "total": 0 } }`, }, diff --git a/ozon/warehouses.go b/ozon/warehouses.go index a2e3255..4beae58 100644 --- a/ozon/warehouses.go +++ b/ozon/warehouses.go @@ -161,6 +161,9 @@ type GetListOfDeliveryMethodsResult struct { // Delivery service identifier ProviderId int64 `json:"provider_id"` + // Minimum time to package an order in minutes according to warehouse settings + SLACutIn int64 `json:"sla_cut_in"` + // Delivery method status: // - NEW—created, // - EDITED—being edited, diff --git a/ozon/warehouses_test.go b/ozon/warehouses_test.go index 42a35aa..b9477a3 100644 --- a/ozon/warehouses_test.go +++ b/ozon/warehouses_test.go @@ -127,7 +127,8 @@ func TestGetListOfDeliveryMethods(t *testing.T) { "template_id": 0, "warehouse_id": 15588127982000, "created_at": "2019-04-04T15:22:31.048202Z", - "updated_at": "2021-08-15T10:21:44.854209Z" + "updated_at": "2021-08-15T10:21:44.854209Z", + "sla_cut_in": 1440 } ], "has_next": false