19 Commits

Author SHA1 Message Date
diPhantxm
7beee39eb2 Added the prices.price_strategy_enabled parameter to the method request 2023-07-20 02:48:09 +03:00
diPhantxm
baeeef9b46 fix json names for GetDigitalActResponse 2023-07-15 03:02:45 +03:00
diPhantxm
336c49baa4 Added the response example to TestGetLabeling 2023-07-15 03:02:45 +03:00
diPhantxm
f11ccb4714 updated the schemas and examples for method responses: methods return the result in binary format 2023-07-15 03:02:45 +03:00
diPhantxm
1958dfb94e Added a method for getting a barcode from the /v2/posting/fbs/act/get-barcode response in text format 2023-07-12 19:14:48 +03:00
diPhantxm
2ca20d9b12 Added a method for getting a barcode used during product shipment 2023-07-12 19:14:48 +03:00
Anton Salnikov
eea0f99066 Change address field tag 2023-07-09 19:54:28 +03:00
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
26 changed files with 5506 additions and 2656 deletions

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

@@ -22,16 +22,7 @@ type GetAnalyticsDataParams struct {
Dimension []GetAnalyticsDataDimension `json:"dimension"` Dimension []GetAnalyticsDataDimension `json:"dimension"`
// Filters // Filters
Filters []struct { Filters []GetAnalyticsDataFilter `json:"filters"`
// 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"`
} `json:"filters"`
// Number of items in the respones: // Number of items in the respones:
// - maximum is 1000, // - maximum is 1000,
@@ -48,6 +39,17 @@ type GetAnalyticsDataParams struct {
Sort []GetAnalyticsDataSort `json:"sort"` 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 // Report sorting settings
type GetAnalyticsDataSort struct { type GetAnalyticsDataSort struct {
// Metric by which the method result will be sorted // Metric by which the method result will be sorted
@@ -61,28 +63,34 @@ type GetAnalyticsDataResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetAnalyticsDataResult `json:"result"`
// Report creation time
Timestamp string `json:"timestamp"`
}
type GetAnalyticsDataResult struct {
// Data array // 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 // Data grouping in the report
Dimensions []struct { Dimensions []GetAnalyticsDataResultDimension `json:"dimensions"`
// Metric values list
Metrics []float64 `json:"metrics"`
}
type GetAnalyticsDataResultDimension struct {
// Identifier // Identifier
Id string `json:"id"` Id string `json:"id"`
// Name // Name
Name string `json:"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. // Specify the period and metrics that are required. The response will contain analytical data grouped by the `dimensions` parameter.
@@ -117,9 +125,15 @@ type GetStocksOnWarehousesResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetStocksOnWarehousesResult `json:"result"`
}
type GetStocksOnWarehousesResult struct {
// Information about products and stocks // Information about products and stocks
Rows []struct { Rows []GetStocksOnWarehousesResultRow `json:"rows"`
}
type GetStocksOnWarehousesResultRow struct {
// Product identifier in the Ozon system, SKU // Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"` SKU int64 `json:"sku"`
@@ -140,8 +154,6 @@ type GetStocksOnWarehousesResponse struct {
// Name of the warehouse where the products are stored // Name of the warehouse where the products are stored
WarehouseName string `json:"warehouse_name"` WarehouseName string `json:"warehouse_name"`
} `json:"rows"`
} `json:"result"`
} }
// Report on stocks and products movement at Ozon warehouses // Report on stocks and products movement at Ozon warehouses

View File

@@ -22,9 +22,18 @@ type ListCertifiedBrandsResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result ListCertifiedBrandsResult `json:"result"`
}
type ListCertifiedBrandsResult struct {
// Certified brands details // Certified brands details
BrandCertification []struct { BrandCertification []ListCertifiedBrandsResultCertificate `json:"brand_certification"`
// Total number of brands
Total int64 `json:"total"`
}
type ListCertifiedBrandsResultCertificate struct {
// Brand name // Brand name
BrandName string `json:"brand_name"` BrandName string `json:"brand_name"`
@@ -32,11 +41,6 @@ type ListCertifiedBrandsResponse struct {
// - true if the certificate is required; // - true if the certificate is required;
// - false if not // - false if not
HasCertificate bool `json:"has_certificate"` HasCertificate bool `json:"has_certificate"`
} `json:"brand_certification"`
// Total number of brands
Total int64 `json:"total"`
} `json:"result"`
} }
// List of certified brands // List of certified brands

View File

@@ -31,13 +31,7 @@ type CancellationInfo struct {
PostingNumber string `json:"posting_number"` PostingNumber string `json:"posting_number"`
// Cancellation reason // Cancellation reason
CancellationReason struct { CancellationReason CancellationInfoReason `json:"cancellation_reason"`
// Cancellation reason identifier
Id int64 `json:"id"`
// Cancellation reason name
Name string `json:"name"`
} `json:"cancellation_reason"`
// Cancellation request creation date // Cancellation request creation date
CancelledAt time.Time `json:"cancelled_at"` CancelledAt time.Time `json:"cancelled_at"`
@@ -49,16 +43,7 @@ type CancellationInfo struct {
TPLIntegrationType string `json:"tpl_integration_type"` TPLIntegrationType string `json:"tpl_integration_type"`
// Cancellation request status // Cancellation request status
State struct { State CancellationInfoState `json:"state"`
// Status identifier
Id int64 `json:"id"`
// Status name
Name string `json:"name"`
// Request status
State string `json:"state"`
} `json:"state"`
// Cancellation initiator // Cancellation initiator
CancellationInitiator string `json:"cancellation_initiator"` CancellationInitiator string `json:"cancellation_initiator"`
@@ -76,6 +61,25 @@ type CancellationInfo struct {
AutoApproveDate time.Time `json:"auto_approve_date"` 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 // Method for getting information about a rFBS cancellation request
func (c Cancellations) GetInfo(params *GetCancellationInfoParams) (*GetCancellationInfoResponse, error) { func (c Cancellations) GetInfo(params *GetCancellationInfoParams) (*GetCancellationInfoResponse, error) {
url := "/v1/delivery-method/list" url := "/v1/delivery-method/list"
@@ -134,7 +138,10 @@ type ListCancellationsResponse struct {
Total int32 `json:"total"` Total int32 `json:"total"`
// Counter of requests in different statuses // Counter of requests in different statuses
Counters struct { Counters ListCancellationResponseCounters `json:"counters"`
}
type ListCancellationResponseCounters struct {
// Number of requests for approval // Number of requests for approval
OnApproval int64 `json:"on_approval"` OnApproval int64 `json:"on_approval"`
@@ -143,7 +150,6 @@ type ListCancellationsResponse struct {
// Number of rejected requests // Number of rejected requests
Rejected int64 `json:"rejected"` Rejected int64 `json:"rejected"`
} `json:"counters"`
} }
// Method for getting a list of rFBS cancellation requests // Method for getting a list of rFBS cancellation requests

View File

@@ -22,7 +22,10 @@ type GetProductTreeResponse struct {
core.CommonResponse core.CommonResponse
// Category list // Category list
Result []struct { Result []GetProductTreeResult `json:"result"`
}
type GetProductTreeResult struct {
// Category identifier // Category identifier
CategoryId int64 `json:"category_id"` CategoryId int64 `json:"category_id"`
@@ -31,7 +34,6 @@ type GetProductTreeResponse struct {
// Category name // Category name
Title string `json:"title"` Title string `json:"title"`
} `json:"result"`
} }
// Returns product categories in the tree view. // Returns product categories in the tree view.
@@ -67,9 +69,18 @@ type GetCategoryAttributesResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result []struct { Result []GetCategoryAttributesResult `json:"result"`
}
type GetCategoryAttributesResult struct {
// Array of product characteristics // 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: // Indication that the dictionary attribute values depend on the category:
// - true — the attribute has its own set of values for each 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 // - false — the attribute has the same set of values for all categories
@@ -114,11 +125,6 @@ type GetCategoryAttributesResponse struct {
// Characteristic type // Characteristic type
Type string `json:"type"` Type string `json:"type"`
} `json:"attributes"`
// Category identifier
CategoryId int64 `json:"category_id"`
} `json:"result"`
} }
// Getting characteristics for specified product category. // Getting characteristics for specified product category.
@@ -167,14 +173,16 @@ type GetAttributeDictionaryResponse struct {
HasNext bool `json:"has_next"` HasNext bool `json:"has_next"`
// Method result // Method result
Result []struct { Result []GetAttributeDictionaryResult `json:"result"`
}
type GetAttributeDictionaryResult struct {
Id int64 `json:"id"` Id int64 `json:"id"`
Info string `json:"info"` Info string `json:"info"`
Picture string `json:"picture"` Picture string `json:"picture"`
// Product characteristic value // Product characteristic value
Value string `json:"value"` Value string `json:"value"`
} `json:"result"`
} }
// You can use the `/v3/category/attribute` method to check if an attribute has a nested directory. // You can use the `/v3/category/attribute` method to check if an attribute has a nested directory.

View File

@@ -15,25 +15,31 @@ type ListOfAccordanceTypesResponse struct {
core.CommonResponse core.CommonResponse
// Accordance types // Accordance types
Result struct { Result ListOfAccordanceTypesResult `json:"result"`
// Main accordance types }
Base []struct {
// Accordance type code
Code string `json:"code"`
// Accordance type description type ListOfAccordanceTypesResult struct {
Title string `json:"title"` // Main accordance types
} `json:"base"` Base []ListOfAccordanceTypesResultBase `json:"base"`
// Main accordance types related to dangerous products // 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 // Accordance type code
Code string `json:"code"` Code string `json:"code"`
// Accordance type description // Accordance type description
Title string `json:"title"` Title string `json:"title"`
} `json:"hazard"`
} `json:"result"`
} }
// List of accordance types (version 2) // List of accordance types (version 2)
@@ -55,13 +61,15 @@ type DirectoryOfDocumentTypesResponse struct {
core.CommonResponse core.CommonResponse
// List of certificate types and names // List of certificate types and names
Result []struct { Result []DirectoryOfDocumentTypesResult `json:"result"`
}
type DirectoryOfDocumentTypesResult struct {
// Certificate name // Certificate name
Name string `json:"name"` Name string `json:"name"`
// Certificate type // Certificate type
Value string `json:"value"` Value string `json:"value"`
} `json:"result"`
} }
// Directory of document types // Directory of document types
@@ -91,19 +99,23 @@ type ListOfCertifiedCategoriesResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result ListOfCertifiedCategoriesResult `json:"reult"`
}
type ListOfCertifiedCategoriesResult struct {
// Certified categories details // Certified categories details
Certification []struct { Certification []ListOfCertifiedCategoriesResultCert `json:"certification"`
// Total number of categories
Total int64 `json:"total"`
}
type ListOfCertifiedCategoriesResultCert struct {
// Category name // Category name
CategoryName string `json:"category_name"` CategoryName string `json:"category_name"`
// Indication of a mandatory category // Indication of a mandatory category
IsRequired bool `json:"is_required"` IsRequired bool `json:"is_required"`
} `json:"certification"`
// Total number of categories
Total int64 `json:"total"`
} `json:"reult"`
} }
// List of certified categories // List of certified categories
@@ -160,7 +172,10 @@ type DeleteCertificateResponse struct {
core.CommonResponse core.CommonResponse
// Result of deleting the certificate // Result of deleting the certificate
Result struct { Result DeleteCertificateResult `json:"result"`
}
type DeleteCertificateResult struct {
// Indication that a certificate has been deleted: // Indication that a certificate has been deleted:
// - true — deleted // - true — deleted
// - false — not deleted // - false — not deleted
@@ -168,7 +183,6 @@ type DeleteCertificateResponse struct {
// Description of errors during certificate deletion // Description of errors during certificate deletion
ErrorMessage string `json:"error_message"` ErrorMessage string `json:"error_message"`
} `json:"result"`
} }
// Delete certificate // Delete certificate
@@ -195,7 +209,10 @@ type GetCertificateInfoResponse struct {
core.CommonResponse core.CommonResponse
// Certificate information // Certificate information
Result struct { Result GetCertificateInfoResult `json:"result"`
}
type GetCertificateInfoResult struct {
// Identifier // Identifier
CertificateId int32 `json:"certificate_id"` CertificateId int32 `json:"certificate_id"`
@@ -228,7 +245,6 @@ type GetCertificateInfoResponse struct {
// Number of products associated with a certificate // Number of products associated with a certificate
ProductsCount int32 `json:"products_count"` ProductsCount int32 `json:"products_count"`
} `json:"result"`
} }
// Certificate information // Certificate information
@@ -268,9 +284,18 @@ type ListCertificatesResponse struct {
core.CommonResponse core.CommonResponse
// Certificates // Certificates
Result struct { Result ListCertificatesResult `json:"result"`
}
type ListCertificatesResult struct {
// Сertificate information // Сertificate information
Certificates []struct { Certificates []ListCertificatesResultCert `json:"certificates"`
// Number of pages
PageCount int32 `json:"page_count"`
}
type ListCertificatesResultCert struct {
// Identifier // Identifier
CertificateId int32 `json:"certificate_id"` CertificateId int32 `json:"certificate_id"`
@@ -303,11 +328,6 @@ type ListCertificatesResponse struct {
// Number of products associated with a certificate // Number of products associated with a certificate
ProductsCount int32 `json:"products_count"` ProductsCount int32 `json:"products_count"`
} `json:"certificates"`
// Number of pages
PageCount int32 `json:"page_count"`
} `json:"result"`
} }
// Certificates list // Certificates list
@@ -329,13 +349,15 @@ type ProductStatusesResponse struct {
core.CommonResponse core.CommonResponse
// Product statuses // Product statuses
Result []struct { Result []ProductStatusesResult `json:"result"`
}
type ProductStatusesResult struct {
// Product status code when linking it to the certificate // Product status code when linking it to the certificate
Code string `json:"code"` Code string `json:"code"`
// Status description // Status description
Name string `json:"name"` Name string `json:"name"`
} `json:"result"`
} }
func (c Certificates) ProductStatuses() (*ProductStatusesResponse, error) { func (c Certificates) ProductStatuses() (*ProductStatusesResponse, error) {
@@ -370,7 +392,10 @@ type ListProductsForCertificateResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result ListProductsForCertificateResult `json:"result"`
}
type ListProductsForCertificateResult struct {
// List of products // List of products
Items []struct { Items []struct {
// Product identifier // Product identifier
@@ -382,7 +407,6 @@ type ListProductsForCertificateResponse struct {
// Number of products found // Number of products found
Count int64 `json:"count"` Count int64 `json:"count"`
} `json:"result"`
} }
// A method for getting a list of possible statuses of products when binding them to a certificate // A method for getting a list of possible statuses of products when binding them to a certificate
@@ -412,7 +436,10 @@ type UnlinkFromProductResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result []struct { Result []UnlinkFromProductResult `json:"result"`
}
type UnlinkFromProductResult struct {
// Error message when unbinding a product // Error message when unbinding a product
Error string `json:"error"` Error string `json:"error"`
@@ -423,7 +450,6 @@ type UnlinkFromProductResponse struct {
// - true — it was unbound, // - true — it was unbound,
// - false — it is still bound // - false — it is still bound
Updated bool `json:"updated"` Updated bool `json:"updated"`
} `json:"result"`
} }
// Unbind products from a certificate // Unbind products from a certificate
@@ -445,13 +471,15 @@ type PossibleRejectReasonsResponse struct {
core.CommonResponse core.CommonResponse
// Certificate rejection reasons // Certificate rejection reasons
Result []struct { Result []PossibleRejectReasonsResult `json:"result"`
}
type PossibleRejectReasonsResult struct {
// Сode of a certificate rejection reason // Сode of a certificate rejection reason
Code string `json:"code"` Code string `json:"code"`
// Description of a certificate rejection reason // Description of a certificate rejection reason
Name string `json:"name"` Name string `json:"name"`
} `json:"result"`
} }
// Possible certificate rejection reasons // Possible certificate rejection reasons
@@ -473,13 +501,15 @@ type PossibleStatusesResponse struct {
core.CommonResponse core.CommonResponse
// Possible certificate statuses // Possible certificate statuses
Result []struct { Result []PossibleStatusesResult `json:"result"`
}
type PossibleStatusesResult struct {
// Certificate status code // Certificate status code
Code string `json:"code"` Code string `json:"code"`
// Status description // Status description
Name string `json:"name"` Name string `json:"name"`
} `json:"result"`
} }
func (c Certificates) PossibleStatuses() (*PossibleStatusesResponse, error) { func (c Certificates) PossibleStatuses() (*PossibleStatusesResponse, error) {

View File

@@ -38,9 +38,30 @@ type ListChatsResponse struct {
core.CommonResponse core.CommonResponse
// Chats data // 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 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 // Chat identifier
ChatId string `json:"chat_id"` ChatId string `json:"chat_id"`
@@ -57,23 +78,6 @@ type ListChatsResponse struct {
// Chat creation date // Chat creation date
CreatedAt time.Time `json:"created_at"` 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 // Returns information about chats by specified filters
@@ -179,7 +183,10 @@ type ChatHistoryResponse struct {
HasNext bool `json:"has_next"` HasNext bool `json:"has_next"`
// An array of messages sorted according to the direction parameter in the request body // 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 // Message creation date
CreatedAt time.Time `json:"created_at"` CreatedAt time.Time `json:"created_at"`
@@ -193,7 +200,10 @@ type ChatHistoryResponse struct {
MessageId string `json:"message_id"` MessageId string `json:"message_id"`
// Chat participant identifier // Chat participant identifier
User struct { User ChatHistoryMessageUser `json:"user"`
}
type ChatHistoryMessageUser struct {
// Chat participant identifier // Chat participant identifier
Id string `json:"id"` Id string `json:"id"`
@@ -204,8 +214,6 @@ type ChatHistoryResponse struct {
// - courier // - courier
// - support // - support
Type string `json:"type"` Type string `json:"type"`
} `json:"user"`
} `json:"messages"`
} }
// Chat history // Chat history
@@ -238,55 +246,18 @@ type UpdateChatResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result []struct { Result []UpdateChatResult `json:"result"`
}
type UpdateChatResult struct {
// An order or a product user wrote about in the chat // An order or a product user wrote about in the chat
Context struct { Context UpdateChatResultContext `json:"context"`
// 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"`
// Creation date and time // Creation date and time
CreatedAt time.Time `json:"created_at"` CreatedAt time.Time `json:"created_at"`
// Information about the file in the chat. Displayed only for `type = file` // Information about the file in the chat. Displayed only for `type = file`
File struct { File UpdateChatResultFile `json:"file"`
// 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 identifier // File identifier
Id uint64 `json:"id"` Id uint64 `json:"id"`
@@ -300,7 +271,60 @@ type UpdateChatResponse struct {
Type string `json:"type"` Type string `json:"type"`
// Chat participant information // 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 // Chat participant identifier
Id string `json:"id"` Id string `json:"id"`
@@ -310,8 +334,6 @@ type UpdateChatResponse struct {
// - crm—system messages // - crm—system messages
// - courier // - courier
Type string `json:"type"` Type string `json:"type"`
} `json:"user"`
} `json:"result"`
} }
// Update chat // Update chat
@@ -338,10 +360,12 @@ type CreateNewChatResponse struct {
core.CommonResponse core.CommonResponse
//Method result //Method result
Result struct { Result CreateNewChatResult `json:"result"`
}
type CreateNewChatResult struct {
// Chat identifier // Chat identifier
ChatId string `json:"chat_id"` 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 // Creates a new chat on the shipment with the customer. For example, to clarify the address or the product model

View File

@@ -313,3 +313,195 @@ const (
// delivery by the seller // delivery by the seller
NonIntegratedTPLType TPLIntegrationType = "non_integrated" 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"
)
type DigitalActType string
const (
// acceptance certificate
DigitalActTypeOfAcceptance DigitalActType = "act_of_acceptance"
// discrepancy certificate
DigitalActTypeOfMismatch DigitalActType = "act_of_mismatch"
// surplus certificate
DigitalActTypeOfExcess DigitalActType = "act_of_excess"
)
type PriceStrategy string
const (
// enable
PriceStrategyEnabled PriceStrategy = "ENABLED"
// disable
PriceStrategyDisabled PriceStrategy = "DISABLED"
// don't change anything. Default value
PriceStrategyUnknown PriceStrategy = "UNKNOWN"
)

View File

@@ -56,41 +56,15 @@ type GetFBOShipmentsListResponse struct {
core.CommonResponse core.CommonResponse
// Shipments list // Shipments list
Result []struct { Result []GetFBOShipmentsListResult `json:"result"`
}
type GetFBOShipmentsListResult struct {
// Additional data for shipment list // Additional data for shipment list
AdditionalData []struct { AdditionalData []GetFBOShipmentsListResultAdditionalData `json:"additional_data"`
Key string `json:"key"`
Value string `json:"value"`
} `json:"additional_data"`
// Analytical data // Analytical data
AnalyticsData struct { AnalyticsData GetFBOShipmentsListResultAnalyticsData `json:"analytics_data"`
// 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"`
// Shipment cancellation reason identifier // Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"` CancelReasonId int64 `json:"cancel_reason_id"`
@@ -118,7 +92,39 @@ type GetFBOShipmentsListResponse struct {
// Shipment status // Shipment status
Status string `json:"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 { type FBOPostingProduct struct {
@@ -196,41 +202,15 @@ type GetShipmentDetailsResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetShipmentDetailsResult `json:"result"`
}
type GetShipmentDetailsResult struct {
// Additional data // Additional data
AdditionalData []struct { AdditionalData []GetShipmentDetailsResultAdditionalData `json:"additional_data"`
Key string `json:"key"`
Value string `json:"value"`
} `json:"additional_data"`
// Analytical data // Analytical data
AnalyticsData struct { AnalyticsData GetShipmentDetailsResultAnalyticsData `json:"analytics_data"`
// 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"`
// Shipment cancellation reason identifier // Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"` CancelReasonId int64 `json:"cancel_reason_id"`
@@ -258,7 +238,39 @@ type GetShipmentDetailsResponse struct {
// Shipment status // Shipment status
Status string `json:"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 // Returns information about the shipment by its identifier
@@ -307,13 +319,7 @@ type SupplyRequestCommonResponse struct {
CreatedAt string `json:"created_at"` CreatedAt string `json:"created_at"`
// Local time supply interval // Local time supply interval
LocalTimeslot struct { LocalTimeslot SupplyRequestCommonResponseLocalTimeslot `json:"local_timeslot"`
// Interval start
From string `json:"from"`
// Interval end
To string `json:"to"`
} `json:"local_timeslot"`
// Date from which you want to bring the supply to the warehouse. Only for supplies via vDC // Date from which you want to bring the supply to the warehouse. Only for supplies via vDC
PreferredSupplyDataFrom string `json:"preferred_supply_data_from"` PreferredSupplyDataFrom string `json:"preferred_supply_data_from"`
@@ -331,16 +337,7 @@ type SupplyRequestCommonResponse struct {
SupplyOrderNumber string `json:"supply_order_number"` SupplyOrderNumber string `json:"supply_order_number"`
// Supply warehouse // Supply warehouse
SupplyWarehouse struct { SupplyWarehouse SupplyRequestCommonResponseSupplyWarehouse `json:"supply_warehouse"`
// Warehouse address
Address string `json:address"`
// Warehouse name
Name string `json:"name"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
} `json:"supply_warehouse"`
// time_left_to_prepare_supply // time_left_to_prepare_supply
TimeLeftToPrepareSupply int64 `json:"time_left_to_prepare_supply"` TimeLeftToPrepareSupply int64 `json:"time_left_to_prepare_supply"`
@@ -355,6 +352,25 @@ type SupplyRequestCommonResponse struct {
TotalQuantity int32 `json:"total_quantity"` 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. // Method for getting a list of supply requests to the Ozon warehouse.
// Requests with supply both to a specific warehouse and via a virtual // Requests with supply both to a specific warehouse and via a virtual
// distribution center (vDC) are taken into account // distribution center (vDC) are taken into account
@@ -383,7 +399,10 @@ type GetSupplyRequestInfoResponse struct {
SupplyRequestCommonResponse SupplyRequestCommonResponse
// Driver and car information // Driver and car information
VehicleInfo struct { VehicleInfo GetSupplyRequestInfoVehicle `json:"vehicle_info"`
}
type GetSupplyRequestInfoVehicle struct {
// Driver name // Driver name
DriverName string `json:"driver_name"` DriverName string `json:"driver_name"`
@@ -395,7 +414,6 @@ type GetSupplyRequestInfoResponse struct {
// Car number // Car number
VehicleNumber string `json:"vehicle_number"` VehicleNumber string `json:"vehicle_number"`
} `json:"vehicle_info"`
} }
// Method for getting detailed information on a supply request. // Method for getting detailed information on a supply request.
@@ -435,7 +453,13 @@ type ListProductsInSupplyRequestResponse struct {
HasNext bool `json:"has_next"` HasNext bool `json:"has_next"`
// Products list // Products list
Items []struct { Items []ListProductsInSupplyRequestItem `json:"items"`
// Total number of products in the request
TotalItemsCount int32 `json:"total_items_count"`
}
type ListProductsInSupplyRequestItem struct {
// Link to product image // Link to product image
IconPath string `json:"icon_path"` IconPath string `json:"icon_path"`
@@ -450,10 +474,6 @@ type ListProductsInSupplyRequestResponse struct {
// Product identifier in the Ozon system, SKU // Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"` SKU int64 `json:"sku"`
} `json:"items"`
// Total number of products in the request
TotalItemsCount int32 `json:"total_items_count"`
} }
// List of products in the sullpy request // List of products in the sullpy request
@@ -470,3 +490,60 @@ func (c FBO) ListProductsInSupplyRequest(params *ListProductsInSupplyRequestPara
return resp, nil 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
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}

View File

@@ -43,8 +43,8 @@ func TestGetFBOShipmentsList(t *testing.T) {
"posting_number": "16965409-0014-1", "posting_number": "16965409-0014-1",
"status": "delivered", "status": "delivered",
"cancel_reason_id": 0, "cancel_reason_id": 0,
"created_at": "2021-09-01T00:23:45.607Z", "created_at": "2021-09-01T00:23:45.607000Z",
"in_process_at": "2021-09-01T00:25:30.120Z", "in_process_at": "2021-09-01T00:25:30.120000Z",
"products": [ "products": [
{ {
"sku": 160249683, "sku": 160249683,
@@ -482,3 +482,61 @@ func TestListProductsInSupplyRequest(t *testing.T) {
} }
} }
} }
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"}, map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&ListOfShipmentCertificatesParams{ &ListOfShipmentCertificatesParams{
Limit: 100, Limit: 100,
Filter: ListOfShipmentCertificates{ Filter: ListOfShipmentCertificatesFilter{
DateFrom: "2021-08-04", DateFrom: "2021-08-04",
DateTo: "2022-08-04", DateTo: "2022-08-04",
IntegrationType: "ozon", IntegrationType: "ozon",
Status: []string{"delivered"}, Status: []ShipmentCertificateFilterStatus{ShitmentCertificateFilterFormed},
}, },
}, },
`{ `{
@@ -1132,9 +1132,8 @@ func TestGetLabeling(t *testing.T) {
}, },
`{ `{
"result": { "result": {
"error": "24", "status": "completed",
"file_url": "some-url", "file_url": "https://cdn1.ozone.ru/s3/sc-temporary/e6/0c/e60cdfd7aed78c2b44d134504fbd591d.pdf"
"status": "completed"
} }
}`, }`,
}, },
@@ -1186,7 +1185,9 @@ func TestPrintLabeling(t *testing.T) {
PostingNumber: []string{"48173252-0034-4"}, PostingNumber: []string{"48173252-0034-4"},
}, },
`{ `{
"content": "https://cdn1.ozone.ru/s3/ozon-disk-api/c4a11c8b748033daf6cdd44aca7ed4c492e55d6f4810f13feae4792afa7934191647255705" "content_type": "application/pdf",
"file_name": "ticket-170660-2023-07-13T13:17:06Z.pdf",
"file_content": "%PDF-1.7\n%âãÏÓ\n53 0 obj\n<</MarkInfo<</Marked true/Type/MarkInfo>>/Pages 9 0 R/StructTreeRoot 10 0 R/Type/Catalog>>\nendobj\n8 0 obj\n<</Filter/FlateDecode/Length 2888>>\nstream\nxœå[[ݶ\u0011~?¿BÏ\u0005Bs†\u001c^\u0000Àwí5ú\u0010 m\u0016Èsà¦)\n;hÒ\u0014èÏïG‰\u0014)‰<{äµ] ]?¬¬oIÎ}†¤F±‰óϤñï\u001bÕü×X­´OÏï?^~¹$<ø¨È9q\u0013Y\u0012åñì§_¼|ÿ‡égü\t+\u0012\u001bxžª}Æxšҿ¿¼›–‡_º¼xg¦Ÿþ5Oku˜œÌ3ýíògüûå\"Ni\u0016C\u0001°\u000fA9g‰'r¢\"\u0013YóĪ\u0018NÑ{\u001d–ÕóZ¬\\Ô\""
}`, }`,
}, },
// Test No Client-Id or Api-Key // Test No Client-Id or Api-Key
@@ -1212,6 +1213,12 @@ func TestPrintLabeling(t *testing.T) {
if resp.StatusCode != test.statusCode { if resp.StatusCode != test.statusCode {
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode) t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
} }
if resp.StatusCode == http.StatusOK {
if resp.Content == "" {
t.Error("content cannot be empty")
}
}
} }
} }
@@ -1480,8 +1487,8 @@ func TestRescheduleShipmentDeliveryDate(t *testing.T) {
&RescheduleShipmentDeliveryDateParams{ &RescheduleShipmentDeliveryDateParams{
PostingNumber: "23281294-0063-2", PostingNumber: "23281294-0063-2",
NewTimeslot: RescheduleShipmentDeliveryDateTimeslot{ NewTimeslot: RescheduleShipmentDeliveryDateTimeslot{
DeliveryDateBegin: 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"),
DeliveryDateEnd: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-03T11:07:00.381Z"), To: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-25T08:51:56.932Z"),
}, },
}, },
`{ `{
@@ -1888,9 +1895,9 @@ func TestGetDigitalAct(t *testing.T) {
DocType: "act_of_acceptance", DocType: "act_of_acceptance",
}, },
`{ `{
"content": "string", "content_type": "application/pdf",
"name": "string", "file_name": "20816409_act_of_mismatch.pdf",
"type": "string" "file_content": "%PDF-1.4\n%ÓôÌá\n1 0 obj\n<<\n/Creator(Chromium)\n/Producer(PDFsharp 1.50.5147 \\([www.pdfsharp.com|http://www.pdfsharp.com/]\\) \\(Original: Skia/PDF m103\\))\n/CreationDate(D:20230625092529+00'00')\n/ModDate(D:20230625092529+00'00')\n>>\nendobj\n2 0 obj\n<<\n/Type/Page\n/Resources\n<<\n/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]\n/ExtGState\n<<\n/G3 3 0 R\n/G8 8 0 R\n>>\n/XObject\n<<\n/X6 6 0 R\n/X7 7 0 R\n>>\n/Font\n<<\n/F4 4 0 R\n/F5 5 0 R\n>>\n>>\n/MediaBox[0 0 594.96 841.92]\n/Contents 9 0 R\n/StructParents 0\n/Parent 13 0 R\n/Group\n<<\n/CS/DeviceRGB\n/S/Transparency\n>>\n>>\nendobj\n3 0 obj\n<<\n/ca 1\n/BM/Normal\n>>\nendobj\n4 0 obj\n<<\n/Type/Font\n/Subtype/Type0\n/BaseFont/AAAAAA+LiberationSans\n/Encoding/Identity-H\n/DescendantFonts[160 0 R]\n/ToUnicode 161 0 R\n>>\nendobj\n5 0 obj\n<<\n/Type/Font\n/Subtype/Type0\n/BaseFont/BAAAAA+LiberationSans-Bold\n/Encoding/Identity-H\n/DescendantFonts[164 0"
}`, }`,
}, },
// Test No Client-Id or Api-Key // Test No Client-Id or Api-Key
@@ -2526,3 +2533,169 @@ func TestETGBCustomsDeclarations(t *testing.T) {
} }
} }
} }
func TestBarcodeFromProductShipment(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *BarcodeFromProductShipmentParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&BarcodeFromProductShipmentParams{
Id: 295662811,
},
`{
"content_type": "image/png",
"file_name": "20913984_barcode.png",
"file_content": "‰PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0003\u0010\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000íZ\u000e'\u0000\u0000\u0002pIDATxœìÕÁJ\u00031\u0014@Q+þÿ/×E\u0017\u000e¼›\u0010u¡-ç¬$£Éˌp?î÷·§t» }ýü¸ÃcåzŸ¹2w˜OWû\\Ϛ뫧×Ùö;œì|rÇýßîç¼úî{˜§¬N?™í7oì•v¸®Ÿµ¹Ãù„û•¹¾ÿÏ9ÿî?›až¸ºéê7O&߿É9çÉ\u000eÏáý¯\u0007\u0000à\u0012\b\u0000’@\u0000\u0004\u0002€$\u0010\u0000$\u0000 \t\u0004\u0000I \u0000H\u0002\u0001@\u0012\b\u0000’@\u0000\u0004\u0002€$\u0010\u0000$\u0000 \t\u0004\u0000I \u0000H\u0002\u0001@\u0012\b\u0000’@\u0000\u0004\u0002€$\u0010\u0000$\u0000 \t\u0004\u0000I \u0000H\u0002\u0001@\u0012\b\u0000’@\u0000\u0004\u0002€$\u0010\u0000$\u0000 \t\u0004\u0000I \u0000H\u0002\u0001@\u0012\b\u0000’@\u0000\u0004\u0002€$\u0010\u0000"
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&BarcodeFromProductShipmentParams{},
`{
"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.FBS().BarcodeFromProductShipment(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 resp.Content == "" {
t.Errorf("content cannot be empty")
}
if resp.Type == "" {
t.Error("type cannot be empty")
}
if resp.Name == "" {
t.Error("name cannot be empty")
}
}
}
}
func TestBarcodeValueFromProductShipment(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *BarcodeValueFromProductShipmentParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&BarcodeValueFromProductShipmentParams{
Id: 295662811,
},
`{
"result": "%303%24276481394"
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&BarcodeValueFromProductShipmentParams{},
`{
"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.FBS().BarcodeValueFromProductShipment(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 resp.Result == "" {
t.Errorf("result cannot be empty")
}
}
}
}
func TestGetActPDF(t *testing.T) {
t.Parallel()
tests := []struct {
statusCode int
headers map[string]string
params *GetActPDFParams
response string
}{
// Test Ok
{
http.StatusOK,
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
&GetActPDFParams{
Id: 22435521842000,
},
`{
"content_type": "application/pdf",
"file_name": "20928233.pdf",
"file_content": "binarystring"
}`,
},
// Test No Client-Id or Api-Key
{
http.StatusUnauthorized,
map[string]string{},
&GetActPDFParams{},
`{
"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.FBS().GetActPDF(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 resp.FileContent == "" {
t.Errorf("result cannot be empty")
}
}
}
}

View File

@@ -20,9 +20,18 @@ type ReportOnSoldProductsResponse struct {
core.CommonResponse core.CommonResponse
// Query result // Query result
Result []struct { Result []ReportonSoldProductsResult `json:"result"`
}
type ReportonSoldProductsResult struct {
// Report title page // Report title page
Header []struct { Header []ReportOnSoldProductsResultHeader `json:"header"`
// Report table
Rows []ReportOnSoldProductsResultRow `json:"rows"`
}
type ReportOnSoldProductsResultHeader struct {
// Report ID // Report ID
Id string `json:"num"` Id string `json:"num"`
@@ -67,10 +76,9 @@ type ReportOnSoldProductsResponse struct {
// Period end in the report // Period end in the report
StopDate string `json:"stop_date"` StopDate string `json:"stop_date"`
} `json:"header"` }
// Report table type ReportOnSoldProductsResultRow struct {
Rows []struct {
// Row number // Row number
RowNumber int32 `json:"row_number"` RowNumber int32 `json:"row_number"`
@@ -138,8 +146,6 @@ type ReportOnSoldProductsResponse struct {
// Quantity of returned products // Quantity of returned products
ReturnQuantity int32 `json:"return_qty"` 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. // Returns information on products sold and returned within a month. Canceled or non-purchased products are not included.
@@ -196,7 +202,10 @@ type GetTotalTransactionsSumResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetTotalTransactionsSumResult `json:"result"`
}
type GetTotalTransactionsSumResult struct {
// Total cost of products and returns for specified period // Total cost of products and returns for specified period
AccrualsForSale float64 `json:"accruals_for_sale"` 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. // The additional services cost that are not directly related to deliveries and returns.
// For example, promotion or product placement // For example, promotion or product placement
ServicesAmount float64 `json:"services_amount"` ServicesAmount float64 `json:"services_amount"`
} `json:"result"`
} }
// Returns total sums for transactions for specified period // Returns total sums for transactions for specified period
@@ -247,7 +255,7 @@ func (c Finance) GetTotalTransactionsSum(params *GetTotalTransactionsSumParams)
return resp, nil return resp, nil
} }
type ListTransactionsParams struct{ type ListTransactionsParams struct {
// Filter // Filter
Filter ListTransactionsFilter `json:"filter"` Filter ListTransactionsFilter `json:"filter"`
@@ -258,7 +266,7 @@ type ListTransactionsParams struct{
PageSize int64 `json:"page_size"` PageSize int64 `json:"page_size"`
} }
type ListTransactionsFilter struct{ type ListTransactionsFilter struct {
// Filter by date // Filter by date
Date ListTransactionsFilterDate `json:"date"` Date ListTransactionsFilterDate `json:"date"`
@@ -272,7 +280,7 @@ type ListTransactionsFilter struct{
TransactionType string `json:"transaction_type"` TransactionType string `json:"transaction_type"`
} }
type ListTransactionsFilterDate struct{ type ListTransactionsFilterDate struct {
// Period start. // Period start.
// //
// Format: YYYY-MM-DDTHH:mm:ss.sssZ. // Format: YYYY-MM-DDTHH:mm:ss.sssZ.
@@ -286,13 +294,25 @@ type ListTransactionsFilterDate struct{
To time.Time `json:"to"` To time.Time `json:"to"`
} }
type ListTransactionsResponse struct{ type ListTransactionsResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct{ Result ListTransactionsResult `json:"result"`
}
type ListTransactionsResult struct {
// Transactions infromation // 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 // Cost of the products with seller's discounts applied
AccrualsForSale float64 `json:"accruals_for_sale"` AccrualsForSale float64 `json:"accruals_for_sale"`
@@ -303,13 +323,7 @@ type ListTransactionsResponse struct{
DeliveryCharge float64 `json:"delivery_charge"` DeliveryCharge float64 `json:"delivery_charge"`
// Product information // Product information
Items []struct{ Items []ListTransactionsResultOperationItem `json:"items"`
// Product name
Name string `json:"name"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
} `json:"items"`
// Operation date // Operation date
OperationDate string `json:"operation_date"` OperationDate string `json:"operation_date"`
@@ -324,7 +338,30 @@ type ListTransactionsResponse struct{
OperationTypeName string `json:"operation_type_name"` OperationTypeName string `json:"operation_type_name"`
// Shipment information // 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: // Delivery scheme:
// - FBO — delivery to Ozon warehouse // - FBO — delivery to Ozon warehouse
// - FBS — delivery from seller's warehouse // - FBS — delivery from seller's warehouse
@@ -340,33 +377,14 @@ type ListTransactionsResponse struct{
// Warehouse identifier // Warehouse identifier
WarehouseId int64 `json:"warehouse_id"` 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 type ListTransactionsResultOperationService struct {
ReturnDeliveryCharge float64 `json:"return_delivery_charge"`
// Sales commission or sales commission refund
SaleCommission float64 `json:"sale_commission"`
// Additional services
Services []struct{
// Service name // Service name
Name string `json:"name"` Name string `json:"name"`
// Price // Price
Price float64 `json:"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. // Returns detailed information on all accruals. The maximum period for which you can get information in one request is 1 month.

View File

@@ -49,10 +49,12 @@ type GetProformaLinkResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetProformaLinkResult `json:"result"`
}
type GetProformaLinkResult struct {
// Proforma invoice link // Proforma invoice link
FileURL string `json:"file_url"` FileURL string `json:"file_url"`
} `json:"result"`
} }
// Get a proforma invoice link // Get a proforma invoice link

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -454,6 +454,7 @@ func TestUpdatePrices(t *testing.T) {
OldPrice: "0", OldPrice: "0",
Price: "1448", Price: "1448",
ProductId: 1386, ProductId: 1386,
PriceStrategyEnabled: PriceStrategyUnknown,
}, },
}, },
}, },
@@ -2487,3 +2488,65 @@ func TestNumberOfSubsToProductAvailability(t *testing.T) {
} }
} }
} }
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 core.CommonResponse
// Method result // Method result
Result []struct { Result []GetAvailablePromotionsResult `json:"result"`
}
type GetAvailablePromotionsResult struct {
// Promotion identifier // Promotion identifier
Id float64 `json:"id"` Id float64 `json:"id"`
@@ -67,7 +70,6 @@ type GetAvailablePromotionsResponse struct {
// Discount size // Discount size
DiscountValue float64 `json:"discount_value"` DiscountValue float64 `json:"discount_value"`
} `json:"result"`
} }
// A method for getting a list of promotions that you can participate in // A method for getting a list of promotions that you can participate in
@@ -108,19 +110,23 @@ type AddProductToPromotionResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result AddProductToPromotionResult `json:"result"`
}
type AddProductToPromotionResult struct {
// List of product identifiers that were added to the promotion // List of product identifiers that were added to the promotion
ProductIds []float64 `json:"product_ids"` ProductIds []float64 `json:"product_ids"`
// List of products that weren't added to the promotion // List of products that weren't added to the promotion
Rejected []struct { Rejected []AddProductToPromotionResultRejected `json:"rejected"`
}
type AddProductToPromotionResultRejected struct {
// Product identifier // Product identifier
ProductId float64 `json:"product_id"` ProductId float64 `json:"product_id"`
// Reason why the product wasn't added to the promotion // Reason why the product wasn't added to the promotion
Reason string `json:"reason"` Reason string `json:"reason"`
} `json:"rejected"`
} `json:"result"`
} }
// A method for adding products to an available promotion // A method for adding products to an available promotion
@@ -154,13 +160,15 @@ type ProductsAvailableForPromotionResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result ProductsAvailableForPromotionResult `json:"result"`
}
type ProductsAvailableForPromotionResult struct {
// Products list // Products list
Products []PromotionProduct `json:"products"` Products []PromotionProduct `json:"products"`
// Total number of products that can participate in the promotion // Total number of products that can participate in the promotion
Total float64 `json:"total"` Total float64 `json:"total"`
} `json:"result"`
} }
type PromotionProduct struct { type PromotionProduct struct {
@@ -216,13 +224,15 @@ type ProductsInPromotionResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result ProductsInPromotionResult `json:"reuslt"`
}
type ProductsInPromotionResult struct {
// Products list // Products list
Products []PromotionProduct `json:"products"` Products []PromotionProduct `json:"products"`
// Total number of products that can participate in the promotion // Total number of products that can participate in the promotion
Total float64 `json:"total"` Total float64 `json:"total"`
} `json:"reuslt"`
} }
// A method for getting the list of products participating in the promotion by its identifier // A method for getting the list of products participating in the promotion by its identifier
@@ -252,19 +262,23 @@ type RemoveProductFromPromotionResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result RemoveProductFromPromotionResult `json:"result"`
}
type RemoveProductFromPromotionResult struct {
// List of product identifiers that were removed from the promotion // List of product identifiers that were removed from the promotion
ProductIds []float64 `json:"product_ids"` ProductIds []float64 `json:"product_ids"`
// List of product identifiers that weren't removed from the promotion // List of product identifiers that weren't removed from the promotion
Rejected []struct { Rejected []RemoveProductFromPromotionResultRejected `json:"rejected"`
}
type RemoveProductFromPromotionResultRejected struct {
// Product identifier // Product identifier
ProductId float64 `json:"product_id"` ProductId float64 `json:"product_id"`
// Reason why the product wasn't removed from the promotion // Reason why the product wasn't removed from the promotion
Reason string `json:"reason"` Reason string `json:"reason"`
} `json:"rejected"`
} `json:"result"`
} }
// A method for removing products from the promotion // A method for removing products from the promotion
@@ -286,7 +300,10 @@ type ListHotSalePromotionsResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result []struct { Result []ListHotSalePromotionsResult `json:"result"`
}
type ListHotSalePromotionsResult struct {
// Promotion end date // Promotion end date
DateEnd string `json:"date_end"` DateEnd string `json:"date_end"`
@@ -312,7 +329,6 @@ type ListHotSalePromotionsResponse struct {
// Promotion name // Promotion name
Title string `json:"title"` Title string `json:"title"`
} `json:"result"`
} }
// List of available Hot Sale promotions // List of available Hot Sale promotions
@@ -345,9 +361,18 @@ type ProductsAvailableForHotSalePromotionResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result ProductsAvailableForHotSalePromotionResult `json:"result"`
}
type ProductsAvailableForHotSalePromotionResult struct {
// Products list // 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 // Promotional product price
ActionPrice float64 `json:"action_price"` ActionPrice float64 `json:"action_price"`
@@ -368,11 +393,6 @@ type ProductsAvailableForHotSalePromotionResponse struct {
// Number of product units in a stock discount type promotion // Number of product units in a stock discount type promotion
Stock float64 `json:"stock"` 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 // Method for getting a list of products that can participate or are already participating in the Hot Sale promotion
@@ -413,16 +433,20 @@ type ProductsToHotSaleResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result ProductsToHotSaleResult `json:"result"`
}
type ProductsToHotSaleResult struct {
// List of products that haven't been added to the promotion // List of products that haven't been added to the promotion
Rejected []struct { Rejected []ProductsToHotSaleResultRejected `json:"rejected"`
}
type ProductsToHotSaleResultRejected struct {
//Product identifier //Product identifier
ProductId float64 `json:"product_id"` ProductId float64 `json:"product_id"`
// Reason why the product hasn't been added to the promotion // Reason why the product hasn't been added to the promotion
Reason string `json:"reason"` Reason string `json:"reason"`
} `json:"rejected"`
} `json:"result"`
} }
func (c Promotions) AddProductsToHotSale(params *AddProductsToHotSaleParams) (*ProductsToHotSaleResponse, error) { func (c Promotions) AddProductsToHotSale(params *AddProductsToHotSaleParams) (*ProductsToHotSaleResponse, error) {
@@ -477,7 +501,10 @@ type ListDiscountRequestsResponse struct {
core.CommonResponse core.CommonResponse
// List of requests // List of requests
Result []struct { Result []ListDiscountRequestsResult `json:"result"`
}
type ListDiscountRequestsResult struct {
// Request ID // Request ID
Id uint64 `json:"id"` Id uint64 `json:"id"`
@@ -582,7 +609,6 @@ type ListDiscountRequestsResponse struct {
// Approved price fee percent // Approved price fee percent
ApprovedPriceFeePercent float64 `json:"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 // Method for getting a list of products that customers want to buy with discount
@@ -626,22 +652,26 @@ type DiscountRequestResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result DiscountRequestResult `json:"result"`
// Errors when creating a request }
FailDetails []struct {
// Request ID
TaskId uint64 `json:"task_id"`
// Error message type DiscountRequestResult struct {
ErrorForUser string `json:"error_for_user"` // Errors when creating a request
} `json:"fail_details"` FailDetails []DiscountRequestResultFailDetail `json:"fail_details"`
// The number of requests with a successful status change // The number of requests with a successful status change
SuccessCount int32 `json:"success_count"` SuccessCount int32 `json:"success_count"`
// The number of requests that failed to change their status // The number of requests that failed to change their status
FailCount int32 `json:"fail_count"` 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: // You can approve applications in statuses:

View File

@@ -15,29 +15,27 @@ type GetCurrentSellerRatingInfoResponse struct {
core.CommonResponse core.CommonResponse
// Rating groups list // Rating groups list
Groups []struct { Groups []GetCurrentSellerRatingInfoGroup `json:"groups"`
}
type GetCurrentSellerRatingInfoGroup struct {
// Ratings group name // Ratings group name
GroupName string `json:"group_name"` GroupName string `json:"group_name"`
// Ratings list // 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 // Rating change: the ratio of the previous value to the current one
Change struct { Change GetCurrentSellerRatingInfoGroupItemChange `json:"change"`
// 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"`
// Current rating value // Current rating value
CurrentValue float64 `json:"current_value"` CurrentValue float64 `json:"current_value"`
@@ -74,14 +72,22 @@ type GetCurrentSellerRatingInfoResponse struct {
// - REVIEW_SCORE — score, // - REVIEW_SCORE — score,
// - COUNT // - COUNT
ValueType string `json:"value_type"` ValueType string `json:"value_type"`
} `json:"items"` }
// An indication that the penalty points balance is exceeded type GetCurrentSellerRatingInfoGroupItemChange struct {
PenaltyScoreExceeded bool `json:"penalty_score_exceeded"` // 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 // What the change means:
Premium bool `json:"premium"` // - MEANING_UNKNOWN — unknown.
} `json:"groups"` // - 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) { func (c Rating) GetCurrentSellerRatingInfo() (*GetCurrentSellerRatingInfoResponse, error) {
@@ -116,12 +122,21 @@ type GetSellerRatingInfoPeriodResponse struct {
core.CommonResponse core.CommonResponse
// Information on the Premium program penalty points // 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 name
Rating string `json:"rating"` Rating string `json:"rating"`
// Information on penalty points // Information on penalty points
Scores []struct { Scores []GetSellerRatingInfoPeriodPremiumScore `json:"scores"`
}
type GetSellerRatingInfoPeriodPremiumScore struct {
// Date when the penalty points were received // Date when the penalty points were received
Date time.Time `json:"date"` Date time.Time `json:"date"`
@@ -130,11 +145,9 @@ type GetSellerRatingInfoPeriodResponse struct {
// Number of received penalty points // Number of received penalty points
Value int32 `json:"value"` Value int32 `json:"value"`
} `json:"scores"` }
} `json:"premium_scores"`
// Information on the seller ratings type GetSellerRatingInfoPeriodRating struct {
Ratings []struct {
// Rating threshold, after which sales will be blocked // Rating threshold, after which sales will be blocked
DangerThreshold float64 `json:"danger_threshold"` DangerThreshold float64 `json:"danger_threshold"`
@@ -145,7 +158,13 @@ type GetSellerRatingInfoPeriodResponse struct {
Rating string `json:"rating"` Rating string `json:"rating"`
// Rating values list // 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 // Rating calculation start date
DateFrom time.Time `json:"date_from"` DateFrom time.Time `json:"date_from"`
@@ -153,7 +172,13 @@ type GetSellerRatingInfoPeriodResponse struct {
DateTo time.Time `json:"date_to"` DateTo time.Time `json:"date_to"`
// Rating status // 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 // Indication if the rating threshold for blocking is exceeded
Danger bool `json:"danger"` Danger bool `json:"danger"`
@@ -162,15 +187,6 @@ type GetSellerRatingInfoPeriodResponse struct {
// Indication of a warning that the threshold for blocking may be exceeded // Indication of a warning that the threshold for blocking may be exceeded
Warning bool `json:"warning"` 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) { func (c Rating) GetSellerRatingInfoForPeriod(params *GetSellerRatingInfoForPeriodParams) (*GetSellerRatingInfoPeriodResponse, error) {

View File

@@ -38,9 +38,18 @@ type GetReportsListResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetReportsListResult `json:"result"`
}
type GetReportsListResult struct {
// Array with generated reports // Array with generated reports
Reports []struct { Reports []GetReportsListResultReport `json:"reports"`
// Total number of reports
Total int32 `json:"total"`
}
type GetReportsListResultReport struct {
// Unique report identifier // Unique report identifier
Code string `json:"code"` Code string `json:"code"`
@@ -54,8 +63,7 @@ type GetReportsListResponse struct {
File string `json:"file"` File string `json:"file"`
// Array with the filters specified when the seller created the report // Array with the filters specified when the seller created the report
Params struct { Params map[string]string `json:"params"`
} `json:"params"`
// Report type: // Report type:
// - SELLER_PRODUCTS — products report, // - SELLER_PRODUCTS — products report,
@@ -72,11 +80,6 @@ type GetReportsListResponse struct {
// - `success` // - `success`
// - `failed` // - `failed`
Status string `json:"status"` 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 // Returns the list of reports that have been generated before
@@ -103,7 +106,10 @@ type GetReportDetailsResponse struct {
core.CommonResponse core.CommonResponse
// Report details // Report details
Result struct { Result GetReportDetailResult `json:"result"`
}
type GetReportDetailResult struct {
// Unique report identifier // Unique report identifier
Code string `json:"code"` Code string `json:"code"`
@@ -134,7 +140,6 @@ type GetReportDetailsResponse struct {
// - success // - success
// - failed // - failed
Status string `json:"status"` Status string `json:"status"`
} `json:"result"`
} }
// Returns information about a created report by its identifier // Returns information about a created report by its identifier
@@ -159,6 +164,9 @@ type GetFinancialReportParams struct {
// Number of the page returned in the request // Number of the page returned in the request
Page int64 `json:"page"` Page int64 `json:"page"`
// true, если нужно добавить дополнительные параметры в ответ
WithDetails bool `json:"with_details"`
// Number of items on the page // Number of items on the page
PageSize int64 `json:"page_size"` PageSize int64 `json:"page_size"`
} }
@@ -175,20 +183,23 @@ type GetFinancialReportResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetFinancialResultResult `json:"result"`
}
type GetFinancialResultResult struct {
// Reports list // 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 data
Period struct { Period GetFinancialResultResultCashflowPeriod `json:"period"`
// Period identifier
Id int64 `json:"id"`
// Period start
Begin time.Time `json:"begin"`
// Period end
End time.Time `json:"end"`
} `json:"period"`
// Sum of sold products prices // Sum of sold products prices
OrdersAmount float64 `json:"order_amount"` OrdersAmount float64 `json:"order_amount"`
@@ -207,11 +218,177 @@ type GetFinancialReportResponse struct {
// Code of the currency used to calculate the commissions // Code of the currency used to calculate the commissions
CurrencyCode string `json:"currency_code"` CurrencyCode string `json:"currency_code"`
} `json:"cash_flows"` }
// Number of pages with reports type GetFinancialResultResultCashflowPeriod struct {
PageCount int64 `json:"page_count"` // Period identifier
} `json:"result"` 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 // Returns information about a created report by its identifier
@@ -254,10 +431,12 @@ type GetProductsReportResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetProductsReportResult `json:"result"`
}
type GetProductsReportResult struct {
// Unique report identifier // Unique report identifier
Code string `json:"code"` Code string `json:"code"`
} `json:"result"`
} }
// Method for getting a report with products data. For example, Ozon ID, number of products, prices, status // Method for getting a report with products data. For example, Ozon ID, number of products, prices, status
@@ -287,10 +466,12 @@ type GetStocksReportResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetStocksReportResult `json:"result"`
}
type GetStocksReportResult struct {
// Unique report identifier // Unique report identifier
Code string `json:"code"` Code string `json:"code"`
} `json:"result"`
} }
// Report with information about the number of available and reserved products in stock // Report with information about the number of available and reserved products in stock
@@ -326,10 +507,12 @@ type GetProductsMovementReportResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetProductsMovementReportResult `json:"result"`
}
type GetProductsMovementReportResult struct {
// Unique report identifier // Unique report identifier
Code string `json:"code"` Code string `json:"code"`
} `json:"result"`
} }
// Report with complete information on products, as well as the number of products with statuses: // Report with complete information on products, as well as the number of products with statuses:
@@ -377,10 +560,12 @@ type GetReturnsReportResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetReturnReportResult `json:"result"`
}
type GetReturnReportResult struct {
// Unique report identifier // Unique report identifier
Code string `json:"code"` 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. // The report contains information about returned products that were accepted from the customer, ready for pickup, or delivered to the seller.
@@ -446,10 +631,12 @@ type GetShipmentReportResponse struct {
core.CommonResponse core.CommonResponse
// Method result // Method result
Result struct { Result GetShipmentReportResult `json:"result"`
}
type GetShipmentReportResult struct {
// Unique report identifier // Unique report identifier
Code string `json:"code"` Code string `json:"code"`
} `json:"result"`
} }
// Shipment report with orders details: // Shipment report with orders details:
@@ -507,7 +694,10 @@ type ReportOnDiscountedProductsResponse struct {
core.CommonResponse core.CommonResponse
// Report information // Report information
Report struct { Report ReportonDiscountedProductsReport `json:"report"`
}
type ReportonDiscountedProductsReport struct {
// Report creation date // Report creation date
CreatedAt time.Time `json:"created_at"` CreatedAt time.Time `json:"created_at"`
@@ -523,7 +713,6 @@ type ReportOnDiscountedProductsResponse struct {
// Report generation error code // Report generation error code
Error string `json:"error"` Error string `json:"error"`
} `json:"report"`
} }
// By report identifier, returns information about the report generated earlier // By report identifier, returns information about the report generated earlier

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"), 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"), To: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2022-12-31T00:00:00.000Z"),
}, },
WithDetails: true,
Page: 1, Page: 1,
PageSize: 1, PageSize: 1,
}, },
@@ -172,21 +173,90 @@ func TestGetFinancialReport(t *testing.T) {
"result": { "result": {
"cash_flows": [ "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, "commission_amount": 1437,
"services_amount": 8471.28, "currency_code": "string",
"item_delivery_and_return_amount": 1991, "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 // Test No Client-Id or Api-Key

View File

@@ -28,7 +28,8 @@ type GetFBOReturnsFilter struct {
// Shipment number // Shipment number
PostingNumber string `json:"posting_number"` PostingNumber string `json:"posting_number"`
Status []string `json:"status"` // Return status
Status []GetFBOReturnsFilterStatus `json:"status"`
} }
type GetFBOReturnsResponse struct { type GetFBOReturnsResponse struct {
@@ -38,7 +39,10 @@ type GetFBOReturnsResponse struct {
LastId int64 `json:"last_id"` LastId int64 `json:"last_id"`
// Returns information // Returns information
Returns []struct { Returns []GetFBOReturnsReturn `json:"returns"`
}
type GetFBOReturnsReturn struct {
// Time when a return was received from the customer // Time when a return was received from the customer
AcceptedFromCustomerMoment time.Time `json:"accepted_from_customer_moment"` AcceptedFromCustomerMoment time.Time `json:"accepted_from_customer_moment"`
@@ -70,8 +74,7 @@ type GetFBOReturnsResponse struct {
SKU int64 `json:"sku"` SKU int64 `json:"sku"`
// Return status // Return status
Status string `json:"status_name"` Status GetFBOReturnsReturnStatus `json:"status_name"`
} `json:"returns"`
} }
// Method for getting information on returned products that are sold from the Ozon warehouse // Method for getting information on returned products that are sold from the Ozon warehouse
@@ -98,9 +101,10 @@ type GetFBSReturnsParams struct {
// - minimum — 1 // - minimum — 1
Limit int64 `json:"limit"` Limit int64 `json:"limit"`
// Number of elements that will be skipped in the response. // Return identifier that was loaded the last time.
// For example, if offset=10, the response will start with the 11th element found // Return identifiers with the higher value than `last_id`
Offset int64 `json:"offset"` // will be returned in the response.
LastId int64 `json:"offset"`
} }
type GetFBSReturnsFilter struct { type GetFBSReturnsFilter struct {
@@ -108,7 +112,7 @@ type GetFBSReturnsFilter struct {
AcceptedFromCustomerMoment GetFBSReturnsFilterTimeRange `json:"accepted_from_customer_moment"` AcceptedFromCustomerMoment GetFBSReturnsFilterTimeRange `json:"accepted_from_customer_moment"`
// Last day of free storage // Last day of free storage
LastFreeWaitingDay []GetFBSReturnsFilterTimeRange `json:"last_free_waiting_dat"` LastFreeWaitingDay GetFBSReturnsFilterTimeRange `json:"last_free_waiting_dat"`
// Order ID // Order ID
OrderId int64 `json:"order_id"` OrderId int64 `json:"order_id"`
@@ -122,13 +126,8 @@ type GetFBSReturnsFilter struct {
// Product ID // Product ID
ProductOfferId string `json:"product_offer_id"` ProductOfferId string `json:"product_offer_id"`
// Return status: // Return status
// - returned_to_seller — returned to seller, Status GetFBSReturnsFilterStatus `json:"status"`
// - 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"`
} }
type GetFBSReturnsFilterTimeRange struct { type GetFBSReturnsFilterTimeRange struct {
@@ -150,12 +149,16 @@ type GetFBSReturnsFilterTimeRange struct {
type GetFBSReturnsResponse struct { type GetFBSReturnsResponse struct {
core.CommonResponse core.CommonResponse
Result struct { // Return identifier that was loaded the last time.
// Elements counter in the response // Return identifiers with the higher value than `last_id`
Count int64 `json:"count"` // will be returned in the response
LastId int64 `json:"last_id"`
// Returns information // Returns information
Returns []struct { Returns []GetFBSReturnResultReturn `json:"returns"`
}
type GetFBSReturnResultReturn struct {
// Time of receiving the return from the customer // Time of receiving the return from the customer
AcceptedFromCustomerAmount string `json:"accepted_from_customer_amount"` AcceptedFromCustomerAmount string `json:"accepted_from_customer_amount"`
@@ -168,7 +171,10 @@ type GetFBSReturnsResponse struct {
// Commission percentage // Commission percentage
CommissionPercent float64 `json:"commission_percent"` 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"` Id int64 `json:"id"`
// If the product is in transit — true // If the product is in transit — true
@@ -192,6 +198,8 @@ type GetFBSReturnsResponse struct {
// Shipment number // Shipment number
PostingNumber string `json:"posting_number"` PostingNumber string `json:"posting_number"`
PickingTag string `json:"picking_tag"`
// Current product price without a discount // Current product price without a discount
Price float64 `json:"price"` Price float64 `json:"price"`
@@ -207,6 +215,12 @@ type GetFBSReturnsResponse struct {
// Product quantity // Product quantity
Quantity int64 `json:"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 // Product return date
ReturnDate string `json:"return_date"` ReturnDate string `json:"return_date"`
@@ -230,13 +244,11 @@ type GetFBSReturnsResponse struct {
// Return status // Return status
Status string `json:"status"` Status string `json:"status"`
} `json:"returns"`
} `json:"result"`
} }
// Method for getting information on returned products that are sold from the seller's warehouse // Method for getting information on returned products that are sold from the seller's warehouse
func (c Returns) GetFBSReturns(params *GetFBSReturnsParams) (*GetFBSReturnsResponse, error) { func (c Returns) GetFBSReturns(params *GetFBSReturnsParams) (*GetFBSReturnsResponse, error) {
url := "/v2/returns/company/fbs" url := "/v3/returns/company/fbs"
resp := &GetFBSReturnsResponse{} resp := &GetFBSReturnsResponse{}

View File

@@ -105,42 +105,43 @@ func TestGetFBSReturns(t *testing.T) {
Status: "returned_to_seller", Status: "returned_to_seller",
}, },
Limit: 1000, Limit: 1000,
Offset: 0, LastId: 0,
}, },
`{ `{
"result": { "last_id": 0,
"returns": [ "returns": [
{ {
"id": 19166541735000, "accepted_from_customer_moment": "string",
"clearing_id": 19166541725000, "clearing_id": 23,
"posting_number": "07402477-0022-2", "commission": 21,
"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,
"commission_percent": 0, "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, "price_without_commission": 0,
"is_moving": false, "product_id": 2222,
"moving_to_place_name": "МОСКВА_ХАБ", "product_name": "string",
"waiting_for_seller_days": 2, "quantity": 0,
"picking_amount": null, "return_barcode": "string",
"accepted_from_customer_moment": null, "return_clearing_id": 0,
"picking_tag": null "return_date": "string",
} "return_reason_name": "string",
], "waiting_for_seller_date_time": "string",
"count": 1 "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 // Test No Client-Id or Api-Key
@@ -168,20 +169,17 @@ func TestGetFBSReturns(t *testing.T) {
} }
if resp.StatusCode == http.StatusOK { if resp.StatusCode == http.StatusOK {
if int(resp.Result.Count) != len(resp.Result.Returns) { if len(resp.Returns) > 0 {
t.Errorf("Count must equal to length of returns") if resp.Returns[0].Id == 0 {
}
if len(resp.Result.Returns) > 0 {
if resp.Result.Returns[0].Id == 0 {
t.Errorf("Id cannot be 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") 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") t.Errorf("SKU cannot be 0")
} }
if resp.Result.Returns[0].Status == "" { if resp.Returns[0].Status == "" {
t.Errorf("Status cannot be empty") 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 { type GetListOfWarehousesResponse struct {
core.CommonResponse core.CommonResponse
Result []struct { Result []GetListOfWarehousesResult `json:"result"`
}
type GetListOfWarehousesResult struct {
// Trusted acceptance attribute. `true` if trusted acceptance is enabled in the warehouse // Trusted acceptance attribute. `true` if trusted acceptance is enabled in the warehouse
HasEntrustedAcceptance bool `json:"has_entrusted_acceptance"` HasEntrustedAcceptance bool `json:"has_entrusted_acceptance"`
@@ -33,23 +36,7 @@ type GetListOfWarehousesResponse struct {
CanPrintActInAdvance bool `json:"can_print_act_in_advance"` CanPrintActInAdvance bool `json:"can_print_act_in_advance"`
// FBS first mile // FBS first mile
FirstMileType struct { FirstMileType GetListOfWarehousesResultFirstMile `json:"first_mile_type"`
// 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"`
// Indication if there is a limit on the minimum number of orders. `true` if there is such a limit // 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"` HasPostingsLimit bool `json:"has_postings_limit"`
@@ -77,7 +64,24 @@ type GetListOfWarehousesResponse struct {
// Warehouse working days // Warehouse working days
WorkingDays []WorkingDay `json:"working_days"` WorkingDays []WorkingDay `json:"working_days"`
} `json:"resulCommonResponse"` }
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 // You do not need to specify any parameters in the request. Your company will be identified by the Warehouses ID
@@ -131,7 +135,10 @@ type GetListOfDeliveryMethodsResponse struct {
HasNext bool `json:"has_next"` HasNext bool `json:"has_next"`
// Method result // Method result
Result []struct { Result []GetListOfDeliveryMethodsResult `json:"result"`
}
type GetListOfDeliveryMethodsResult struct {
// Company identifier // Company identifier
CompanyId int64 `json:"company_id"` CompanyId int64 `json:"company_id"`
@@ -165,7 +172,6 @@ type GetListOfDeliveryMethodsResponse struct {
// Warehouse identifier // Warehouse identifier
WarehouseId int64 `json:"warehouse_id"` 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 // This methods allows you to get list of all delivery methods that can be applied for this warehouse