12 Commits

Author SHA1 Message Date
diPhantxm
7adaa92ad4 Specify enum values for status in GetFBOReturns method 2023-07-06 19:48:33 +03:00
diPhantxm
f54aa64b63 Update GetFBSReturns to v3. Add exemplar_id and return_barcode fields to method reponse 2023-07-06 19:39:54 +03:00
diPhantxm
e7c5dc320e fix params field in GetReportsListResultReport 2023-06-24 02:06:18 +03:00
diPhantxm
006ecdf877 commmented all data types and methods 2023-06-23 23:23:23 +03:00
diPhantxm
f81e4ed350 flat structures 2023-06-23 20:57:38 +03:00
Kirill
e7290069f5 Create LICENSE
Add MIT License
2023-06-20 23:33:02 +03:00
diphantxm
422f959b9f add prr option to some methods 2023-06-16 21:52:49 +03:00
diphantxm
ac99c5ba2f added new status to getting act list filter, updated descriptions, changed test according to examples 2023-06-16 21:35:33 +03:00
diPhantxm
e60a3f1ca2 add method for getting ozon warehouses workload 2023-06-02 18:55:45 +03:00
diPhantxm
2f1dbd5c00 add method for updating product characteristics 2023-06-02 18:55:33 +03:00
diPhantxm
387af0e30e add pricing strategy methods 2023-04-24 01:03:24 +03:00
diPhantxm
c1e7f2b370 add optional paramter with_details to request and details to response in GetFinancial in reports 2023-04-24 01:03:24 +03:00
26 changed files with 5165 additions and 2636 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"`
// Filters
Filters []struct {
// Sorting parameter. You can pass any attribute from the `dimension` and `metric` parameters except the `brand` attribute
Key string `json:"key"`
// Comparison operation
Operation GetAnalyticsDataFilterOperation `json:"operation"`
// Value for comparison
Value string `json:"value"`
} `json:"filters"`
Filters []GetAnalyticsDataFilter `json:"filters"`
// Number of items in the respones:
// - maximum is 1000,
@@ -48,6 +39,17 @@ type GetAnalyticsDataParams struct {
Sort []GetAnalyticsDataSort `json:"sort"`
}
type GetAnalyticsDataFilter struct {
// Sorting parameter. You can pass any attribute from the `dimension` and `metric` parameters except the `brand` attribute
Key string `json:"key"`
// Comparison operation
Operation GetAnalyticsDataFilterOperation `json:"operation"`
// Value for comparison
Value string `json:"value"`
}
// Report sorting settings
type GetAnalyticsDataSort struct {
// Metric by which the method result will be sorted
@@ -61,30 +63,36 @@ type GetAnalyticsDataResponse struct {
core.CommonResponse
// Method result
Result struct {
// Data array
Data []struct {
// Data grouping in the report
Dimensions []struct {
// Identifier
Id string `json:"id"`
// Name
Name string `json:"name"`
} `json:"dimensions"`
// Metric values list
Metrics []float64 `json:"metrics"`
} `json:"data"`
// Total and average metrics values
Totals []float64 `json:"totals"`
} `json:"result"`
Result GetAnalyticsDataResult `json:"result"`
// Report creation time
Timestamp string `json:"timestamp"`
}
type GetAnalyticsDataResult struct {
// Data array
Data []GetAnalyticsDataResultData `json:"data"`
// Total and average metrics values
Totals []float64 `json:"totals"`
}
type GetAnalyticsDataResultData struct {
// Data grouping in the report
Dimensions []GetAnalyticsDataResultDimension `json:"dimensions"`
// Metric values list
Metrics []float64 `json:"metrics"`
}
type GetAnalyticsDataResultDimension struct {
// Identifier
Id string `json:"id"`
// Name
Name string `json:"name"`
}
// Specify the period and metrics that are required. The response will contain analytical data grouped by the `dimensions` parameter.
func (c Analytics) GetAnalyticsData(params *GetAnalyticsDataParams) (*GetAnalyticsDataResponse, error) {
url := "/v1/analytics/data"
@@ -117,31 +125,35 @@ type GetStocksOnWarehousesResponse struct {
core.CommonResponse
// Method result
Result struct {
// Information about products and stocks
Rows []struct {
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
Result GetStocksOnWarehousesResult `json:"result"`
}
// Product identifier in the seller's system
ItemCode string `json:"item_code"`
type GetStocksOnWarehousesResult struct {
// Information about products and stocks
Rows []GetStocksOnWarehousesResultRow `json:"rows"`
}
// Product name in the Ozon system
ItemName string `json:"item_name"`
type GetStocksOnWarehousesResultRow struct {
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
// Product amount available for sale on Ozon
FreeToSellAmount int64 `json:"free_to_sell_amount"`
// Product identifier in the seller's system
ItemCode string `json:"item_code"`
// Product amount specified for confirmed future supplies
PromisedAmount int64 `json:"promised_amount"`
// Product name in the Ozon system
ItemName string `json:"item_name"`
// Product amount reserved for purchase, returns, and transportation between warehouses
ReservedAmount int64 `json:"reserved_amount"`
// Product amount available for sale on Ozon
FreeToSellAmount int64 `json:"free_to_sell_amount"`
// Name of the warehouse where the products are stored
WarehouseName string `json:"warehouse_name"`
} `json:"rows"`
} `json:"result"`
// Product amount specified for confirmed future supplies
PromisedAmount int64 `json:"promised_amount"`
// Product amount reserved for purchase, returns, and transportation between warehouses
ReservedAmount int64 `json:"reserved_amount"`
// Name of the warehouse where the products are stored
WarehouseName string `json:"warehouse_name"`
}
// Report on stocks and products movement at Ozon warehouses

View File

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

View File

@@ -31,13 +31,7 @@ type CancellationInfo struct {
PostingNumber string `json:"posting_number"`
// Cancellation reason
CancellationReason struct {
// Cancellation reason identifier
Id int64 `json:"id"`
// Cancellation reason name
Name string `json:"name"`
} `json:"cancellation_reason"`
CancellationReason CancellationInfoReason `json:"cancellation_reason"`
// Cancellation request creation date
CancelledAt time.Time `json:"cancelled_at"`
@@ -49,16 +43,7 @@ type CancellationInfo struct {
TPLIntegrationType string `json:"tpl_integration_type"`
// Cancellation request status
State struct {
// Status identifier
Id int64 `json:"id"`
// Status name
Name string `json:"name"`
// Request status
State string `json:"state"`
} `json:"state"`
State CancellationInfoState `json:"state"`
// Cancellation initiator
CancellationInitiator string `json:"cancellation_initiator"`
@@ -76,6 +61,25 @@ type CancellationInfo struct {
AutoApproveDate time.Time `json:"auto_approve_date"`
}
type CancellationInfoReason struct {
// Cancellation reason identifier
Id int64 `json:"id"`
// Cancellation reason name
Name string `json:"name"`
}
type CancellationInfoState struct {
// Status identifier
Id int64 `json:"id"`
// Status name
Name string `json:"name"`
// Request status
State string `json:"state"`
}
// Method for getting information about a rFBS cancellation request
func (c Cancellations) GetInfo(params *GetCancellationInfoParams) (*GetCancellationInfoResponse, error) {
url := "/v1/delivery-method/list"
@@ -134,16 +138,18 @@ type ListCancellationsResponse struct {
Total int32 `json:"total"`
// Counter of requests in different statuses
Counters struct {
// Number of requests for approval
OnApproval int64 `json:"on_approval"`
Counters ListCancellationResponseCounters `json:"counters"`
}
// Number of approved requests
Approved int64 `json:"approved"`
type ListCancellationResponseCounters struct {
// Number of requests for approval
OnApproval int64 `json:"on_approval"`
// Number of rejected requests
Rejected int64 `json:"rejected"`
} `json:"counters"`
// Number of approved requests
Approved int64 `json:"approved"`
// Number of rejected requests
Rejected int64 `json:"rejected"`
}
// Method for getting a list of rFBS cancellation requests
@@ -190,7 +196,7 @@ func (c Cancellations) Approve(params *ApproveRejectCancellationsParams) (*Appro
}
// The method allows to reject an rFBS cancellation request in the ON_APPROVAL status. Explain your decision in the comment parameter.
//
//
// The order will remain in the same status and must be delivered to the customer
func (c Cancellations) Reject(params *ApproveRejectCancellationsParams) (*ApproveRejectCancellationsResponse, error) {
url := "/v1/conditional-cancellation/reject"

View File

@@ -22,16 +22,18 @@ type GetProductTreeResponse struct {
core.CommonResponse
// Category list
Result []struct {
// Category identifier
CategoryId int64 `json:"category_id"`
Result []GetProductTreeResult `json:"result"`
}
// Subcategory tree
Children []GetProductTreeResponse `json:"children"`
type GetProductTreeResult struct {
// Category identifier
CategoryId int64 `json:"category_id"`
// Category name
Title string `json:"title"`
} `json:"result"`
// Subcategory tree
Children []GetProductTreeResponse `json:"children"`
// Category name
Title string `json:"title"`
}
// Returns product categories in the tree view.
@@ -67,58 +69,62 @@ type GetCategoryAttributesResponse struct {
core.CommonResponse
// Method result
Result []struct {
// Array of product characteristics
Attributes []struct {
// Indication that the dictionary attribute values depend on the category:
// - true — the attribute has its own set of values for each category.
// - false — the attribute has the same set of values for all categories
CategoryDependent bool `json:"category_dependent"`
Result []GetCategoryAttributesResult `json:"result"`
}
// Characteristic description
Description string `json:"description"`
type GetCategoryAttributesResult struct {
// Array of product characteristics
Attributes []GetCategoryAttributesResultAttribute `json:"attributes"`
// Directory identifier
DictionaryId int64 `json:"dictionary_id"`
// Category identifier
CategoryId int64 `json:"category_id"`
}
// Characteristics group identifier
GroupId int64 `json:"group_id"`
type GetCategoryAttributesResultAttribute struct {
// Indication that the dictionary attribute values depend on the category:
// - true — the attribute has its own set of values for each category.
// - false — the attribute has the same set of values for all categories
CategoryDependent bool `json:"category_dependent"`
// Characteristics group name
GroupName string `json:"group_name"`
// Characteristic description
Description string `json:"description"`
// Document generation task number
Id int64 `json:"id"`
// Directory identifier
DictionaryId int64 `json:"dictionary_id"`
// Indicates that the attribute is aspect. An aspect attribute is a characteristic that distinguishes products of the same model.
//
// For example, clothes and shoes of the same model may have different colors and sizes. That is, color and size are aspect attributes.
//
// Values description:
// - true — the attribute is aspect and cannot be changed after the products are delivered to the warehouse or sold from the seller's warehouse.
// - false — the attribute is not aspect and can be changed at any time
IsAspect bool `json:"is_aspect"`
// Characteristics group identifier
GroupId int64 `json:"group_id"`
// Indicates that the characteristic is a set of values:
// - true — the characteristic is a set of values,
// - false — the characteristic consists of a single value
IsCollection bool `json:"is_collection"`
// Characteristics group name
GroupName string `json:"group_name"`
// Indicates that the characteristic is mandatory:
// - true — a mandatory characteristic,
// - false — you can leave the characteristic out
IsRequired bool `json:"is_required"`
// Document generation task number
Id int64 `json:"id"`
// Name
Name string `json:"name"`
// Indicates that the attribute is aspect. An aspect attribute is a characteristic that distinguishes products of the same model.
//
// For example, clothes and shoes of the same model may have different colors and sizes. That is, color and size are aspect attributes.
//
// Values description:
// - true — the attribute is aspect and cannot be changed after the products are delivered to the warehouse or sold from the seller's warehouse.
// - false — the attribute is not aspect and can be changed at any time
IsAspect bool `json:"is_aspect"`
// Characteristic type
Type string `json:"type"`
} `json:"attributes"`
// Indicates that the characteristic is a set of values:
// - true — the characteristic is a set of values,
// - false — the characteristic consists of a single value
IsCollection bool `json:"is_collection"`
// Category identifier
CategoryId int64 `json:"category_id"`
} `json:"result"`
// Indicates that the characteristic is mandatory:
// - true — a mandatory characteristic,
// - false — you can leave the characteristic out
IsRequired bool `json:"is_required"`
// Name
Name string `json:"name"`
// Characteristic type
Type string `json:"type"`
}
// Getting characteristics for specified product category.
@@ -167,14 +173,16 @@ type GetAttributeDictionaryResponse struct {
HasNext bool `json:"has_next"`
// Method result
Result []struct {
Id int64 `json:"id"`
Info string `json:"info"`
Picture string `json:"picture"`
Result []GetAttributeDictionaryResult `json:"result"`
}
// Product characteristic value
Value string `json:"value"`
} `json:"result"`
type GetAttributeDictionaryResult struct {
Id int64 `json:"id"`
Info string `json:"info"`
Picture string `json:"picture"`
// Product characteristic value
Value string `json:"value"`
}
// 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
// Accordance types
Result struct {
// Main accordance types
Base []struct {
// Accordance type code
Code string `json:"code"`
Result ListOfAccordanceTypesResult `json:"result"`
}
// Accordance type description
Title string `json:"title"`
} `json:"base"`
type ListOfAccordanceTypesResult struct {
// Main accordance types
Base []ListOfAccordanceTypesResultBase `json:"base"`
// Main accordance types related to dangerous products
Hazard []struct {
// Accordance type code
Code string `json:"code"`
// Main accordance types related to dangerous products
Hazard []ListOfAccordanceTypesResultHazard `json:"hazard"`
}
// Accordance type description
Title string `json:"title"`
} `json:"hazard"`
} `json:"result"`
type ListOfAccordanceTypesResultBase struct {
// Accordance type code
Code string `json:"code"`
// Accordance type description
Title string `json:"title"`
}
type ListOfAccordanceTypesResultHazard struct {
// Accordance type code
Code string `json:"code"`
// Accordance type description
Title string `json:"title"`
}
// List of accordance types (version 2)
@@ -55,13 +61,15 @@ type DirectoryOfDocumentTypesResponse struct {
core.CommonResponse
// List of certificate types and names
Result []struct {
// Certificate name
Name string `json:"name"`
Result []DirectoryOfDocumentTypesResult `json:"result"`
}
// Certificate type
Value string `json:"value"`
} `json:"result"`
type DirectoryOfDocumentTypesResult struct {
// Certificate name
Name string `json:"name"`
// Certificate type
Value string `json:"value"`
}
// Directory of document types
@@ -91,19 +99,23 @@ type ListOfCertifiedCategoriesResponse struct {
core.CommonResponse
// Method result
Result struct {
// Certified categories details
Certification []struct {
// Category name
CategoryName string `json:"category_name"`
Result ListOfCertifiedCategoriesResult `json:"reult"`
}
// Indication of a mandatory category
IsRequired bool `json:"is_required"`
} `json:"certification"`
type ListOfCertifiedCategoriesResult struct {
// Certified categories details
Certification []ListOfCertifiedCategoriesResultCert `json:"certification"`
// Total number of categories
Total int64 `json:"total"`
} `json:"reult"`
// Total number of categories
Total int64 `json:"total"`
}
type ListOfCertifiedCategoriesResultCert struct {
// Category name
CategoryName string `json:"category_name"`
// Indication of a mandatory category
IsRequired bool `json:"is_required"`
}
// List of certified categories
@@ -160,15 +172,17 @@ type DeleteCertificateResponse struct {
core.CommonResponse
// Result of deleting the certificate
Result struct {
// Indication that a certificate has been deleted:
// - true — deleted
// - false — not deleted
IsDelete bool `json:"is_delete"`
Result DeleteCertificateResult `json:"result"`
}
// Description of errors during certificate deletion
ErrorMessage string `json:"error_message"`
} `json:"result"`
type DeleteCertificateResult struct {
// Indication that a certificate has been deleted:
// - true — deleted
// - false — not deleted
IsDelete bool `json:"is_delete"`
// Description of errors during certificate deletion
ErrorMessage string `json:"error_message"`
}
// Delete certificate
@@ -195,40 +209,42 @@ type GetCertificateInfoResponse struct {
core.CommonResponse
// Certificate information
Result struct {
// Identifier
CertificateId int32 `json:"certificate_id"`
Result GetCertificateInfoResult `json:"result"`
}
// Number
CertificateNumber string `json:"certificate_number"`
type GetCertificateInfoResult struct {
// Identifier
CertificateId int32 `json:"certificate_id"`
// Name
CertificateName string `json:"certificate_name"`
// Number
CertificateNumber string `json:"certificate_number"`
// Type
TypeCode string `json:"type_code"`
// Name
CertificateName string `json:"certificate_name"`
// Status
StatusCode string `json:"status_code"`
// Type
TypeCode string `json:"type_code"`
// Accordance type
AccordanceTypeCode string `json:"accordance_type_code"`
// Status
StatusCode string `json:"status_code"`
// Certificate rejection reason
RejectionReasonCode string `json:"rejectio_reason_code"`
// Accordance type
AccordanceTypeCode string `json:"accordance_type_code"`
// Moderator's comment
VerificationComment string `json:"verification_comment"`
// Certificate rejection reason
RejectionReasonCode string `json:"rejectio_reason_code"`
// Issue date
IssueDate time.Time `json:"issue_date"`
// Moderator's comment
VerificationComment string `json:"verification_comment"`
// Expire date
ExpireDate time.Time `json:"expire_date"`
// Issue date
IssueDate time.Time `json:"issue_date"`
// Number of products associated with a certificate
ProductsCount int32 `json:"products_count"`
} `json:"result"`
// Expire date
ExpireDate time.Time `json:"expire_date"`
// Number of products associated with a certificate
ProductsCount int32 `json:"products_count"`
}
// Certificate information
@@ -268,46 +284,50 @@ type ListCertificatesResponse struct {
core.CommonResponse
// Certificates
Result struct {
// Сertificate information
Certificates []struct {
// Identifier
CertificateId int32 `json:"certificate_id"`
Result ListCertificatesResult `json:"result"`
}
// Number
CertificateNumber string `json:"certificate_number"`
type ListCertificatesResult struct {
// Сertificate information
Certificates []ListCertificatesResultCert `json:"certificates"`
// Name
CertificateName string `json:"certificate_name"`
// Number of pages
PageCount int32 `json:"page_count"`
}
// Type
TypeCode string `json:"type"`
type ListCertificatesResultCert struct {
// Identifier
CertificateId int32 `json:"certificate_id"`
// Status
StatusCode string `json:"status_code"`
// Number
CertificateNumber string `json:"certificate_number"`
// Accordance type
AccordanceTypecode string `json:"accordance_type_code"`
// Name
CertificateName string `json:"certificate_name"`
// Certificate rejection reason
RejectionReasonCode string `json:"rejectio_reason_code"`
// Type
TypeCode string `json:"type"`
// Moderator's comment
VerificationComment string `json:"verification_comment"`
// Status
StatusCode string `json:"status_code"`
// Issue date
IssueDate time.Time `json:"issue_data"`
// Accordance type
AccordanceTypecode string `json:"accordance_type_code"`
// Expire date
ExpireDate time.Time `json:"expire_date"`
// Certificate rejection reason
RejectionReasonCode string `json:"rejectio_reason_code"`
// Number of products associated with a certificate
ProductsCount int32 `json:"products_count"`
} `json:"certificates"`
// Moderator's comment
VerificationComment string `json:"verification_comment"`
// Number of pages
PageCount int32 `json:"page_count"`
} `json:"result"`
// Issue date
IssueDate time.Time `json:"issue_data"`
// Expire date
ExpireDate time.Time `json:"expire_date"`
// Number of products associated with a certificate
ProductsCount int32 `json:"products_count"`
}
// Certificates list
@@ -329,13 +349,15 @@ type ProductStatusesResponse struct {
core.CommonResponse
// Product statuses
Result []struct {
// Product status code when linking it to the certificate
Code string `json:"code"`
Result []ProductStatusesResult `json:"result"`
}
// Status description
Name string `json:"name"`
} `json:"result"`
type ProductStatusesResult struct {
// Product status code when linking it to the certificate
Code string `json:"code"`
// Status description
Name string `json:"name"`
}
func (c Certificates) ProductStatuses() (*ProductStatusesResponse, error) {
@@ -370,19 +392,21 @@ type ListProductsForCertificateResponse struct {
core.CommonResponse
// Method result
Result struct {
// List of products
Items []struct {
// Product identifier
ProductId int64 `json:"product_id"`
Result ListProductsForCertificateResult `json:"result"`
}
// Status of the product processing when binding to a certificate
ProductStatusCode string `json:"product_status_code"`
} `json:"items"`
type ListProductsForCertificateResult struct {
// List of products
Items []struct {
// Product identifier
ProductId int64 `json:"product_id"`
// Number of products found
Count int64 `json:"count"`
} `json:"result"`
// Status of the product processing when binding to a certificate
ProductStatusCode string `json:"product_status_code"`
} `json:"items"`
// Number of products found
Count int64 `json:"count"`
}
// A method for getting a list of possible statuses of products when binding them to a certificate
@@ -412,18 +436,20 @@ type UnlinkFromProductResponse struct {
core.CommonResponse
// Method result
Result []struct {
// Error message when unbinding a product
Error string `json:"error"`
Result []UnlinkFromProductResult `json:"result"`
}
// Product identifier
ProductId int64 `json:"product_id"`
type UnlinkFromProductResult struct {
// Error message when unbinding a product
Error string `json:"error"`
// Indication that the product was unbound from a certificate:
// - true — it was unbound,
// - false — it is still bound
Updated bool `json:"updated"`
} `json:"result"`
// Product identifier
ProductId int64 `json:"product_id"`
// Indication that the product was unbound from a certificate:
// - true — it was unbound,
// - false — it is still bound
Updated bool `json:"updated"`
}
// Unbind products from a certificate
@@ -445,13 +471,15 @@ type PossibleRejectReasonsResponse struct {
core.CommonResponse
// Certificate rejection reasons
Result []struct {
// Сode of a certificate rejection reason
Code string `json:"code"`
Result []PossibleRejectReasonsResult `json:"result"`
}
// Description of a certificate rejection reason
Name string `json:"name"`
} `json:"result"`
type PossibleRejectReasonsResult struct {
// Сode of a certificate rejection reason
Code string `json:"code"`
// Description of a certificate rejection reason
Name string `json:"name"`
}
// Possible certificate rejection reasons
@@ -473,13 +501,15 @@ type PossibleStatusesResponse struct {
core.CommonResponse
// Possible certificate statuses
Result []struct {
// Certificate status code
Code string `json:"code"`
Result []PossibleStatusesResult `json:"result"`
}
// Status description
Name string `json:"name"`
} `json:"result"`
type PossibleStatusesResult struct {
// Certificate status code
Code string `json:"code"`
// Status description
Name string `json:"name"`
}
func (c Certificates) PossibleStatuses() (*PossibleStatusesResponse, error) {

View File

@@ -38,36 +38,7 @@ type ListChatsResponse struct {
core.CommonResponse
// Chats data
Chats []struct {
// Chat data
Chat struct {
// Chat identifier
ChatId string `json:"chat_id"`
// Chat status:
// - All
// - Opened
// - Closed
ChatStatus string `json:"chat_status"`
// Chat type:
// - Seller_Support — support chat
// - Buyer_Seller — chat with a customer
ChatType string `json:"chat_type"`
// Chat creation date
CreatedAt time.Time `json:"created_at"`
} `json:"chat"`
// Identifier of the first unread chat message
FirstUnreadMessageId string `json:"first_unread_message_id"`
// Identifier of the last message in the chat
LastMessageId string `json:"last_message_id"`
// Number of unread messages in the chat
UnreadCount int64 `json:"unread_count"`
} `json:"chats"`
Chats []ListChatsChat `json:"chats"`
// Total number of chats
TotalChatsCount int64 `json:"total_chats_count"`
@@ -76,6 +47,39 @@ type ListChatsResponse struct {
TotalUnreadCount int64 `json:"total_unread_count"`
}
type ListChatsChat struct {
// Chat data
Chat ListChatsChatData `json:"chat"`
// Identifier of the first unread chat message
FirstUnreadMessageId string `json:"first_unread_message_id"`
// Identifier of the last message in the chat
LastMessageId string `json:"last_message_id"`
// Number of unread messages in the chat
UnreadCount int64 `json:"unread_count"`
}
type ListChatsChatData struct {
// Chat identifier
ChatId string `json:"chat_id"`
// Chat status:
// - All
// - Opened
// - Closed
ChatStatus string `json:"chat_status"`
// Chat type:
// - Seller_Support — support chat
// - Buyer_Seller — chat with a customer
ChatType string `json:"chat_type"`
// Chat creation date
CreatedAt time.Time `json:"created_at"`
}
// Returns information about chats by specified filters
func (c Chats) List(params *ListChatsParams) (*ListChatsResponse, error) {
url := "/v2/chat/list"
@@ -179,33 +183,37 @@ type ChatHistoryResponse struct {
HasNext bool `json:"has_next"`
// An array of messages sorted according to the direction parameter in the request body
Messages []struct {
// Message creation date
CreatedAt time.Time `json:"created_at"`
Messages []ChatHistoryMessage `json:"messages"`
}
// Array with message content in Markdown format
Data []string `json:"data"`
type ChatHistoryMessage struct {
// Message creation date
CreatedAt time.Time `json:"created_at"`
// Indication of the read message
IsRead bool `json:"is_read"`
// Array with message content in Markdown format
Data []string `json:"data"`
// Message identifier
MessageId string `json:"message_id"`
// Indication of the read message
IsRead bool `json:"is_read"`
// Chat participant identifier
User struct {
// Chat participant identifier
Id string `json:"id"`
// Message identifier
MessageId string `json:"message_id"`
// Chat participant type:
// - customer
// - seller
// - crm—system messages
// - courier
// - support
Type string `json:"type"`
} `json:"user"`
} `json:"messages"`
// Chat participant identifier
User ChatHistoryMessageUser `json:"user"`
}
type ChatHistoryMessageUser struct {
// Chat participant identifier
Id string `json:"id"`
// Chat participant type:
// - customer
// - seller
// - crm—system messages
// - courier
// - support
Type string `json:"type"`
}
// Chat history
@@ -238,80 +246,94 @@ type UpdateChatResponse struct {
core.CommonResponse
// Method result
Result []struct {
// An order or a product user wrote about in the chat
Context struct {
// Product inforamtion
Item struct {
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
} `json:"item"`
Result []UpdateChatResult `json:"result"`
}
// Order information
Order struct {
// Order number
OrderNumber string `json:"order_number"`
type UpdateChatResult struct {
// An order or a product user wrote about in the chat
Context UpdateChatResultContext `json:"context"`
// Shipment information
Postings []struct {
// Delivery scheme:
// - FBO
// - FBS
// - RFBS
// - Crossborder
DeliverySchema string `json:"delivery_schema"`
// Creation date and time
CreatedAt time.Time `json:"created_at"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Information about the file in the chat. Displayed only for `type = file`
File UpdateChatResultFile `json:"file"`
// List of product identifiers in the shipment
SKUList []int64 `json:"sku_list"`
} `json:"postings"`
} `json:"order"`
} `json:"context"`
// File identifier
Id uint64 `json:"id"`
// Creation date and time
CreatedAt time.Time `json:"created_at"`
// Message. Displayed only for `type = text`
Text string `json:"text"`
// Information about the file in the chat. Displayed only for `type = file`
File struct {
// File type
Mime string `json:"mime"`
// Message type:
// - text
// - file
Type string `json:"type"`
// File name
Name string `json:"name"`
// Chat participant information
User UpdateChatResultUser `json:"user"`
}
// File size in bytes
Size int64 `json:"size"`
type UpdateChatResultContext struct {
// Product inforamtion
Item UpdateChatResultContextItem `json:"item"`
// File URL
URL string `json:"url"`
} `json:"file"`
// Order information
Order UpdateChatResultContextOrder `json:"order"`
}
// File identifier
Id uint64 `json:"id"`
type UpdateChatResultContextItem struct {
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
}
// Message. Displayed only for `type = text`
Text string `json:"text"`
type UpdateChatResultContextOrder struct {
// Order number
OrderNumber string `json:"order_number"`
// Message type:
// - text
// - file
Type string `json:"type"`
// Shipment information
Postings []UpdateChatResultContextOrderPosting `json:"postings"`
}
// Chat participant information
User struct {
// Chat participant identifier
Id string `json:"id"`
type UpdateChatResultContextOrderPosting struct {
// Delivery scheme:
// - FBO
// - FBS
// - RFBS
// - Crossborder
DeliverySchema string `json:"delivery_schema"`
// Chat participant chat:
// - customer
// - seller
// - crm—system messages
// - courier
Type string `json:"type"`
} `json:"user"`
} `json:"result"`
// Shipment number
PostingNumber string `json:"posting_number"`
// List of product identifiers in the shipment
SKUList []int64 `json:"sku_list"`
}
type UpdateChatResultFile struct {
// File type
Mime string `json:"mime"`
// File name
Name string `json:"name"`
// File size in bytes
Size int64 `json:"size"`
// File URL
URL string `json:"url"`
}
type UpdateChatResultUser struct {
// Chat participant identifier
Id string `json:"id"`
// Chat participant chat:
// - customer
// - seller
// - crm—system messages
// - courier
Type string `json:"type"`
}
// Update chat
@@ -338,10 +360,12 @@ type CreateNewChatResponse struct {
core.CommonResponse
//Method result
Result struct {
// Chat identifier
ChatId string `json:"chat_id"`
} `json:"result"`
Result CreateNewChatResult `json:"result"`
}
type CreateNewChatResult struct {
// Chat identifier
ChatId string `json:"chat_id"`
}
// 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,169 @@ const (
// delivery by the seller
NonIntegratedTPLType TPLIntegrationType = "non_integrated"
)
type DetailsDeliveryItemName string
const (
DirectFlowLogisticSumDetailsDeliveryItemName DetailsDeliveryItemName = "MarketplaceServiceItemDirectFlowLogisticSum"
DropoffDetailsDeliveryItemName DetailsDeliveryItemName = "MarketplaceServiceItemDropoff"
DelivToCustomerDetailsDeliveryItemName DetailsDeliveryItemName = "MarketplaceServiceItemDelivToCustomer"
)
type DetailsReturnServiceName string
const (
ReturnAfterDelivToCustomerDetailsReturnServiceName DetailsReturnServiceName = "MarketplaceServiceItemReturnAfterDelivToCustomer"
ReturnPartGoodsCustomerDetailsReturnServiceName DetailsReturnServiceName = "MarketplaceServiceItemReturnPartGoodsCustomer"
ReturnNotDelivToCustomerDetailsReturnServiceName DetailsReturnServiceName = "MarketplaceServiceItemReturnNotDelivToCustomer"
ReturnFlowLogisticDetailsReturnServiceName DetailsReturnServiceName = "MarketplaceServiceItemReturnFlowLogistic"
)
type DetailsServiceItemName string
const (
OtherMarketAndTech DetailsServiceItemName = "MarketplaceServiceItemOtherMarketAndTechService"
ReturnStorageServiceAtThePickupPointFbsItem DetailsServiceItemName = "MarketplaceReturnStorageServiceAtThePickupPointFbsItem"
SaleReviewsItem DetailsServiceItemName = "MarketplaceSaleReviewsItem"
ServicePremiumCashbackIndividualPoints DetailsServiceItemName = "MarketplaceServicePremiumCashbackIndividualPoints"
ServiceStorageItem DetailsServiceItemName = "MarketplaceServiceStorageItem"
ServiceStockDisposal DetailsServiceItemName = "MarketplaceServiceStockDisposal"
ReturnDisposalServiceFbsItem DetailsServiceItemName = "MarketplaceReturnDisposalServiceFbsItem"
ServiceItemFlexiblePaymentSchedule DetailsServiceItemName = "MarketplaceServiceItemFlexiblePaymentSchedule"
ServiceProcessingSpoilage DetailsServiceItemName = "MarketplaceServiceProcessingSpoilage"
ServiceProcessingIdentifiedSurplus DetailsServiceItemName = "MarketplaceServiceProcessingIdentifiedSurplus"
ServiceProcessingIdentifiedDiscrepancies DetailsServiceItemName = "MarketplaceServiceProcessingIdentifiedDiscrepancies"
ServiceItemInternetSiteAdvertising DetailsServiceItemName = "MarketplaceServiceItemInternetSiteAdvertising"
ServiceItemPremiumSubscribtion DetailsServiceItemName = "MarketplaceServiceItemPremiumSubscribtion"
AgencyFeeAggregator3PLGlobalItem DetailsServiceItemName = "MarketplaceAgencyFeeAggregator3PLGlobalItem"
)
type DetailsOtherItemName string
const (
RedistributionOfAcquiringOperation DetailsOtherItemName = "MarketplaceRedistributionOfAcquiringOperation"
CompensationLossOfGoodsOperation DetailsOtherItemName = "MarketplaceSellerCompensationLossOfGoodsOperation"
CorrectionOperation DetailsOtherItemName = "MarketplaceSellerCorrectionOperation"
OperationCorrectionSeller DetailsOtherItemName = "OperationCorrectionSeller"
OperationMarketplaceWithHoldingForUndeliverableGoods DetailsOtherItemName = "OperationMarketplaceWithHoldingForUndeliverableGoods"
OperationClaim DetailsOtherItemName = "OperationClaim"
)
type StrategyType string
const (
MinExtPrice StrategyType = "MIN_EXT_PRICE"
CompPrice StrategyType = "COMP_PRICE"
)
type StrategyUpdateType string
const (
StrategyEnabled StrategyUpdateType = "strategyEnabled"
StrategyDisabled StrategyUpdateType = "strategyDisabled"
StrategyChanged StrategyUpdateType = "strategyChanged"
StrategyCreated StrategyUpdateType = "strategyCreated"
StrategyItemsListChanged StrategyUpdateType = "strategyItemsListChanged"
)
type ShipmentCertificateFilterStatus string
const (
// new
ShitmentCertificateFilterNew ShipmentCertificateFilterStatus = "new"
// retry creation
ShitmentCertificateFilterAwaitingRetry ShipmentCertificateFilterStatus = "awaiting-retry"
// is being packaged
ShitmentCertificateFilterInProcess ShipmentCertificateFilterStatus = "in_process"
// created
ShitmentCertificateFilterSuccess ShipmentCertificateFilterStatus = "success"
// creation error
ShitmentCertificateFilterError ShipmentCertificateFilterStatus = "error"
// sent
ShitmentCertificateFilterSend ShipmentCertificateFilterStatus = "sent"
// received
ShitmentCertificateFilterReceived ShipmentCertificateFilterStatus = "received"
// packaged
ShitmentCertificateFilterFormed ShipmentCertificateFilterStatus = "formed"
// canceled
ShitmentCertificateFilterCancelled ShipmentCertificateFilterStatus = "cancelled"
// in the queue for packaging
ShitmentCertificateFilterPending ShipmentCertificateFilterStatus = "pending"
// in the queue for completion
ShitmentCertificateFilterCompletionEnqueued ShipmentCertificateFilterStatus = "completion_enqueued"
// in the process of completion
ShitmentCertificateFilterCompletionProcessing ShipmentCertificateFilterStatus = "completion_processing"
// completion error
ShitmentCertificateFilterCompletionFailed ShipmentCertificateFilterStatus = "completion_failed"
// in the queue for cancellation
ShitmentCertificateFilterCancelationEnqueued ShipmentCertificateFilterStatus = "cancelation_enqueued"
// in the process of cancellation
ShitmentCertificateFilterCancelationProcessing ShipmentCertificateFilterStatus = "cancelation_processing"
// cancellation error
ShitmentCertificateFilterCancelationFailed ShipmentCertificateFilterStatus = "cancelation_failed"
// completed
ShitmentCertificateFilterCompleted ShipmentCertificateFilterStatus = "completed"
// closed
ShitmentCertificateFilterClosed ShipmentCertificateFilterStatus = "closed"
)
type PRROptionStatus string
const (
// carrying the bulky product using the elevator
PRROptionLift PRROptionStatus = "lift"
// carrying the bulky product upstairs
PRROptionStairs PRROptionStatus = "stairs"
// the customer canceled the service,
// you don't need to lift the shipment
PRROptionNone PRROptionStatus = "none"
// delivery is included in the price.
// According to the offer you need to
// deliver products to the floor
PRROptionDeliveryDefault PRROptionStatus = "delivery_default"
)
type GetFBSReturnsFilterStatus string
const (
ReturnedToSeller GetFBSReturnsFilterStatus = "returned_to_seller"
WaitingForSeller GetFBSReturnsFilterStatus = "waiting_for_seller"
AcceptedFromCustomer GetFBSReturnsFilterStatus = "accepted_from_customer"
CancelledWithCompensation GetFBSReturnsFilterStatus = "cancelled_with_compensation"
ReadyForShipment GetFBSReturnsFilterStatus = "ready_for_shipment"
)
type GetFBOReturnsFilterStatus string
const (
GetFBOReturnsFilterStatusReturnedToOzon GetFBOReturnsFilterStatus = "ReturnedToOzon"
GetFBOReturnsFilterStatusCancelled GetFBOReturnsFilterStatus = "Cancelled"
)
type GetFBOReturnsReturnStatus string
const (
GetFBOReturnsReturnStatusCancelled GetFBOReturnsReturnStatus = "Возврат отменен"
GetFBOReturnsReturnStatusAcceptedFromCustomer GetFBOReturnsReturnStatus = "Принят от покупателя"
GetFBOReturnsReturnStatusReceivedAtOzon GetFBOReturnsReturnStatus = "Получен в Ozon"
)

View File

@@ -56,69 +56,75 @@ type GetFBOShipmentsListResponse struct {
core.CommonResponse
// Shipments list
Result []struct {
// Additional data for shipment list
AdditionalData []struct {
Key string `json:"key"`
Value string `json:"value"`
} `json:"additional_data"`
Result []GetFBOShipmentsListResult `json:"result"`
}
// Analytical data
AnalyticsData struct {
// Delivery city
City string `json:"city"`
type GetFBOShipmentsListResult struct {
// Additional data for shipment list
AdditionalData []GetFBOShipmentsListResultAdditionalData `json:"additional_data"`
// Delivery method
DeliveryType string `json:"delivery_type"`
// Analytical data
AnalyticsData GetFBOShipmentsListResultAnalyticsData `json:"analytics_data"`
// Indication that the recipient is a legal person
// * true — a legal person,
// * false — a natural person.
IsLegal bool `json:"is_legal"`
// Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Date and time of shipment creation
CreatedAt time.Time `json:"created_at"`
// Payment method
PaymentTypeGroupName string `json:"payment_type_group_name"`
// Financial data
FinancialData FBOFinancialData `json:"financial_data"`
// Delivery region
Region string `json:"region"`
// Date and time of shipment processing start
InProccessAt time.Time `json:"in_process_at"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
// Identifier of the order to which the shipment belongs
OrderId int64 `json:"order_id"`
// Name of the warehouse from which the order is shipped
WarehouseName string `json:"warehouse_name"`
} `json:"analytics_data"`
// Number of the order to which the shipment belongs
OrderNumber string `json:"order_number"`
// Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Date and time of shipment creation
CreatedAt time.Time `json:"created_at"`
// Number of products in the shipment
Products []FBOPostingProduct `json:"products"`
// Financial data
FinancialData FBOFinancialData `json:"financial_data"`
// Shipment status
Status string `json:"status"`
}
// Date and time of shipment processing start
InProccessAt time.Time `json:"in_process_at"`
type GetFBOShipmentsListResultAdditionalData struct {
Key string `json:"key"`
Value string `json:"value"`
}
// Identifier of the order to which the shipment belongs
OrderId int64 `json:"order_id"`
type GetFBOShipmentsListResultAnalyticsData struct {
// Delivery city
City string `json:"city"`
// Number of the order to which the shipment belongs
OrderNumber string `json:"order_number"`
// Delivery method
DeliveryType string `json:"delivery_type"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Indication that the recipient is a legal person
// * true — a legal person,
// * false — a natural person.
IsLegal bool `json:"is_legal"`
// Number of products in the shipment
Products []FBOPostingProduct `json:"products"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Shipment status
Status string `json:"status"`
} `json:"result"`
// 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 {
@@ -196,69 +202,75 @@ type GetShipmentDetailsResponse struct {
core.CommonResponse
// Method result
Result struct {
// Additional data
AdditionalData []struct {
Key string `json:"key"`
Value string `json:"value"`
} `json:"additional_data"`
Result GetShipmentDetailsResult `json:"result"`
}
// Analytical data
AnalyticsData struct {
// Delivery city
City string `json:"Delivery city"`
type GetShipmentDetailsResult struct {
// Additional data
AdditionalData []GetShipmentDetailsResultAdditionalData `json:"additional_data"`
// Delivery method
DeliveryType string `json:"delivery_type"`
// Analytical data
AnalyticsData GetShipmentDetailsResultAnalyticsData `json:"analytics_data"`
// Indication that the recipient is a legal person:
// - true — a legal person
// - false — a natural person
IsLegal bool `json:"is_legal"`
// Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Date and time of shipment creation
CreatedAt time.Time `json:"created_at"`
// Payment method
PaymentTypeGroupName string `json:"payment_type_group_name"`
// Financial data
FinancialData FBOFinancialData `json:"financial_data"`
// Delivery region
Region string `json:"region"`
// Date and time of shipment processing start
InProcessAt time.Time `json:"in_process_at"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
// Identifier of the order to which the shipment belongs
OrderId int64 `json:"order_id"`
// Name of the warehouse from which the order is shipped
WarehouseName string `json:"warehouse_name"`
} `json:"analytics_data"`
// Number of the order to which the shipment belongs
OrderNumber string `json:"order_number"`
// Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Date and time of shipment creation
CreatedAt time.Time `json:"created_at"`
// Number of products in the shipment
Products []FBOPostingProduct `json:"products"`
// Financial data
FinancialData FBOFinancialData `json:"financial_data"`
// Shipment status
Status string `json:"status"`
}
// Date and time of shipment processing start
InProcessAt time.Time `json:"in_process_at"`
type GetShipmentDetailsResultAdditionalData struct {
Key string `json:"key"`
Value string `json:"value"`
}
// Identifier of the order to which the shipment belongs
OrderId int64 `json:"order_id"`
type GetShipmentDetailsResultAnalyticsData struct {
// Delivery city
City string `json:"Delivery city"`
// Number of the order to which the shipment belongs
OrderNumber string `json:"order_number"`
// Delivery method
DeliveryType string `json:"delivery_type"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Indication that the recipient is a legal person:
// - true — a legal person
// - false — a natural person
IsLegal bool `json:"is_legal"`
// Number of products in the shipment
Products []FBOPostingProduct `json:"products"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Shipment status
Status string `json:"status"`
} `json:"result"`
// 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
@@ -307,13 +319,7 @@ type SupplyRequestCommonResponse struct {
CreatedAt string `json:"created_at"`
// Local time supply interval
LocalTimeslot struct {
// Interval start
From string `json:"from"`
// Interval end
To string `json:"to"`
} `json:"local_timeslot"`
LocalTimeslot SupplyRequestCommonResponseLocalTimeslot `json:"local_timeslot"`
// Date from which you want to bring the supply to the warehouse. Only for supplies via vDC
PreferredSupplyDataFrom string `json:"preferred_supply_data_from"`
@@ -331,16 +337,7 @@ type SupplyRequestCommonResponse struct {
SupplyOrderNumber string `json:"supply_order_number"`
// Supply warehouse
SupplyWarehouse struct {
// Warehouse address
Address string `json:address"`
// Warehouse name
Name string `json:"name"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
} `json:"supply_warehouse"`
SupplyWarehouse SupplyRequestCommonResponseSupplyWarehouse `json:"supply_warehouse"`
// 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"`
}
type SupplyRequestCommonResponseLocalTimeslot struct {
// Interval start
From string `json:"from"`
// Interval end
To string `json:"to"`
}
type SupplyRequestCommonResponseSupplyWarehouse struct {
// Warehouse address
Address string `json:"address"`
// Warehouse name
Name string `json:"name"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
}
// Method for getting a list of supply requests to the Ozon warehouse.
// Requests with supply both to a specific warehouse and via a virtual
// distribution center (vDC) are taken into account
@@ -383,19 +399,21 @@ type GetSupplyRequestInfoResponse struct {
SupplyRequestCommonResponse
// Driver and car information
VehicleInfo struct {
// Driver name
DriverName string `json:"driver_name"`
VehicleInfo GetSupplyRequestInfoVehicle `json:"vehicle_info"`
}
// Driver phone number
DriverPhone string `json:"driver_phone"`
type GetSupplyRequestInfoVehicle struct {
// Driver name
DriverName string `json:"driver_name"`
// Car model
VehicleModel string `json:"vehicle_model"`
// Driver phone number
DriverPhone string `json:"driver_phone"`
// Car number
VehicleNumber string `json:"vehicle_number"`
} `json:"vehicle_info"`
// Car model
VehicleModel string `json:"vehicle_model"`
// Car number
VehicleNumber string `json:"vehicle_number"`
}
// Method for getting detailed information on a supply request.
@@ -435,27 +453,29 @@ type ListProductsInSupplyRequestResponse struct {
HasNext bool `json:"has_next"`
// Products list
Items []struct {
// Link to product image
IconPath string `json:"icon_path"`
// Product name
Name string `json:"name"`
// Product ID
OfferId string `json:"offer_id"`
// Product quantity
Quantity int64 `json:"quantity"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
} `json:"items"`
Items []ListProductsInSupplyRequestItem `json:"items"`
// Total number of products in the request
TotalItemsCount int32 `json:"total_items_count"`
}
type ListProductsInSupplyRequestItem struct {
// Link to product image
IconPath string `json:"icon_path"`
// Product name
Name string `json:"name"`
// Product ID
OfferId string `json:"offer_id"`
// Product quantity
Quantity int64 `json:"quantity"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
}
// List of products in the sullpy request
func (c FBO) ListProductsInSupplyRequest(params *ListProductsInSupplyRequestParams) (*ListProductsInSupplyRequestResponse, error) {
url := "/v1/supply-order/items"
@@ -470,3 +490,60 @@ func (c FBO) ListProductsInSupplyRequest(params *ListProductsInSupplyRequestPara
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",
"status": "delivered",
"cancel_reason_id": 0,
"created_at": "2021-09-01T00:23:45.607Z",
"in_process_at": "2021-09-01T00:25:30.120Z",
"created_at": "2021-09-01T00:23:45.607000Z",
"in_process_at": "2021-09-01T00:25:30.120000Z",
"products": [
{
"sku": 160249683,
@@ -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"},
&ListOfShipmentCertificatesParams{
Limit: 100,
Filter: ListOfShipmentCertificates{
Filter: ListOfShipmentCertificatesFilter{
DateFrom: "2021-08-04",
DateTo: "2022-08-04",
IntegrationType: "ozon",
Status: []string{"delivered"},
Status: []ShipmentCertificateFilterStatus{ShitmentCertificateFilterFormed},
},
},
`{
@@ -1480,8 +1480,8 @@ func TestRescheduleShipmentDeliveryDate(t *testing.T) {
&RescheduleShipmentDeliveryDateParams{
PostingNumber: "23281294-0063-2",
NewTimeslot: RescheduleShipmentDeliveryDateTimeslot{
DeliveryDateBegin: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-03T11:07:00.381Z"),
DeliveryDateEnd: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-03T11:07:00.381Z"),
From: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-25T08:51:56.932Z"),
To: core.TimeFromString(t, "2006-01-02T15:04:05Z", "2023-03-25T08:51:56.932Z"),
},
},
`{

View File

@@ -20,126 +20,132 @@ type ReportOnSoldProductsResponse struct {
core.CommonResponse
// Query result
Result []struct {
// Report title page
Header []struct {
// Report ID
Id string `json:"num"`
Result []ReportonSoldProductsResult `json:"result"`
}
// Report generation date
DocDate string `json:"doc_date"`
type ReportonSoldProductsResult struct {
// Report title page
Header []ReportOnSoldProductsResultHeader `json:"header"`
// Date of the offer agreement
ContractDate string `json:"contract_date"`
// Report table
Rows []ReportOnSoldProductsResultRow `json:"rows"`
}
// Offer agreement number
ContractNum string `json:"contract_num"`
type ReportOnSoldProductsResultHeader struct {
// Report ID
Id string `json:"num"`
// Currency of your prices
CurrencyCode string `json:"currency_code"`
// Report generation date
DocDate string `json:"doc_date"`
// Amount to accrue
DocAmount float64 `json:"doc_amount"`
// Date of the offer agreement
ContractDate string `json:"contract_date"`
// Amount to accrue with VAT
VATAmount float64 `json:"vat_amount"`
// Offer agreement number
ContractNum string `json:"contract_num"`
// Payer's TIN
PayerINN string `json:"payer_inn"`
// Currency of your prices
CurrencyCode string `json:"currency_code"`
// Payer's Tax Registration Reason Code (KPP)
PayerKPP string `json:"payer_kpp"`
// Amount to accrue
DocAmount float64 `json:"doc_amount"`
// Payer's name
PayerName string `json:"payer_name"`
// Amount to accrue with VAT
VATAmount float64 `json:"vat_amount"`
// Recipient's TIN
RecipientINN string `json:"rcv_inn"`
// Payer's TIN
PayerINN string `json:"payer_inn"`
// Recipient's Tax Registration Reason Code (KPP)
RecipientKPP string `json:"rcv_kpp"`
// Payer's Tax Registration Reason Code (KPP)
PayerKPP string `json:"payer_kpp"`
// Recipient's name
RecipientName string `json:"rcv_name"`
// Payer's name
PayerName string `json:"payer_name"`
// Period start in the report
StartDate string `json:"start_date"`
// Recipient's TIN
RecipientINN string `json:"rcv_inn"`
// Period end in the report
StopDate string `json:"stop_date"`
} `json:"header"`
// Recipient's Tax Registration Reason Code (KPP)
RecipientKPP string `json:"rcv_kpp"`
// Report table
Rows []struct {
// Row number
RowNumber int32 `json:"row_number"`
// Recipient's name
RecipientName string `json:"rcv_name"`
// Product ID
ProductId int64 `json:"product_id"`
// Period start in the report
StartDate string `json:"start_date"`
// Product name
ProductName string `json:"product_name"`
// Period end in the report
StopDate string `json:"stop_date"`
}
// Product barcode
Barcode string `json:"barcode"`
type ReportOnSoldProductsResultRow struct {
// Row number
RowNumber int32 `json:"row_number"`
// Product identifier in the seller's system
OfferId string `json:"offer_id"`
// Product ID
ProductId int64 `json:"product_id"`
// Sales commission by category
CommissionPercent float64 `json:"commission_percent"`
// Product name
ProductName string `json:"product_name"`
// Seller's price with their discount
Price float64 `json:"price"`
// Product barcode
Barcode string `json:"barcode"`
// Selling price: the price at which the customer purchased the product. For sold products
PriceSale float64 `json:"price_sale"`
// Product identifier in the seller's system
OfferId string `json:"offer_id"`
// Sold for amount.
//
// Sold products cost considering the quantity and regional coefficients. Calculation is made by the sale_amount price
SaleAmount float64 `json:"sale_amount"`
// Sales commission by category
CommissionPercent float64 `json:"commission_percent"`
// Commission for sold products, including discounts and extra charges
SaleCommission float64 `json:"sale_commission"`
// Seller's price with their discount
Price float64 `json:"price"`
// Extra charge at the expense of Ozon.
//
// Amount that Ozon will compensate the seller if the Ozon discount is greater than or equal to the sales commission
SaleDiscount float64 `json:"sale_discount"`
// Selling price: the price at which the customer purchased the product. For sold products
PriceSale float64 `json:"price_sale"`
// Total accrual for the products sold.
//
// Amount after deduction of sales commission, application of discounts and extra charges
SalePriceSeller float64 `json:"sale_price_seller"`
// Sold for amount.
//
// Sold products cost considering the quantity and regional coefficients. Calculation is made by the sale_amount price
SaleAmount float64 `json:"sale_amount"`
// Quantity of products sold at the price_sale price
SaleQuantity int32 `json:"sale_qty"`
// Commission for sold products, including discounts and extra charges
SaleCommission float64 `json:"sale_commission"`
// Price at which the customer purchased the product. For returned products
ReturnSale float64 `json:"return_sale"`
// Extra charge at the expense of Ozon.
//
// Amount that Ozon will compensate the seller if the Ozon discount is greater than or equal to the sales commission
SaleDiscount float64 `json:"sale_discount"`
// Cost of returned products, taking into account the quantity and regional coefficients.
// Calculation is carried out at the return_sale price
ReturnAmount float64 `json:"return_amount"`
// Total accrual for the products sold.
//
// Amount after deduction of sales commission, application of discounts and extra charges
SalePriceSeller float64 `json:"sale_price_seller"`
// Commission including the quantity of products, discounts and extra charges.
// Ozon compensates it for the returned products
ReturnCommission float64 `json:"return_commission"`
// Quantity of products sold at the price_sale price
SaleQuantity int32 `json:"sale_qty"`
// Extra charge at the expense of Ozon.
//
// Amount of the discount at the expense of Ozon on returned products.
// Ozon will compensate it to the seller if the Ozon discount is greater than or equal to the sales commission
ReturnDiscount float64 `json:"return_discount"`
// Price at which the customer purchased the product. For returned products
ReturnSale float64 `json:"return_sale"`
// Amount charged to the seller for returned products after deducing sales commissions, applying discounts and extra charges
ReturnPriceSeller float64 `json:"return_price_seller"`
// Cost of returned products, taking into account the quantity and regional coefficients.
// Calculation is carried out at the return_sale price
ReturnAmount float64 `json:"return_amount"`
// Quantity of returned products
ReturnQuantity int32 `json:"return_qty"`
} `json:"rows"`
} `json:"result"`
// Commission including the quantity of products, discounts and extra charges.
// Ozon compensates it for the returned products
ReturnCommission float64 `json:"return_commission"`
// Extra charge at the expense of Ozon.
//
// Amount of the discount at the expense of Ozon on returned products.
// Ozon will compensate it to the seller if the Ozon discount is greater than or equal to the sales commission
ReturnDiscount float64 `json:"return_discount"`
// Amount charged to the seller for returned products after deducing sales commissions, applying discounts and extra charges
ReturnPriceSeller float64 `json:"return_price_seller"`
// Quantity of returned products
ReturnQuantity int32 `json:"return_qty"`
}
// Returns information on products sold and returned within a month. Canceled or non-purchased products are not included.
@@ -196,40 +202,42 @@ type GetTotalTransactionsSumResponse struct {
core.CommonResponse
// Method result
Result struct {
// Total cost of products and returns for specified period
AccrualsForSale float64 `json:"accruals_for_sale"`
Result GetTotalTransactionsSumResult `json:"result"`
}
// Compensations
CompensationAmount float64 `json:"compensatino_amount"`
type GetTotalTransactionsSumResult struct {
// Total cost of products and returns for specified period
AccrualsForSale float64 `json:"accruals_for_sale"`
// Charges for delivery and returns when working under rFBS scheme
MoneyTransfer float64 `json:"money_transfer"`
// Compensations
CompensationAmount float64 `json:"compensatino_amount"`
// Other accurals
OthersAmount float64 `json:"others_amount"`
// Charges for delivery and returns when working under rFBS scheme
MoneyTransfer float64 `json:"money_transfer"`
// Cost of shipment processing, orders packaging, pipeline and last mile services, and delivery cost before the new commissions and rates applied from February 1, 2021.
//
// Pipeline is delivery of products from one cluster to another.
//
// Last mile is products delivery to the pick-up point, parcle terminal, or by courier
ProcessingAndDelivery float64 `json:"processing_and_delivery"`
// Other accurals
OthersAmount float64 `json:"others_amount"`
// Cost of reverse pipeline, returned, canceled and unredeemed orders processing, and return cost before the new commissions and rates applied from February 1, 2021.
//
// Pipeline is delivery of products from one cluster to another.
//
// Last mile is products delivery to the pick-up point, parcle terminal, or by courier
RefundsAndCancellations float64 `json:"refunds_and_cancellations"`
// Cost of shipment processing, orders packaging, pipeline and last mile services, and delivery cost before the new commissions and rates applied from February 1, 2021.
//
// Pipeline is delivery of products from one cluster to another.
//
// Last mile is products delivery to the pick-up point, parcle terminal, or by courier
ProcessingAndDelivery float64 `json:"processing_and_delivery"`
// The commission withheld when the product was sold and refunded when the product was returned
SaleCommission float64 `json:"sale_commission"`
// Cost of reverse pipeline, returned, canceled and unredeemed orders processing, and return cost before the new commissions and rates applied from February 1, 2021.
//
// Pipeline is delivery of products from one cluster to another.
//
// Last mile is products delivery to the pick-up point, parcle terminal, or by courier
RefundsAndCancellations float64 `json:"refunds_and_cancellations"`
// The additional services cost that are not directly related to deliveries and returns.
// For example, promotion or product placement
ServicesAmount float64 `json:"services_amount"`
} `json:"result"`
// The commission withheld when the product was sold and refunded when the product was returned
SaleCommission float64 `json:"sale_commission"`
// The additional services cost that are not directly related to deliveries and returns.
// For example, promotion or product placement
ServicesAmount float64 `json:"services_amount"`
}
// Returns total sums for transactions for specified period
@@ -247,7 +255,7 @@ func (c Finance) GetTotalTransactionsSum(params *GetTotalTransactionsSumParams)
return resp, nil
}
type ListTransactionsParams struct{
type ListTransactionsParams struct {
// Filter
Filter ListTransactionsFilter `json:"filter"`
@@ -258,7 +266,7 @@ type ListTransactionsParams struct{
PageSize int64 `json:"page_size"`
}
type ListTransactionsFilter struct{
type ListTransactionsFilter struct {
// Filter by date
Date ListTransactionsFilterDate `json:"date"`
@@ -272,105 +280,115 @@ type ListTransactionsFilter struct{
TransactionType string `json:"transaction_type"`
}
type ListTransactionsFilterDate struct{
type ListTransactionsFilterDate struct {
// Period start.
//
//
// Format: YYYY-MM-DDTHH:mm:ss.sssZ.
// Example: 2019-11-25T10:43:06.51
From time.Time `json:"from"`
// Period end.
//
//
// Format: YYYY-MM-DDTHH:mm:ss.sssZ.
// Example: 2019-11-25T10:43:06.51
To time.Time `json:"to"`
}
type ListTransactionsResponse struct{
type ListTransactionsResponse struct {
core.CommonResponse
// Method result
Result struct{
// Transactions infromation
Operations []struct{
// Cost of the products with seller's discounts applied
AccrualsForSale float64 `json:"accruals_for_sale"`
Result ListTransactionsResult `json:"result"`
}
// Total transaction sum
Amount float64 `json:"amount"`
type ListTransactionsResult struct {
// Transactions infromation
Operations []ListTransactionsResultOperation `json:"operations"`
// Delivery cost for charges by rates that were in effect until February 1, 2021, and for charges for bulky products
DeliveryCharge float64 `json:"delivery_charge"`
// Number of pages
PageCount int64 `json:"page_count"`
// Product information
Items []struct{
// Product name
Name string `json:"name"`
// Number of products
RowCount int64 `json:"row_count"`
}
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
} `json:"items"`
type ListTransactionsResultOperation struct {
// Cost of the products with seller's discounts applied
AccrualsForSale float64 `json:"accruals_for_sale"`
// Operation date
OperationDate string `json:"operation_date"`
// Total transaction sum
Amount float64 `json:"amount"`
// Operation identifier
OperationId int64 `json:"operation_id"`
// Delivery cost for charges by rates that were in effect until February 1, 2021, and for charges for bulky products
DeliveryCharge float64 `json:"delivery_charge"`
// Operation type
OperationType string `json:"operation_type"`
// Product information
Items []ListTransactionsResultOperationItem `json:"items"`
// Operation type name
OperationTypeName string `json:"operation_type_name"`
// Operation date
OperationDate string `json:"operation_date"`
// Shipment information
Posting struct{
// Delivery scheme:
// - FBO — delivery to Ozon warehouse
// - FBS — delivery from seller's warehouse
// - RFBS — delivery service of seller's choice
// - Crossborder — delivery from abroad
DeliverySchema string `json:"delivery_schema"`
// Operation identifier
OperationId int64 `json:"operation_id"`
// Date the product was accepted for processing
OrderDate string `json:"order_date"`
// Operation type
OperationType string `json:"operation_type"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Operation type name
OperationTypeName string `json:"operation_type_name"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
} `json:"posting"`
// Shipment information
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"`
// 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"`
// Sales commission or sales commission refund
SaleCommission float64 `json:"sale_commission"`
// Additional services
Services []struct{
// Service name
Name string `json:"name"`
// Additional services
Services []ListTransactionsResultOperationService `json:"services"`
// Price
Price float64 `json:"price"`
} `json:"services"`
// Transaction type
Type string `json:"type"`
}
// Transaction type
Type string `json:"type"`
} `json:"operations"`
type ListTransactionsResultOperationItem struct {
// Product name
Name string `json:"name"`
// Number of pages
PageCount int64 `json:"page_count"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
}
// Number of products
RowCount int64 `json:"row_count"`
} `json:"result"`
type ListTransactionsResultOperationPosting struct {
// Delivery scheme:
// - FBO — delivery to Ozon warehouse
// - FBS — delivery from seller's warehouse
// - RFBS — delivery service of seller's choice
// - Crossborder — delivery from abroad
DeliverySchema string `json:"delivery_schema"`
// Date the product was accepted for processing
OrderDate string `json:"order_date"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
}
type ListTransactionsResultOperationService struct {
// Service name
Name string `json:"name"`
// Price
Price float64 `json:"price"`
}
// Returns detailed information on all accruals. The maximum period for which you can get information in one request is 1 month.
//
//
// If you don't specify the posting_number in request, the response contains all shipments for the specified period or shipments of a certain type
func (c Finance) ListTransactions(params *ListTransactionsParams) (*ListTransactionsResponse, error) {
url := "/v3/finance/transaction/list"

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -2487,3 +2487,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,59 +15,61 @@ type GetAvailablePromotionsResponse struct {
core.CommonResponse
// Method result
Result []struct {
// Promotion identifier
Id float64 `json:"id"`
Result []GetAvailablePromotionsResult `json:"result"`
}
// Promotion name
Title string `json:"title"`
type GetAvailablePromotionsResult struct {
// Promotion identifier
Id float64 `json:"id"`
// Promotion type
ActionType string `json:"action_type"`
// Promotion name
Title string `json:"title"`
// Promotion description
Description string `json:"description"`
// Promotion type
ActionType string `json:"action_type"`
// Promotion start date
DateStart string `json:"date_start"`
// Promotion description
Description string `json:"description"`
// Promotion end date
DateEnd string `json:"date_end"`
// Promotion start date
DateStart string `json:"date_start"`
// Promotion freeze date.
//
// If the field is filled, the seller can't increase prices, change the list of products, or decrease the number of product units in the promotion.
//
// The seller can lower prices and increase the product units number in the promotion
FreezeDate string `json:"freeze_date"`
// Promotion end date
DateEnd string `json:"date_end"`
// Number of products that can participate in the promotion
PotentialProductsCount float64 `json:"potential_products_count"`
// Promotion freeze date.
//
// If the field is filled, the seller can't increase prices, change the list of products, or decrease the number of product units in the promotion.
//
// The seller can lower prices and increase the product units number in the promotion
FreezeDate string `json:"freeze_date"`
// Number of products that participate in the promotion
ParticipatingProductsCount float64 `json:"participating_products_count"`
// Number of products that can participate in the promotion
PotentialProductsCount float64 `json:"potential_products_count"`
// Whether or not you participate in the promotion
IsParticipating bool `json:"participating"`
// Number of products that participate in the promotion
ParticipatingProductsCount float64 `json:"participating_products_count"`
// Indication that customers need a promo code to participate in the promotion
IsVoucherAction bool `json:"is_voucher_action"`
// Whether or not you participate in the promotion
IsParticipating bool `json:"participating"`
// Number of blocked products
BannedProductsCount float64 `json:"banned_products_count"`
// Indication that customers need a promo code to participate in the promotion
IsVoucherAction bool `json:"is_voucher_action"`
// Indication of the promotion is with the target audience
WithTargeting bool `json:"with_targeting"`
// Number of blocked products
BannedProductsCount float64 `json:"banned_products_count"`
// Order amount
OrderAmount float64 `json:"order_amount"`
// Indication of the promotion is with the target audience
WithTargeting bool `json:"with_targeting"`
// Discount type
DiscountType string `json:"discount_type"`
// Order amount
OrderAmount float64 `json:"order_amount"`
// Discount size
DiscountValue float64 `json:"discount_value"`
} `json:"result"`
// Discount type
DiscountType string `json:"discount_type"`
// Discount size
DiscountValue float64 `json:"discount_value"`
}
// A method for getting a list of promotions that you can participate in
@@ -108,19 +110,23 @@ type AddProductToPromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
// List of product identifiers that were added to the promotion
ProductIds []float64 `json:"product_ids"`
Result AddProductToPromotionResult `json:"result"`
}
// List of products that weren't added to the promotion
Rejected []struct {
// Product identifier
ProductId float64 `json:"product_id"`
type AddProductToPromotionResult struct {
// List of product identifiers that were added to the promotion
ProductIds []float64 `json:"product_ids"`
// Reason why the product wasn't added to the promotion
Reason string `json:"reason"`
} `json:"rejected"`
} `json:"result"`
// List of products that weren't added to the promotion
Rejected []AddProductToPromotionResultRejected `json:"rejected"`
}
type AddProductToPromotionResultRejected struct {
// Product identifier
ProductId float64 `json:"product_id"`
// Reason why the product wasn't added to the promotion
Reason string `json:"reason"`
}
// A method for adding products to an available promotion
@@ -154,13 +160,15 @@ type ProductsAvailableForPromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
// Products list
Products []PromotionProduct `json:"products"`
Result ProductsAvailableForPromotionResult `json:"result"`
}
// Total number of products that can participate in the promotion
Total float64 `json:"total"`
} `json:"result"`
type ProductsAvailableForPromotionResult struct {
// Products list
Products []PromotionProduct `json:"products"`
// Total number of products that can participate in the promotion
Total float64 `json:"total"`
}
type PromotionProduct struct {
@@ -216,13 +224,15 @@ type ProductsInPromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
// Products list
Products []PromotionProduct `json:"products"`
Result ProductsInPromotionResult `json:"reuslt"`
}
// Total number of products that can participate in the promotion
Total float64 `json:"total"`
} `json:"reuslt"`
type ProductsInPromotionResult struct {
// Products list
Products []PromotionProduct `json:"products"`
// Total number of products that can participate in the promotion
Total float64 `json:"total"`
}
// A method for getting the list of products participating in the promotion by its identifier
@@ -252,19 +262,23 @@ type RemoveProductFromPromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
// List of product identifiers that were removed from the promotion
ProductIds []float64 `json:"product_ids"`
Result RemoveProductFromPromotionResult `json:"result"`
}
// List of product identifiers that weren't removed from the promotion
Rejected []struct {
// Product identifier
ProductId float64 `json:"product_id"`
type RemoveProductFromPromotionResult struct {
// List of product identifiers that were removed from the promotion
ProductIds []float64 `json:"product_ids"`
// Reason why the product wasn't removed from the promotion
Reason string `json:"reason"`
} `json:"rejected"`
} `json:"result"`
// List of product identifiers that weren't removed from the promotion
Rejected []RemoveProductFromPromotionResultRejected `json:"rejected"`
}
type RemoveProductFromPromotionResultRejected struct {
// Product identifier
ProductId float64 `json:"product_id"`
// Reason why the product wasn't removed from the promotion
Reason string `json:"reason"`
}
// A method for removing products from the promotion
@@ -286,33 +300,35 @@ type ListHotSalePromotionsResponse struct {
core.CommonResponse
// Method result
Result []struct {
// Promotion end date
DateEnd string `json:"date_end"`
Result []ListHotSalePromotionsResult `json:"result"`
}
// Promotion start date
DateStart string `json:"date_start"`
type ListHotSalePromotionsResult struct {
// Promotion end date
DateEnd string `json:"date_end"`
// Promotion description
Description string `json:"description"`
// Promotion start date
DateStart string `json:"date_start"`
// Promotion freeze date.
//
// If the field is filled, the seller can't increase prices, change the list of products,
// or decrease the number of product units in the promotion.
//
// The seller can lower prices and increase the product units number in the promotion
FreezeDate string `json:"freeze_date"`
// Promotion description
Description string `json:"description"`
// Hot Sale promotion identifier
HotsaleId float64 `json:"hotsale_id"`
// Promotion freeze date.
//
// If the field is filled, the seller can't increase prices, change the list of products,
// or decrease the number of product units in the promotion.
//
// The seller can lower prices and increase the product units number in the promotion
FreezeDate string `json:"freeze_date"`
// Indication that you participate in this promotion
IsParticipating bool `json:"is_participating"`
// Hot Sale promotion identifier
HotsaleId float64 `json:"hotsale_id"`
// Promotion name
Title string `json:"title"`
} `json:"result"`
// Indication that you participate in this promotion
IsParticipating bool `json:"is_participating"`
// Promotion name
Title string `json:"title"`
}
// List of available Hot Sale promotions
@@ -345,34 +361,38 @@ type ProductsAvailableForHotSalePromotionResponse struct {
core.CommonResponse
// Method result
Result struct {
// Products list
Products []struct {
// Promotional product price
ActionPrice float64 `json:"action_price"`
Result ProductsAvailableForHotSalePromotionResult `json:"result"`
}
// Date when the product participates in the promotion in the YYYY-MM-DD format
DateDayPromo string `json:"date_day_promo"`
type ProductsAvailableForHotSalePromotionResult struct {
// Products list
Products []ProductsAvailableForHotSalePromotionResultProduct `json:"products"`
// Product identifier
Id float64 `json:"id"`
// Total number of products that are available for the promotion
Total float64 `json:"total"`
}
// Indication that product participates in the promotion
IsActive bool `json:"is_active"`
type ProductsAvailableForHotSalePromotionResultProduct struct {
// Promotional product price
ActionPrice float64 `json:"action_price"`
// Maximum possible promotional price of the product
MaxActionPrice float64 `json:"max_action_type"`
// Date when the product participates in the promotion in the YYYY-MM-DD format
DateDayPromo string `json:"date_day_promo"`
// Minimum number of product units in a stock discount type promotion
MinStock float64 `json:"min_stock"`
// Product identifier
Id float64 `json:"id"`
// Number of product units in a stock discount type promotion
Stock float64 `json:"stock"`
} `json:"products"`
// Indication that product participates in the promotion
IsActive bool `json:"is_active"`
// Total number of products that are available for the promotion
Total float64 `json:"total"`
} `json:"result"`
// Maximum possible promotional price of the product
MaxActionPrice float64 `json:"max_action_type"`
// Minimum number of product units in a stock discount type promotion
MinStock float64 `json:"min_stock"`
// Number of product units in a stock discount type promotion
Stock float64 `json:"stock"`
}
// Method for getting a list of products that can participate or are already participating in the Hot Sale promotion
@@ -413,16 +433,20 @@ type ProductsToHotSaleResponse struct {
core.CommonResponse
// Method result
Result struct {
// List of products that haven't been added to the promotion
Rejected []struct {
//Product identifier
ProductId float64 `json:"product_id"`
Result ProductsToHotSaleResult `json:"result"`
}
// Reason why the product hasn't been added to the promotion
Reason string `json:"reason"`
} `json:"rejected"`
} `json:"result"`
type ProductsToHotSaleResult struct {
// List of products that haven't been added to the promotion
Rejected []ProductsToHotSaleResultRejected `json:"rejected"`
}
type ProductsToHotSaleResultRejected struct {
//Product identifier
ProductId float64 `json:"product_id"`
// Reason why the product hasn't been added to the promotion
Reason string `json:"reason"`
}
func (c Promotions) AddProductsToHotSale(params *AddProductsToHotSaleParams) (*ProductsToHotSaleResponse, error) {
@@ -477,112 +501,114 @@ type ListDiscountRequestsResponse struct {
core.CommonResponse
// List of requests
Result []struct {
// Request ID
Id uint64 `json:"id"`
Result []ListDiscountRequestsResult `json:"result"`
}
// Request created date
CreatedAt time.Time `json:"created_at"`
type ListDiscountRequestsResult struct {
// Request ID
Id uint64 `json:"id"`
// End time of the request
EndAt time.Time `json:"end_at"`
// Request created date
CreatedAt time.Time `json:"created_at"`
// Time to change the decision
EditedTill time.Time `json:"edited_till"`
// End time of the request
EndAt time.Time `json:"end_at"`
// Request status
Status string `json:"status"`
// Time to change the decision
EditedTill time.Time `json:"edited_till"`
// Customer's name
CustomerName string `json:"customer_name"`
// Request status
Status string `json:"status"`
// Product identifier in the Ozon system, SKU
SKU uint64 `json:"sku"`
// Customer's name
CustomerName string `json:"customer_name"`
// Customer's comment on the request
UserComment string `json:"user_comment"`
// Product identifier in the Ozon system, SKU
SKU uint64 `json:"sku"`
// Seller's comment on the request
SellerComment string `json:"seller_comment"`
// Customer's comment on the request
UserComment string `json:"user_comment"`
// Requested price
RequestedPrice float64 `json:"requested_price"`
// Seller's comment on the request
SellerComment string `json:"seller_comment"`
// Approved price
ApprovedPrice float64 `json:"approved_price"`
// Requested price
RequestedPrice float64 `json:"requested_price"`
// Product price before all discounts
OriginalPrice float64 `json:"original_price"`
// Approved price
ApprovedPrice float64 `json:"approved_price"`
// Discount in rubles
Discount float64 `json:"discount"`
// Product price before all discounts
OriginalPrice float64 `json:"original_price"`
// Discount percentage
DiscountPercent float64 `json:"discount_percent"`
// Discount in rubles
Discount float64 `json:"discount"`
// Base price at which a product is selling on Ozon, if not eligible for a promotion
BasePrice float64 `json:"base_price"`
// Discount percentage
DiscountPercent float64 `json:"discount_percent"`
// The minimum price after auto-application of discounts and promotions
MinAutoPrice float64 `json:"min_auto_price"`
// Base price at which a product is selling on Ozon, if not eligible for a promotion
BasePrice float64 `json:"base_price"`
// ID of the previous customer request for this product
PrevTaskId uint64 `json:"prev_task_id"`
// The minimum price after auto-application of discounts and promotions
MinAutoPrice float64 `json:"min_auto_price"`
// If product is damaged — true
IsDamaged bool `json:"is_damaged"`
// ID of the previous customer request for this product
PrevTaskId uint64 `json:"prev_task_id"`
// Moderation date: review, approval or decline of the request
ModeratedAt time.Time `json:"moderated_at"`
// If product is damaged — true
IsDamaged bool `json:"is_damaged"`
// Discount in rubles approved by the seller. Pass the value 0 if the seller did not approve the request
ApprovedDiscount float64 `json:"approved_discount"`
// Moderation date: review, approval or decline of the request
ModeratedAt time.Time `json:"moderated_at"`
// Discount percentage approved by the seller. Pass the value 0 if the seller did not approve the request
ApprovedDiscountPercent float64 `json:"approved_discount_percent"`
// Discount in rubles approved by the seller. Pass the value 0 if the seller did not approve the request
ApprovedDiscount float64 `json:"approved_discount"`
// Whether the customer has purchased the product. true if purchased
IsPurchased bool `json:"is_purchased"`
// Discount percentage approved by the seller. Pass the value 0 if the seller did not approve the request
ApprovedDiscountPercent float64 `json:"approved_discount_percent"`
// Whether the request was moderated automatically. true if moderation was automatic
IsAutoModerated bool `json:"is_auto_moderated"`
// Whether the customer has purchased the product. true if purchased
IsPurchased bool `json:"is_purchased"`
// Product identifier in the seller's system
OfferId string `json:"offer_id"`
// Whether the request was moderated automatically. true if moderation was automatic
IsAutoModerated bool `json:"is_auto_moderated"`
// Email of the user who processed the request
Email string `json:"email"`
// Product identifier in the seller's system
OfferId string `json:"offer_id"`
// Last name of the user who processed the request
LastName string `json:"last_name"`
// Email of the user who processed the request
Email string `json:"email"`
// First name of the user who processed the request
FirstName string `json:"first_name"`
// Last name of the user who processed the request
LastName string `json:"last_name"`
// Patronymic of the user who processed the request
Patronymic string `json:"patronymic"`
// First name of the user who processed the request
FirstName string `json:"first_name"`
// Approved minimum quantity of products
ApprovedQuantityMin uint64 `json:"approved_quantity_min"`
// Patronymic of the user who processed the request
Patronymic string `json:"patronymic"`
// Approved maximum quantity of products
ApprovedQuantityMax uint64 `json:"approved_quantity_max"`
// Approved minimum quantity of products
ApprovedQuantityMin uint64 `json:"approved_quantity_min"`
// Requested minimum number of products
RequestedQuantityMin uint64 `json:"requested_quantity_min"`
// Approved maximum quantity of products
ApprovedQuantityMax uint64 `json:"approved_quantity_max"`
// Requested maximum number of products
RequestedQuantityMax uint64 `json:"requested_quantity_max"`
// Requested minimum number of products
RequestedQuantityMin uint64 `json:"requested_quantity_min"`
// Requested price with fee
RequestedPriceWithFee float64 `json:"requested_price_with_fee"`
// Requested maximum number of products
RequestedQuantityMax uint64 `json:"requested_quantity_max"`
// Approved price with fee
ApprovedPriceWithFee float64 `json:"approved_price_with_fee"`
// Requested price with fee
RequestedPriceWithFee float64 `json:"requested_price_with_fee"`
// Approved price fee percent
ApprovedPriceFeePercent float64 `json:"approved_price_fee_percent"`
} `json:"result"`
// Approved price with fee
ApprovedPriceWithFee float64 `json:"approved_price_with_fee"`
// Approved price fee percent
ApprovedPriceFeePercent float64 `json:"approved_price_fee_percent"`
}
// Method for getting a list of products that customers want to buy with discount
@@ -626,22 +652,26 @@ type DiscountRequestResponse struct {
core.CommonResponse
// Method result
Result struct {
// Errors when creating a request
FailDetails []struct {
// Request ID
TaskId uint64 `json:"task_id"`
Result DiscountRequestResult `json:"result"`
}
// Error message
ErrorForUser string `json:"error_for_user"`
} `json:"fail_details"`
type DiscountRequestResult struct {
// Errors when creating a request
FailDetails []DiscountRequestResultFailDetail `json:"fail_details"`
// The number of requests with a successful status change
SuccessCount int32 `json:"success_count"`
// The number of requests with a successful status change
SuccessCount int32 `json:"success_count"`
// The number of requests that failed to change their status
FailCount int32 `json:"fail_count"`
} `json:"result"`
// The number of requests that failed to change their status
FailCount int32 `json:"fail_count"`
}
type DiscountRequestResultFailDetail struct {
// Request ID
TaskId uint64 `json:"task_id"`
// Error message
ErrorForUser string `json:"error_for_user"`
}
// You can approve applications in statuses:

View File

@@ -15,73 +15,79 @@ type GetCurrentSellerRatingInfoResponse struct {
core.CommonResponse
// Rating groups list
Groups []struct {
// Ratings group name
GroupName string `json:"group_name"`
Groups []GetCurrentSellerRatingInfoGroup `json:"groups"`
}
// Ratings list
Items []struct {
type GetCurrentSellerRatingInfoGroup struct {
// Ratings group name
GroupName string `json:"group_name"`
// Rating change: the ratio of the previous value to the current one
Change struct {
// How the rating value has changed:
// - DIRECTION_UNKNOWN — unknown.
// - DIRECTION_NONE — has not changed.
// - DIRECTION_RISE — has increased.
// - DIRECTION_FALL — has dropped.
Direction string `json:"direction"`
// Ratings list
Items []GetCurrentSellerRatingInfoGroupItem `json:"items"`
// 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"`
// An indication that the penalty points balance is exceeded
PenaltyScoreExceeded bool `json:"penalty_score_exceeded"`
// Current rating value
CurrentValue float64 `json:"current_value"`
// An indication that you participate in the Premium program
Premium bool `json:"premium"`
}
// Rating name
Name string `json:"name"`
type GetCurrentSellerRatingInfoGroupItem struct {
// Previous rating value
PastValue float64 `json:"past_value"`
// Rating change: the ratio of the previous value to the current one
Change GetCurrentSellerRatingInfoGroupItemChange `json:"change"`
// System rating name
Rating string `json:"rating"`
// Current rating value
CurrentValue float64 `json:"current_value"`
// What should be the rating value to be considered good:
// - UNKNOWN_DIRECTION — unknown.
// - NEUTRAL — doesn't matter.
// - HIGHER_IS_BETTER — the higher the better.
// - LOWER_IS_BETTER — the lower the better.
RatingDirection string `json:"rating_direction"`
// Rating name
Name string `json:"name"`
// Rating status:
// - UNKNOWN_STATUS — unknown status.
// - OK — everything is OK.
// - WARNING — indicators require attention.
// - CRITICAL — critical rating
Status string `json:"status"`
// Previous rating value
PastValue float64 `json:"past_value"`
// Value type:
// - UNKNOWN_VALUE — unknown,
// - INDEX,
// - PERCENT,
// - TIME,
// - RATIO — coefficient,
// - REVIEW_SCORE — score,
// - COUNT
ValueType string `json:"value_type"`
} `json:"items"`
// System rating name
Rating string `json:"rating"`
// An indication that the penalty points balance is exceeded
PenaltyScoreExceeded bool `json:"penalty_score_exceeded"`
// What should be the rating value to be considered good:
// - UNKNOWN_DIRECTION — unknown.
// - NEUTRAL — doesn't matter.
// - HIGHER_IS_BETTER — the higher the better.
// - LOWER_IS_BETTER — the lower the better.
RatingDirection string `json:"rating_direction"`
// An indication that you participate in the Premium program
Premium bool `json:"premium"`
} `json:"groups"`
// Rating status:
// - UNKNOWN_STATUS — unknown status.
// - OK — everything is OK.
// - WARNING — indicators require attention.
// - CRITICAL — critical rating
Status string `json:"status"`
// Value type:
// - UNKNOWN_VALUE — unknown,
// - INDEX,
// - PERCENT,
// - TIME,
// - RATIO — coefficient,
// - REVIEW_SCORE — score,
// - COUNT
ValueType string `json:"value_type"`
}
type GetCurrentSellerRatingInfoGroupItemChange struct {
// How the rating value has changed:
// - DIRECTION_UNKNOWN — unknown.
// - DIRECTION_NONE — has not changed.
// - DIRECTION_RISE — has increased.
// - DIRECTION_FALL — has dropped.
Direction string `json:"direction"`
// What the change means:
// - MEANING_UNKNOWN — unknown.
// - MEANING_NONE — neutral.
// - MEANING_GOOD — the indicator is improving, everything is good.
// - MEANING_BAD — the indicator is dropping, you should do something.
Meaning string `json:"meaning"`
}
func (c Rating) GetCurrentSellerRatingInfo() (*GetCurrentSellerRatingInfoResponse, error) {
@@ -116,61 +122,71 @@ type GetSellerRatingInfoPeriodResponse struct {
core.CommonResponse
// Information on the Premium program penalty points
PremiumScores []struct {
// Rating name
Rating string `json:"rating"`
// Information on penalty points
Scores []struct {
// Date when the penalty points were received
Date time.Time `json:"date"`
// Rating value for which the penalty points were received
RatingValue float64 `json:"rating_value"`
// Number of received penalty points
Value int32 `json:"value"`
} `json:"scores"`
} `json:"premium_scores"`
PremiumScores []GetSellerRatingInfoPeriodPremiumScores `json:"premium_scores"`
// Information on the seller ratings
Ratings []struct {
// Rating threshold, after which sales will be blocked
DangerThreshold float64 `json:"danger_threshold"`
Ratings []GetSellerRatingInfoPeriodRating `json:"ratings"`
}
// Rating threshold for participation in the Premium program
PremiumThreshold float64 `json:"premium_threshold"`
type GetSellerRatingInfoPeriodPremiumScores struct {
// Rating name
Rating string `json:"rating"`
// Rating system name
Rating string `json:"rating"`
// Information on penalty points
Scores []GetSellerRatingInfoPeriodPremiumScore `json:"scores"`
}
// Rating values list
Values []struct {
// Rating calculation start date
DateFrom time.Time `json:"date_from"`
type GetSellerRatingInfoPeriodPremiumScore struct {
// Date when the penalty points were received
Date time.Time `json:"date"`
// Rating calculation end date
DateTo time.Time `json:"date_to"`
// Rating value for which the penalty points were received
RatingValue float64 `json:"rating_value"`
// Rating status
Status struct {
// Indication if the rating threshold for blocking is exceeded
Danger bool `json:"danger"`
// Number of received penalty points
Value int32 `json:"value"`
}
// Indication whether the threshold for participation in the Premium program has been reached
Premium bool `json:"premium"`
type GetSellerRatingInfoPeriodRating struct {
// Rating threshold, after which sales will be blocked
DangerThreshold float64 `json:"danger_threshold"`
// Indication of a warning that the threshold for blocking may be exceeded
Warning bool `json:"warning"`
} `json:"status"`
// Rating threshold for participation in the Premium program
PremiumThreshold float64 `json:"premium_threshold"`
// Rating value
Value float64 `json:"value"`
} `json:"values"`
// Rating system name
Rating string `json:"rating"`
// Rating threshold, after which a warning about possible blocking appears
WarningThreshold float64 `json:"warning_threshold"`
} `json:"ratings"`
// Rating values list
Values []GetSellerRatingInfoPeriodRatingValue `json:"values"`
// Rating threshold, after which a warning about possible blocking appears
WarningThreshold float64 `json:"warning_threshold"`
}
type GetSellerRatingInfoPeriodRatingValue struct {
// Rating calculation start date
DateFrom time.Time `json:"date_from"`
// Rating calculation end date
DateTo time.Time `json:"date_to"`
// Rating status
Status GetSellerRatingInfoPeriodRatingValueStatus `json:"status"`
// Rating value
Value float64 `json:"value"`
}
type GetSellerRatingInfoPeriodRatingValueStatus struct {
// Indication if the rating threshold for blocking is exceeded
Danger bool `json:"danger"`
// Indication whether the threshold for participation in the Premium program has been reached
Premium bool `json:"premium"`
// Indication of a warning that the threshold for blocking may be exceeded
Warning bool `json:"warning"`
}
func (c Rating) GetSellerRatingInfoForPeriod(params *GetSellerRatingInfoForPeriodParams) (*GetSellerRatingInfoPeriodResponse, error) {

View File

@@ -38,45 +38,48 @@ type GetReportsListResponse struct {
core.CommonResponse
// Method result
Result struct {
// Array with generated reports
Reports []struct {
// Unique report identifier
Code string `json:"code"`
Result GetReportsListResult `json:"result"`
}
// Report creation date
CreatedAt time.Time `json:"created_at"`
type GetReportsListResult struct {
// Array with generated reports
Reports []GetReportsListResultReport `json:"reports"`
// Error code when generating the report
Error string `json:"error"`
// Total number of reports
Total int32 `json:"total"`
}
// Link to CSV file
File string `json:"file"`
type GetReportsListResultReport struct {
// Unique report identifier
Code string `json:"code"`
// Array with the filters specified when the seller created the report
Params struct {
} `json:"params"`
// Report creation date
CreatedAt time.Time `json:"created_at"`
// Report type:
// - SELLER_PRODUCTS — products report,
// - SELLER_TRANSACTIONS — transactions report,
// - SELLER_PRODUCT_PRICES — product prices report,
// - SELLER_STOCK — stocks report,
// - SELLER_PRODUCT_MOVEMENT — products movement report,
// - SELLER_RETURNS — returns report,
// - SELLER_POSTINGS — shipments report,
// - SELLER_FINANCE — financial report
ReportType string `json:"report_type"`
// Error code when generating the report
Error string `json:"error"`
// Report generation status
// - `success`
// - `failed`
Status string `json:"status"`
} `json:"reports"`
// Link to CSV file
File string `json:"file"`
// Total number of reports
Total int32 `json:"total"`
} `json:"result"`
// Array with the filters specified when the seller created the report
Params map[string]string `json:"params"`
// Report type:
// - SELLER_PRODUCTS — products report,
// - SELLER_TRANSACTIONS — transactions report,
// - SELLER_PRODUCT_PRICES — product prices report,
// - SELLER_STOCK — stocks report,
// - SELLER_PRODUCT_MOVEMENT — products movement report,
// - SELLER_RETURNS — returns report,
// - SELLER_POSTINGS — shipments report,
// - SELLER_FINANCE — financial report
ReportType string `json:"report_type"`
// Report generation status
// - `success`
// - `failed`
Status string `json:"status"`
}
// Returns the list of reports that have been generated before
@@ -103,38 +106,40 @@ type GetReportDetailsResponse struct {
core.CommonResponse
// Report details
Result struct {
// Unique report identifier
Code string `json:"code"`
Result GetReportDetailResult `json:"result"`
}
// Report creation date
CreatedAt time.Time `json:"created_at"`
type GetReportDetailResult struct {
// Unique report identifier
Code string `json:"code"`
// Error code when generating the report
Error string `json:"error"`
// Report creation date
CreatedAt time.Time `json:"created_at"`
// Link to CSV file
File string `json:"file"`
// Error code when generating the report
Error string `json:"error"`
// Array with the filters specified when the seller created the report
Params map[string]string `json:"params"`
// Link to CSV file
File string `json:"file"`
// Report type:
// - SELLER_PRODUCTS — products report,
// - SELLER_TRANSACTIONS — transactions report,
// - SELLER_PRODUCT_PRICES — product prices report,
// - SELLER_STOCK — stocks report,
// - SELLER_PRODUCT_MOVEMENT — products movement report,
// - SELLER_RETURNS — returns report,
// - SELLER_POSTINGS — shipments report,
// - SELLER_FINANCE — financial report
ReportType string `json:"report_type"`
// Array with the filters specified when the seller created the report
Params map[string]string `json:"params"`
// Report generation status:
// - success
// - failed
Status string `json:"status"`
} `json:"result"`
// Report type:
// - SELLER_PRODUCTS — products report,
// - SELLER_TRANSACTIONS — transactions report,
// - SELLER_PRODUCT_PRICES — product prices report,
// - SELLER_STOCK — stocks report,
// - SELLER_PRODUCT_MOVEMENT — products movement report,
// - SELLER_RETURNS — returns report,
// - SELLER_POSTINGS — shipments report,
// - SELLER_FINANCE — financial report
ReportType string `json:"report_type"`
// Report generation status:
// - success
// - failed
Status string `json:"status"`
}
// Returns information about a created report by its identifier
@@ -159,6 +164,9 @@ type GetFinancialReportParams struct {
// Number of the page returned in the request
Page int64 `json:"page"`
// true, если нужно добавить дополнительные параметры в ответ
WithDetails bool `json:"with_details"`
// Number of items on the page
PageSize int64 `json:"page_size"`
}
@@ -175,43 +183,212 @@ type GetFinancialReportResponse struct {
core.CommonResponse
// Method result
Result struct {
// Reports list
CashFlows []struct {
// Period data
Period struct {
// Period identifier
Id int64 `json:"id"`
Result GetFinancialResultResult `json:"result"`
}
// Period start
Begin time.Time `json:"begin"`
type GetFinancialResultResult struct {
// Reports list
CashFlows []GetFinancialResultResultCashflow `json:"cash_flows"`
// Period end
End time.Time `json:"end"`
} `json:"period"`
// Detailed info
Details GetFinancialResultResultDetail `json:"details"`
// Sum of sold products prices
OrdersAmount float64 `json:"order_amount"`
// Number of pages with reports
PageCount int64 `json:"page_count"`
}
// Sum of returned products prices
ReturnsAmount float64 `json:"returns_amount"`
type GetFinancialResultResultCashflow struct {
// Period data
Period GetFinancialResultResultCashflowPeriod `json:"period"`
// Ozon sales commission
CommissionAmount float64 `json:"commission_amount"`
// Sum of sold products prices
OrdersAmount float64 `json:"order_amount"`
// Additional services cost
ServicesAmount float64 `json:"services_amount"`
// Sum of returned products prices
ReturnsAmount float64 `json:"returns_amount"`
// Logistic services cost
ItemDeliveryAndReturnAmount float64 `json:"item_delivery_and_return_amount"`
// Ozon sales commission
CommissionAmount float64 `json:"commission_amount"`
// Code of the currency used to calculate the commissions
CurrencyCode string `json:"currency_code"`
} `json:"cash_flows"`
// Additional services cost
ServicesAmount float64 `json:"services_amount"`
// Number of pages with reports
PageCount int64 `json:"page_count"`
} `json:"result"`
// Logistic services cost
ItemDeliveryAndReturnAmount float64 `json:"item_delivery_and_return_amount"`
// Code of the currency used to calculate the commissions
CurrencyCode string `json:"currency_code"`
}
type GetFinancialResultResultCashflowPeriod struct {
// Period identifier
Id int64 `json:"id"`
// Period start
Begin time.Time `json:"begin"`
// Period end
End time.Time `json:"end"`
}
type GetFinancialResultResultDetail struct {
// Balance on the beginning of period
BeginBalanceAmount float64 `json:"begin_balance_amount"`
// Orders
Delivery GetFinancialResultResultDetailDelivery `json:"delivery"`
// Amount to be paid for the period
InvoiceTransfer float64 `json:"invoice_transfer"`
// Transfer under loan agreements
Loan float64 `json:"loan"`
// Paid for the period
Payments []GetFinancialResultResultDetailPayment `json:"payments"`
// Period data
Period GetFinancialResultResultDetailPeriod `json:"period"`
// Returns and cancellations
Return GetFinancialResultResultDetailReturn `json:"return"`
// rFBS transfers
RFBS GetFinancialResultResultDetailRFBS `json:"rfbs"`
// Services
Services GetFinancialResultResultDetailService `json:"services"`
// Compensation and other accruals
Others GetFinancialResultResultDetailOthers `json:"others"`
// Balance at the end of the period
EndBalanceAmount float64 `json:"end_balance_amount"`
}
type GetFinancialResultResultDetailDelivery struct {
// Total amount
Total float64 `json:"total"`
// Amount for which products were purchased, including commission fees
Amount float64 `json:"amount"`
// Processing and delivery fees
DeliveryServices GetFinancialResultResultDetailDeliveryServices `json:"delivery_services"`
}
type GetFinancialResultResultDetailDeliveryServices struct {
// Total amount
Total float64 `json:"total"`
// Details
Items []GetFinancialResultResultDetailDeliveryServicesItem `json:"items"`
}
type GetFinancialResultResultDetailDeliveryServicesItem struct {
// Operation name
Name DetailsDeliveryItemName `json:"name"`
// Amount by operation
Price float64 `json:"price"`
}
type GetFinancialResultResultDetailPayment struct {
// Currency
CurrencyCode string `json:"currency_code"`
// Payment amount
Payment float64 `json:"payment"`
}
type GetFinancialResultResultDetailPeriod struct {
// Period start
Begin time.Time `json:"begin"`
// Period end
End time.Time `json:"end"`
// Period identifier
Id int64 `json:"id"`
}
type GetFinancialResultResultDetailReturn struct {
// Total amount
Total float64 `json:"total"`
// Amount of returns received, including commission fees
Amount float64 `json:"amount"`
// Returns and cancellation fees
ReturnServices GetFinancialResultResultDetailReturnServices `json:"return_services"`
}
type GetFinancialResultResultDetailReturnServices struct {
// Total amount
Total float64 `json:"total"`
// Details
Items []GetFinancialResultResultDetailReturnServicesItem `json:"items"`
}
type GetFinancialResultResultDetailReturnServicesItem struct {
// Operation name
Name DetailsReturnServiceName `json:"name"`
// Amount by operation
Price float64 `json:"price"`
}
type GetFinancialResultResultDetailRFBS struct {
// Total amount
Total float64 `json:"total"`
// Transfers from customers
TransferDelivery float64 `json:"transfer_delivery"`
// Return of transfers to customers
TransferDeliveryReturn float64 `json:"transfer_delivery_return"`
// Compensation of delivery fees
CompensationDeliveryReturn float64 `json:"compensation_delivery_return"`
// Transfers of partial refunds to customers
PartialCompensation float64 `json:"partial_compensation"`
// Compensation of partial refunds
PartialCompensationReturn float64 `json:"partial_compensation_return"`
}
type GetFinancialResultResultDetailService struct {
// Total amount
Total float64 `json:"total"`
// Details
Items []GetFinancialResultResultDetailServiceItem `json:"items"`
}
type GetFinancialResultResultDetailServiceItem struct {
// Operation name
Name DetailsServiceItemName `json:"name"`
// Amount by operation
Price float64 `json:"price"`
}
type GetFinancialResultResultDetailOthers struct {
// Total amount
Total float64 `json:"total"`
// Details
Items []GetFinancialResultResultDetailOthersItem `json:"items"`
}
type GetFinancialResultResultDetailOthersItem struct {
// Operation name
Name DetailsOtherItemName `json:"name"`
// Amount by operation
Price float64 `json:"price"`
}
// Returns information about a created report by its identifier
@@ -254,10 +431,12 @@ type GetProductsReportResponse struct {
core.CommonResponse
// Method result
Result struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
Result GetProductsReportResult `json:"result"`
}
type GetProductsReportResult struct {
// Unique report identifier
Code string `json:"code"`
}
// 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
// Method result
Result struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
Result GetStocksReportResult `json:"result"`
}
type GetStocksReportResult struct {
// Unique report identifier
Code string `json:"code"`
}
// Report with information about the number of available and reserved products in stock
@@ -326,10 +507,12 @@ type GetProductsMovementReportResponse struct {
core.CommonResponse
// Method result
Result struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
Result GetProductsMovementReportResult `json:"result"`
}
type GetProductsMovementReportResult struct {
// Unique report identifier
Code string `json:"code"`
}
// Report with complete information on products, as well as the number of products with statuses:
@@ -377,10 +560,12 @@ type GetReturnsReportResponse struct {
core.CommonResponse
// Method result
Result struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
Result GetReturnReportResult `json:"result"`
}
type GetReturnReportResult struct {
// Unique report identifier
Code string `json:"code"`
}
// 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
// Method result
Result struct {
// Unique report identifier
Code string `json:"code"`
} `json:"result"`
Result GetShipmentReportResult `json:"result"`
}
type GetShipmentReportResult struct {
// Unique report identifier
Code string `json:"code"`
}
// Shipment report with orders details:
@@ -507,23 +694,25 @@ type ReportOnDiscountedProductsResponse struct {
core.CommonResponse
// Report information
Report struct {
// Report creation date
CreatedAt time.Time `json:"created_at"`
Report ReportonDiscountedProductsReport `json:"report"`
}
// Link to report file
File string `json:"file"`
type ReportonDiscountedProductsReport struct {
// Report creation date
CreatedAt time.Time `json:"created_at"`
// Report status:
// - success — created
// - pending — waiting to be processed
// - processing — processed
// - failed — generation error
Status string `json:"status"`
// Link to report file
File string `json:"file"`
// Report generation error code
Error string `json:"error"`
} `json:"report"`
// Report status:
// - success — created
// - pending — waiting to be processed
// - processing — processed
// - failed — generation error
Status string `json:"status"`
// Report generation error code
Error string `json:"error"`
}
// By report identifier, returns information about the report generated earlier

View File

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

View File

@@ -28,7 +28,8 @@ type GetFBOReturnsFilter struct {
// Shipment number
PostingNumber string `json:"posting_number"`
Status []string `json:"status"`
// Return status
Status []GetFBOReturnsFilterStatus `json:"status"`
}
type GetFBOReturnsResponse struct {
@@ -38,40 +39,42 @@ type GetFBOReturnsResponse struct {
LastId int64 `json:"last_id"`
// Returns information
Returns []struct {
// Time when a return was received from the customer
AcceptedFromCustomerMoment time.Time `json:"accepted_from_customer_moment"`
Returns []GetFBOReturnsReturn `json:"returns"`
}
// Seller identifier
CompanyId int64 `json:"company_id"`
type GetFBOReturnsReturn struct {
// Time when a return was received from the customer
AcceptedFromCustomerMoment time.Time `json:"accepted_from_customer_moment"`
// Current return location
CurrentPlaceName string `json:"current_place_name"`
// Seller identifier
CompanyId int64 `json:"company_id"`
// Return destination
DestinationPlaceName string `json:"dst_place_name"`
// Current return location
CurrentPlaceName string `json:"current_place_name"`
// Return identifier
Id int64 `json:"id"`
// Return destination
DestinationPlaceName string `json:"dst_place_name"`
// Indication that the package has been opened. true, if it has been
IsOpened bool `json:"is_opened"`
// Return identifier
Id int64 `json:"id"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Indication that the package has been opened. true, if it has been
IsOpened bool `json:"is_opened"`
// Return reason
ReturnReasonName string `json:"return_reason_name"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Return delivery time to the Ozon warehouse
ReturnedToOzonMoment time.Time `json:"returned_to_ozon_moment"`
// Return reason
ReturnReasonName string `json:"return_reason_name"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
// Return delivery time to the Ozon warehouse
ReturnedToOzonMoment time.Time `json:"returned_to_ozon_moment"`
// Return status
Status string `json:"status_name"`
} `json:"returns"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
// Return status
Status GetFBOReturnsReturnStatus `json:"status_name"`
}
// Method for getting information on returned products that are sold from the Ozon warehouse
@@ -98,9 +101,10 @@ type GetFBSReturnsParams struct {
// - minimum — 1
Limit int64 `json:"limit"`
// Number of elements that will be skipped in the response.
// For example, if offset=10, the response will start with the 11th element found
Offset int64 `json:"offset"`
// Return identifier that was loaded the last time.
// Return identifiers with the higher value than `last_id`
// will be returned in the response.
LastId int64 `json:"offset"`
}
type GetFBSReturnsFilter struct {
@@ -108,7 +112,7 @@ type GetFBSReturnsFilter struct {
AcceptedFromCustomerMoment GetFBSReturnsFilterTimeRange `json:"accepted_from_customer_moment"`
// Last day of free storage
LastFreeWaitingDay []GetFBSReturnsFilterTimeRange `json:"last_free_waiting_dat"`
LastFreeWaitingDay GetFBSReturnsFilterTimeRange `json:"last_free_waiting_dat"`
// Order ID
OrderId int64 `json:"order_id"`
@@ -122,13 +126,8 @@ type GetFBSReturnsFilter struct {
// Product ID
ProductOfferId string `json:"product_offer_id"`
// Return status:
// - returned_to_seller — returned to seller,
// - waiting_for_seller — waiting for seller,
// - accepted_from_customer — accepted from customer,
// - cancelled_with_compensation — cancelled with compensation,
// - ready_for_shipment — ready for shipment
Status string `json:"status"`
// Return status
Status GetFBSReturnsFilterStatus `json:"status"`
}
type GetFBSReturnsFilterTimeRange struct {
@@ -150,93 +149,106 @@ type GetFBSReturnsFilterTimeRange struct {
type GetFBSReturnsResponse struct {
core.CommonResponse
Result struct {
// Elements counter in the response
Count int64 `json:"count"`
// Return identifier that was loaded the last time.
// Return identifiers with the higher value than `last_id`
// will be returned in the response
LastId int64 `json:"last_id"`
// Returns information
Returns []struct {
// Time of receiving the return from the customer
AcceptedFromCustomerAmount string `json:"accepted_from_customer_amount"`
// Returns information
Returns []GetFBSReturnResultReturn `json:"returns"`
}
// Bottom barcode on the product label
ClearingId int64 `json:"clearing_id"`
type GetFBSReturnResultReturn struct {
// Time of receiving the return from the customer
AcceptedFromCustomerAmount string `json:"accepted_from_customer_amount"`
// Commission fee
Commission float64 `json:"commission"`
// Bottom barcode on the product label
ClearingId int64 `json:"clearing_id"`
// Commission percentage
CommissionPercent float64 `json:"commission_percent"`
// Commission fee
Commission float64 `json:"commission"`
// Return identifier
Id int64 `json:"id"`
// Commission percentage
CommissionPercent float64 `json:"commission_percent"`
// If the product is in transit — true
IsMoving bool `json:"is_moving"`
// Product item identifier in the Ozon logistics system
ExemplarId int64 `json:"exemplar_id"`
// Indication that the package has been opened. true, if it has been
IsOpened bool `json:"is_opened"`
// Return identifier in the Ozon accounting system
Id int64 `json:"id"`
// Last day of free storage
LastFreeWaitingDay string `json:"last_free_waiting_day"`
// If the product is in transit — true
IsMoving bool `json:"is_moving"`
// ID of the warehouse the product is being transported to
PlaceId int64 `json:"place_id"`
// Indication that the package has been opened. true, if it has been
IsOpened bool `json:"is_opened"`
// Name of the warehouse the product is being transported to
MovingToPlaceName string `json:"moving_to_place_name"`
// Last day of free storage
LastFreeWaitingDay string `json:"last_free_waiting_day"`
// Delivery cost
PickingAmount float64 `json:"picking_amount"`
// ID of the warehouse the product is being transported to
PlaceId int64 `json:"place_id"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Name of the warehouse the product is being transported to
MovingToPlaceName string `json:"moving_to_place_name"`
// Current product price without a discount
Price float64 `json:"price"`
// Delivery cost
PickingAmount float64 `json:"picking_amount"`
// Product price without commission
PriceWithoutCommission float64 `json:"price_without_commission"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Product identifier
ProductId int64 `json:"product_id"`
PickingTag string `json:"picking_tag"`
// Product name
ProductName string `json:"product_name"`
// Current product price without a discount
Price float64 `json:"price"`
// Product quantity
Quantity int64 `json:"quantity"`
// Product price without commission
PriceWithoutCommission float64 `json:"price_without_commission"`
// Product return date
ReturnDate string `json:"return_date"`
// Product identifier
ProductId int64 `json:"product_id"`
// Return reason
ReturnReasonName string `json:"return_reason_name"`
// Product name
ProductName string `json:"product_name"`
// Date when the product is ready to be handed over to the seller
WaitingForSellerDate string `json:"waiting_for_seller_date_time"`
// Product quantity
Quantity int64 `json:"quantity"`
// Date of handing over the product to the seller
ReturnedToSellerDate string `json:"returned_to_seller_date_time"`
// Barcode on the return label. Use this parameter value to work with the return label
ReturnBarcode string `json:"return_barcode"`
// Return storage period in days
WaitingForSellerDays int64 `json:"waiting_for_seller_days"`
// Package unit identifier in the Ozon logistics system
ReturnClearingId int64 `json:"return_clearing_id"`
// Return storage cost
ReturnsKeepingCost float64 `json:"returns_keeping_cost"`
// Product return date
ReturnDate string `json:"return_date"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
// Return reason
ReturnReasonName string `json:"return_reason_name"`
// Return status
Status string `json:"status"`
} `json:"returns"`
} `json:"result"`
// Date when the product is ready to be handed over to the seller
WaitingForSellerDate string `json:"waiting_for_seller_date_time"`
// Date of handing over the product to the seller
ReturnedToSellerDate string `json:"returned_to_seller_date_time"`
// Return storage period in days
WaitingForSellerDays int64 `json:"waiting_for_seller_days"`
// Return storage cost
ReturnsKeepingCost float64 `json:"returns_keeping_cost"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
// Return status
Status string `json:"status"`
}
// Method for getting information on returned products that are sold from the seller's warehouse
func (c Returns) GetFBSReturns(params *GetFBSReturnsParams) (*GetFBSReturnsResponse, error) {
url := "/v2/returns/company/fbs"
url := "/v3/returns/company/fbs"
resp := &GetFBSReturnsResponse{}

View File

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

471
ozon/strategies.go Normal file
View File

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

668
ozon/strategies_test.go Normal file
View File

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

View File

@@ -14,70 +14,74 @@ type Warehouses struct {
type GetListOfWarehousesResponse struct {
core.CommonResponse
Result []struct {
// Trusted acceptance attribute. `true` if trusted acceptance is enabled in the warehouse
HasEntrustedAcceptance bool `json:"has_entrusted_acceptance"`
Result []GetListOfWarehousesResult `json:"result"`
}
// Indication that the warehouse works under the rFBS scheme:
// - true — the warehouse works under the rFBS scheme;
// - false — the warehouse does not work under the rFBS scheme.
IsRFBS bool `json:"is_rfbs"`
type GetListOfWarehousesResult struct {
// Trusted acceptance attribute. `true` if trusted acceptance is enabled in the warehouse
HasEntrustedAcceptance bool `json:"has_entrusted_acceptance"`
// Warehouse name
Name string `json:"name"`
// Indication that the warehouse works under the rFBS scheme:
// - true — the warehouse works under the rFBS scheme;
// - false — the warehouse does not work under the rFBS scheme.
IsRFBS bool `json:"is_rfbs"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
// Warehouse name
Name string `json:"name"`
// Possibility to print an acceptance certificate in advance. `true` if printing in advance is possible
CanPrintActInAdvance bool `json:"can_print_act_in_advance"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
// FBS first mile
FirstMileType struct {
// DropOff point identifier
DropoffPointId string `json:"dropoff_point_id"`
// Possibility to print an acceptance certificate in advance. `true` if printing in advance is possible
CanPrintActInAdvance bool `json:"can_print_act_in_advance"`
// DropOff timeslot identifier
DropoffTimeslotId int64 `json:"dropoff_timeslot_id"`
// FBS first mile
FirstMileType GetListOfWarehousesResultFirstMile `json:"first_mile_type"`
// Indication that the warehouse settings are being updated
FirstMileIsChanging bool `json:"first_mile_is_changing"`
// 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"`
// First mile type:
//
// Enum: "DropOff" "Pickup"
// - DropOff
// - Pickup
FirstMileType string `json:"first_mile_type"`
} `json:"first_mile_type"`
// Indication that the warehouse is not working due to quarantine
IsKarantin bool `json:"is_karantin"`
// 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"`
// Indication that the warehouse accepts bulky products
IsKGT bool `json:"is_kgt"`
// Indication that the warehouse is not working due to quarantine
IsKarantin bool `json:"is_karantin"`
// Indication that warehouse schedule can be changed
IsTimetableEditable bool `json:"is_timetable_editable"`
// Indication that the warehouse accepts bulky products
IsKGT bool `json:"is_kgt"`
// Minimum limit value: the number of orders that can be brought in one shipment
MinPostingsLimit int32 `json:"min_postings_limit"`
// Indication that warehouse schedule can be changed
IsTimetableEditable bool `json:"is_timetable_editable"`
// Limit value. -1 if there is no limit
PostingsLimit int32 `json:"postings_limit"`
// Minimum limit value: the number of orders that can be brought in one shipment
MinPostingsLimit int32 `json:"min_postings_limit"`
// Number of warehouse working days
MinWorkingDays int64 `json:"min_working_days"`
// Limit value. -1 if there is no limit
PostingsLimit int32 `json:"postings_limit"`
// Warehouse status
Status string `json:"status"`
// Number of warehouse working days
MinWorkingDays int64 `json:"min_working_days"`
// Warehouse working days
WorkingDays []WorkingDay `json:"working_days"`
}
// Warehouse status
Status string `json:"status"`
type GetListOfWarehousesResultFirstMile struct {
// DropOff point identifier
DropoffPointId string `json:"dropoff_point_id"`
// Warehouse working days
WorkingDays []WorkingDay `json:"working_days"`
} `json:"resulCommonResponse"`
// 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
@@ -131,41 +135,43 @@ type GetListOfDeliveryMethodsResponse struct {
HasNext bool `json:"has_next"`
// Method result
Result []struct {
// Company identifier
CompanyId int64 `json:"company_id"`
Result []GetListOfDeliveryMethodsResult `json:"result"`
}
// Date and time of delivery method creation
CreatedAt time.Time `json:"created_at"`
type GetListOfDeliveryMethodsResult struct {
// Company identifier
CompanyId int64 `json:"company_id"`
// Time before an order must be packaged
Cutoff string `json:"cutoff"`
// Date and time of delivery method creation
CreatedAt time.Time `json:"created_at"`
// Delivery method identifier
Id int64 `json:"id"`
// Time before an order must be packaged
Cutoff string `json:"cutoff"`
// Delivery method name
Name string `json:"name"`
// Delivery method identifier
Id int64 `json:"id"`
// Delivery service identifier
ProviderId int64 `json:"provider_id"`
// Delivery method name
Name string `json:"name"`
// Delivery method status:
// - NEW—created,
// - EDITED—being edited,
// - ACTIVE—active,
// - DISABLED—inactive
Status string `json:"status"`
// Delivery service identifier
ProviderId int64 `json:"provider_id"`
// Order delivery service identifier
TemplateId int64 `json:"template_id"`
// Delivery method status:
// - NEW—created,
// - EDITED—being edited,
// - ACTIVE—active,
// - DISABLED—inactive
Status string `json:"status"`
// Date and time when the delivery method was last updated
UpdatedAt time.Time `json:"updated_at"`
// Order delivery service identifier
TemplateId int64 `json:"template_id"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
} `json:"result"`
// Date and time when the delivery method was last updated
UpdatedAt time.Time `json:"updated_at"`
// Warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
}
// This methods allows you to get list of all delivery methods that can be applied for this warehouse