20 Commits

Author SHA1 Message Date
diPhantxm
7adaa92ad4 Specify enum values for status in GetFBOReturns method 2023-07-06 19:48:33 +03:00
diPhantxm
f54aa64b63 Update GetFBSReturns to v3. Add exemplar_id and return_barcode fields to method reponse 2023-07-06 19:39:54 +03:00
diPhantxm
e7c5dc320e fix params field in GetReportsListResultReport 2023-06-24 02:06:18 +03:00
diPhantxm
006ecdf877 commmented all data types and methods 2023-06-23 23:23:23 +03:00
diPhantxm
f81e4ed350 flat structures 2023-06-23 20:57:38 +03:00
Kirill
e7290069f5 Create LICENSE
Add MIT License
2023-06-20 23:33:02 +03:00
diphantxm
422f959b9f add prr option to some methods 2023-06-16 21:52:49 +03:00
diphantxm
ac99c5ba2f added new status to getting act list filter, updated descriptions, changed test according to examples 2023-06-16 21:35:33 +03:00
diPhantxm
e60a3f1ca2 add method for getting ozon warehouses workload 2023-06-02 18:55:45 +03:00
diPhantxm
2f1dbd5c00 add method for updating product characteristics 2023-06-02 18:55:33 +03:00
diPhantxm
387af0e30e add pricing strategy methods 2023-04-24 01:03:24 +03:00
diPhantxm
c1e7f2b370 add optional paramter with_details to request and details to response in GetFinancial in reports 2023-04-24 01:03:24 +03:00
diPhantxm
a1c92ae26f change price index to multiple indexes in product/info/prices 2023-04-12 01:32:24 +03:00
diPhantxm
08180d901c update posting methods status/substatus, changed price index to multiple indexes in products responses 2023-04-12 01:32:24 +03:00
diPhantxm
838f28d3d9 fix 2023-04-11 23:20:46 +03:00
diPhantxm
226f40275a add supply order methods 2023-04-11 23:18:10 +03:00
Kirill
4139692ac3 Merge pull request #5 from diPhantxm/refactor-enum-types
add enum types where possible
2023-04-02 12:54:17 +03:00
diPhantxm
3507be6ec2 add enum types where possible 2023-04-02 12:52:55 +03:00
Kirill
9990719060 Merge pull request #4 from diPhantxm/feature/add-content-type-to-request
add Content-Type to request header
2023-03-25 17:22:33 +03:00
diPhantxm
18470fcae5 add Content-Type to request header 2023-03-25 17:18:20 +03:00
32 changed files with 6231 additions and 2690 deletions

View File

@@ -57,7 +57,7 @@
- [x] List of accordance types (version 2)
- [x] Directory of document types
- [x] List of certified categories
- [ ] Adding certificates for products
- [x] Adding certificates for products
- [x] Link the certificate to the product
- [x] Delete certificate
- [x] Certificate information

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Kirill
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -56,7 +56,7 @@ func (c Client) newRequest(method string, url string, body interface{}) (*http.R
return req, nil
}
func (c Client) Request(method string, path string, req, resp interface{}) (*Response, error) {
func (c Client) Request(method string, path string, req, resp interface{}, options map[string]string) (*Response, error) {
httpReq, err := c.newRequest(method, path, req)
if err != nil {
return nil, err

View File

@@ -55,7 +55,7 @@ func TestRequest(t *testing.T) {
c := NewMockClient(NewMockHttpHandler(test.statusCode, test.response, test.headers))
respStruct := &TestRequestResponse{}
resp, err := c.Request(http.MethodPost, "/", test.params, respStruct)
resp, err := c.Request(http.MethodPost, "/", test.params, respStruct, nil)
if err != nil {
t.Error(err)

View File

@@ -19,21 +19,10 @@ type GetAnalyticsDataParams struct {
DateTo time.Time `json:"date_to"`
// Items Enum: "unknownDimension" "sku" "spu" "day" "week" "month" "year" "category1" "category2" "category3" "category4" "brand" "modelID"
Dimension []string `json:"dimension"`
Dimension []GetAnalyticsDataDimension `json:"dimension"`
// Filters
Filters []struct {
// Sorting parameter. You can pass any attribute from the `dimension` and `metric` parameters except the `brand` attribute
Key string `json:"key"`
// Comparison operation
//
// Enum: "EQ" "GT" "GTE" "LT" "LTE"
Operation string `json:"operation"`
// Value for comparison
Value string `json:"value"`
} `json:"filters"`
Filters []GetAnalyticsDataFilter `json:"filters"`
// Number of items in the respones:
// - maximum is 1000,
@@ -41,11 +30,7 @@ type GetAnalyticsDataParams struct {
Limit int64 `json:"limit"`
// Specify up to 14 metrics. If there are more, you will get an error with the InvalidArgument code
//
// Items Enum: "unknown_metric" "hits_view_search" "hits_view_pdp" "hits_view" "hits_tocart_search" "hits_tocart_pdp" "hits_tocart" "session_view_search"
// "session_view_pdp" "session_view" "conv_tocart_search" "conv_tocart_pdp" "conv_tocart" "revenue" "returns" "cancellations" "ordered_units" "delivered_units"
// "adv_view_pdp" "adv_view_search_category" "adv_view_all" "adv_sum_all" "position_category" "postings" "postings_premium"
Metrics []string `json:"metrics"`
Metrics []GetAnalyticsDataFilterMetric `json:"metrics"`
// 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 int64 `json:"offset"`
@@ -54,43 +39,58 @@ type GetAnalyticsDataParams struct {
Sort []GetAnalyticsDataSort `json:"sort"`
}
type GetAnalyticsDataFilter struct {
// Sorting parameter. You can pass any attribute from the `dimension` and `metric` parameters except the `brand` attribute
Key string `json:"key"`
// Comparison operation
Operation GetAnalyticsDataFilterOperation `json:"operation"`
// Value for comparison
Value string `json:"value"`
}
// Report sorting settings
type GetAnalyticsDataSort struct {
// Metric by which the method result will be sorted
Key string `json:"key"`
Key GetAnalyticsDataFilterMetric `json:"key"`
// Sorting type
// - ASC — in ascending order,
// - DESC — in descending order.
Order string `json:"order"`
Order Order `json:"order"`
}
type GetAnalyticsDataResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetAnalyticsDataResult `json:"result"`
// Report creation time
Timestamp string `json:"timestamp"`
}
type GetAnalyticsDataResult struct {
// Data array
Data []struct {
Data []GetAnalyticsDataResultData `json:"data"`
// Total and average metrics values
Totals []float64 `json:"totals"`
}
type GetAnalyticsDataResultData struct {
// Data grouping in the report
Dimensions []struct {
Dimensions []GetAnalyticsDataResultDimension `json:"dimensions"`
// Metric values list
Metrics []float64 `json:"metrics"`
}
type GetAnalyticsDataResultDimension struct {
// Identifier
Id string `json:"id"`
// Name
Name string `json:"name"`
} `json:"dimensions"`
// Metric values list
Metrics []float64 `json:"metrics"`
} `json:"data"`
// Total and average metrics values
Totals []float64 `json:"totals"`
} `json:"result"`
// Report creation time
Timestamp string `json:"timestamp"`
}
// Specify the period and metrics that are required. The response will contain analytical data grouped by the `dimensions` parameter.
@@ -99,7 +99,7 @@ func (c Analytics) GetAnalyticsData(params *GetAnalyticsDataParams) (*GetAnalyti
resp := &GetAnalyticsDataResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -118,19 +118,22 @@ type GetStocksOnWarehousesParams struct {
Offset int64 `json:"offset"`
// Warehouse type filter:
// - EXPRESS_DARK_STORE — Ozon warehouses with Fresh delivery.
// - NOT_EXPRESS_DARK_STORE — Ozon warehouses without Fresh delivery.
// - ALL — all Ozon warehouses.
WarehouseType string `json:"warehouse_type"`
WarehouseType WarehouseType `json:"warehouse_type"`
}
type GetStocksOnWarehousesResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetStocksOnWarehousesResult `json:"result"`
}
type GetStocksOnWarehousesResult struct {
// Information about products and stocks
Rows []struct {
Rows []GetStocksOnWarehousesResultRow `json:"rows"`
}
type GetStocksOnWarehousesResultRow struct {
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
@@ -151,8 +154,6 @@ type GetStocksOnWarehousesResponse struct {
// Name of the warehouse where the products are stored
WarehouseName string `json:"warehouse_name"`
} `json:"rows"`
} `json:"result"`
}
// Report on stocks and products movement at Ozon warehouses
@@ -161,7 +162,7 @@ func (c Analytics) GetStocksOnWarehouses(params *GetStocksOnWarehousesParams) (*
resp := &GetStocksOnWarehousesResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -23,12 +23,12 @@ func TestGetAnalyticsData(t *testing.T) {
&GetAnalyticsDataParams{
DateFrom: core.TimeFromString(t, "2006-01-02", "2020-09-01"),
DateTo: core.TimeFromString(t, "2006-01-02", "2021-10-15"),
Dimension: []string{"sku", "day"},
Metrics: []string{"hits_view_search"},
Dimension: []GetAnalyticsDataDimension{SKUDimension, DayDimension},
Metrics: []GetAnalyticsDataFilterMetric{AdvViewAll},
Sort: []GetAnalyticsDataSort{
{
Key: "hits_view_search",
Order: "DESC",
Key: HistViewPDP,
Order: Descending,
},
},
Limit: 1000,

View File

@@ -22,9 +22,18 @@ type ListCertifiedBrandsResponse struct {
core.CommonResponse
// Method result
Result struct {
Result ListCertifiedBrandsResult `json:"result"`
}
type ListCertifiedBrandsResult struct {
// Certified brands details
BrandCertification []struct {
BrandCertification []ListCertifiedBrandsResultCertificate `json:"brand_certification"`
// Total number of brands
Total int64 `json:"total"`
}
type ListCertifiedBrandsResultCertificate struct {
// Brand name
BrandName string `json:"brand_name"`
@@ -32,11 +41,6 @@ type ListCertifiedBrandsResponse struct {
// - true if the certificate is required;
// - false if not
HasCertificate bool `json:"has_certificate"`
} `json:"brand_certification"`
// Total number of brands
Total int64 `json:"total"`
} `json:"result"`
}
// List of certified brands
@@ -45,7 +49,7 @@ func (c Brands) List(params *ListCertifiedBrandsParams) (*ListCertifiedBrandsRes
resp := &ListCertifiedBrandsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -31,13 +31,7 @@ type CancellationInfo struct {
PostingNumber string `json:"posting_number"`
// Cancellation reason
CancellationReason struct {
// Cancellation reason identifier
Id int64 `json:"id"`
// Cancellation reason name
Name string `json:"name"`
} `json:"cancellation_reason"`
CancellationReason CancellationInfoReason `json:"cancellation_reason"`
// Cancellation request creation date
CancelledAt time.Time `json:"cancelled_at"`
@@ -49,16 +43,7 @@ type CancellationInfo struct {
TPLIntegrationType string `json:"tpl_integration_type"`
// Cancellation request status
State struct {
// Status identifier
Id int64 `json:"id"`
// Status name
Name string `json:"name"`
// Request status
State string `json:"state"`
} `json:"state"`
State CancellationInfoState `json:"state"`
// Cancellation initiator
CancellationInitiator string `json:"cancellation_initiator"`
@@ -76,13 +61,32 @@ type CancellationInfo struct {
AutoApproveDate time.Time `json:"auto_approve_date"`
}
type CancellationInfoReason struct {
// Cancellation reason identifier
Id int64 `json:"id"`
// Cancellation reason name
Name string `json:"name"`
}
type CancellationInfoState struct {
// Status identifier
Id int64 `json:"id"`
// Status name
Name string `json:"name"`
// Request status
State string `json:"state"`
}
// Method for getting information about a rFBS cancellation request
func (c Cancellations) GetInfo(params *GetCancellationInfoParams) (*GetCancellationInfoResponse, error) {
url := "/v1/delivery-method/list"
resp := &GetCancellationInfoResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -134,7 +138,10 @@ type ListCancellationsResponse struct {
Total int32 `json:"total"`
// Counter of requests in different statuses
Counters struct {
Counters ListCancellationResponseCounters `json:"counters"`
}
type ListCancellationResponseCounters struct {
// Number of requests for approval
OnApproval int64 `json:"on_approval"`
@@ -143,7 +150,6 @@ type ListCancellationsResponse struct {
// Number of rejected requests
Rejected int64 `json:"rejected"`
} `json:"counters"`
}
// Method for getting a list of rFBS cancellation requests
@@ -152,7 +158,7 @@ func (c Cancellations) List(params *ListCancellationsParams) (*ListCancellations
resp := &ListCancellationsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -180,7 +186,7 @@ func (c Cancellations) Approve(params *ApproveRejectCancellationsParams) (*Appro
resp := &ApproveRejectCancellationsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -197,7 +203,7 @@ func (c Cancellations) Reject(params *ApproveRejectCancellationsParams) (*Approv
resp := &ApproveRejectCancellationsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -15,14 +15,17 @@ type GetProductTreeParams struct {
CategoryId int64 `json:"category_id"`
// Response language
Language string `json:"language" default:"DEFAULT"`
Language Language `json:"language" default:"DEFAULT"`
}
type GetProductTreeResponse struct {
core.CommonResponse
// Category list
Result []struct {
Result []GetProductTreeResult `json:"result"`
}
type GetProductTreeResult struct {
// Category identifier
CategoryId int64 `json:"category_id"`
@@ -31,7 +34,6 @@ type GetProductTreeResponse struct {
// Category name
Title string `json:"title"`
} `json:"result"`
}
// Returns product categories in the tree view.
@@ -43,7 +45,7 @@ func (c Categories) Tree(params *GetProductTreeParams) (*GetProductTreeResponse,
resp := &GetProductTreeResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -54,22 +56,31 @@ func (c Categories) Tree(params *GetProductTreeParams) (*GetProductTreeResponse,
type GetCategoryAttributesParams struct {
// Filter by characteristics
AttributeType string `json:"attribute_type" default:"ALL"`
AttributeType AttributeType `json:"attribute_type" default:"ALL"`
// Category identifier
CategoryId []int64 `json:"category_id"`
// Response language
Language string `json:"language" default:"DEFAULT"`
Language Language `json:"language" default:"DEFAULT"`
}
type GetCategoryAttributesResponse struct {
core.CommonResponse
// Method result
Result []struct {
Result []GetCategoryAttributesResult `json:"result"`
}
type GetCategoryAttributesResult struct {
// Array of product characteristics
Attributes []struct {
Attributes []GetCategoryAttributesResultAttribute `json:"attributes"`
// Category identifier
CategoryId int64 `json:"category_id"`
}
type GetCategoryAttributesResultAttribute struct {
// Indication that the dictionary attribute values depend on the category:
// - true — the attribute has its own set of values for each category.
// - false — the attribute has the same set of values for all categories
@@ -114,11 +125,6 @@ type GetCategoryAttributesResponse struct {
// Characteristic type
Type string `json:"type"`
} `json:"attributes"`
// Category identifier
CategoryId int64 `json:"category_id"`
} `json:"result"`
}
// Getting characteristics for specified product category.
@@ -133,7 +139,7 @@ func (c Categories) Attributes(params *GetCategoryAttributesParams) (*GetCategor
resp := &GetCategoryAttributesResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -151,7 +157,7 @@ type GetAttributeDictionaryParams struct {
// Response language
// The default language is Russian
Language string `json:"language" default:"DEFAULT"`
Language Language `json:"language" default:"DEFAULT"`
LastValueId int64 `json:"last_value_id"`
@@ -167,14 +173,16 @@ type GetAttributeDictionaryResponse struct {
HasNext bool `json:"has_next"`
// Method result
Result []struct {
Result []GetAttributeDictionaryResult `json:"result"`
}
type GetAttributeDictionaryResult struct {
Id int64 `json:"id"`
Info string `json:"info"`
Picture string `json:"picture"`
// Product characteristic value
Value string `json:"value"`
} `json:"result"`
}
// You can use the `/v3/category/attribute` method to check if an attribute has a nested directory.
@@ -184,7 +192,7 @@ func (c Categories) AttributesDictionary(params *GetAttributeDictionaryParams) (
resp := &GetAttributeDictionaryResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -15,25 +15,31 @@ type ListOfAccordanceTypesResponse struct {
core.CommonResponse
// Accordance types
Result struct {
// Main accordance types
Base []struct {
// Accordance type code
Code string `json:"code"`
Result ListOfAccordanceTypesResult `json:"result"`
}
// Accordance type description
Title string `json:"title"`
} `json:"base"`
type ListOfAccordanceTypesResult struct {
// Main accordance types
Base []ListOfAccordanceTypesResultBase `json:"base"`
// Main accordance types related to dangerous products
Hazard []struct {
Hazard []ListOfAccordanceTypesResultHazard `json:"hazard"`
}
type ListOfAccordanceTypesResultBase struct {
// Accordance type code
Code string `json:"code"`
// Accordance type description
Title string `json:"title"`
}
type ListOfAccordanceTypesResultHazard struct {
// Accordance type code
Code string `json:"code"`
// Accordance type description
Title string `json:"title"`
} `json:"hazard"`
} `json:"result"`
}
// List of accordance types (version 2)
@@ -42,7 +48,7 @@ func (c Certificates) ListOfAccordanceTypes() (*ListOfAccordanceTypesResponse, e
resp := &ListOfAccordanceTypesResponse{}
response, err := c.client.Request(http.MethodGet, url, nil, resp)
response, err := c.client.Request(http.MethodGet, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -55,13 +61,15 @@ type DirectoryOfDocumentTypesResponse struct {
core.CommonResponse
// List of certificate types and names
Result []struct {
Result []DirectoryOfDocumentTypesResult `json:"result"`
}
type DirectoryOfDocumentTypesResult struct {
// Certificate name
Name string `json:"name"`
// Certificate type
Value string `json:"value"`
} `json:"result"`
}
// Directory of document types
@@ -70,7 +78,7 @@ func (c Certificates) DirectoryOfDocumentTypes() (*DirectoryOfDocumentTypesRespo
resp := &DirectoryOfDocumentTypesResponse{}
response, err := c.client.Request(http.MethodGet, url, nil, resp)
response, err := c.client.Request(http.MethodGet, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -91,19 +99,23 @@ type ListOfCertifiedCategoriesResponse struct {
core.CommonResponse
// Method result
Result struct {
Result ListOfCertifiedCategoriesResult `json:"reult"`
}
type ListOfCertifiedCategoriesResult struct {
// Certified categories details
Certification []struct {
Certification []ListOfCertifiedCategoriesResultCert `json:"certification"`
// Total number of categories
Total int64 `json:"total"`
}
type ListOfCertifiedCategoriesResultCert struct {
// Category name
CategoryName string `json:"category_name"`
// Indication of a mandatory category
IsRequired bool `json:"is_required"`
} `json:"certification"`
// Total number of categories
Total int64 `json:"total"`
} `json:"reult"`
}
// List of certified categories
@@ -112,7 +124,7 @@ func (c Certificates) ListOfCertifiedCategories(params *ListOfCertifiedCategorie
resp := &ListOfCertifiedCategoriesResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -142,7 +154,7 @@ func (c Certificates) LinkToProduct(params *LinkCertificateToProductParams) (*Li
resp := &LinkCertificateToProductResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -160,7 +172,10 @@ type DeleteCertificateResponse struct {
core.CommonResponse
// Result of deleting the certificate
Result struct {
Result DeleteCertificateResult `json:"result"`
}
type DeleteCertificateResult struct {
// Indication that a certificate has been deleted:
// - true — deleted
// - false — not deleted
@@ -168,7 +183,6 @@ type DeleteCertificateResponse struct {
// Description of errors during certificate deletion
ErrorMessage string `json:"error_message"`
} `json:"result"`
}
// Delete certificate
@@ -177,7 +191,7 @@ func (c Certificates) Delete(params *DeleteCertificateParams) (*DeleteCertificat
resp := &DeleteCertificateResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -195,7 +209,10 @@ type GetCertificateInfoResponse struct {
core.CommonResponse
// Certificate information
Result struct {
Result GetCertificateInfoResult `json:"result"`
}
type GetCertificateInfoResult struct {
// Identifier
CertificateId int32 `json:"certificate_id"`
@@ -228,7 +245,6 @@ type GetCertificateInfoResponse struct {
// Number of products associated with a certificate
ProductsCount int32 `json:"products_count"`
} `json:"result"`
}
// Certificate information
@@ -237,7 +253,7 @@ func (c Certificates) GetInfo(params *GetCertificateInfoParams) (*GetCertificate
resp := &GetCertificateInfoResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -268,9 +284,18 @@ type ListCertificatesResponse struct {
core.CommonResponse
// Certificates
Result struct {
Result ListCertificatesResult `json:"result"`
}
type ListCertificatesResult struct {
// Сertificate information
Certificates []struct {
Certificates []ListCertificatesResultCert `json:"certificates"`
// Number of pages
PageCount int32 `json:"page_count"`
}
type ListCertificatesResultCert struct {
// Identifier
CertificateId int32 `json:"certificate_id"`
@@ -303,11 +328,6 @@ type ListCertificatesResponse struct {
// Number of products associated with a certificate
ProductsCount int32 `json:"products_count"`
} `json:"certificates"`
// Number of pages
PageCount int32 `json:"page_count"`
} `json:"result"`
}
// Certificates list
@@ -316,7 +336,7 @@ func (c Certificates) List(params *ListCertificatesParams) (*ListCertificatesRes
resp := &ListCertificatesResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -329,13 +349,15 @@ type ProductStatusesResponse struct {
core.CommonResponse
// Product statuses
Result []struct {
Result []ProductStatusesResult `json:"result"`
}
type ProductStatusesResult struct {
// Product status code when linking it to the certificate
Code string `json:"code"`
// Status description
Name string `json:"name"`
} `json:"result"`
}
func (c Certificates) ProductStatuses() (*ProductStatusesResponse, error) {
@@ -343,7 +365,7 @@ func (c Certificates) ProductStatuses() (*ProductStatusesResponse, error) {
resp := &ProductStatusesResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -370,7 +392,10 @@ type ListProductsForCertificateResponse struct {
core.CommonResponse
// Method result
Result struct {
Result ListProductsForCertificateResult `json:"result"`
}
type ListProductsForCertificateResult struct {
// List of products
Items []struct {
// Product identifier
@@ -382,7 +407,6 @@ type ListProductsForCertificateResponse struct {
// Number of products found
Count int64 `json:"count"`
} `json:"result"`
}
// A method for getting a list of possible statuses of products when binding them to a certificate
@@ -391,7 +415,7 @@ func (c Certificates) ListProductsForCertificate(params *ListProductsForCertific
resp := &ListProductsForCertificateResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -412,7 +436,10 @@ type UnlinkFromProductResponse struct {
core.CommonResponse
// Method result
Result []struct {
Result []UnlinkFromProductResult `json:"result"`
}
type UnlinkFromProductResult struct {
// Error message when unbinding a product
Error string `json:"error"`
@@ -423,7 +450,6 @@ type UnlinkFromProductResponse struct {
// - true — it was unbound,
// - false — it is still bound
Updated bool `json:"updated"`
} `json:"result"`
}
// Unbind products from a certificate
@@ -432,7 +458,7 @@ func (c Certificates) UnlinkFromProduct(params *UnlinkFromProductParams) (*Unlin
resp := &UnlinkFromProductResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -445,13 +471,15 @@ type PossibleRejectReasonsResponse struct {
core.CommonResponse
// Certificate rejection reasons
Result []struct {
Result []PossibleRejectReasonsResult `json:"result"`
}
type PossibleRejectReasonsResult struct {
// Сode of a certificate rejection reason
Code string `json:"code"`
// Description of a certificate rejection reason
Name string `json:"name"`
} `json:"result"`
}
// Possible certificate rejection reasons
@@ -460,7 +488,7 @@ func (c Certificates) PossibleRejectReasons() (*PossibleRejectReasonsResponse, e
resp := &PossibleRejectReasonsResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -473,13 +501,15 @@ type PossibleStatusesResponse struct {
core.CommonResponse
// Possible certificate statuses
Result []struct {
Result []PossibleStatusesResult `json:"result"`
}
type PossibleStatusesResult struct {
// Certificate status code
Code string `json:"code"`
// Status description
Name string `json:"name"`
} `json:"result"`
}
func (c Certificates) PossibleStatuses() (*PossibleStatusesResponse, error) {
@@ -487,7 +517,53 @@ func (c Certificates) PossibleStatuses() (*PossibleStatusesResponse, error) {
resp := &PossibleStatusesResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type AddCertificatesForProductsParams struct {
// Array of certificates for the product. Valid extensions are jpg, jpeg, png, pdf
Files []byte `json:"files"`
// Certificate name. No more than 100 characters
Name string `json:"name"`
// Certificate number. No more than 100 characters
Number string `json:"number"`
// Certificate type. To get the list of types, use the GET `/v1/product/certificate/types` method
TypeCode string `json:"type_code"`
// Accordance type. To get the list of types, use the GET `/v1/product/certificate/accordance-types` method
AccordanceTypeCode string `json:"accordance_type_code"`
// Issue date of the certificate
IssueDate time.Time `json:"issue_date"`
// Expiration date of the certificate. Can be empty for permanent certificates
ExpireDate time.Time `json:"expire_date"`
}
type AddCertificatesForProductsResponse struct {
core.CommonResponse
Id int `json:"id"`
}
// Adding certificates for products
func (c Certificates) AddForProducts(params *AddCertificatesForProductsParams) (*AddCertificatesForProductsResponse, error) {
url := "/v1/product/certificate/create"
resp := &AddCertificatesForProductsResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp, map[string]string{
"Content-Type": "multipart/form-data",
})
if err != nil {
return nil, err
}

View File

@@ -3,6 +3,7 @@ package ozon
import (
"net/http"
"testing"
"time"
core "github.com/diphantxm/ozon-api-client"
)
@@ -652,3 +653,55 @@ func TestPossibleStatuses(t *testing.T) {
}
}
}
func TestAddCertificatesForProducts(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *AddCertificatesForProductsParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&AddCertificatesForProductsParams{
Files: []byte{10, 15, 2, 0},
Name: "Certificate name",
Number: "10a-d5s9-4asdf2",
TypeCode: "declaration",
AccordanceTypeCode: "gost",
IssueDate: time.Now(),
ExpireDate: time.Now(),
},
`{
"id": 50058
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&AddCertificatesForProductsParams{},
`{
"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))
resp, err := c.Certificates().AddForProducts(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}

View File

@@ -38,9 +38,30 @@ type ListChatsResponse struct {
core.CommonResponse
// Chats data
Chats []struct {
Chats []ListChatsChat `json:"chats"`
// Total number of chats
TotalChatsCount int64 `json:"total_chats_count"`
// Total number of unread messages
TotalUnreadCount int64 `json:"total_unread_count"`
}
type ListChatsChat struct {
// Chat data
Chat struct {
Chat ListChatsChatData `json:"chat"`
// Identifier of the first unread chat message
FirstUnreadMessageId string `json:"first_unread_message_id"`
// Identifier of the last message in the chat
LastMessageId string `json:"last_message_id"`
// Number of unread messages in the chat
UnreadCount int64 `json:"unread_count"`
}
type ListChatsChatData struct {
// Chat identifier
ChatId string `json:"chat_id"`
@@ -57,23 +78,6 @@ type ListChatsResponse struct {
// Chat creation date
CreatedAt time.Time `json:"created_at"`
} `json:"chat"`
// Identifier of the first unread chat message
FirstUnreadMessageId string `json:"first_unread_message_id"`
// Identifier of the last message in the chat
LastMessageId string `json:"last_message_id"`
// Number of unread messages in the chat
UnreadCount int64 `json:"unread_count"`
} `json:"chats"`
// Total number of chats
TotalChatsCount int64 `json:"total_chats_count"`
// Total number of unread messages
TotalUnreadCount int64 `json:"total_unread_count"`
}
// Returns information about chats by specified filters
@@ -82,7 +86,7 @@ func (c Chats) List(params *ListChatsParams) (*ListChatsResponse, error) {
resp := &ListChatsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -112,7 +116,7 @@ func (c Chats) SendMessage(params *SendMessageParams) (*SendMessageResponse, err
resp := &SendMessageResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -145,7 +149,7 @@ func (c Chats) SendFile(params *SendFileParams) (*SendFileResponse, error) {
resp := &SendFileResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -179,7 +183,10 @@ type ChatHistoryResponse struct {
HasNext bool `json:"has_next"`
// An array of messages sorted according to the direction parameter in the request body
Messages []struct {
Messages []ChatHistoryMessage `json:"messages"`
}
type ChatHistoryMessage struct {
// Message creation date
CreatedAt time.Time `json:"created_at"`
@@ -193,7 +200,10 @@ type ChatHistoryResponse struct {
MessageId string `json:"message_id"`
// Chat participant identifier
User struct {
User ChatHistoryMessageUser `json:"user"`
}
type ChatHistoryMessageUser struct {
// Chat participant identifier
Id string `json:"id"`
@@ -204,8 +214,6 @@ type ChatHistoryResponse struct {
// - courier
// - support
Type string `json:"type"`
} `json:"user"`
} `json:"messages"`
}
// Chat history
@@ -214,7 +222,7 @@ func (c Chats) History(params *ChatHistoryParams) (*ChatHistoryResponse, error)
resp := &ChatHistoryResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -238,55 +246,18 @@ type UpdateChatResponse struct {
core.CommonResponse
// Method result
Result []struct {
Result []UpdateChatResult `json:"result"`
}
type UpdateChatResult struct {
// An order or a product user wrote about in the chat
Context struct {
// Product inforamtion
Item struct {
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
} `json:"item"`
// Order information
Order struct {
// Order number
OrderNumber string `json:"order_number"`
// Shipment information
Postings []struct {
// Delivery scheme:
// - FBO
// - FBS
// - RFBS
// - Crossborder
DeliverySchema string `json:"delivery_schema"`
// Shipment number
PostingNumber string `json:"posting_number"`
// List of product identifiers in the shipment
SKUList []int64 `json:"sku_list"`
} `json:"postings"`
} `json:"order"`
} `json:"context"`
Context UpdateChatResultContext `json:"context"`
// Creation date and time
CreatedAt time.Time `json:"created_at"`
// Information about the file in the chat. Displayed only for `type = file`
File struct {
// File type
Mime string `json:"mime"`
// File name
Name string `json:"name"`
// File size in bytes
Size int64 `json:"size"`
// File URL
URL string `json:"url"`
} `json:"file"`
File UpdateChatResultFile `json:"file"`
// File identifier
Id uint64 `json:"id"`
@@ -300,7 +271,60 @@ type UpdateChatResponse struct {
Type string `json:"type"`
// Chat participant information
User struct {
User UpdateChatResultUser `json:"user"`
}
type UpdateChatResultContext struct {
// Product inforamtion
Item UpdateChatResultContextItem `json:"item"`
// Order information
Order UpdateChatResultContextOrder `json:"order"`
}
type UpdateChatResultContextItem struct {
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
}
type UpdateChatResultContextOrder struct {
// Order number
OrderNumber string `json:"order_number"`
// Shipment information
Postings []UpdateChatResultContextOrderPosting `json:"postings"`
}
type UpdateChatResultContextOrderPosting struct {
// Delivery scheme:
// - FBO
// - FBS
// - RFBS
// - Crossborder
DeliverySchema string `json:"delivery_schema"`
// Shipment number
PostingNumber string `json:"posting_number"`
// List of product identifiers in the shipment
SKUList []int64 `json:"sku_list"`
}
type UpdateChatResultFile struct {
// File type
Mime string `json:"mime"`
// File name
Name string `json:"name"`
// File size in bytes
Size int64 `json:"size"`
// File URL
URL string `json:"url"`
}
type UpdateChatResultUser struct {
// Chat participant identifier
Id string `json:"id"`
@@ -310,8 +334,6 @@ type UpdateChatResponse struct {
// - crm—system messages
// - courier
Type string `json:"type"`
} `json:"user"`
} `json:"result"`
}
// Update chat
@@ -320,7 +342,7 @@ func (c Chats) Update(params *UpdateChatParams) (*UpdateChatResponse, error) {
resp := &UpdateChatResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -338,10 +360,12 @@ type CreateNewChatResponse struct {
core.CommonResponse
//Method result
Result struct {
Result CreateNewChatResult `json:"result"`
}
type CreateNewChatResult struct {
// Chat identifier
ChatId string `json:"chat_id"`
} `json:"result"`
}
// Creates a new chat on the shipment with the customer. For example, to clarify the address or the product model
@@ -350,7 +374,7 @@ func (c Chats) Create(params *CreateNewChatParams) (*CreateNewChatResponse, erro
resp := &CreateNewChatResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -380,7 +404,7 @@ func (c Chats) MarkAsRead(params *MarkAsReadParams) (*MarkAsReadResponse, error)
resp := &MarkAsReadResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

481
ozon/common.go Normal file
View File

@@ -0,0 +1,481 @@
package ozon
type Order string
const (
Ascending Order = "ASC"
Descending Order = "DESC"
)
type GetAnalyticsDataFilterOperation string
const (
Equal GetAnalyticsDataFilterOperation = "EQ"
Greater GetAnalyticsDataFilterOperation = "GT"
GreaterEqual GetAnalyticsDataFilterOperation = "GTE"
Lesser GetAnalyticsDataFilterOperation = "LT"
LesserEqual GetAnalyticsDataFilterOperation = "LTE"
)
type GetAnalyticsDataFilterMetric string
const (
UnknownMetric GetAnalyticsDataFilterMetric = "unknown_metric"
HitsViewSearch GetAnalyticsDataFilterMetric = "hits_view_search"
HistViewPDP GetAnalyticsDataFilterMetric = "hits_view_pdp"
HitsView GetAnalyticsDataFilterMetric = "hist_view"
HitsToCartSearch GetAnalyticsDataFilterMetric = "hits_tocart_search"
HitsToCartPDP GetAnalyticsDataFilterMetric = "hits_tocart_pdp"
SessionViewSearch GetAnalyticsDataFilterMetric = "session_view_search"
SessionViewPDP GetAnalyticsDataFilterMetric = "session_view_pdp"
SessionView GetAnalyticsDataFilterMetric = "session_view"
ConvToCartSearch GetAnalyticsDataFilterMetric = "conv_tocart_search"
ConvToCartPDP GetAnalyticsDataFilterMetric = "conv_tocart_pdp"
ConvToCart GetAnalyticsDataFilterMetric = "conv_tocart"
Revenue GetAnalyticsDataFilterMetric = "revenue"
ReturnsMetric GetAnalyticsDataFilterMetric = "returns"
CancellationsMetric GetAnalyticsDataFilterMetric = "cancellations"
OrderedUnits GetAnalyticsDataFilterMetric = "ordered_units"
DeliveredUnits GetAnalyticsDataFilterMetric = "delivered_units"
AdvViewPDP GetAnalyticsDataFilterMetric = "adv_view_pdp"
AdvViewSearchCategory GetAnalyticsDataFilterMetric = "adv_view_search_category"
AdvViewAll GetAnalyticsDataFilterMetric = "adv_view_all"
AdvSumAll GetAnalyticsDataFilterMetric = "adv_sum_all"
PositionCategory GetAnalyticsDataFilterMetric = "position_category"
PostingsMetric GetAnalyticsDataFilterMetric = "postings"
PostingsPremium GetAnalyticsDataFilterMetric = "postings_premium"
)
type WarehouseType string
const (
// Ozon warehouses with Fresh delivery
ExpressDarkStore WarehouseType = "EXPRESS_DARK_STORE"
// Ozon warehouses without Fresh delivery
NotExressDarkStore WarehouseType = "NOT_EXPRESS_DARK_STORE"
// All Ozon warehouses
ALLWarehouseType WarehouseType = "ALL"
)
type Language string
const (
Default Language = "DEFAULT"
Russian Language = "RU"
English Language = "EN"
Turkish Language = "TR"
Chinese Language = "ZH_HANS"
)
type AttributeType string
const (
All AttributeType = "ALL"
Required AttributeType = "REQUIRED"
Optional AttributeType = "OPTIONAL"
)
type ListDiscountRequestsStatus string
const (
New ListDiscountRequestsStatus = "NEW"
Seen ListDiscountRequestsStatus = "SEEN"
Approved ListDiscountRequestsStatus = "APPROVED"
PartlyApproved ListDiscountRequestsStatus = "PARTLY_APPROVED"
Declined ListDiscountRequestsStatus = "DECLINED"
AutoDeclined ListDiscountRequestsStatus = "AUTO_DECLINED"
DeclinedByUser ListDiscountRequestsStatus = "DECLINED_BY_USER"
Coupon ListDiscountRequestsStatus = "COUPON"
Purchased ListDiscountRequestsStatus = "PURCHASED"
)
type WorkingDay string
const (
Mon WorkingDay = "1"
Tue WorkingDay = "2"
Wed WorkingDay = "3"
Thu WorkingDay = "4"
Fri WorkingDay = "5"
Sat WorkingDay = "6"
Sun WorkingDay = "7"
)
type GetAnalyticsDataDimension string
const (
UnknownDimension GetAnalyticsDataDimension = "unknownDimension"
SKUDimension GetAnalyticsDataDimension = "sku"
SPUDimension GetAnalyticsDataDimension = "spu"
DayDimension GetAnalyticsDataDimension = "day"
WeekDimension GetAnalyticsDataDimension = "week"
MonthDimension GetAnalyticsDataDimension = "month"
YearDimension GetAnalyticsDataDimension = "year"
Category1Dimension GetAnalyticsDataDimension = "category1"
Category2Dimension GetAnalyticsDataDimension = "category2"
Category3Dimension GetAnalyticsDataDimension = "category3"
Category4Dimension GetAnalyticsDataDimension = "category4"
BrandDimension GetAnalyticsDataDimension = "brand"
ModelIDDimension GetAnalyticsDataDimension = "modelID"
)
type SupplyRequestState string
const (
// request draft. Only for supplies via vDC
Draft SupplyRequestState = "DRAFT"
// selecting supply options. Only for supplies via vDC
SupplyVariantsArranging SupplyRequestState = "SUPPLY_VARIANTS_ARRANGING"
// no supply options, the request is archived. Only for supplies via vDC
HasNoSupplyVariantsArchive SupplyRequestState = "HAS_NO_SUPPLY_VARIANTS_ARCHIVE"
// no supply options. Only for supplies via vDC
HasNoSupplyVariantsNew SupplyRequestState = "HAS_NO_SUPPLY_VARIANTS_NEW"
// supply being approved. Only for supplies via vDC
SupplyVariantsConfirmation SupplyRequestState = "SUPPLY_VARIANTS_CONFIRMATION"
// time reservation
TimeslotBooking SupplyRequestState = "TIMESLOT_BOOKING"
// filling in the data
DATA_FILLING SupplyRequestState = "DATA_FILLING"
// ready for shipment
ReadyToSupply SupplyRequestState = "READY_TO_SUPPLY"
// accepted at the shipping point
AcceptedAtSupplyWarehouse SupplyRequestState = "ACCEPTED_AT_SUPPLY_WAREHOUSE"
// on the way
InTransit SupplyRequestState = "IN_TRANSIT"
// acceptance at the warehouse
AcceptanceAtStorageWarehouse SupplyRequestState = "ACCEPTANCE_AT_STORAGE_WAREHOUSE"
// acts being approved
ReportsConfirmationAwaiting SupplyRequestState = "REPORTS_CONFIRMATION_AWAITING"
// dispute
ReportRejected SupplyRequestState = "REPORT_REJECTED"
// completed
Completed SupplyRequestState = "COMPLETED"
// refused acceptance
RejectedAtSupplyWarehouse SupplyRequestState = "REJECTED_AT_SUPPLY_WAREHOUSE"
// cancelled
Cancelled SupplyRequestState = "CANCELLED"
// overdue
Overdue SupplyRequestState = "OVERDUE"
)
type ShipmentStatus string
const (
// acceptance is in progress
AcceptanceInProgress ShipmentStatus = "acceptance_in_progress"
// arbitration
Arbitration ShipmentStatus = "arbitration"
// awaiting confirmation
AwaitingApprove ShipmentStatus = "awaiting_approve"
// awaiting shipping
AwaitingDeliver ShipmentStatus = "awaiting_deliver"
// awaiting packaging
AwaitingPackaging ShipmentStatus = "awaiting_packaging"
// created
AwaitingVerification ShipmentStatus = "awaiting_verification"
// cancelled
CancelledSubstatus ShipmentStatus = "cancelled"
// delivered
Delivered ShipmentStatus = "delivered"
// delivery is in progress
Delivering ShipmentStatus = "delivering"
// picked up by driver
DriverPickup ShipmentStatus = "driver_pickup"
// not accepted at the sorting center
NotAccepted ShipmentStatus = "not_accepted"
// sent by the seller
SentBySeller ShipmentStatus = "sent_by_seller"
)
type ShipmentSubstatus string
const (
// acceptance in progress
PostingAcceptanceInProgress ShipmentStatus = "posting_acceptance_in_progress"
// arbitrage
PostingInArbitration ShipmentStatus = "posting_in_arbitration"
// created
PostingCreated ShipmentStatus = "posting_created"
// in the freight
PostingInCarriage ShipmentStatus = "posting_in_carriage"
// not added to the freight
PostingNotInCarriage ShipmentStatus = "posting_not_in_carriage"
// registered
PostingRegistered ShipmentStatus = "posting_registered"
// is handed over to the delivery service
PostingTransferringToDelivery ShipmentStatus = "posting_transferring_to_delivery"
// waiting for passport data
PostingAwaitingPassportData ShipmentStatus = "posting_awaiting_passport_data"
// created
PostingCreatedSubstatus ShipmentStatus = "posting_created"
// awaiting registration
PostingAwaitingRegistration ShipmentStatus = "posting_awaiting_registration"
// registration error
PostingRegistrationError ShipmentStatus = "posting_registration_error"
// created
PostingSplitPending ShipmentStatus = "posting_split_pending"
// canceled
PostingCancelled ShipmentStatus = "posting_canceled"
// customer delivery arbitrage
PostingInClientArbitration ShipmentStatus = "posting_in_client_arbitration"
// delivered
PostingDelivered ShipmentStatus = "posting_delivered"
// recieved
PostingReceived ShipmentStatus = "posting_received"
// presumably delivered
PostingConditionallyDelivered ShipmentStatus = "posting_conditionally_delivered"
// courier on the way
PostingInCourierService ShipmentStatus = "posting_in_courier_service"
// at the pick-up point
PostingInPickupPoint ShipmentStatus = "posting_in_pickup_point"
// on the way to the city
PostingOnWayToCity ShipmentStatus = "posting_on_way_to_city"
// on the way to the pick-up point
PostingOnWayToPickupPoint ShipmentStatus = "posting_on_way_to_pickup_point"
// returned to the warehouse
PostingReturnedToWarehouse ShipmentStatus = "posting_returned_to_warehouse"
// is handed over to the courier
PostingTransferredToCourierService ShipmentStatus = "posting_transferred_to_courier_service"
// handed over to the driver
PostingDriverPickup ShipmentStatus = "posting_driver_pick_up"
// not accepted at the sorting center
PostingNotInSortCenter ShipmentStatus = "posting_not_in_sort_center"
// sent by the seller
SentBySellerSubstatus ShipmentStatus = "sent_by_seller"
)
type TPLIntegrationType string
const (
// delivery by the Ozon logistics
OzonTPLType TPLIntegrationType = "ozon"
// delivery by a third-party service, Ozon registers the order
AggregatorTPLType TPLIntegrationType = "aggregator"
// delivery by a third-party service, the seller registers the order
TrackingTPLType TPLIntegrationType = "3pl_tracking"
// delivery by the seller
NonIntegratedTPLType TPLIntegrationType = "non_integrated"
)
type DetailsDeliveryItemName string
const (
DirectFlowLogisticSumDetailsDeliveryItemName DetailsDeliveryItemName = "MarketplaceServiceItemDirectFlowLogisticSum"
DropoffDetailsDeliveryItemName DetailsDeliveryItemName = "MarketplaceServiceItemDropoff"
DelivToCustomerDetailsDeliveryItemName DetailsDeliveryItemName = "MarketplaceServiceItemDelivToCustomer"
)
type DetailsReturnServiceName string
const (
ReturnAfterDelivToCustomerDetailsReturnServiceName DetailsReturnServiceName = "MarketplaceServiceItemReturnAfterDelivToCustomer"
ReturnPartGoodsCustomerDetailsReturnServiceName DetailsReturnServiceName = "MarketplaceServiceItemReturnPartGoodsCustomer"
ReturnNotDelivToCustomerDetailsReturnServiceName DetailsReturnServiceName = "MarketplaceServiceItemReturnNotDelivToCustomer"
ReturnFlowLogisticDetailsReturnServiceName DetailsReturnServiceName = "MarketplaceServiceItemReturnFlowLogistic"
)
type DetailsServiceItemName string
const (
OtherMarketAndTech DetailsServiceItemName = "MarketplaceServiceItemOtherMarketAndTechService"
ReturnStorageServiceAtThePickupPointFbsItem DetailsServiceItemName = "MarketplaceReturnStorageServiceAtThePickupPointFbsItem"
SaleReviewsItem DetailsServiceItemName = "MarketplaceSaleReviewsItem"
ServicePremiumCashbackIndividualPoints DetailsServiceItemName = "MarketplaceServicePremiumCashbackIndividualPoints"
ServiceStorageItem DetailsServiceItemName = "MarketplaceServiceStorageItem"
ServiceStockDisposal DetailsServiceItemName = "MarketplaceServiceStockDisposal"
ReturnDisposalServiceFbsItem DetailsServiceItemName = "MarketplaceReturnDisposalServiceFbsItem"
ServiceItemFlexiblePaymentSchedule DetailsServiceItemName = "MarketplaceServiceItemFlexiblePaymentSchedule"
ServiceProcessingSpoilage DetailsServiceItemName = "MarketplaceServiceProcessingSpoilage"
ServiceProcessingIdentifiedSurplus DetailsServiceItemName = "MarketplaceServiceProcessingIdentifiedSurplus"
ServiceProcessingIdentifiedDiscrepancies DetailsServiceItemName = "MarketplaceServiceProcessingIdentifiedDiscrepancies"
ServiceItemInternetSiteAdvertising DetailsServiceItemName = "MarketplaceServiceItemInternetSiteAdvertising"
ServiceItemPremiumSubscribtion DetailsServiceItemName = "MarketplaceServiceItemPremiumSubscribtion"
AgencyFeeAggregator3PLGlobalItem DetailsServiceItemName = "MarketplaceAgencyFeeAggregator3PLGlobalItem"
)
type DetailsOtherItemName string
const (
RedistributionOfAcquiringOperation DetailsOtherItemName = "MarketplaceRedistributionOfAcquiringOperation"
CompensationLossOfGoodsOperation DetailsOtherItemName = "MarketplaceSellerCompensationLossOfGoodsOperation"
CorrectionOperation DetailsOtherItemName = "MarketplaceSellerCorrectionOperation"
OperationCorrectionSeller DetailsOtherItemName = "OperationCorrectionSeller"
OperationMarketplaceWithHoldingForUndeliverableGoods DetailsOtherItemName = "OperationMarketplaceWithHoldingForUndeliverableGoods"
OperationClaim DetailsOtherItemName = "OperationClaim"
)
type StrategyType string
const (
MinExtPrice StrategyType = "MIN_EXT_PRICE"
CompPrice StrategyType = "COMP_PRICE"
)
type StrategyUpdateType string
const (
StrategyEnabled StrategyUpdateType = "strategyEnabled"
StrategyDisabled StrategyUpdateType = "strategyDisabled"
StrategyChanged StrategyUpdateType = "strategyChanged"
StrategyCreated StrategyUpdateType = "strategyCreated"
StrategyItemsListChanged StrategyUpdateType = "strategyItemsListChanged"
)
type ShipmentCertificateFilterStatus string
const (
// new
ShitmentCertificateFilterNew ShipmentCertificateFilterStatus = "new"
// retry creation
ShitmentCertificateFilterAwaitingRetry ShipmentCertificateFilterStatus = "awaiting-retry"
// is being packaged
ShitmentCertificateFilterInProcess ShipmentCertificateFilterStatus = "in_process"
// created
ShitmentCertificateFilterSuccess ShipmentCertificateFilterStatus = "success"
// creation error
ShitmentCertificateFilterError ShipmentCertificateFilterStatus = "error"
// sent
ShitmentCertificateFilterSend ShipmentCertificateFilterStatus = "sent"
// received
ShitmentCertificateFilterReceived ShipmentCertificateFilterStatus = "received"
// packaged
ShitmentCertificateFilterFormed ShipmentCertificateFilterStatus = "formed"
// canceled
ShitmentCertificateFilterCancelled ShipmentCertificateFilterStatus = "cancelled"
// in the queue for packaging
ShitmentCertificateFilterPending ShipmentCertificateFilterStatus = "pending"
// in the queue for completion
ShitmentCertificateFilterCompletionEnqueued ShipmentCertificateFilterStatus = "completion_enqueued"
// in the process of completion
ShitmentCertificateFilterCompletionProcessing ShipmentCertificateFilterStatus = "completion_processing"
// completion error
ShitmentCertificateFilterCompletionFailed ShipmentCertificateFilterStatus = "completion_failed"
// in the queue for cancellation
ShitmentCertificateFilterCancelationEnqueued ShipmentCertificateFilterStatus = "cancelation_enqueued"
// in the process of cancellation
ShitmentCertificateFilterCancelationProcessing ShipmentCertificateFilterStatus = "cancelation_processing"
// cancellation error
ShitmentCertificateFilterCancelationFailed ShipmentCertificateFilterStatus = "cancelation_failed"
// completed
ShitmentCertificateFilterCompleted ShipmentCertificateFilterStatus = "completed"
// closed
ShitmentCertificateFilterClosed ShipmentCertificateFilterStatus = "closed"
)
type PRROptionStatus string
const (
// carrying the bulky product using the elevator
PRROptionLift PRROptionStatus = "lift"
// carrying the bulky product upstairs
PRROptionStairs PRROptionStatus = "stairs"
// the customer canceled the service,
// you don't need to lift the shipment
PRROptionNone PRROptionStatus = "none"
// delivery is included in the price.
// According to the offer you need to
// deliver products to the floor
PRROptionDeliveryDefault PRROptionStatus = "delivery_default"
)
type GetFBSReturnsFilterStatus string
const (
ReturnedToSeller GetFBSReturnsFilterStatus = "returned_to_seller"
WaitingForSeller GetFBSReturnsFilterStatus = "waiting_for_seller"
AcceptedFromCustomer GetFBSReturnsFilterStatus = "accepted_from_customer"
CancelledWithCompensation GetFBSReturnsFilterStatus = "cancelled_with_compensation"
ReadyForShipment GetFBSReturnsFilterStatus = "ready_for_shipment"
)
type GetFBOReturnsFilterStatus string
const (
GetFBOReturnsFilterStatusReturnedToOzon GetFBOReturnsFilterStatus = "ReturnedToOzon"
GetFBOReturnsFilterStatusCancelled GetFBOReturnsFilterStatus = "Cancelled"
)
type GetFBOReturnsReturnStatus string
const (
GetFBOReturnsReturnStatusCancelled GetFBOReturnsReturnStatus = "Возврат отменен"
GetFBOReturnsReturnStatusAcceptedFromCustomer GetFBOReturnsReturnStatus = "Принят от покупателя"
GetFBOReturnsReturnStatusReceivedAtOzon GetFBOReturnsReturnStatus = "Получен в Ozon"
)

View File

@@ -56,41 +56,15 @@ type GetFBOShipmentsListResponse struct {
core.CommonResponse
// Shipments list
Result []struct {
Result []GetFBOShipmentsListResult `json:"result"`
}
type GetFBOShipmentsListResult struct {
// Additional data for shipment list
AdditionalData []struct {
Key string `json:"key"`
Value string `json:"value"`
} `json:"additional_data"`
AdditionalData []GetFBOShipmentsListResultAdditionalData `json:"additional_data"`
// Analytical data
AnalyticsData struct {
// Delivery city
City string `json:"city"`
// Delivery method
DeliveryType string `json:"delivery_type"`
// Indication that the recipient is a legal person
// * true — a legal person,
// * false — a natural person.
IsLegal bool `json:"is_legal"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Payment method
PaymentTypeGroupName string `json:"payment_type_group_name"`
// Delivery region
Region string `json:"region"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
// Name of the warehouse from which the order is shipped
WarehouseName string `json:"warehouse_name"`
} `json:"analytics_data"`
AnalyticsData GetFBOShipmentsListResultAnalyticsData `json:"analytics_data"`
// Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"`
@@ -118,7 +92,39 @@ type GetFBOShipmentsListResponse struct {
// Shipment status
Status string `json:"status"`
} `json:"result"`
}
type GetFBOShipmentsListResultAdditionalData struct {
Key string `json:"key"`
Value string `json:"value"`
}
type GetFBOShipmentsListResultAnalyticsData struct {
// Delivery city
City string `json:"city"`
// Delivery method
DeliveryType string `json:"delivery_type"`
// Indication that the recipient is a legal person
// * true — a legal person,
// * false — a natural person.
IsLegal bool `json:"is_legal"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Payment method
PaymentTypeGroupName string `json:"payment_type_group_name"`
// Delivery region
Region string `json:"region"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
// Name of the warehouse from which the order is shipped
WarehouseName string `json:"warehouse_name"`
}
type FBOPostingProduct struct {
@@ -164,7 +170,7 @@ func (c FBO) GetShipmentsList(params *GetFBOShipmentsListParams) (*GetFBOShipmen
resp := &GetFBOShipmentsListResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -196,41 +202,15 @@ type GetShipmentDetailsResponse struct{
core.CommonResponse
// Method result
Result struct{
Result GetShipmentDetailsResult `json:"result"`
}
type GetShipmentDetailsResult struct {
// Additional data
AdditionalData []struct{
Key string `json:"key"`
Value string `json:"value"`
} `json:"additional_data"`
AdditionalData []GetShipmentDetailsResultAdditionalData `json:"additional_data"`
// Analytical data
AnalyticsData struct{
// Delivery city
City string `json:"Delivery city"`
// Delivery method
DeliveryType string `json:"delivery_type"`
// Indication that the recipient is a legal person:
// - true — a legal person
// - false — a natural person
IsLegal bool `json:"is_legal"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Payment method
PaymentTypeGroupName string `json:"payment_type_group_name"`
// Delivery region
Region string `json:"region"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
// Name of the warehouse from which the order is shipped
WarehouseName string `json:"warehouse_name"`
} `json:"analytics_data"`
AnalyticsData GetShipmentDetailsResultAnalyticsData `json:"analytics_data"`
// Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"`
@@ -258,7 +238,39 @@ type GetShipmentDetailsResponse struct{
// Shipment status
Status string `json:"status"`
} `json:"result"`
}
type GetShipmentDetailsResultAdditionalData struct {
Key string `json:"key"`
Value string `json:"value"`
}
type GetShipmentDetailsResultAnalyticsData struct {
// Delivery city
City string `json:"Delivery city"`
// Delivery method
DeliveryType string `json:"delivery_type"`
// Indication that the recipient is a legal person:
// - true — a legal person
// - false — a natural person
IsLegal bool `json:"is_legal"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Payment method
PaymentTypeGroupName string `json:"payment_type_group_name"`
// Delivery region
Region string `json:"region"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
// Name of the warehouse from which the order is shipped
WarehouseName string `json:"warehouse_name"`
}
// Returns information about the shipment by its identifier
@@ -267,7 +279,267 @@ func (c FBO) GetShipmentDetails(params *GetShipmentDetailsParams) (*GetShipmentD
resp := &GetShipmentDetailsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type ListSupplyRequestsParams struct {
// Number of the page returned in the request
Page int32 `json:"page"`
// Number of elements on the page
PageSize int32 `json:"page_size"`
// Filter on status of a supply by request
States []SupplyRequestState `json:"states"`
}
type ListSupplyRequestsResponse 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 information on the remaining requests;
// - false — the entire array of requests for the filter specified in the request was returned in the response
HasNext bool `json:"has_next"`
// Supply requests list
SupplyOrders []SupplyRequestCommonResponse `json:"supply_orders"`
// Total requests number
TotalSupplyOrdersCount int32 `json:"total_supply_orders_count"`
}
type SupplyRequestCommonResponse struct {
// Supply request creation date
CreatedAt string `json:"created_at"`
// Local time supply interval
LocalTimeslot SupplyRequestCommonResponseLocalTimeslot `json:"local_timeslot"`
// Date from which you want to bring the supply to the warehouse. Only for supplies via vDC
PreferredSupplyDataFrom string `json:"preferred_supply_data_from"`
// Date by which you want to bring the supply to the warehouse. Only for supplies via vDC
PreferredSupplyDataTo string `json:"preferred_supply_data_to"`
// Status of a supply by request
State string `json:"state"`
// Supply request identifier
SupplyOrderId int64 `json:"supply_order_id"`
// Supply request number
SupplyOrderNumber string `json:"supply_order_number"`
// Supply warehouse
SupplyWarehouse SupplyRequestCommonResponseSupplyWarehouse `json:"supply_warehouse"`
// time_left_to_prepare_supply
TimeLeftToPrepareSupply int64 `json:"time_left_to_prepare_supply"`
// Time in seconds left to select the supply option. Only for supplies via vDC
TimeLeftToSelectSupplyVariant int64 `json:"time_left_to_select_supply_variant"`
// total_items_count
TotalItemsCount int32 `json:"total_items_count"`
// Total number of items in the request
TotalQuantity int32 `json:"total_quantity"`
}
type SupplyRequestCommonResponseLocalTimeslot struct {
// Interval start
From string `json:"from"`
// Interval end
To string `json:"to"`
}
type SupplyRequestCommonResponseSupplyWarehouse struct {
// Warehouse address
Address string `json:"address"`
// Warehouse name
Name string `json:"name"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
}
// Method for getting a list of supply requests to the Ozon warehouse.
// Requests with supply both to a specific warehouse and via a virtual
// distribution center (vDC) are taken into account
func (c FBO) ListSupplyRequests(params *ListSupplyRequestsParams) (*ListSupplyRequestsResponse, error) {
url := "/v1/supply-order/list"
resp := &ListSupplyRequestsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetSupplyRequestInfoParams struct {
// Supply request identifier
SupplyOrderId int64 `json:"supply_order_id"`
}
type GetSupplyRequestInfoResponse struct {
core.CommonResponse
SupplyRequestCommonResponse
// Driver and car information
VehicleInfo GetSupplyRequestInfoVehicle `json:"vehicle_info"`
}
type GetSupplyRequestInfoVehicle struct {
// Driver name
DriverName string `json:"driver_name"`
// Driver phone number
DriverPhone string `json:"driver_phone"`
// Car model
VehicleModel string `json:"vehicle_model"`
// Car number
VehicleNumber string `json:"vehicle_number"`
}
// Method for getting detailed information on a supply request.
// Requests with supply both to a specific warehouse and via a
// virtual distribution center (vDC) are taken into account
func (c FBO) GetSupplyRequestInfo(params *GetSupplyRequestInfoParams) (*GetSupplyRequestInfoResponse, error) {
url := "/v1/supply-order/get"
resp := &GetSupplyRequestInfoResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
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(params *ListProductsInSupplyRequestParams) (*ListProductsInSupplyRequestResponse, error) {
url := "/v1/supply-order/items"
resp := &ListProductsInSupplyRequestResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetWarehouseWorkloadResponse struct {
core.CommonResponse
// Method result
Result []GetWarehouseWorkloadResult `json:"result"`
}
type GetWarehouseWorkloadResult struct {
// Workload
Schedule GetWarehouseWorkloadResultSchedule `json:"schedule"`
// Warehouse
Warehouse GetWarehouseWorkloadResultWarehouse `json:"warehouse"`
}
type GetWarehouseWorkloadResultSchedule struct {
// Data on the products quantity supplied to the warehouse
Capacity []GetWarehouseWorkloadResultScheduleCapacity `json:"capacity"`
// The closest available date for supply, local time
Date time.Time `json:"date"`
}
type GetWarehouseWorkloadResultScheduleCapacity struct {
// Period start, local time
Start time.Time `json:"start"`
// Period end, local time
End time.Time `json:"end"`
// Average number of products that the warehouse can accept per day for the period
Value int32 `json:"value"`
}
type GetWarehouseWorkloadResultWarehouse struct {
// Warehouse identifier
Id string `json:"id"`
// Warehouse name
Name string `json:"name"`
}
// Method returns a list of active Ozon warehouses with information about their average workload in the nearest future
func (c FBO) GetWarehouseWorkload() (*GetWarehouseWorkloadResponse, error) {
url := "/v1/supplier/available_warehouses"
resp := &GetWarehouseWorkloadResponse{}
response, err := c.client.Request(http.MethodGet, url, nil, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -43,8 +43,8 @@ func TestGetFBOShipmentsList(t *testing.T) {
"posting_number": "16965409-0014-1",
"status": "delivered",
"cancel_reason_id": 0,
"created_at": "2021-09-01T00:23:45.607Z",
"in_process_at": "2021-09-01T00:25:30.120Z",
"created_at": "2021-09-01T00:23:45.607000Z",
"in_process_at": "2021-09-01T00:25:30.120000Z",
"products": [
{
"sku": 160249683,
@@ -277,3 +277,266 @@ func TestGetShipmentDetails(t *testing.T) {
}
}
}
func TestListSupplyRequests(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *ListSupplyRequestsParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&ListSupplyRequestsParams{
Page: 0,
PageSize: 0,
States: []SupplyRequestState{AcceptanceAtStorageWarehouse},
},
`{
"has_next": true,
"supply_orders": [
{
"created_at": "string",
"local_timeslot": {
"from": "string",
"to": "string"
},
"preferred_supply_date_from": "string",
"preferred_supply_date_to": "string",
"state": "string",
"supply_order_id": 0,
"supply_order_number": "string",
"supply_warehouse": {
"address": "string",
"name": "string",
"warehouse_id": 0
},
"time_left_to_prepare_supply": 0,
"time_left_to_select_supply_variant": 0,
"total_items_count": 0,
"total_quantity": 0
}
],
"total_supply_orders_count": 0
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&ListSupplyRequestsParams{},
`{
"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))
resp, err := c.FBO().ListSupplyRequests(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestGetSupplyRequestInfo(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *GetSupplyRequestInfoParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&GetSupplyRequestInfoParams{
SupplyOrderId: 0,
},
`{
"created_at": "string",
"local_timeslot": {
"from": "string",
"to": "string"
},
"preferred_supply_date_from": "string",
"preferred_supply_date_to": "string",
"seller_warehouse": {
"address": "string",
"name": "string",
"warehouse_id": 0
},
"state": "string",
"supply_order_id": 0,
"supply_order_number": "string",
"supply_warehouse": {
"address": "string",
"name": "string",
"warehouse_id": 0
},
"time_left_to_prepare_supply": 0,
"time_left_to_select_supply_variant": 0,
"total_items_count": 0,
"total_quantity": 0,
"vehicle_info": {
"driver_name": "string",
"driver_phone": "string",
"vehicle_model": "string",
"vehicle_number": "string"
}
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&GetSupplyRequestInfoParams{},
`{
"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))
resp, err := c.FBO().GetSupplyRequestInfo(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
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))
resp, err := c.FBO().ListProductsInSupplyRequest(test.params)
if err != nil {
t.Error(err)
}
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()
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": [
{
"schedule": {
"capacity": [
{
"start": "2019-08-24T14:15:22Z",
"end": "2019-08-24T14:15:22Z",
"value": 0
}
],
"date": "2019-08-24T14:15:22Z"
},
"warehouse": {
"id": "string",
"name": "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))
resp, err := c.FBO().GetWarehouseWorkload()
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -751,11 +751,11 @@ func TestListOfShipmentCertificates(t *testing.T) {
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&ListOfShipmentCertificatesParams{
Limit: 100,
Filter: ListOfShipmentCertificates{
Filter: ListOfShipmentCertificatesFilter{
DateFrom: "2021-08-04",
DateTo: "2022-08-04",
IntegrationType: "ozon",
Status: []string{"delivered"},
Status: []ShipmentCertificateFilterStatus{ShitmentCertificateFilterFormed},
},
},
`{
@@ -1480,8 +1480,8 @@ func TestRescheduleShipmentDeliveryDate(t *testing.T) {
&RescheduleShipmentDeliveryDateParams{
PostingNumber: "23281294-0063-2",
NewTimeslot: RescheduleShipmentDeliveryDateTimeslot{
DeliveryDateBegin: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-03T11:07:00.381Z"),
DeliveryDateEnd: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-03T11:07:00.381Z"),
From: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-25T08:51:56.932Z"),
To: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-25T08:51:56.932Z"),
},
},
`{

View File

@@ -20,9 +20,18 @@ type ReportOnSoldProductsResponse struct {
core.CommonResponse
// Query result
Result []struct {
Result []ReportonSoldProductsResult `json:"result"`
}
type ReportonSoldProductsResult struct {
// Report title page
Header []struct {
Header []ReportOnSoldProductsResultHeader `json:"header"`
// Report table
Rows []ReportOnSoldProductsResultRow `json:"rows"`
}
type ReportOnSoldProductsResultHeader struct {
// Report ID
Id string `json:"num"`
@@ -67,10 +76,9 @@ type ReportOnSoldProductsResponse struct {
// Period end in the report
StopDate string `json:"stop_date"`
} `json:"header"`
}
// Report table
Rows []struct {
type ReportOnSoldProductsResultRow struct {
// Row number
RowNumber int32 `json:"row_number"`
@@ -138,8 +146,6 @@ type ReportOnSoldProductsResponse struct {
// Quantity of returned products
ReturnQuantity int32 `json:"return_qty"`
} `json:"rows"`
} `json:"result"`
}
// Returns information on products sold and returned within a month. Canceled or non-purchased products are not included.
@@ -150,7 +156,7 @@ func (c Finance) ReportOnSoldProducts(params *ReportOnSoldProductsParams) (*Repo
resp := &ReportOnSoldProductsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -196,7 +202,10 @@ type GetTotalTransactionsSumResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetTotalTransactionsSumResult `json:"result"`
}
type GetTotalTransactionsSumResult struct {
// Total cost of products and returns for specified period
AccrualsForSale float64 `json:"accruals_for_sale"`
@@ -229,7 +238,6 @@ type GetTotalTransactionsSumResponse struct {
// The additional services cost that are not directly related to deliveries and returns.
// For example, promotion or product placement
ServicesAmount float64 `json:"services_amount"`
} `json:"result"`
}
// Returns total sums for transactions for specified period
@@ -238,7 +246,7 @@ func (c Finance) GetTotalTransactionsSum(params *GetTotalTransactionsSumParams)
resp := &GetTotalTransactionsSumResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -290,9 +298,21 @@ type ListTransactionsResponse struct{
core.CommonResponse
// Method result
Result struct{
Result ListTransactionsResult `json:"result"`
}
type ListTransactionsResult struct {
// Transactions infromation
Operations []struct{
Operations []ListTransactionsResultOperation `json:"operations"`
// Number of pages
PageCount int64 `json:"page_count"`
// Number of products
RowCount int64 `json:"row_count"`
}
type ListTransactionsResultOperation struct {
// Cost of the products with seller's discounts applied
AccrualsForSale float64 `json:"accruals_for_sale"`
@@ -303,13 +323,7 @@ type ListTransactionsResponse struct{
DeliveryCharge float64 `json:"delivery_charge"`
// Product information
Items []struct{
// Product name
Name string `json:"name"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
} `json:"items"`
Items []ListTransactionsResultOperationItem `json:"items"`
// Operation date
OperationDate string `json:"operation_date"`
@@ -324,7 +338,30 @@ type ListTransactionsResponse struct{
OperationTypeName string `json:"operation_type_name"`
// Shipment information
Posting struct{
Posting ListTransactionsResultOperationPosting `json:"posting"`
// Returns and cancellation cost for charges by rates that were in effect until February 1, 2021, and for charges for bulky products
ReturnDeliveryCharge float64 `json:"return_delivery_charge"`
// Sales commission or sales commission refund
SaleCommission float64 `json:"sale_commission"`
// Additional services
Services []ListTransactionsResultOperationService `json:"services"`
// Transaction type
Type string `json:"type"`
}
type ListTransactionsResultOperationItem struct {
// Product name
Name string `json:"name"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
}
type ListTransactionsResultOperationPosting struct {
// Delivery scheme:
// - FBO — delivery to Ozon warehouse
// - FBS — delivery from seller's warehouse
@@ -340,33 +377,14 @@ type ListTransactionsResponse struct{
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
} `json:"posting"`
}
// Returns and cancellation cost for charges by rates that were in effect until February 1, 2021, and for charges for bulky products
ReturnDeliveryCharge float64 `json:"return_delivery_charge"`
// Sales commission or sales commission refund
SaleCommission float64 `json:"sale_commission"`
// Additional services
Services []struct{
type ListTransactionsResultOperationService struct {
// Service name
Name string `json:"name"`
// Price
Price float64 `json:"price"`
} `json:"services"`
// Transaction type
Type string `json:"type"`
} `json:"operations"`
// Number of pages
PageCount int64 `json:"page_count"`
// Number of products
RowCount int64 `json:"row_count"`
} `json:"result"`
}
// Returns detailed information on all accruals. The maximum period for which you can get information in one request is 1 month.
@@ -377,7 +395,7 @@ func (c Finance) ListTransactions(params *ListTransactionsParams) (*ListTransact
resp := &ListTransactionsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -31,7 +31,7 @@ func (c Invoices) CreateUpdate(params *CreateUpdateProformaLinkParams) (*CreateU
resp := &CreateUpdateProformaLinkResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -49,10 +49,12 @@ type GetProformaLinkResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetProformaLinkResult `json:"result"`
}
type GetProformaLinkResult struct {
// Proforma invoice link
FileURL string `json:"file_url"`
} `json:"result"`
}
// Get a proforma invoice link
@@ -61,7 +63,7 @@ func (c Invoices) Get(params *GetProformaLinkParams) (*GetProformaLinkResponse,
resp := &GetProformaLinkResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -87,7 +89,7 @@ func (c Invoices) Delete(params *DeleteProformaLinkParams) (*DeleteProformaLinkR
resp := &DeleteProformaLinkResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -30,6 +30,7 @@ type Client struct {
brands *Brands
chats *Chats
certificates *Certificates
strategies *Strategies
}
func (c Client) Analytics() *Analytics {
@@ -100,6 +101,10 @@ func (c Client) Certificates() *Certificates {
return c.certificates
}
func (c Client) Strategies() *Strategies {
return c.strategies
}
func NewClient(clientId, apiKey string) *Client {
coreClient := core.NewClient(DefaultAPIBaseUrl, map[string]string{
"Client-Id": clientId,
@@ -125,6 +130,7 @@ func NewClient(clientId, apiKey string) *Client {
brands: &Brands{client: coreClient},
chats: &Chats{client: coreClient},
certificates: &Certificates{client: coreClient},
strategies: &Strategies{client: coreClient},
}
}
@@ -150,5 +156,6 @@ func NewMockClient(handler http.HandlerFunc) *Client {
brands: &Brands{client: coreClient},
chats: &Chats{client: coreClient},
certificates: &Certificates{client: coreClient},
strategies: &Strategies{client: coreClient},
}
}

View File

@@ -30,7 +30,7 @@ func (c Polygons) CreateDelivery(params *CreateDeliveryPolygonParams) (*CreateDe
resp := &CreateDeliveryPolygonResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -76,7 +76,7 @@ func (c Polygons) Link(params *LinkDeliveryMethodToPolygonParams) (*LinkDelivery
resp := &LinkDeliveryMethodToPolygonResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -100,7 +100,7 @@ func (c Polygons) Delete(params *DeletePolygonParams) (*DeletePolygonResponse, e
resp := &DeletePolygonResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

File diff suppressed because it is too large Load Diff

View File

@@ -168,7 +168,24 @@ func TestGetProductDetails(t *testing.T) {
"has_stock": false,
"active_product": false
},
"price_index": "0.00",
"price_indexes": {
"external_index_data": {
"minimal_price": "string",
"minimal_price_currency": "string",
"price_index_value": 0
},
"ozon_index_data": {
"minimal_price": "string",
"minimal_price_currency": "string",
"price_index_value": 0
},
"price_index": "WITHOUT_INDEX",
"self_marketplaces_index_data": {
"minimal_price": "string",
"minimal_price_currency": "string",
"price_index_value": 0
}
},
"commissions": [],
"volume_weight": 0.1,
"is_prepayment": false,
@@ -2407,3 +2424,128 @@ func TestSetDiscountOnMarkdownProduct(t *testing.T) {
}
}
}
func TestNumberOfSubsToProductAvailability(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *NumberOfSubsToProductAvailabilityParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&NumberOfSubsToProductAvailabilityParams{
SKUS: []int64{1234},
},
`{
"result": [
{
"count": 2,
"sku": 1234
}
]
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&NumberOfSubsToProductAvailabilityParams{},
`{
"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))
resp, err := c.Products().NumberOfSubsToProductAvailability(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
if resp.StatusCode == http.StatusOK {
if len(resp.Result) != len(test.params.SKUS) {
t.Errorf("Length of SKUS in request and response are not equal")
}
if len(resp.Result) > 0 {
if resp.Result[0].SKU != test.params.SKUS[0] {
t.Errorf("SKU in request and response are not equal")
}
}
}
}
}
func TestUpdateCharacteristics(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *UpdateCharacteristicsParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&UpdateCharacteristicsParams{
Items: []UpdateCharacteristicsItem{
{
Attributes: []UpdateCharacteristicsItemAttribute{
{
ComplexId: 0,
Id: 0,
Values: []UpdateCharacteristicsItemValue{
{
DictionaryValueId: 0,
Value: "string",
},
},
},
},
OfferId: "string",
},
},
},
`{
"task_id": 0
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&UpdateCharacteristicsParams{},
`{
"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))
resp, err := c.Products().UpdateCharacteristics(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}

View File

@@ -15,7 +15,10 @@ type GetAvailablePromotionsResponse struct {
core.CommonResponse
// Method result
Result []struct {
Result []GetAvailablePromotionsResult `json:"result"`
}
type GetAvailablePromotionsResult struct {
// Promotion identifier
Id float64 `json:"id"`
@@ -67,7 +70,6 @@ type GetAvailablePromotionsResponse struct {
// Discount size
DiscountValue float64 `json:"discount_value"`
} `json:"result"`
}
// A method for getting a list of promotions that you can participate in
@@ -76,7 +78,7 @@ func (c Promotions) GetAvailablePromotions() (*GetAvailablePromotionsResponse, e
resp := &GetAvailablePromotionsResponse{}
response, err := c.client.Request(http.MethodGet, url, nil, resp)
response, err := c.client.Request(http.MethodGet, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -108,19 +110,23 @@ type AddProductToPromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
Result AddProductToPromotionResult `json:"result"`
}
type AddProductToPromotionResult struct {
// List of product identifiers that were added to the promotion
ProductIds []float64 `json:"product_ids"`
// List of products that weren't added to the promotion
Rejected []struct {
Rejected []AddProductToPromotionResultRejected `json:"rejected"`
}
type AddProductToPromotionResultRejected struct {
// Product identifier
ProductId float64 `json:"product_id"`
// Reason why the product wasn't added to the promotion
Reason string `json:"reason"`
} `json:"rejected"`
} `json:"result"`
}
// A method for adding products to an available promotion
@@ -129,7 +135,7 @@ func (c Promotions) AddToPromotion(params *AddProductToPromotionParams) (*AddPro
resp := &AddProductToPromotionResponse{}
response, err := c.client.Request(http.MethodGet, url, params, resp)
response, err := c.client.Request(http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -154,13 +160,15 @@ type ProductsAvailableForPromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
Result ProductsAvailableForPromotionResult `json:"result"`
}
type ProductsAvailableForPromotionResult struct {
// Products list
Products []PromotionProduct `json:"products"`
// Total number of products that can participate in the promotion
Total float64 `json:"total"`
} `json:"result"`
}
type PromotionProduct struct {
@@ -192,7 +200,7 @@ func (c Promotions) ProductsAvailableForPromotion(params *ProductsAvailableForPr
resp := &ProductsAvailableForPromotionResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -216,13 +224,15 @@ type ProductsInPromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
Result ProductsInPromotionResult `json:"reuslt"`
}
type ProductsInPromotionResult struct {
// Products list
Products []PromotionProduct `json:"products"`
// Total number of products that can participate in the promotion
Total float64 `json:"total"`
} `json:"reuslt"`
}
// A method for getting the list of products participating in the promotion by its identifier
@@ -231,7 +241,7 @@ func (c Promotions) ProductsInPromotion(params *ProductsInPromotionParams) (*Pro
resp := &ProductsInPromotionResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -252,19 +262,23 @@ type RemoveProductFromPromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
Result RemoveProductFromPromotionResult `json:"result"`
}
type RemoveProductFromPromotionResult struct {
// List of product identifiers that were removed from the promotion
ProductIds []float64 `json:"product_ids"`
// List of product identifiers that weren't removed from the promotion
Rejected []struct {
Rejected []RemoveProductFromPromotionResultRejected `json:"rejected"`
}
type RemoveProductFromPromotionResultRejected struct {
// Product identifier
ProductId float64 `json:"product_id"`
// Reason why the product wasn't removed from the promotion
Reason string `json:"reason"`
} `json:"rejected"`
} `json:"result"`
}
// A method for removing products from the promotion
@@ -273,7 +287,7 @@ func (c Promotions) RemoveProduct(params *RemoveProductFromPromotionParams) (*Re
resp := &RemoveProductFromPromotionResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -286,7 +300,10 @@ type ListHotSalePromotionsResponse struct {
core.CommonResponse
// Method result
Result []struct {
Result []ListHotSalePromotionsResult `json:"result"`
}
type ListHotSalePromotionsResult struct {
// Promotion end date
DateEnd string `json:"date_end"`
@@ -312,7 +329,6 @@ type ListHotSalePromotionsResponse struct {
// Promotion name
Title string `json:"title"`
} `json:"result"`
}
// List of available Hot Sale promotions
@@ -321,7 +337,7 @@ func (c Promotions) ListHotSalePromotions() (*ListHotSalePromotionsResponse, err
resp := &ListHotSalePromotionsResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -345,9 +361,18 @@ type ProductsAvailableForHotSalePromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
Result ProductsAvailableForHotSalePromotionResult `json:"result"`
}
type ProductsAvailableForHotSalePromotionResult struct {
// Products list
Products []struct {
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"`
@@ -368,11 +393,6 @@ type ProductsAvailableForHotSalePromotionResponse struct {
// Number of product units in a stock discount type promotion
Stock float64 `json:"stock"`
} `json:"products"`
// Total number of products that are available for the promotion
Total float64 `json:"total"`
} `json:"result"`
}
// Method for getting a list of products that can participate or are already participating in the Hot Sale promotion
@@ -381,7 +401,7 @@ func (c Promotions) ProductsAvailableForHotSalePromotion(params *ProductsAvailab
resp := &ProductsAvailableForHotSalePromotionResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -413,16 +433,20 @@ type ProductsToHotSaleResponse struct {
core.CommonResponse
// Method result
Result struct {
Result ProductsToHotSaleResult `json:"result"`
}
type ProductsToHotSaleResult struct {
// List of products that haven't been added to the promotion
Rejected []struct {
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"`
} `json:"rejected"`
} `json:"result"`
}
func (c Promotions) AddProductsToHotSale(params *AddProductsToHotSaleParams) (*ProductsToHotSaleResponse, error) {
@@ -430,7 +454,7 @@ func (c Promotions) AddProductsToHotSale(params *AddProductsToHotSaleParams) (*P
resp := &ProductsToHotSaleResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -453,7 +477,7 @@ func (c Promotions) RemoveProductsToHotSale(params *RemoveProductsToHotSaleParam
resp := &ProductsToHotSaleResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -464,7 +488,7 @@ func (c Promotions) RemoveProductsToHotSale(params *RemoveProductsToHotSaleParam
type ListDiscountRequestsParams struct {
// Discount request status
Status string `json:"status" default:"UNKNOWN"`
Status ListDiscountRequestsStatus `json:"status" default:"UNKNOWN"`
// Page number from which you want to download the list of discount requests
Page uint64 `json:"page"`
@@ -477,7 +501,10 @@ type ListDiscountRequestsResponse struct {
core.CommonResponse
// List of requests
Result []struct {
Result []ListDiscountRequestsResult `json:"result"`
}
type ListDiscountRequestsResult struct {
// Request ID
Id uint64 `json:"id"`
@@ -582,7 +609,6 @@ type ListDiscountRequestsResponse struct {
// Approved price fee percent
ApprovedPriceFeePercent float64 `json:"approved_price_fee_percent"`
} `json:"result"`
}
// Method for getting a list of products that customers want to buy with discount
@@ -591,7 +617,7 @@ func (c Promotions) ListDiscountRequests(params *ListDiscountRequestsParams) (*L
resp := &ListDiscountRequestsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -626,22 +652,26 @@ type DiscountRequestResponse struct {
core.CommonResponse
// Method result
Result struct {
// Errors when creating a request
FailDetails []struct {
// Request ID
TaskId uint64 `json:"task_id"`
Result DiscountRequestResult `json:"result"`
}
// Error message
ErrorForUser string `json:"error_for_user"`
} `json:"fail_details"`
type DiscountRequestResult struct {
// Errors when creating a request
FailDetails []DiscountRequestResultFailDetail `json:"fail_details"`
// The number of requests with a successful status change
SuccessCount int32 `json:"success_count"`
// The number of requests that failed to change their status
FailCount int32 `json:"fail_count"`
} `json:"result"`
}
type DiscountRequestResultFailDetail struct {
// Request ID
TaskId uint64 `json:"task_id"`
// Error message
ErrorForUser string `json:"error_for_user"`
}
// You can approve applications in statuses:
@@ -652,7 +682,7 @@ func (c Promotions) ApproveDiscountRequest(params *DiscountRequestParams) (*Disc
resp := &DiscountRequestResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -669,7 +699,7 @@ func (c Promotions) DeclineDiscountRequest(params *DiscountRequestParams) (*Disc
resp := &DiscountRequestResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -15,29 +15,27 @@ type GetCurrentSellerRatingInfoResponse struct {
core.CommonResponse
// Rating groups list
Groups []struct {
Groups []GetCurrentSellerRatingInfoGroup `json:"groups"`
}
type GetCurrentSellerRatingInfoGroup struct {
// Ratings group name
GroupName string `json:"group_name"`
// Ratings list
Items []struct {
Items []GetCurrentSellerRatingInfoGroupItem `json:"items"`
// An indication that the penalty points balance is exceeded
PenaltyScoreExceeded bool `json:"penalty_score_exceeded"`
// An indication that you participate in the Premium program
Premium bool `json:"premium"`
}
type GetCurrentSellerRatingInfoGroupItem struct {
// Rating change: the ratio of the previous value to the current one
Change struct {
// How the rating value has changed:
// - DIRECTION_UNKNOWN — unknown.
// - DIRECTION_NONE — has not changed.
// - DIRECTION_RISE — has increased.
// - DIRECTION_FALL — has dropped.
Direction string `json:"direction"`
// What the change means:
// - MEANING_UNKNOWN — unknown.
// - MEANING_NONE — neutral.
// - MEANING_GOOD — the indicator is improving, everything is good.
// - MEANING_BAD — the indicator is dropping, you should do something.
Meaning string `json:"meaning"`
} `json:"change"`
Change GetCurrentSellerRatingInfoGroupItemChange `json:"change"`
// Current rating value
CurrentValue float64 `json:"current_value"`
@@ -74,14 +72,22 @@ type GetCurrentSellerRatingInfoResponse struct {
// - REVIEW_SCORE — score,
// - COUNT
ValueType string `json:"value_type"`
} `json:"items"`
}
// An indication that the penalty points balance is exceeded
PenaltyScoreExceeded bool `json:"penalty_score_exceeded"`
type GetCurrentSellerRatingInfoGroupItemChange struct {
// How the rating value has changed:
// - DIRECTION_UNKNOWN — unknown.
// - DIRECTION_NONE — has not changed.
// - DIRECTION_RISE — has increased.
// - DIRECTION_FALL — has dropped.
Direction string `json:"direction"`
// An indication that you participate in the Premium program
Premium bool `json:"premium"`
} `json:"groups"`
// What the change means:
// - MEANING_UNKNOWN — unknown.
// - MEANING_NONE — neutral.
// - MEANING_GOOD — the indicator is improving, everything is good.
// - MEANING_BAD — the indicator is dropping, you should do something.
Meaning string `json:"meaning"`
}
func (c Rating) GetCurrentSellerRatingInfo() (*GetCurrentSellerRatingInfoResponse, error) {
@@ -89,7 +95,7 @@ func (c Rating) GetCurrentSellerRatingInfo() (*GetCurrentSellerRatingInfoRespons
resp := &GetCurrentSellerRatingInfoResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -116,12 +122,21 @@ type GetSellerRatingInfoPeriodResponse struct {
core.CommonResponse
// Information on the Premium program penalty points
PremiumScores []struct {
PremiumScores []GetSellerRatingInfoPeriodPremiumScores `json:"premium_scores"`
// Information on the seller ratings
Ratings []GetSellerRatingInfoPeriodRating `json:"ratings"`
}
type GetSellerRatingInfoPeriodPremiumScores struct {
// Rating name
Rating string `json:"rating"`
// Information on penalty points
Scores []struct {
Scores []GetSellerRatingInfoPeriodPremiumScore `json:"scores"`
}
type GetSellerRatingInfoPeriodPremiumScore struct {
// Date when the penalty points were received
Date time.Time `json:"date"`
@@ -130,11 +145,9 @@ type GetSellerRatingInfoPeriodResponse struct {
// Number of received penalty points
Value int32 `json:"value"`
} `json:"scores"`
} `json:"premium_scores"`
}
// Information on the seller ratings
Ratings []struct {
type GetSellerRatingInfoPeriodRating struct {
// Rating threshold, after which sales will be blocked
DangerThreshold float64 `json:"danger_threshold"`
@@ -145,7 +158,13 @@ type GetSellerRatingInfoPeriodResponse struct {
Rating string `json:"rating"`
// Rating values list
Values []struct {
Values []GetSellerRatingInfoPeriodRatingValue `json:"values"`
// Rating threshold, after which a warning about possible blocking appears
WarningThreshold float64 `json:"warning_threshold"`
}
type GetSellerRatingInfoPeriodRatingValue struct {
// Rating calculation start date
DateFrom time.Time `json:"date_from"`
@@ -153,7 +172,13 @@ type GetSellerRatingInfoPeriodResponse struct {
DateTo time.Time `json:"date_to"`
// Rating status
Status struct {
Status GetSellerRatingInfoPeriodRatingValueStatus `json:"status"`
// Rating value
Value float64 `json:"value"`
}
type GetSellerRatingInfoPeriodRatingValueStatus struct {
// Indication if the rating threshold for blocking is exceeded
Danger bool `json:"danger"`
@@ -162,15 +187,6 @@ type GetSellerRatingInfoPeriodResponse struct {
// Indication of a warning that the threshold for blocking may be exceeded
Warning bool `json:"warning"`
} `json:"status"`
// Rating value
Value float64 `json:"value"`
} `json:"values"`
// Rating threshold, after which a warning about possible blocking appears
WarningThreshold float64 `json:"warning_threshold"`
} `json:"ratings"`
}
func (c Rating) GetSellerRatingInfoForPeriod(params *GetSellerRatingInfoForPeriodParams) (*GetSellerRatingInfoPeriodResponse, error) {
@@ -178,7 +194,7 @@ func (c Rating) GetSellerRatingInfoForPeriod(params *GetSellerRatingInfoForPerio
resp := &GetSellerRatingInfoPeriodResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -38,9 +38,18 @@ type GetReportsListResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetReportsListResult `json:"result"`
}
type GetReportsListResult struct {
// Array with generated reports
Reports []struct {
Reports []GetReportsListResultReport `json:"reports"`
// Total number of reports
Total int32 `json:"total"`
}
type GetReportsListResultReport struct {
// Unique report identifier
Code string `json:"code"`
@@ -54,8 +63,7 @@ type GetReportsListResponse struct {
File string `json:"file"`
// Array with the filters specified when the seller created the report
Params struct {
} `json:"params"`
Params map[string]string `json:"params"`
// Report type:
// - SELLER_PRODUCTS — products report,
@@ -72,11 +80,6 @@ type GetReportsListResponse struct {
// - `success`
// - `failed`
Status string `json:"status"`
} `json:"reports"`
// Total number of reports
Total int32 `json:"total"`
} `json:"result"`
}
// Returns the list of reports that have been generated before
@@ -85,7 +88,7 @@ func (c Reports) GetList(params *GetReportsListParams) (*GetReportsListResponse,
resp := &GetReportsListResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -103,7 +106,10 @@ type GetReportDetailsResponse struct {
core.CommonResponse
// Report details
Result struct {
Result GetReportDetailResult `json:"result"`
}
type GetReportDetailResult struct {
// Unique report identifier
Code string `json:"code"`
@@ -134,7 +140,6 @@ type GetReportDetailsResponse struct {
// - success
// - failed
Status string `json:"status"`
} `json:"result"`
}
// Returns information about a created report by its identifier
@@ -143,7 +148,7 @@ func (c Reports) GetReportDetails(params *GetReportDetailsParams) (*GetReportDet
resp := &GetReportDetailsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -159,6 +164,9 @@ type GetFinancialReportParams struct {
// Number of the page returned in the request
Page int64 `json:"page"`
// true, если нужно добавить дополнительные параметры в ответ
WithDetails bool `json:"with_details"`
// Number of items on the page
PageSize int64 `json:"page_size"`
}
@@ -175,20 +183,23 @@ type GetFinancialReportResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetFinancialResultResult `json:"result"`
}
type GetFinancialResultResult struct {
// Reports list
CashFlows []struct {
CashFlows []GetFinancialResultResultCashflow `json:"cash_flows"`
// Detailed info
Details GetFinancialResultResultDetail `json:"details"`
// Number of pages with reports
PageCount int64 `json:"page_count"`
}
type GetFinancialResultResultCashflow struct {
// Period data
Period struct {
// Period identifier
Id int64 `json:"id"`
// Period start
Begin time.Time `json:"begin"`
// Period end
End time.Time `json:"end"`
} `json:"period"`
Period GetFinancialResultResultCashflowPeriod `json:"period"`
// Sum of sold products prices
OrdersAmount float64 `json:"order_amount"`
@@ -207,11 +218,177 @@ type GetFinancialReportResponse struct {
// Code of the currency used to calculate the commissions
CurrencyCode string `json:"currency_code"`
} `json:"cash_flows"`
}
// Number of pages with reports
PageCount int64 `json:"page_count"`
} `json:"result"`
type GetFinancialResultResultCashflowPeriod struct {
// Period identifier
Id int64 `json:"id"`
// Period start
Begin time.Time `json:"begin"`
// Period end
End time.Time `json:"end"`
}
type GetFinancialResultResultDetail struct {
// Balance on the beginning of period
BeginBalanceAmount float64 `json:"begin_balance_amount"`
// Orders
Delivery GetFinancialResultResultDetailDelivery `json:"delivery"`
// Amount to be paid for the period
InvoiceTransfer float64 `json:"invoice_transfer"`
// Transfer under loan agreements
Loan float64 `json:"loan"`
// Paid for the period
Payments []GetFinancialResultResultDetailPayment `json:"payments"`
// Period data
Period GetFinancialResultResultDetailPeriod `json:"period"`
// Returns and cancellations
Return GetFinancialResultResultDetailReturn `json:"return"`
// rFBS transfers
RFBS GetFinancialResultResultDetailRFBS `json:"rfbs"`
// Services
Services GetFinancialResultResultDetailService `json:"services"`
// Compensation and other accruals
Others GetFinancialResultResultDetailOthers `json:"others"`
// Balance at the end of the period
EndBalanceAmount float64 `json:"end_balance_amount"`
}
type GetFinancialResultResultDetailDelivery struct {
// Total amount
Total float64 `json:"total"`
// Amount for which products were purchased, including commission fees
Amount float64 `json:"amount"`
// Processing and delivery fees
DeliveryServices GetFinancialResultResultDetailDeliveryServices `json:"delivery_services"`
}
type GetFinancialResultResultDetailDeliveryServices struct {
// Total amount
Total float64 `json:"total"`
// Details
Items []GetFinancialResultResultDetailDeliveryServicesItem `json:"items"`
}
type GetFinancialResultResultDetailDeliveryServicesItem struct {
// Operation name
Name DetailsDeliveryItemName `json:"name"`
// Amount by operation
Price float64 `json:"price"`
}
type GetFinancialResultResultDetailPayment struct {
// Currency
CurrencyCode string `json:"currency_code"`
// Payment amount
Payment float64 `json:"payment"`
}
type GetFinancialResultResultDetailPeriod struct {
// Period start
Begin time.Time `json:"begin"`
// Period end
End time.Time `json:"end"`
// Period identifier
Id int64 `json:"id"`
}
type GetFinancialResultResultDetailReturn struct {
// Total amount
Total float64 `json:"total"`
// Amount of returns received, including commission fees
Amount float64 `json:"amount"`
// Returns and cancellation fees
ReturnServices GetFinancialResultResultDetailReturnServices `json:"return_services"`
}
type GetFinancialResultResultDetailReturnServices struct {
// Total amount
Total float64 `json:"total"`
// Details
Items []GetFinancialResultResultDetailReturnServicesItem `json:"items"`
}
type GetFinancialResultResultDetailReturnServicesItem struct {
// Operation name
Name DetailsReturnServiceName `json:"name"`
// Amount by operation
Price float64 `json:"price"`
}
type GetFinancialResultResultDetailRFBS struct {
// Total amount
Total float64 `json:"total"`
// Transfers from customers
TransferDelivery float64 `json:"transfer_delivery"`
// Return of transfers to customers
TransferDeliveryReturn float64 `json:"transfer_delivery_return"`
// Compensation of delivery fees
CompensationDeliveryReturn float64 `json:"compensation_delivery_return"`
// Transfers of partial refunds to customers
PartialCompensation float64 `json:"partial_compensation"`
// Compensation of partial refunds
PartialCompensationReturn float64 `json:"partial_compensation_return"`
}
type GetFinancialResultResultDetailService struct {
// Total amount
Total float64 `json:"total"`
// Details
Items []GetFinancialResultResultDetailServiceItem `json:"items"`
}
type GetFinancialResultResultDetailServiceItem struct {
// Operation name
Name DetailsServiceItemName `json:"name"`
// Amount by operation
Price float64 `json:"price"`
}
type GetFinancialResultResultDetailOthers struct {
// Total amount
Total float64 `json:"total"`
// Details
Items []GetFinancialResultResultDetailOthersItem `json:"items"`
}
type GetFinancialResultResultDetailOthersItem struct {
// Operation name
Name DetailsOtherItemName `json:"name"`
// Amount by operation
Price float64 `json:"price"`
}
// Returns information about a created report by its identifier
@@ -220,7 +397,7 @@ func (c Reports) GetFinancial(params *GetFinancialReportParams) (*GetFinancialRe
resp := &GetFinancialReportResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -254,10 +431,12 @@ type GetProductsReportResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetProductsReportResult `json:"result"`
}
type GetProductsReportResult struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
}
// Method for getting a report with products data. For example, Ozon ID, number of products, prices, status
@@ -266,7 +445,7 @@ func (c Reports) GetProducts(params *GetProductsReportParams) (*GetProductsRepor
resp := &GetProductsReportResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -287,10 +466,12 @@ type GetStocksReportResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetStocksReportResult `json:"result"`
}
type GetStocksReportResult struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
}
// Report with information about the number of available and reserved products in stock
@@ -299,7 +480,7 @@ func (c Reports) GetStocks(params *GetStocksReportParams) (*GetStocksReportRespo
resp := &GetStocksReportResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -326,10 +507,12 @@ type GetProductsMovementReportResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetProductsMovementReportResult `json:"result"`
}
type GetProductsMovementReportResult struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
}
// Report with complete information on products, as well as the number of products with statuses:
@@ -342,7 +525,7 @@ func (c Reports) GetProductsMovement(params *GetProductsMovementReportParams) (*
resp := &GetProductsMovementReportResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -377,10 +560,12 @@ type GetReturnsReportResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetReturnReportResult `json:"result"`
}
type GetReturnReportResult struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
}
// The report contains information about returned products that were accepted from the customer, ready for pickup, or delivered to the seller.
@@ -391,7 +576,7 @@ func (c Reports) GetReturns(params *GetReturnsReportParams) (*GetReturnsReportRe
resp := &GetReturnsReportResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -446,10 +631,12 @@ type GetShipmentReportResponse struct {
core.CommonResponse
// Method result
Result struct {
Result GetShipmentReportResult `json:"result"`
}
type GetShipmentReportResult struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
}
// Shipment report with orders details:
@@ -464,7 +651,7 @@ func (c Reports) GetShipment(params *GetShipmentReportParams) (*GetShipmentRepor
resp := &GetShipmentReportResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -489,7 +676,7 @@ func (c Reports) IssueOnDiscountedProducts() (*IssueOnDiscountedProductsResponse
resp := &IssueOnDiscountedProductsResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -507,7 +694,10 @@ type ReportOnDiscountedProductsResponse struct {
core.CommonResponse
// Report information
Report struct {
Report ReportonDiscountedProductsReport `json:"report"`
}
type ReportonDiscountedProductsReport struct {
// Report creation date
CreatedAt time.Time `json:"created_at"`
@@ -523,7 +713,6 @@ type ReportOnDiscountedProductsResponse struct {
// Report generation error code
Error string `json:"error"`
} `json:"report"`
}
// By report identifier, returns information about the report generated earlier
@@ -532,7 +721,7 @@ func (c Reports) ReportOnDiscountedProducts(params *ReportOnDiscountedProductsPa
resp := &ReportOnDiscountedProductsResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -547,7 +736,7 @@ func (c Reports) ListReportsOnDiscountedProducts() (*ReportOnDiscountedProductsR
resp := &ReportOnDiscountedProductsResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -165,6 +165,7 @@ func TestGetFinancialReport(t *testing.T) {
From: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2022-01-01T00:00:00.000Z"),
To: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2022-12-31T00:00:00.000Z"),
},
WithDetails: true,
Page: 1,
PageSize: 1,
},
@@ -172,21 +173,90 @@ func TestGetFinancialReport(t *testing.T) {
"result": {
"cash_flows": [
{
"period": {
"id": 11567022278500,
"begin": "2022-08-01T00:00:00Z",
"end": "2022-08-15T00:00:00Z"
},
"orders_amount": 1000,
"returns_amount": -3000,
"commission_amount": 1437,
"services_amount": 8471.28,
"currency_code": "string",
"item_delivery_and_return_amount": 1991,
"currency_code": "RUB"
"orders_amount": 1000,
"period": {
"begin": "2023-04-03T09:12:10.239Z",
"end": "2023-04-03T09:12:10.239Z",
"id": 11567022278500
},
"returns_amount": -3000,
"services_amount": 8471.28
}
],
"page_count": 15
"details": {
"period": {
"begin": "2023-04-03T09:12:10.239Z",
"end": "2023-04-03T09:12:10.239Z",
"id": 11567022278500
},
"payments": [
{
"payment": 0,
"currency_code": "string"
}
],
"begin_balance_amount": 0,
"delivery": {
"total": 0,
"amount": 0,
"delivery_services": {
"total": 0,
"items": [
{
"name": "string",
"price": 0
}
]
}
},
"return": {
"total": 0,
"amount": 0,
"return_services": {
"total": 0,
"items": [
{
"name": "string",
"price": 0
}
]
}
},
"loan": 0,
"invoice_transfer": 0,
"rfbs": {
"total": 0,
"transfer_delivery": 0,
"transfer_delivery_return": 0,
"compensation_delivery_return": 0,
"partial_compensation": 0,
"partial_compensation_return": 0
},
"services": {
"total": 0,
"items": [
{
"name": "string",
"price": 0
}
]
},
"others": {
"total": 0,
"items": [
{
"name": "string",
"price": 0
}
]
},
"end_balance_amount": 0
}
},
"page_count": 15
}`,
},
// Test No Client-Id or Api-Key

View File

@@ -28,7 +28,8 @@ type GetFBOReturnsFilter struct {
// Shipment number
PostingNumber string `json:"posting_number"`
Status []string `json:"status"`
// Return status
Status []GetFBOReturnsFilterStatus `json:"status"`
}
type GetFBOReturnsResponse struct {
@@ -38,7 +39,10 @@ type GetFBOReturnsResponse struct {
LastId int64 `json:"last_id"`
// Returns information
Returns []struct {
Returns []GetFBOReturnsReturn `json:"returns"`
}
type GetFBOReturnsReturn struct {
// Time when a return was received from the customer
AcceptedFromCustomerMoment time.Time `json:"accepted_from_customer_moment"`
@@ -70,8 +74,7 @@ type GetFBOReturnsResponse struct {
SKU int64 `json:"sku"`
// Return status
Status string `json:"status_name"`
} `json:"returns"`
Status GetFBOReturnsReturnStatus `json:"status_name"`
}
// Method for getting information on returned products that are sold from the Ozon warehouse
@@ -80,7 +83,7 @@ func (c Returns) GetFBOReturns(params *GetFBOReturnsParams) (*GetFBOReturnsRespo
resp := &GetFBOReturnsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
@@ -98,9 +101,10 @@ type GetFBSReturnsParams struct {
// - minimum — 1
Limit int64 `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 int64 `json:"offset"`
// Return identifier that was loaded the last time.
// Return identifiers with the higher value than `last_id`
// will be returned in the response.
LastId int64 `json:"offset"`
}
type GetFBSReturnsFilter struct {
@@ -108,7 +112,7 @@ type GetFBSReturnsFilter struct {
AcceptedFromCustomerMoment GetFBSReturnsFilterTimeRange `json:"accepted_from_customer_moment"`
// Last day of free storage
LastFreeWaitingDay []GetFBSReturnsFilterTimeRange `json:"last_free_waiting_dat"`
LastFreeWaitingDay GetFBSReturnsFilterTimeRange `json:"last_free_waiting_dat"`
// Order ID
OrderId int64 `json:"order_id"`
@@ -122,13 +126,8 @@ type GetFBSReturnsFilter struct {
// Product ID
ProductOfferId string `json:"product_offer_id"`
// Return status:
// - returned_to_seller — returned to seller,
// - waiting_for_seller — waiting for seller,
// - accepted_from_customer — accepted from customer,
// - cancelled_with_compensation — cancelled with compensation,
// - ready_for_shipment — ready for shipment
Status string `json:"status"`
// Return status
Status GetFBSReturnsFilterStatus `json:"status"`
}
type GetFBSReturnsFilterTimeRange struct {
@@ -150,12 +149,16 @@ type GetFBSReturnsFilterTimeRange struct {
type GetFBSReturnsResponse struct {
core.CommonResponse
Result struct {
// Elements counter in the response
Count int64 `json:"count"`
// Return identifier that was loaded the last time.
// Return identifiers with the higher value than `last_id`
// will be returned in the response
LastId int64 `json:"last_id"`
// Returns information
Returns []struct {
Returns []GetFBSReturnResultReturn `json:"returns"`
}
type GetFBSReturnResultReturn struct {
// Time of receiving the return from the customer
AcceptedFromCustomerAmount string `json:"accepted_from_customer_amount"`
@@ -168,7 +171,10 @@ type GetFBSReturnsResponse struct {
// Commission percentage
CommissionPercent float64 `json:"commission_percent"`
// Return identifier
// Product item identifier in the Ozon logistics system
ExemplarId int64 `json:"exemplar_id"`
// Return identifier in the Ozon accounting system
Id int64 `json:"id"`
// If the product is in transit — true
@@ -192,6 +198,8 @@ type GetFBSReturnsResponse struct {
// Shipment number
PostingNumber string `json:"posting_number"`
PickingTag string `json:"picking_tag"`
// Current product price without a discount
Price float64 `json:"price"`
@@ -207,6 +215,12 @@ type GetFBSReturnsResponse struct {
// Product quantity
Quantity int64 `json:"quantity"`
// Barcode on the return label. Use this parameter value to work with the return label
ReturnBarcode string `json:"return_barcode"`
// Package unit identifier in the Ozon logistics system
ReturnClearingId int64 `json:"return_clearing_id"`
// Product return date
ReturnDate string `json:"return_date"`
@@ -230,17 +244,15 @@ type GetFBSReturnsResponse struct {
// Return status
Status string `json:"status"`
} `json:"returns"`
} `json:"result"`
}
// Method for getting information on returned products that are sold from the seller's warehouse
func (c Returns) GetFBSReturns(params *GetFBSReturnsParams) (*GetFBSReturnsResponse, error) {
url := "/v2/returns/company/fbs"
url := "/v3/returns/company/fbs"
resp := &GetFBSReturnsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp)
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}

View File

@@ -105,42 +105,43 @@ func TestGetFBSReturns(t *testing.T) {
Status: "returned_to_seller",
},
Limit: 1000,
Offset: 0,
LastId: 0,
},
`{
"result": {
"last_id": 0,
"returns": [
{
"id": 19166541735000,
"clearing_id": 19166541725000,
"posting_number": "07402477-0022-2",
"product_id": 172423678,
"sku": 172423678,
"status": "returned_to_seller",
"returns_keeping_cost": 0,
"return_reason_name": "5.12 Заказ более не актуален: долгие сроки доставки",
"return_date": "2020-08-12T17:27:50+00:00",
"quantity": 1,
"product_name": "Кофе ароматизированный \"Лесной орех\" 250 гр",
"price": 294,
"waiting_for_seller_date_time": "2020-08-16T02:50:35+00:00",
"returned_to_seller_date_time": "2020-08-21T10:07:13+00:00",
"last_free_waiting_day": "2020-08-19T23:59:59+00:00",
"is_opened": false,
"place_id": 0,
"accepted_from_customer_moment": "string",
"clearing_id": 23,
"commission": 21,
"commission_percent": 0,
"commission": 0,
"exemplar_id": 42,
"id": 123,
"is_moving": true,
"is_opened": true,
"last_free_waiting_day": "string",
"place_id": 122,
"moving_to_place_name": "string",
"picking_amount": 0,
"posting_number": "string",
"picking_tag": "string",
"price": 0,
"price_without_commission": 0,
"is_moving": false,
"moving_to_place_name": "МОСКВА_ХАБ",
"waiting_for_seller_days": 2,
"picking_amount": null,
"accepted_from_customer_moment": null,
"picking_tag": null
}
],
"count": 1
"product_id": 2222,
"product_name": "string",
"quantity": 0,
"return_barcode": "string",
"return_clearing_id": 0,
"return_date": "string",
"return_reason_name": "string",
"waiting_for_seller_date_time": "string",
"returned_to_seller_date_time": "string",
"waiting_for_seller_days": 0,
"returns_keeping_cost": 0,
"sku": 33332,
"status": "string"
}
]
}`,
},
// Test No Client-Id or Api-Key
@@ -168,20 +169,17 @@ func TestGetFBSReturns(t *testing.T) {
}
if resp.StatusCode == http.StatusOK {
if int(resp.Result.Count) != len(resp.Result.Returns) {
t.Errorf("Count must equal to length of returns")
}
if len(resp.Result.Returns) > 0 {
if resp.Result.Returns[0].Id == 0 {
if len(resp.Returns) > 0 {
if resp.Returns[0].Id == 0 {
t.Errorf("Id cannot be 0")
}
if resp.Result.Returns[0].ProductId == 0 {
if resp.Returns[0].ProductId == 0 {
t.Errorf("Product id cannot be 0")
}
if resp.Result.Returns[0].SKU == 0 {
if resp.Returns[0].SKU == 0 {
t.Errorf("SKU cannot be 0")
}
if resp.Result.Returns[0].Status == "" {
if resp.Returns[0].Status == "" {
t.Errorf("Status cannot be empty")
}
}

471
ozon/strategies.go Normal file
View File

@@ -0,0 +1,471 @@
package ozon
import (
"net/http"
core "github.com/diphantxm/ozon-api-client"
)
type Strategies struct {
client *core.Client
}
type ListCompetitorsParams struct {
// Page number from which you want to download the list of competitors.
// The minimum value is 1
Page int64 `json:"page"`
// Maximum number of competitors on the page. Allowed values: 150
Limit int64 `json:"limit"`
}
type ListCompetitorsResponse struct {
core.CommonResponse
// List of competitors
Competitors []ListCompetitorsCompetitor `json:"competitors"`
// Total number of competitors
Total int32 `json:"total"`
}
type ListCompetitorsCompetitor struct {
// Competitor's name
Name string `json:"name"`
// Competitor identifier
Id int64 `json:"id"`
}
// Method for getting a list of competitors—sellers with similar products in other online stores and marketplaces
func (c Strategies) ListCompetitors(params *ListCompetitorsParams) (*ListCompetitorsResponse, error) {
url := "/v1/pricing-strategy/competitors/list"
resp := &ListCompetitorsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type ListStrategiesParams struct {
// Page number from which you want to download the list of competitors.
// The minimum value is 1
Page int64 `json:"page"`
// Maximum number of competitors on the page. Allowed values: 150
Limit int64 `json:"limit"`
}
type ListStrategiesResponse struct {
core.CommonResponse
// List of strategies
Strategies []ListStrategiesStrategy `json:"strategies"`
// Total number of strategies
Total int32 `json:"total"`
}
type ListStrategiesStrategy struct {
// Strategy identifier
Id string `json:"id"`
// Strategy name
Name string `json:"name"`
// Strategy type
Type StrategyType `json:"type"`
// Type of the last strategy change
UpdateType StrategyUpdateType `json:"update_type"`
// Date of last change
UpdatedAt string `json:"updated_at"`
// Number of products in the strategy
ProductsCount int64 `json:"products_count"`
// Number of selected competitors
CompetitorsCount int64 `json:"competitors_count"`
// Strategy status
Enabled bool `json:"enabled"`
}
func (c Strategies) List(params *ListStrategiesParams) (*ListStrategiesResponse, error) {
url := "/v1/pricing-strategy/list"
resp := &ListStrategiesResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type CreateStrategyParams struct {
// List of competitors
Competitors []CreateStrategyCompetitor `json:"competitors"`
// Strategy name
StrategyName string `json:"strategy_name"`
}
type CreateStrategyCompetitor struct {
// Coefficient by which the minimum price among competitors will be multiplied.
// The allowed range is from 0.5 to 1.2
Coefficient float32 `json:"coefficient"`
// Competitor identifier
CompetitorId int64 `json:"competitor_id"`
}
type CreateStrategyResponse struct {
core.CommonResponse
// Method result
Result CreateStrategyResult `json:"result"`
}
type CreateStrategyResult struct {
// Strategy identifier
StrategyId string `json:"strategy_id"`
}
func (c Strategies) Create(params *CreateStrategyParams) (*CreateStrategyResponse, error) {
url := "/v1/pricing-strategy/create"
resp := &CreateStrategyResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type InfoStrategyParams struct {
// Strategy identifier
StrategyId string `json:"strategy_id"`
}
type InfoStrategyResponse struct {
core.CommonResponse
// Method result
Result InfoStrategyResult `json:"result"`
}
type InfoStrategyResult struct {
// List of competitors
Competitors []CreateStrategyCompetitor `json:"competitors"`
// Strategy status
Enabled bool `json:"enabled"`
// Strategy name
Name string `json:"name"`
// Strategy type
Type StrategyType `json:"type"`
// Type of the last strategy change
UpdateType StrategyUpdateType `json:"update_type"`
}
func (c Strategies) Info(params *InfoStrategyParams) (*InfoStrategyResponse, error) {
url := "/v1/pricing-strategy/info"
resp := &InfoStrategyResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type UpdateStrategyParams struct {
// List of competitors
Competitors []CreateStrategyCompetitor `json:"competitors"`
// Product identifier
StrategyId string `json:"strategy_id"`
// Strategy name
StrategyName string `json:"strategy_name"`
}
type UpdateStrategyResponse struct {
core.CommonResponse
}
func (c Strategies) Update(params *UpdateStrategyParams) (*UpdateStrategyResponse, error) {
url := "/v1/pricing-strategy/update"
resp := &UpdateStrategyResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type AddProductsToStrategyParams struct {
// List of product identifiers. The maximum number is 50
ProductId []int64 `json:"product_id"`
// Product identifier
StrategyId string `json:"strategy_id"`
}
type AddProductsToStrategyResponse struct {
core.CommonResponse
// Method result
Result AddProductsToStrategyResult `json:"result"`
}
type AddProductsToStrategyResult struct {
// Products with errors
Errors []AddProductsToStrategyResultError `json:"errors"`
// Number of products with errors
FailedProductCount int32 `json:"failed_product_count"`
}
type AddProductsToStrategyResultError struct {
// Error code
Code string `json:"code"`
// Error message
Error string `json:"error"`
// Product identifier
ProductId int64 `json:"product_id"`
}
func (c Strategies) AddProducts(params *AddProductsToStrategyParams) (*AddProductsToStrategyResponse, error) {
url := "/v1/pricing-strategy/products/add"
resp := &AddProductsToStrategyResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetStrategiesByProductIdsParams struct {
// List of product identifiers. The maximum number is 50
ProductId []int64 `json:"product_id"`
}
type GetStrategiesByProductIdsResponse struct {
core.CommonResponse
// Method result
Result GetStrategiesByProductIdsResult `json:"result"`
}
type GetStrategiesByProductIdsResult struct {
// Product information
ProductsInfo []GetStrategiesByProductIdsResultProductInfo `json:"products_info"`
}
type GetStrategiesByProductIdsResultProductInfo struct {
// Product identifier
ProductId int64 `json:"product_id"`
// Strategy identifier to which the product is bounded
StrategyId string `json:"strategy_id"`
}
func (c Strategies) GetByProductIds(params *GetStrategiesByProductIdsParams) (*GetStrategiesByProductIdsResponse, error) {
url := "/v1/pricing-strategy/strategy-ids-by-product-ids"
resp := &GetStrategiesByProductIdsResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type ListProductsInStrategyParams struct {
// Strategy identifier
StrategyId string `json:"strategy_id"`
}
type ListProductsInStrategyResponse struct {
core.CommonResponse
// Method result
Result ListProductsInStrategyResult `json:"result"`
}
type ListProductsInStrategyResult struct {
// Product identifier
ProductId []string `json:"product_id"`
}
func (c Strategies) ListProducts(params *ListProductsInStrategyParams) (*ListProductsInStrategyResponse, error) {
url := "/v1/pricing-strategy/products/list"
resp := &ListProductsInStrategyResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetCompetitorPriceParams struct {
// Product identifier
ProductId int64 `json:"product_id"`
}
type GetCompetitorPriceResponse struct {
core.CommonResponse
// Method result
Result GetCompetitorPriceResult `json:"result"`
}
type GetCompetitorPriceResult struct {
// Product identifier
StrategyId string `json:"strategy_id"`
// true if the product is in the pricing strategy
IsEnabled bool `json:"is_enabled"`
// Price of product in the strategy
StrategyProductPrice int32 `json:"strategy_product_price"`
// Price setting date
PriceDownloadedAt string `json:"price_downloaded_at"`
// Competitor identifier
StrategyCompetitorId int64 `json:"strategy_competitor_id"`
// Link to a competitor's product
StrategyCompetitorProductURL string `json:"strategy_competitor_product_url"`
}
func (c Strategies) GetCompetitorPrice(params *GetCompetitorPriceParams) (*GetCompetitorPriceResponse, error) {
url := "/v1/pricing-strategy/product/info"
resp := &GetCompetitorPriceResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type RemoveProductsFromStrategyParams struct {
// List of product identifiers. The maximum number is 50
ProductId []int64 `json:"product_id"`
}
type RemoveProductsFromStrategyResponse struct {
core.CommonResponse
// Method result
Result RemoveProductsFromStrategyResult `json:"result"`
}
type RemoveProductsFromStrategyResult struct {
// Number of products with errors
FailedProductCount int32 `json:"failed_product_count"`
}
func (c Strategies) RemoveProducts(params *RemoveProductsFromStrategyParams) (*RemoveProductsFromStrategyResponse, error) {
url := "/v1/pricing-strategy/products/delete"
resp := &RemoveProductsFromStrategyResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type ChangeStrategyStatusParams struct {
// Strategy status
Enabled bool `json:"enabled"`
// Product identifier
StrategyId string `json:"strategy_id"`
}
type ChangeStrategyStatusResponse struct {
core.CommonResponse
}
func (c Strategies) ChangeStatus(params *ChangeStrategyStatusParams) (*ChangeStrategyStatusResponse, error) {
url := "/v1/pricing-strategy/status"
resp := &ChangeStrategyStatusResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type RemoveStrategyParams struct {
// Strategy identifier
StrategyId string `json:"strategy_id"`
}
type RemoveStrategyResponse struct {
core.CommonResponse
}
func (c Strategies) Remove(params *RemoveStrategyParams) (*RemoveStrategyResponse, error) {
url := "/v1/pricing-strategy/delete"
resp := &RemoveStrategyResponse{}
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}

668
ozon/strategies_test.go Normal file
View File

@@ -0,0 +1,668 @@
package ozon
import (
"net/http"
"testing"
core "github.com/diphantxm/ozon-api-client"
)
func TestListCompetitors(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *ListCompetitorsParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&ListCompetitorsParams{
Page: 1,
Limit: 20,
},
`{
"competitor": [
{
"competitor_name": "string",
"competitor_id": 0
}
],
"total": 0
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&ListCompetitorsParams{},
`{
"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))
resp, err := c.Strategies().ListCompetitors(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestListStrategies(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *ListStrategiesParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&ListStrategiesParams{
Page: 1,
Limit: 20,
},
`{
"strategies": [
{
"strategy_id": "string",
"strategy_name": "string",
"type": "string",
"update_type": "string",
"updated_at": "string",
"products_count": 0,
"competitors_count": 0,
"enabled": true
}
],
"total": 0
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&ListStrategiesParams{},
`{
"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))
resp, err := c.Strategies().List(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestCreateStrategy(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *CreateStrategyParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&CreateStrategyParams{
StrategyName: "New strategy",
Competitors: []CreateStrategyCompetitor{
{
CompetitorId: 1008426,
Coefficient: 1,
},
{
CompetitorId: 204,
Coefficient: 1,
},
{
CompetitorId: 91,
Coefficient: 1,
},
{
CompetitorId: 48,
Coefficient: 1,
},
},
},
`{
"result": {
"id": "4f3a1d4c-5833-4f04-b69b-495cbc1f6f1c"
}
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&CreateStrategyParams{},
`{
"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))
resp, err := c.Strategies().Create(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestInfoStrategy(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *InfoStrategyParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&InfoStrategyParams{
StrategyId: "1",
},
`{
"result": {
"strategy_name": "test1",
"enabled": true,
"update_type": "strategyItemsListChanged",
"type": "COMP_PRICE",
"competitors": [
{
"competitor_id": 204,
"coefficient": 1
},
{
"competitor_id": 1008426,
"coefficient": 1
}
]
}
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&InfoStrategyParams{},
`{
"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))
resp, err := c.Strategies().Info(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestUpdateStrategy(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *UpdateStrategyParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&UpdateStrategyParams{
StrategyId: "a3de1826-9c54-40f1-bb6d-1a9e2638b058",
StrategyName: "New Strategy",
Competitors: []CreateStrategyCompetitor{
{
CompetitorId: 1008426,
Coefficient: 1,
},
{
CompetitorId: 204,
Coefficient: 1,
},
{
CompetitorId: 91,
Coefficient: 1,
},
{
CompetitorId: 48,
Coefficient: 1,
},
{
CompetitorId: 45,
Coefficient: 1,
},
},
},
`{}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&UpdateStrategyParams{},
`{
"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))
resp, err := c.Strategies().Update(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestAddProductsToStrategy(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *AddProductsToStrategyParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&AddProductsToStrategyParams{
ProductId: []int64{29209},
StrategyId: "e29114f0-177d-4160-8d06-2bc528470dda",
},
`{
"result": {
"failed_product_count": 0
}
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&AddProductsToStrategyParams{},
`{
"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))
resp, err := c.Strategies().AddProducts(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestGetStrategiesByProductIds(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *GetStrategiesByProductIdsParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&GetStrategiesByProductIdsParams{
ProductId: []int64{29209},
},
`{
"result": {
"products_info": [
{
"product_id": 29209,
"strategy_id": "b7cd30e6-5667-424d-b105-fbec30a52477"
}
]
}
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&GetStrategiesByProductIdsParams{},
`{
"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))
resp, err := c.Strategies().GetByProductIds(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
if resp.StatusCode == http.StatusOK {
if len(resp.Result.ProductsInfo) != len(test.params.ProductId) {
t.Errorf("Length of product ids in request and response are not equal")
}
if len(resp.Result.ProductsInfo) > 0 {
if resp.Result.ProductsInfo[0].ProductId != test.params.ProductId[0] {
t.Errorf("Product ids in request and response are not equal")
}
}
}
}
}
func TestListProductsInStrategy(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *ListProductsInStrategyParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&ListProductsInStrategyParams{
StrategyId: "string",
},
`{
"result": {
"product_id": [
"string"
]
}
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&ListProductsInStrategyParams{},
`{
"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))
resp, err := c.Strategies().ListProducts(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestGetCompetitorPrice(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *GetCompetitorPriceParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&GetCompetitorPriceParams{
ProductId: 0,
},
`{
"result": {
"strategy_id": "string",
"is_enabled": true,
"strategy_product_price": 0,
"price_downloaded_at": "2022-11-17T15:33:53.936Z",
"strategy_competitor_id": 0,
"strategy_competitor_product_url": "string"
}
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&GetCompetitorPriceParams{},
`{
"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))
resp, err := c.Strategies().GetCompetitorPrice(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestRemoveProductsFromStrategy(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *RemoveProductsFromStrategyParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&RemoveProductsFromStrategyParams{
ProductId: []int64{0},
},
`{
"result": {
"failed_product_count": 0
}
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&RemoveProductsFromStrategyParams{},
`{
"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))
resp, err := c.Strategies().RemoveProducts(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestChangeStrategyStatus(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *ChangeStrategyStatusParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&ChangeStrategyStatusParams{
Enabled: true,
StrategyId: "c7516438-7124-4e2c-85d3-ccd92b6b9b65",
},
`{}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&ChangeStrategyStatusParams{},
`{
"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))
resp, err := c.Strategies().ChangeStatus(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}
func TestRemoveStrategy(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *RemoveStrategyParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&RemoveStrategyParams{
StrategyId: "strategy",
},
`{}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&RemoveStrategyParams{},
`{
"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))
resp, err := c.Strategies().Remove(test.params)
if err != nil {
t.Error(err)
}
if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
}
}
}

View File

@@ -14,7 +14,10 @@ type Warehouses struct {
type GetListOfWarehousesResponse struct {
core.CommonResponse
Result []struct {
Result []GetListOfWarehousesResult `json:"result"`
}
type GetListOfWarehousesResult struct {
// Trusted acceptance attribute. `true` if trusted acceptance is enabled in the warehouse
HasEntrustedAcceptance bool `json:"has_entrusted_acceptance"`
@@ -33,23 +36,7 @@ type GetListOfWarehousesResponse struct {
CanPrintActInAdvance bool `json:"can_print_act_in_advance"`
// FBS first mile
FirstMileType struct {
// DropOff point identifier
DropoffPointId string `json:"dropoff_point_id"`
// DropOff timeslot identifier
DropoffTimeslotId int64 `json:"dropoff_timeslot_id"`
// Indication that the warehouse settings are being updated
FirstMileIsChanging bool `json:"first_mile_is_changing"`
// First mile type:
//
// Enum: "DropOff" "Pickup"
// - DropOff
// - Pickup
FirstMileType string `json:"first_mile_type"`
} `json:"first_mile_type"`
FirstMileType GetListOfWarehousesResultFirstMile `json:"first_mile_type"`
// Indication if there is a limit on the minimum number of orders. `true` if there is such a limit
HasPostingsLimit bool `json:"has_postings_limit"`
@@ -76,8 +63,25 @@ type GetListOfWarehousesResponse struct {
Status string `json:"status"`
// Warehouse working days
WorkingDays []string `json:"working_days"`
} `json:"resulCommonResponse"`
WorkingDays []WorkingDay `json:"working_days"`
}
type GetListOfWarehousesResultFirstMile struct {
// DropOff point identifier
DropoffPointId string `json:"dropoff_point_id"`
// DropOff timeslot identifier
DropoffTimeslotId int64 `json:"dropoff_timeslot_id"`
// Indication that the warehouse settings are being updated
FirstMileIsChanging bool `json:"first_mile_is_changing"`
// First mile type:
//
// Enum: "DropOff" "Pickup"
// - DropOff
// - Pickup
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
@@ -86,7 +90,7 @@ func (c Warehouses) GetListOfWarehouses() (*GetListOfWarehousesResponse, error)
resp := &GetListOfWarehousesResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}
@@ -131,7 +135,10 @@ type GetListOfDeliveryMethodsResponse struct {
HasNext bool `json:"has_next"`
// Method result
Result []struct {
Result []GetListOfDeliveryMethodsResult `json:"result"`
}
type GetListOfDeliveryMethodsResult struct {
// Company identifier
CompanyId int64 `json:"company_id"`
@@ -165,7 +172,6 @@ type GetListOfDeliveryMethodsResponse struct {
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
} `json:"result"`
}
// This methods allows you to get list of all delivery methods that can be applied for this warehouse
@@ -174,7 +180,7 @@ func (c Warehouses) GetListOfDeliveryMethods(params *GetListOfDeliveryMethodsPar
resp := &GetListOfDeliveryMethodsResponse{}
response, err := c.client.Request(http.MethodPost, url, nil, resp)
response, err := c.client.Request(http.MethodPost, url, nil, resp, nil)
if err != nil {
return nil, err
}